diff --git a/archetypes/event.md b/archetypes/event.md
new file mode 100644
index 0000000000000000000000000000000000000000..e60e65125ee9cec4db6c6a0da7a0f68fd966b25a
--- /dev/null
+++ b/archetypes/event.md
@@ -0,0 +1,5 @@
++++
+end_date = "2015-03-04"
+location = "Burlingame, CA"
+link = "http://www.eclipsecon.org/na2015"
++++
diff --git a/content/event/xx.md b/content/event/xx.md
new file mode 100644
index 0000000000000000000000000000000000000000..408e67f12e3629a7744b1b8601cc543aa598e8d6
--- /dev/null
+++ b/content/event/xx.md
@@ -0,0 +1,11 @@
++++
+type = "event"
+date = "2015-03-09"
+event_date = "Mar 9-12, 2015"
+link = "http://www.eclipsecon.org/na2015"
+location = "Burlingame, CA"
+title = "EclipseCon NA 2015"
+
++++
+
+xx
\ No newline at end of file
diff --git a/content/post/first.md b/content/post/first.md
new file mode 100644
index 0000000000000000000000000000000000000000..9563a30be03442a63dd1355b17c55ea11e0bb055
--- /dev/null
+++ b/content/post/first.md
@@ -0,0 +1,5 @@
++++
+date = "2015-03-05T12:16:25+01:00"
+title = "first"
++++
+When faced with the same need, I past the lwm2m_context_t pointer in the object lwm2m_object_t::userData (directly on inside a struct). See code snippets below.
diff --git a/layouts/index.html b/layouts/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..de02a47e4bff8a955096bef0417b184f2ccb1231
--- /dev/null
+++ b/layouts/index.html
@@ -0,0 +1,396 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <meta itemprop="name" content="iot.eclipse.org - IoT development made simple">
+  <meta itemprop="description" content="iot.eclipse.org is where you can learn about the technologies developed at Eclipse to make Internet of Things (IoT) development simpler. These technologies aim at establishing an open, end-to-end, IoT stack.">
+  <title>iot.eclipse.org - IoT development made simple</title>
+
+  <!-- Bootstrap -->
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+  <!-- icomoon -->
+  <link href="/assets/css/icomoon.css" rel="stylesheet">
+
+  <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
+  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
+  <!--[if lt IE 9]>
+      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+    <![endif]-->
+
+  <script src="https://apis.google.com/js/platform.js" async defer></script>
+
+
+</head>
+
+<body class="homepage">
+
+  <header>
+
+    <nav class="navbar navbar-default">
+      <div class="container">
+        <!-- Brand and toggle get grouped for better mobile display -->
+        <div class="navbar-header">
+          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+            <span class="sr-only">Toggle navigation</span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <a class="navbar-brand" href="/">
+            <img alt="Brand" src="/assets/images/iot-logo.png">
+          </a>
+        </div>
+
+        <!-- Collect the nav links, forms, and other content for toggling -->
+        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+          <ul class="nav navbar-nav navbar-right">
+            <li><a href="/getting-started">Getting Started</a>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="/standards">Standards</a>
+                </li>
+                <li><a href="/frameworks">Services &amp; Frameworks</a>
+                </li>
+                <li><a href="/projects">All the projects</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="#">Resources</a>
+                </li>
+                <li><a href="#">News</a>
+                </li>
+                <li><a href="#">Events</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="/ecosystem">Working Group</a>
+            </li>
+            <li style="min-width: 100px; padding-top: 15px; padding-left: 8px;">
+              <div class="g-plusone" data-size="medium" data-href="http://iot.eclipse.org"></div>
+            </li>
+          </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+      </div>
+      <!-- /.container-fluid -->
+    </nav>
+
+
+
+    <section class="container">
+      <div class="row">
+        <div class="col-md-8 col-sm-12">
+          <h1><span class="green">Open Source</span> for <span class="green">IoT</span></h1>
+          <p>IoT needs open source to be successful.
+            <br>
+            <span class="green">Eclipse IoT</span> simplifies IoT development.</p>
+        </div>
+        <!--         <div class="col-md-3 hidden-xs hidden-sm">
+          <img src="assets/images/iot-icon-alt.png" class="img-responsive">
+        </div> -->
+      </div>
+    </section>
+
+    <section class="header-divider">
+      <img src="assets/images/header-divider.png">
+    </section>
+
+  </header>
+
+  <main class="main">
+    <section class="first">
+      <div class="container">
+        <div class="row">
+
+          <div class="col-md-4 first-col">
+
+            <a href="/protocols.html">
+              <div class="row">
+                <div class="col-xs-2 col-md-3">
+                  <span class="icon-bulb" aria-hidden="true"></span>
+                </div>
+                <div class="col-xs-10 col-md-9">
+                  <h2>Standards</h2>
+                  <p>Implementation of IoT standards like MQTT, CoAP, LWM2M and OneM2M</p>
+                </div>
+              </div>
+            </a>
+
+            <a href="#">
+              <div class="row">
+                <div class="col-xs-2 col-md-3">
+                  <span class="icon-switch" aria-hidden="true"></span>
+                </div>
+                <div class="col-xs-10 col-md-9">
+                  <h2>Getting Started</h2>
+
+                  <p>Step-by-step guide to getting started on IoT development</p>
+                </div>
+              </div>
+            </a>
+
+          </div>
+
+
+          <div class="col-md-4 second-col">
+
+            <a href="/frameworks.html">
+              <div class="row">
+                <div class="col-xs-2 col-md-3">
+                  <span class="icon-cogs" aria-hidden="true"></span>
+                </div>
+                <div class="col-xs-10 col-md-9">
+                  <h2>Services &amp; Frameworks</h2>
+                  <p>Building blocks to accelerate IoT development</p>
+                </div>
+              </div>
+            </a>
+
+            <a href="/projects.html">
+              <div class="row">
+                <div class="col-xs-2 col-md-3">
+                  <span class="icon-embed" aria-hidden="true"></span>
+                </div>
+                <div class="col-xs-10 col-md-9">
+                  <h2>All projects</h2>
+                  <p>Check out all our IoT open source projects</p>
+                </div>
+              </div>
+            </a>
+
+          </div>
+
+          <div class="col-md-4 third-col line-divider-left">
+
+            <h1 class="purple">Technology</h1>
+            <p>Eclipse IoT provides open source implementations of the standards, services and frameworks that enable an Open Internet of Things.</p>
+          </div>
+
+        </div>
+      </div>
+    </section>
+
+
+    <section class="second">
+      <div class="container">
+        <div class="row">
+
+          <div class="col-md-5">
+            <section class="community">
+              <h1 class="purple">Community</h1>
+              <p>
+                <strong>Eclipse IoT</strong> is an ecosystem of companies and individuals that are working together to establish an Internet of Things based on open technologies.
+              </p>
+            </section>
+          </div>
+
+          <div class="col-md-6 col-md-offset-1">
+            <section class="subsection-header featured-articles">
+              <h2>Featured Articles</h2>
+
+              <div class="row">
+
+                <div class="col-md-6">
+                  <div class=" featured-articles-item">
+                    <a href="/java/tutorial">
+                      <h3>Open IoT Stack for Java Tutorial</h3>
+                      <!-- <p>Use Kura and MQTT to connect a greenhouse</p>
+ -->
+                    </a>
+                  </div>
+
+                </div>
+                <div class="col-md-6">
+                  <div class="featured-articles-item">
+                    <h3>Open IoT Stack for Java Tutorial</h3>
+                    <!--                     <p>Use Kura and MQTT to connect a greenhouse</p> -->
+                  </div>
+                </div>
+
+              </div>
+            </section>
+            <!-- .featured-article -->
+          </div>
+
+
+
+          <div class="col-md-6">
+            <section class="subsection-header latest-news">
+              <h2>Latest News</h2>
+              <div class="latest-news-item">
+                <h3>Announcing the Open IoT challenge</h3>
+                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec blandit pellentesque euismod. Curabitur mattis</p>
+                <p class="date">12/04/2015</p>
+              </div>
+              <div class="latest-news-item">
+                <h3>Announcing the Open IoT challenge</h3>
+                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec blandit pellentesque euismod. Curabitur mattis</p>
+                <p class="date">12/04/2015</p>
+              </div>
+              <!-- <div class="latest-news-item last">
+  <h3>Announcing the Open IoT challenge</h3>
+  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec blandit pellentesque euismod. Curabitur mattis</p>
+  <p class="date">12/04/2015</p>
+</div>
+ -->
+
+              <p><a href="#" class="btn btn-primary">More News...</a>
+              </p>
+            </section>
+            <!-- .latest-news -->
+          </div>
+          <!-- .col-md-6 -->
+
+
+          <div class="col-md-6">
+            <section class="subsection-header upcoming-events">
+              <h2>Upcoming Events</h2>
+              <div class="row">
+
+
+                {{ range first 4 .Data.Pages }} {{ if eq .Type "event"}}
+
+                <div class="col-sm-6">
+                  <a href="{{ .Params.link }}" target="_blank">
+                    <div class="upcoming-events-item">
+                      <h3>
+                      {{ .Title }}<br>
+                      <span class="date">Mar 9-12, 2015</span>
+                      </h3>
+                      <p>{{ .Params.Location }}</p>
+                    </div>
+                  </a>
+                </div>
+
+
+                {{ end }} {{ end }}
+
+
+              </div>
+            </section>
+            <!-- .upcoming-events -->
+          </div>
+
+          <!-- .col-md-6 -->
+        </div>
+      </div>
+    </section>
+
+
+    <section class="third">
+      <div class="container">
+        <div class="row">
+          <div class="col-md-8 logos">
+
+            <div class="row">
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-eurotech.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-ibm.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-sierra.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-bosch.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-bitreactive.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-dcsquare.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-gadgetkeeper.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-cisco.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-2lemetry.jpg" class="img-responsive">
+              </div>
+
+              <!-- <div class="col-md-12">
+  <p class="align-center"><a href="/ecosystem.html" class="btn btn-primary">More</a>
+  </p>
+</div>
+ -->
+            </div>
+
+          </div>
+          <section class="working-group col-md-4 line-divider-left">
+            <h1 class="purple">Working Group</h1>
+            <p>The <strong>Eclipse IoT Working Group</strong> is an industry collaboration of companies who invest and promote an open source community for IoT. <a href="/ecosystem"><strong>Join Us</strong></a>!
+            </p>
+            <p><a href="/ecosystem" class="btn btn-primary">Ecosystem</a>
+            </p>
+          </section>
+        </div>
+      </div>
+    </section>
+
+  </main>
+
+
+  <footer>
+
+    <div class="container">
+      <div class="row">
+        <div class="col-md-6">
+          <nav>
+            <ul class="list-inline menu">
+              <li><a href="#">Technology</a>
+              </li>
+              <li><a href="#">Community</a>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </nav>
+          <div class="socials">
+            <a href="#" class="social-facebook">&nbsp;</a>
+            <a href="#" class="social-twitter">&nbsp;</a>
+            <a href="#" class="social-youtube">&nbsp;</a>
+            <a href="#" class="social-share">&nbsp;</a>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+        </div>
+      </div>
+    </div>
+
+
+  </footer>
+
+
+  <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
+  <!-- Include all compiled plugins (below), or include individual files as needed -->
+  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
+
+
+  <script src="js/index.js"></script>
+
+</body>
+
+</html>
diff --git a/layouts/prout.html b/layouts/prout.html
new file mode 100644
index 0000000000000000000000000000000000000000..e5cf89dfdcd1ddc0325cffee8a4b7911d350e79a
--- /dev/null
+++ b/layouts/prout.html
@@ -0,0 +1,14 @@
+{{ }}
+
+<!DOCTYPE html>
+<html>
+
+<head>
+  <title></title>
+</head>
+
+<body>
+
+</body>
+
+</html>
diff --git a/public/.gitignore b/public/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..54749a29bf0fce58dbd8715cdc6c8ae4f87ab9c7
--- /dev/null
+++ b/public/.gitignore
@@ -0,0 +1,2 @@
+node_modules
+.grunt
\ No newline at end of file
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644
index 0000000000000000000000000000000000000000..2dc8be5f682f7fa38053ee01968a02ad3a51841d
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,9 @@
+# Redirects domain.com/file.html to domain.com/file
+#RewriteCond %{REQUEST_FILENAME} !-d          # is not directory
+#RewriteCond %{REQUEST_FILENAME}\.html -f     # is an existing html file
+#RewriteCond %{REQUEST_URI} ^(.+)\.html$      # request URI ends with .html
+#RewriteRule (.*)\.html$ /$1 [R=301,L]        # redirect from index.html to index
+
+<IfModule pagespeed_module>
+    ModPagespeed off
+</IfModule>
\ No newline at end of file
diff --git a/public/.jsbeautifyrc b/public/.jsbeautifyrc
new file mode 100644
index 0000000000000000000000000000000000000000..07aea46f3b3404cb6722a5314cdd37599aaa8c68
--- /dev/null
+++ b/public/.jsbeautifyrc
@@ -0,0 +1,5 @@
+{
+    "html": {
+        "indent_size": 2 // Indentation size
+    }
+}
diff --git a/public/.project b/public/.project
new file mode 100644
index 0000000000000000000000000000000000000000..f4ca2a1802015991bb2ddc0061b848c27192174b
--- /dev/null
+++ b/public/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>m2m.eclipse.org</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/assets/css/bootstrap.css b/public/assets/css/bootstrap.css
similarity index 100%
rename from assets/css/bootstrap.css
rename to public/assets/css/bootstrap.css
diff --git a/assets/css/icomoon.css b/public/assets/css/icomoon.css
similarity index 100%
rename from assets/css/icomoon.css
rename to public/assets/css/icomoon.css
diff --git a/assets/css/jquery.oembed.css b/public/assets/css/jquery.oembed.css
similarity index 100%
rename from assets/css/jquery.oembed.css
rename to public/assets/css/jquery.oembed.css
diff --git a/assets/fonts/bootstrap/glyphicons-halflings-regular.eot b/public/assets/fonts/bootstrap/glyphicons-halflings-regular.eot
similarity index 100%
rename from assets/fonts/bootstrap/glyphicons-halflings-regular.eot
rename to public/assets/fonts/bootstrap/glyphicons-halflings-regular.eot
diff --git a/assets/fonts/bootstrap/glyphicons-halflings-regular.svg b/public/assets/fonts/bootstrap/glyphicons-halflings-regular.svg
similarity index 100%
rename from assets/fonts/bootstrap/glyphicons-halflings-regular.svg
rename to public/assets/fonts/bootstrap/glyphicons-halflings-regular.svg
diff --git a/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf b/public/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf
similarity index 100%
rename from assets/fonts/bootstrap/glyphicons-halflings-regular.ttf
rename to public/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf
diff --git a/assets/fonts/bootstrap/glyphicons-halflings-regular.woff b/public/assets/fonts/bootstrap/glyphicons-halflings-regular.woff
similarity index 100%
rename from assets/fonts/bootstrap/glyphicons-halflings-regular.woff
rename to public/assets/fonts/bootstrap/glyphicons-halflings-regular.woff
diff --git a/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2 b/public/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2
similarity index 100%
rename from assets/fonts/bootstrap/glyphicons-halflings-regular.woff2
rename to public/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2
diff --git a/assets/fonts/icomoon.eot b/public/assets/fonts/icomoon.eot
similarity index 100%
rename from assets/fonts/icomoon.eot
rename to public/assets/fonts/icomoon.eot
diff --git a/assets/fonts/icomoon.svg b/public/assets/fonts/icomoon.svg
similarity index 100%
rename from assets/fonts/icomoon.svg
rename to public/assets/fonts/icomoon.svg
diff --git a/assets/fonts/icomoon.ttf b/public/assets/fonts/icomoon.ttf
similarity index 100%
rename from assets/fonts/icomoon.ttf
rename to public/assets/fonts/icomoon.ttf
diff --git a/assets/fonts/icomoon.woff b/public/assets/fonts/icomoon.woff
similarity index 100%
rename from assets/fonts/icomoon.woff
rename to public/assets/fonts/icomoon.woff
diff --git a/assets/fonts/selection.json b/public/assets/fonts/selection.json
similarity index 100%
rename from assets/fonts/selection.json
rename to public/assets/fonts/selection.json
diff --git a/assets/images/.keep b/public/assets/images/.keep
similarity index 100%
rename from assets/images/.keep
rename to public/assets/images/.keep
diff --git a/assets/images/footer-bg.jpg b/public/assets/images/footer-bg.jpg
similarity index 100%
rename from assets/images/footer-bg.jpg
rename to public/assets/images/footer-bg.jpg
diff --git a/assets/images/header-bg.jpg b/public/assets/images/header-bg.jpg
similarity index 100%
rename from assets/images/header-bg.jpg
rename to public/assets/images/header-bg.jpg
diff --git a/assets/images/header-divider.png b/public/assets/images/header-divider.png
similarity index 100%
rename from assets/images/header-divider.png
rename to public/assets/images/header-divider.png
diff --git a/assets/images/heading-community.jpg b/public/assets/images/heading-community.jpg
similarity index 100%
rename from assets/images/heading-community.jpg
rename to public/assets/images/heading-community.jpg
diff --git a/assets/images/heading-community.png b/public/assets/images/heading-community.png
similarity index 100%
rename from assets/images/heading-community.png
rename to public/assets/images/heading-community.png
diff --git a/assets/images/heading-featured.jpg b/public/assets/images/heading-featured.jpg
similarity index 100%
rename from assets/images/heading-featured.jpg
rename to public/assets/images/heading-featured.jpg
diff --git a/assets/images/heading-featured.png b/public/assets/images/heading-featured.png
similarity index 100%
rename from assets/images/heading-featured.png
rename to public/assets/images/heading-featured.png
diff --git a/assets/images/heading-latest_news.jpg b/public/assets/images/heading-latest_news.jpg
similarity index 100%
rename from assets/images/heading-latest_news.jpg
rename to public/assets/images/heading-latest_news.jpg
diff --git a/assets/images/heading-latest_news.png b/public/assets/images/heading-latest_news.png
similarity index 100%
rename from assets/images/heading-latest_news.png
rename to public/assets/images/heading-latest_news.png
diff --git a/assets/images/heading-upcoming_events.jpg b/public/assets/images/heading-upcoming_events.jpg
similarity index 100%
rename from assets/images/heading-upcoming_events.jpg
rename to public/assets/images/heading-upcoming_events.jpg
diff --git a/assets/images/heading-upcoming_events.png b/public/assets/images/heading-upcoming_events.png
similarity index 100%
rename from assets/images/heading-upcoming_events.png
rename to public/assets/images/heading-upcoming_events.png
diff --git a/assets/images/icon-all_projects.png b/public/assets/images/icon-all_projects.png
similarity index 100%
rename from assets/images/icon-all_projects.png
rename to public/assets/images/icon-all_projects.png
diff --git a/assets/images/icon-facebook.png b/public/assets/images/icon-facebook.png
similarity index 100%
rename from assets/images/icon-facebook.png
rename to public/assets/images/icon-facebook.png
diff --git a/assets/images/icon-getting_started.png b/public/assets/images/icon-getting_started.png
similarity index 100%
rename from assets/images/icon-getting_started.png
rename to public/assets/images/icon-getting_started.png
diff --git a/assets/images/icon-services.png b/public/assets/images/icon-services.png
similarity index 100%
rename from assets/images/icon-services.png
rename to public/assets/images/icon-services.png
diff --git a/assets/images/icon-share.png b/public/assets/images/icon-share.png
similarity index 100%
rename from assets/images/icon-share.png
rename to public/assets/images/icon-share.png
diff --git a/assets/images/icon-standards.png b/public/assets/images/icon-standards.png
similarity index 100%
rename from assets/images/icon-standards.png
rename to public/assets/images/icon-standards.png
diff --git a/assets/images/icon-twitter.png b/public/assets/images/icon-twitter.png
similarity index 100%
rename from assets/images/icon-twitter.png
rename to public/assets/images/icon-twitter.png
diff --git a/assets/images/icon-youtube.png b/public/assets/images/icon-youtube.png
similarity index 100%
rename from assets/images/icon-youtube.png
rename to public/assets/images/icon-youtube.png
diff --git a/assets/images/iot-icon-alt.png b/public/assets/images/iot-icon-alt.png
similarity index 100%
rename from assets/images/iot-icon-alt.png
rename to public/assets/images/iot-icon-alt.png
diff --git a/assets/images/iot-icon.png b/public/assets/images/iot-icon.png
similarity index 100%
rename from assets/images/iot-icon.png
rename to public/assets/images/iot-icon.png
diff --git a/assets/images/iot-logo.png b/public/assets/images/iot-logo.png
similarity index 100%
rename from assets/images/iot-logo.png
rename to public/assets/images/iot-logo.png
diff --git a/assets/images/open-iot-bg.jpg b/public/assets/images/open-iot-bg.jpg
similarity index 100%
rename from assets/images/open-iot-bg.jpg
rename to public/assets/images/open-iot-bg.jpg
diff --git a/assets/images/section-first-divider.jpg b/public/assets/images/section-first-divider.jpg
similarity index 100%
rename from assets/images/section-first-divider.jpg
rename to public/assets/images/section-first-divider.jpg
diff --git a/assets/images/section-first-divider.png b/public/assets/images/section-first-divider.png
similarity index 100%
rename from assets/images/section-first-divider.png
rename to public/assets/images/section-first-divider.png
diff --git a/assets/images/section-second-divider.jpg b/public/assets/images/section-second-divider.jpg
similarity index 100%
rename from assets/images/section-second-divider.jpg
rename to public/assets/images/section-second-divider.jpg
diff --git a/assets/images/section-second-divider.png b/public/assets/images/section-second-divider.png
similarity index 100%
rename from assets/images/section-second-divider.png
rename to public/assets/images/section-second-divider.png
diff --git a/assets/images/upcoming-events-bg.png b/public/assets/images/upcoming-events-bg.png
similarity index 100%
rename from assets/images/upcoming-events-bg.png
rename to public/assets/images/upcoming-events-bg.png
diff --git a/assets/images/upcoming-events-bg_hover.png b/public/assets/images/upcoming-events-bg_hover.png
similarity index 100%
rename from assets/images/upcoming-events-bg_hover.png
rename to public/assets/images/upcoming-events-bg_hover.png
diff --git a/assets/images/well-bg-br.png b/public/assets/images/well-bg-br.png
similarity index 100%
rename from assets/images/well-bg-br.png
rename to public/assets/images/well-bg-br.png
diff --git a/assets/images/well-bg-tl.png b/public/assets/images/well-bg-tl.png
similarity index 100%
rename from assets/images/well-bg-tl.png
rename to public/assets/images/well-bg-tl.png
diff --git a/assets/images/wg-2lemetry.jpg b/public/assets/images/wg-2lemetry.jpg
similarity index 100%
rename from assets/images/wg-2lemetry.jpg
rename to public/assets/images/wg-2lemetry.jpg
diff --git a/assets/images/wg-bitreactive.jpg b/public/assets/images/wg-bitreactive.jpg
similarity index 100%
rename from assets/images/wg-bitreactive.jpg
rename to public/assets/images/wg-bitreactive.jpg
diff --git a/assets/images/wg-bosch.jpg b/public/assets/images/wg-bosch.jpg
similarity index 100%
rename from assets/images/wg-bosch.jpg
rename to public/assets/images/wg-bosch.jpg
diff --git a/assets/images/wg-cisco.jpg b/public/assets/images/wg-cisco.jpg
similarity index 100%
rename from assets/images/wg-cisco.jpg
rename to public/assets/images/wg-cisco.jpg
diff --git a/assets/images/wg-dcsquare.jpg b/public/assets/images/wg-dcsquare.jpg
similarity index 100%
rename from assets/images/wg-dcsquare.jpg
rename to public/assets/images/wg-dcsquare.jpg
diff --git a/assets/images/wg-eurotech.jpg b/public/assets/images/wg-eurotech.jpg
similarity index 100%
rename from assets/images/wg-eurotech.jpg
rename to public/assets/images/wg-eurotech.jpg
diff --git a/assets/images/wg-gadgetkeeper.jpg b/public/assets/images/wg-gadgetkeeper.jpg
similarity index 100%
rename from assets/images/wg-gadgetkeeper.jpg
rename to public/assets/images/wg-gadgetkeeper.jpg
diff --git a/assets/images/wg-ibm.jpg b/public/assets/images/wg-ibm.jpg
similarity index 100%
rename from assets/images/wg-ibm.jpg
rename to public/assets/images/wg-ibm.jpg
diff --git a/assets/images/wg-sierra.jpg b/public/assets/images/wg-sierra.jpg
similarity index 100%
rename from assets/images/wg-sierra.jpg
rename to public/assets/images/wg-sierra.jpg
diff --git a/assets/js/bootstrap-sprockets.js b/public/assets/js/bootstrap-sprockets.js
similarity index 100%
rename from assets/js/bootstrap-sprockets.js
rename to public/assets/js/bootstrap-sprockets.js
diff --git a/assets/js/bootstrap.js b/public/assets/js/bootstrap.js
similarity index 100%
rename from assets/js/bootstrap.js
rename to public/assets/js/bootstrap.js
diff --git a/assets/js/bootstrap.min.js b/public/assets/js/bootstrap.min.js
similarity index 100%
rename from assets/js/bootstrap.min.js
rename to public/assets/js/bootstrap.min.js
diff --git a/assets/js/bootstrap/affix.js b/public/assets/js/bootstrap/affix.js
similarity index 100%
rename from assets/js/bootstrap/affix.js
rename to public/assets/js/bootstrap/affix.js
diff --git a/assets/js/bootstrap/alert.js b/public/assets/js/bootstrap/alert.js
similarity index 100%
rename from assets/js/bootstrap/alert.js
rename to public/assets/js/bootstrap/alert.js
diff --git a/assets/js/bootstrap/button.js b/public/assets/js/bootstrap/button.js
similarity index 100%
rename from assets/js/bootstrap/button.js
rename to public/assets/js/bootstrap/button.js
diff --git a/assets/js/bootstrap/carousel.js b/public/assets/js/bootstrap/carousel.js
similarity index 100%
rename from assets/js/bootstrap/carousel.js
rename to public/assets/js/bootstrap/carousel.js
diff --git a/assets/js/bootstrap/collapse.js b/public/assets/js/bootstrap/collapse.js
similarity index 100%
rename from assets/js/bootstrap/collapse.js
rename to public/assets/js/bootstrap/collapse.js
diff --git a/assets/js/bootstrap/dropdown.js b/public/assets/js/bootstrap/dropdown.js
similarity index 100%
rename from assets/js/bootstrap/dropdown.js
rename to public/assets/js/bootstrap/dropdown.js
diff --git a/assets/js/bootstrap/modal.js b/public/assets/js/bootstrap/modal.js
similarity index 100%
rename from assets/js/bootstrap/modal.js
rename to public/assets/js/bootstrap/modal.js
diff --git a/assets/js/bootstrap/popover.js b/public/assets/js/bootstrap/popover.js
similarity index 100%
rename from assets/js/bootstrap/popover.js
rename to public/assets/js/bootstrap/popover.js
diff --git a/assets/js/bootstrap/scrollspy.js b/public/assets/js/bootstrap/scrollspy.js
similarity index 100%
rename from assets/js/bootstrap/scrollspy.js
rename to public/assets/js/bootstrap/scrollspy.js
diff --git a/assets/js/bootstrap/tab.js b/public/assets/js/bootstrap/tab.js
similarity index 100%
rename from assets/js/bootstrap/tab.js
rename to public/assets/js/bootstrap/tab.js
diff --git a/assets/js/bootstrap/tooltip.js b/public/assets/js/bootstrap/tooltip.js
similarity index 100%
rename from assets/js/bootstrap/tooltip.js
rename to public/assets/js/bootstrap/tooltip.js
diff --git a/assets/js/bootstrap/transition.js b/public/assets/js/bootstrap/transition.js
similarity index 100%
rename from assets/js/bootstrap/transition.js
rename to public/assets/js/bootstrap/transition.js
diff --git a/assets/js/jquery.oembed.js b/public/assets/js/jquery.oembed.js
similarity index 100%
rename from assets/js/jquery.oembed.js
rename to public/assets/js/jquery.oembed.js
diff --git a/assets/stylesheets/_bootstrap-compass.scss b/public/assets/stylesheets/_bootstrap-compass.scss
similarity index 100%
rename from assets/stylesheets/_bootstrap-compass.scss
rename to public/assets/stylesheets/_bootstrap-compass.scss
diff --git a/assets/stylesheets/_bootstrap-mincer.scss b/public/assets/stylesheets/_bootstrap-mincer.scss
similarity index 100%
rename from assets/stylesheets/_bootstrap-mincer.scss
rename to public/assets/stylesheets/_bootstrap-mincer.scss
diff --git a/assets/stylesheets/_bootstrap-sprockets.scss b/public/assets/stylesheets/_bootstrap-sprockets.scss
similarity index 100%
rename from assets/stylesheets/_bootstrap-sprockets.scss
rename to public/assets/stylesheets/_bootstrap-sprockets.scss
diff --git a/assets/stylesheets/bootstrap.scss b/public/assets/stylesheets/bootstrap.scss
similarity index 100%
rename from assets/stylesheets/bootstrap.scss
rename to public/assets/stylesheets/bootstrap.scss
diff --git a/assets/stylesheets/bootstrap/_alerts.scss b/public/assets/stylesheets/bootstrap/_alerts.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_alerts.scss
rename to public/assets/stylesheets/bootstrap/_alerts.scss
diff --git a/assets/stylesheets/bootstrap/_badges.scss b/public/assets/stylesheets/bootstrap/_badges.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_badges.scss
rename to public/assets/stylesheets/bootstrap/_badges.scss
diff --git a/assets/stylesheets/bootstrap/_breadcrumbs.scss b/public/assets/stylesheets/bootstrap/_breadcrumbs.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_breadcrumbs.scss
rename to public/assets/stylesheets/bootstrap/_breadcrumbs.scss
diff --git a/assets/stylesheets/bootstrap/_button-groups.scss b/public/assets/stylesheets/bootstrap/_button-groups.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_button-groups.scss
rename to public/assets/stylesheets/bootstrap/_button-groups.scss
diff --git a/assets/stylesheets/bootstrap/_buttons.scss b/public/assets/stylesheets/bootstrap/_buttons.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_buttons.scss
rename to public/assets/stylesheets/bootstrap/_buttons.scss
diff --git a/assets/stylesheets/bootstrap/_carousel.scss b/public/assets/stylesheets/bootstrap/_carousel.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_carousel.scss
rename to public/assets/stylesheets/bootstrap/_carousel.scss
diff --git a/assets/stylesheets/bootstrap/_close.scss b/public/assets/stylesheets/bootstrap/_close.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_close.scss
rename to public/assets/stylesheets/bootstrap/_close.scss
diff --git a/assets/stylesheets/bootstrap/_code.scss b/public/assets/stylesheets/bootstrap/_code.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_code.scss
rename to public/assets/stylesheets/bootstrap/_code.scss
diff --git a/assets/stylesheets/bootstrap/_component-animations.scss b/public/assets/stylesheets/bootstrap/_component-animations.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_component-animations.scss
rename to public/assets/stylesheets/bootstrap/_component-animations.scss
diff --git a/assets/stylesheets/bootstrap/_dropdowns.scss b/public/assets/stylesheets/bootstrap/_dropdowns.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_dropdowns.scss
rename to public/assets/stylesheets/bootstrap/_dropdowns.scss
diff --git a/assets/stylesheets/bootstrap/_forms.scss b/public/assets/stylesheets/bootstrap/_forms.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_forms.scss
rename to public/assets/stylesheets/bootstrap/_forms.scss
diff --git a/assets/stylesheets/bootstrap/_glyphicons.scss b/public/assets/stylesheets/bootstrap/_glyphicons.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_glyphicons.scss
rename to public/assets/stylesheets/bootstrap/_glyphicons.scss
diff --git a/assets/stylesheets/bootstrap/_grid.scss b/public/assets/stylesheets/bootstrap/_grid.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_grid.scss
rename to public/assets/stylesheets/bootstrap/_grid.scss
diff --git a/assets/stylesheets/bootstrap/_input-groups.scss b/public/assets/stylesheets/bootstrap/_input-groups.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_input-groups.scss
rename to public/assets/stylesheets/bootstrap/_input-groups.scss
diff --git a/assets/stylesheets/bootstrap/_jumbotron.scss b/public/assets/stylesheets/bootstrap/_jumbotron.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_jumbotron.scss
rename to public/assets/stylesheets/bootstrap/_jumbotron.scss
diff --git a/assets/stylesheets/bootstrap/_labels.scss b/public/assets/stylesheets/bootstrap/_labels.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_labels.scss
rename to public/assets/stylesheets/bootstrap/_labels.scss
diff --git a/assets/stylesheets/bootstrap/_list-group.scss b/public/assets/stylesheets/bootstrap/_list-group.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_list-group.scss
rename to public/assets/stylesheets/bootstrap/_list-group.scss
diff --git a/assets/stylesheets/bootstrap/_media.scss b/public/assets/stylesheets/bootstrap/_media.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_media.scss
rename to public/assets/stylesheets/bootstrap/_media.scss
diff --git a/assets/stylesheets/bootstrap/_mixins.scss b/public/assets/stylesheets/bootstrap/_mixins.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_mixins.scss
rename to public/assets/stylesheets/bootstrap/_mixins.scss
diff --git a/assets/stylesheets/bootstrap/_modals.scss b/public/assets/stylesheets/bootstrap/_modals.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_modals.scss
rename to public/assets/stylesheets/bootstrap/_modals.scss
diff --git a/assets/stylesheets/bootstrap/_navbar.scss b/public/assets/stylesheets/bootstrap/_navbar.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_navbar.scss
rename to public/assets/stylesheets/bootstrap/_navbar.scss
diff --git a/assets/stylesheets/bootstrap/_navs.scss b/public/assets/stylesheets/bootstrap/_navs.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_navs.scss
rename to public/assets/stylesheets/bootstrap/_navs.scss
diff --git a/assets/stylesheets/bootstrap/_normalize.scss b/public/assets/stylesheets/bootstrap/_normalize.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_normalize.scss
rename to public/assets/stylesheets/bootstrap/_normalize.scss
diff --git a/assets/stylesheets/bootstrap/_pager.scss b/public/assets/stylesheets/bootstrap/_pager.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_pager.scss
rename to public/assets/stylesheets/bootstrap/_pager.scss
diff --git a/assets/stylesheets/bootstrap/_pagination.scss b/public/assets/stylesheets/bootstrap/_pagination.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_pagination.scss
rename to public/assets/stylesheets/bootstrap/_pagination.scss
diff --git a/assets/stylesheets/bootstrap/_panels.scss b/public/assets/stylesheets/bootstrap/_panels.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_panels.scss
rename to public/assets/stylesheets/bootstrap/_panels.scss
diff --git a/assets/stylesheets/bootstrap/_popovers.scss b/public/assets/stylesheets/bootstrap/_popovers.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_popovers.scss
rename to public/assets/stylesheets/bootstrap/_popovers.scss
diff --git a/assets/stylesheets/bootstrap/_print.scss b/public/assets/stylesheets/bootstrap/_print.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_print.scss
rename to public/assets/stylesheets/bootstrap/_print.scss
diff --git a/assets/stylesheets/bootstrap/_progress-bars.scss b/public/assets/stylesheets/bootstrap/_progress-bars.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_progress-bars.scss
rename to public/assets/stylesheets/bootstrap/_progress-bars.scss
diff --git a/assets/stylesheets/bootstrap/_responsive-embed.scss b/public/assets/stylesheets/bootstrap/_responsive-embed.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_responsive-embed.scss
rename to public/assets/stylesheets/bootstrap/_responsive-embed.scss
diff --git a/assets/stylesheets/bootstrap/_responsive-utilities.scss b/public/assets/stylesheets/bootstrap/_responsive-utilities.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_responsive-utilities.scss
rename to public/assets/stylesheets/bootstrap/_responsive-utilities.scss
diff --git a/assets/stylesheets/bootstrap/_scaffolding.scss b/public/assets/stylesheets/bootstrap/_scaffolding.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_scaffolding.scss
rename to public/assets/stylesheets/bootstrap/_scaffolding.scss
diff --git a/assets/stylesheets/bootstrap/_tables.scss b/public/assets/stylesheets/bootstrap/_tables.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_tables.scss
rename to public/assets/stylesheets/bootstrap/_tables.scss
diff --git a/assets/stylesheets/bootstrap/_theme.scss b/public/assets/stylesheets/bootstrap/_theme.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_theme.scss
rename to public/assets/stylesheets/bootstrap/_theme.scss
diff --git a/assets/stylesheets/bootstrap/_thumbnails.scss b/public/assets/stylesheets/bootstrap/_thumbnails.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_thumbnails.scss
rename to public/assets/stylesheets/bootstrap/_thumbnails.scss
diff --git a/assets/stylesheets/bootstrap/_tooltip.scss b/public/assets/stylesheets/bootstrap/_tooltip.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_tooltip.scss
rename to public/assets/stylesheets/bootstrap/_tooltip.scss
diff --git a/assets/stylesheets/bootstrap/_type.scss b/public/assets/stylesheets/bootstrap/_type.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_type.scss
rename to public/assets/stylesheets/bootstrap/_type.scss
diff --git a/assets/stylesheets/bootstrap/_utilities.scss b/public/assets/stylesheets/bootstrap/_utilities.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_utilities.scss
rename to public/assets/stylesheets/bootstrap/_utilities.scss
diff --git a/assets/stylesheets/bootstrap/_variables.scss b/public/assets/stylesheets/bootstrap/_variables.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_variables.scss
rename to public/assets/stylesheets/bootstrap/_variables.scss
diff --git a/assets/stylesheets/bootstrap/_wells.scss b/public/assets/stylesheets/bootstrap/_wells.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/_wells.scss
rename to public/assets/stylesheets/bootstrap/_wells.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_alerts.scss b/public/assets/stylesheets/bootstrap/mixins/_alerts.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_alerts.scss
rename to public/assets/stylesheets/bootstrap/mixins/_alerts.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_background-variant.scss b/public/assets/stylesheets/bootstrap/mixins/_background-variant.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_background-variant.scss
rename to public/assets/stylesheets/bootstrap/mixins/_background-variant.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_border-radius.scss b/public/assets/stylesheets/bootstrap/mixins/_border-radius.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_border-radius.scss
rename to public/assets/stylesheets/bootstrap/mixins/_border-radius.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_buttons.scss b/public/assets/stylesheets/bootstrap/mixins/_buttons.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_buttons.scss
rename to public/assets/stylesheets/bootstrap/mixins/_buttons.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_center-block.scss b/public/assets/stylesheets/bootstrap/mixins/_center-block.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_center-block.scss
rename to public/assets/stylesheets/bootstrap/mixins/_center-block.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_clearfix.scss b/public/assets/stylesheets/bootstrap/mixins/_clearfix.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_clearfix.scss
rename to public/assets/stylesheets/bootstrap/mixins/_clearfix.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_forms.scss b/public/assets/stylesheets/bootstrap/mixins/_forms.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_forms.scss
rename to public/assets/stylesheets/bootstrap/mixins/_forms.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_gradients.scss b/public/assets/stylesheets/bootstrap/mixins/_gradients.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_gradients.scss
rename to public/assets/stylesheets/bootstrap/mixins/_gradients.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_grid-framework.scss b/public/assets/stylesheets/bootstrap/mixins/_grid-framework.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_grid-framework.scss
rename to public/assets/stylesheets/bootstrap/mixins/_grid-framework.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_grid.scss b/public/assets/stylesheets/bootstrap/mixins/_grid.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_grid.scss
rename to public/assets/stylesheets/bootstrap/mixins/_grid.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_hide-text.scss b/public/assets/stylesheets/bootstrap/mixins/_hide-text.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_hide-text.scss
rename to public/assets/stylesheets/bootstrap/mixins/_hide-text.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_image.scss b/public/assets/stylesheets/bootstrap/mixins/_image.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_image.scss
rename to public/assets/stylesheets/bootstrap/mixins/_image.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_labels.scss b/public/assets/stylesheets/bootstrap/mixins/_labels.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_labels.scss
rename to public/assets/stylesheets/bootstrap/mixins/_labels.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_list-group.scss b/public/assets/stylesheets/bootstrap/mixins/_list-group.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_list-group.scss
rename to public/assets/stylesheets/bootstrap/mixins/_list-group.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_nav-divider.scss b/public/assets/stylesheets/bootstrap/mixins/_nav-divider.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_nav-divider.scss
rename to public/assets/stylesheets/bootstrap/mixins/_nav-divider.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss b/public/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss
rename to public/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_opacity.scss b/public/assets/stylesheets/bootstrap/mixins/_opacity.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_opacity.scss
rename to public/assets/stylesheets/bootstrap/mixins/_opacity.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_pagination.scss b/public/assets/stylesheets/bootstrap/mixins/_pagination.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_pagination.scss
rename to public/assets/stylesheets/bootstrap/mixins/_pagination.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_panels.scss b/public/assets/stylesheets/bootstrap/mixins/_panels.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_panels.scss
rename to public/assets/stylesheets/bootstrap/mixins/_panels.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_progress-bar.scss b/public/assets/stylesheets/bootstrap/mixins/_progress-bar.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_progress-bar.scss
rename to public/assets/stylesheets/bootstrap/mixins/_progress-bar.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_reset-filter.scss b/public/assets/stylesheets/bootstrap/mixins/_reset-filter.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_reset-filter.scss
rename to public/assets/stylesheets/bootstrap/mixins/_reset-filter.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_resize.scss b/public/assets/stylesheets/bootstrap/mixins/_resize.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_resize.scss
rename to public/assets/stylesheets/bootstrap/mixins/_resize.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss b/public/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss
rename to public/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_size.scss b/public/assets/stylesheets/bootstrap/mixins/_size.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_size.scss
rename to public/assets/stylesheets/bootstrap/mixins/_size.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_tab-focus.scss b/public/assets/stylesheets/bootstrap/mixins/_tab-focus.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_tab-focus.scss
rename to public/assets/stylesheets/bootstrap/mixins/_tab-focus.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_table-row.scss b/public/assets/stylesheets/bootstrap/mixins/_table-row.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_table-row.scss
rename to public/assets/stylesheets/bootstrap/mixins/_table-row.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss b/public/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_text-emphasis.scss
rename to public/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_text-overflow.scss b/public/assets/stylesheets/bootstrap/mixins/_text-overflow.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_text-overflow.scss
rename to public/assets/stylesheets/bootstrap/mixins/_text-overflow.scss
diff --git a/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss b/public/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss
similarity index 100%
rename from assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss
rename to public/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss
diff --git a/assets/stylesheets/theme/_footer.scss b/public/assets/stylesheets/theme/_footer.scss
similarity index 100%
rename from assets/stylesheets/theme/_footer.scss
rename to public/assets/stylesheets/theme/_footer.scss
diff --git a/assets/stylesheets/theme/_header.scss b/public/assets/stylesheets/theme/_header.scss
similarity index 100%
rename from assets/stylesheets/theme/_header.scss
rename to public/assets/stylesheets/theme/_header.scss
diff --git a/assets/stylesheets/theme/_main.scss b/public/assets/stylesheets/theme/_main.scss
similarity index 100%
rename from assets/stylesheets/theme/_main.scss
rename to public/assets/stylesheets/theme/_main.scss
diff --git a/assets/stylesheets/theme/_mixins.scss b/public/assets/stylesheets/theme/_mixins.scss
similarity index 100%
rename from assets/stylesheets/theme/_mixins.scss
rename to public/assets/stylesheets/theme/_mixins.scss
diff --git a/assets/stylesheets/theme/_utilities.scss b/public/assets/stylesheets/theme/_utilities.scss
similarity index 100%
rename from assets/stylesheets/theme/_utilities.scss
rename to public/assets/stylesheets/theme/_utilities.scss
diff --git a/community.html b/public/community.html
similarity index 100%
rename from community.html
rename to public/community.html
diff --git a/contact.html b/public/contact.html
similarity index 100%
rename from contact.html
rename to public/contact.html
diff --git a/css/bootstrap/bootstrap-responsive.css b/public/css/bootstrap/bootstrap-responsive.css
similarity index 100%
rename from css/bootstrap/bootstrap-responsive.css
rename to public/css/bootstrap/bootstrap-responsive.css
diff --git a/css/bootstrap/bootstrap-responsive.min.css b/public/css/bootstrap/bootstrap-responsive.min.css
similarity index 100%
rename from css/bootstrap/bootstrap-responsive.min.css
rename to public/css/bootstrap/bootstrap-responsive.min.css
diff --git a/css/bootstrap/bootstrap.css b/public/css/bootstrap/bootstrap.css
similarity index 100%
rename from css/bootstrap/bootstrap.css
rename to public/css/bootstrap/bootstrap.css
diff --git a/css/bootstrap/bootstrap.min.css b/public/css/bootstrap/bootstrap.min.css
similarity index 100%
rename from css/bootstrap/bootstrap.min.css
rename to public/css/bootstrap/bootstrap.min.css
diff --git a/css/font/fontawesome-webfont.eot b/public/css/font/fontawesome-webfont.eot
similarity index 100%
rename from css/font/fontawesome-webfont.eot
rename to public/css/font/fontawesome-webfont.eot
diff --git a/css/font/fontawesome-webfont.svg b/public/css/font/fontawesome-webfont.svg
similarity index 100%
rename from css/font/fontawesome-webfont.svg
rename to public/css/font/fontawesome-webfont.svg
diff --git a/css/font/fontawesome-webfont.ttf b/public/css/font/fontawesome-webfont.ttf
similarity index 100%
rename from css/font/fontawesome-webfont.ttf
rename to public/css/font/fontawesome-webfont.ttf
diff --git a/css/font/fontawesome-webfont.woff b/public/css/font/fontawesome-webfont.woff
similarity index 100%
rename from css/font/fontawesome-webfont.woff
rename to public/css/font/fontawesome-webfont.woff
diff --git a/css/img/bg_index.gif b/public/css/img/bg_index.gif
similarity index 100%
rename from css/img/bg_index.gif
rename to public/css/img/bg_index.gif
diff --git a/css/img/bg_index.png b/public/css/img/bg_index.png
similarity index 100%
rename from css/img/bg_index.png
rename to public/css/img/bg_index.png
diff --git a/css/img/glyphicons-halflings-white.png b/public/css/img/glyphicons-halflings-white.png
similarity index 100%
rename from css/img/glyphicons-halflings-white.png
rename to public/css/img/glyphicons-halflings-white.png
diff --git a/css/img/glyphicons-halflings.png b/public/css/img/glyphicons-halflings.png
similarity index 100%
rename from css/img/glyphicons-halflings.png
rename to public/css/img/glyphicons-halflings.png
diff --git a/css/img/m2m_eclipse_logo.png b/public/css/img/m2m_eclipse_logo.png
similarity index 100%
rename from css/img/m2m_eclipse_logo.png
rename to public/css/img/m2m_eclipse_logo.png
diff --git a/css/theme.css b/public/css/theme.css
similarity index 100%
rename from css/theme.css
rename to public/css/theme.css
diff --git a/demo/.gitignore b/public/demo/.gitignore
similarity index 100%
rename from demo/.gitignore
rename to public/demo/.gitignore
diff --git a/demo/component.json b/public/demo/component.json
similarity index 100%
rename from demo/component.json
rename to public/demo/component.json
diff --git a/demo/components/angular-socialshare/.bower.json b/public/demo/components/angular-socialshare/.bower.json
similarity index 100%
rename from demo/components/angular-socialshare/.bower.json
rename to public/demo/components/angular-socialshare/.bower.json
diff --git a/demo/components/angular-socialshare/README.md b/public/demo/components/angular-socialshare/README.md
similarity index 100%
rename from demo/components/angular-socialshare/README.md
rename to public/demo/components/angular-socialshare/README.md
diff --git a/demo/components/angular-socialshare/angular-socialshare.css b/public/demo/components/angular-socialshare/angular-socialshare.css
similarity index 100%
rename from demo/components/angular-socialshare/angular-socialshare.css
rename to public/demo/components/angular-socialshare/angular-socialshare.css
diff --git a/demo/components/angular-socialshare/angular-socialshare.js b/public/demo/components/angular-socialshare/angular-socialshare.js
similarity index 100%
rename from demo/components/angular-socialshare/angular-socialshare.js
rename to public/demo/components/angular-socialshare/angular-socialshare.js
diff --git a/demo/components/angular-socialshare/angular-socialshare.less b/public/demo/components/angular-socialshare/angular-socialshare.less
similarity index 100%
rename from demo/components/angular-socialshare/angular-socialshare.less
rename to public/demo/components/angular-socialshare/angular-socialshare.less
diff --git a/demo/components/angular-socialshare/angular-socialshare.min.css b/public/demo/components/angular-socialshare/angular-socialshare.min.css
similarity index 100%
rename from demo/components/angular-socialshare/angular-socialshare.min.css
rename to public/demo/components/angular-socialshare/angular-socialshare.min.css
diff --git a/demo/components/angular-socialshare/angular-socialshare.min.js b/public/demo/components/angular-socialshare/angular-socialshare.min.js
similarity index 100%
rename from demo/components/angular-socialshare/angular-socialshare.min.js
rename to public/demo/components/angular-socialshare/angular-socialshare.min.js
diff --git a/demo/components/angular-socialshare/bower.json b/public/demo/components/angular-socialshare/bower.json
similarity index 100%
rename from demo/components/angular-socialshare/bower.json
rename to public/demo/components/angular-socialshare/bower.json
diff --git a/demo/components/angular-socialshare/gulpfile.js b/public/demo/components/angular-socialshare/gulpfile.js
similarity index 100%
rename from demo/components/angular-socialshare/gulpfile.js
rename to public/demo/components/angular-socialshare/gulpfile.js
diff --git a/demo/components/angular/.bower.json b/public/demo/components/angular/.bower.json
similarity index 100%
rename from demo/components/angular/.bower.json
rename to public/demo/components/angular/.bower.json
diff --git a/demo/components/angular/angular.js b/public/demo/components/angular/angular.js
similarity index 100%
rename from demo/components/angular/angular.js
rename to public/demo/components/angular/angular.js
diff --git a/demo/components/angular/angular.min.js b/public/demo/components/angular/angular.min.js
similarity index 100%
rename from demo/components/angular/angular.min.js
rename to public/demo/components/angular/angular.min.js
diff --git a/demo/components/angular/bower.json b/public/demo/components/angular/bower.json
similarity index 100%
rename from demo/components/angular/bower.json
rename to public/demo/components/angular/bower.json
diff --git a/demo/components/bootstrap.css/.bower.json b/public/demo/components/bootstrap.css/.bower.json
similarity index 100%
rename from demo/components/bootstrap.css/.bower.json
rename to public/demo/components/bootstrap.css/.bower.json
diff --git a/demo/components/bootstrap.css/README.md b/public/demo/components/bootstrap.css/README.md
similarity index 100%
rename from demo/components/bootstrap.css/README.md
rename to public/demo/components/bootstrap.css/README.md
diff --git a/demo/components/bootstrap.css/component.json b/public/demo/components/bootstrap.css/component.json
similarity index 100%
rename from demo/components/bootstrap.css/component.json
rename to public/demo/components/bootstrap.css/component.json
diff --git a/demo/components/bootstrap.css/css/bootstrap-responsive.css b/public/demo/components/bootstrap.css/css/bootstrap-responsive.css
similarity index 100%
rename from demo/components/bootstrap.css/css/bootstrap-responsive.css
rename to public/demo/components/bootstrap.css/css/bootstrap-responsive.css
diff --git a/demo/components/bootstrap.css/css/bootstrap-responsive.min.css b/public/demo/components/bootstrap.css/css/bootstrap-responsive.min.css
similarity index 100%
rename from demo/components/bootstrap.css/css/bootstrap-responsive.min.css
rename to public/demo/components/bootstrap.css/css/bootstrap-responsive.min.css
diff --git a/demo/components/bootstrap.css/css/bootstrap.css b/public/demo/components/bootstrap.css/css/bootstrap.css
similarity index 100%
rename from demo/components/bootstrap.css/css/bootstrap.css
rename to public/demo/components/bootstrap.css/css/bootstrap.css
diff --git a/demo/components/bootstrap.css/css/bootstrap.min.css b/public/demo/components/bootstrap.css/css/bootstrap.min.css
similarity index 100%
rename from demo/components/bootstrap.css/css/bootstrap.min.css
rename to public/demo/components/bootstrap.css/css/bootstrap.min.css
diff --git a/demo/components/bootstrap.css/img/glyphicons-halflings-white.png b/public/demo/components/bootstrap.css/img/glyphicons-halflings-white.png
similarity index 100%
rename from demo/components/bootstrap.css/img/glyphicons-halflings-white.png
rename to public/demo/components/bootstrap.css/img/glyphicons-halflings-white.png
diff --git a/demo/components/bootstrap.css/img/glyphicons-halflings.png b/public/demo/components/bootstrap.css/img/glyphicons-halflings.png
similarity index 100%
rename from demo/components/bootstrap.css/img/glyphicons-halflings.png
rename to public/demo/components/bootstrap.css/img/glyphicons-halflings.png
diff --git a/demo/components/bootstrap.css/js/bootstrap.js b/public/demo/components/bootstrap.css/js/bootstrap.js
similarity index 100%
rename from demo/components/bootstrap.css/js/bootstrap.js
rename to public/demo/components/bootstrap.css/js/bootstrap.js
diff --git a/demo/components/bootstrap.css/js/bootstrap.min.js b/public/demo/components/bootstrap.css/js/bootstrap.min.js
similarity index 100%
rename from demo/components/bootstrap.css/js/bootstrap.min.js
rename to public/demo/components/bootstrap.css/js/bootstrap.min.js
diff --git a/demo/components/d3/.bower.json b/public/demo/components/d3/.bower.json
similarity index 100%
rename from demo/components/d3/.bower.json
rename to public/demo/components/d3/.bower.json
diff --git a/demo/components/d3/.gitignore b/public/demo/components/d3/.gitignore
similarity index 100%
rename from demo/components/d3/.gitignore
rename to public/demo/components/d3/.gitignore
diff --git a/demo/components/d3/.gitmodules b/public/demo/components/d3/.gitmodules
similarity index 100%
rename from demo/components/d3/.gitmodules
rename to public/demo/components/d3/.gitmodules
diff --git a/demo/components/d3/.npmignore b/public/demo/components/d3/.npmignore
similarity index 100%
rename from demo/components/d3/.npmignore
rename to public/demo/components/d3/.npmignore
diff --git a/demo/components/d3/LICENSE b/public/demo/components/d3/LICENSE
similarity index 100%
rename from demo/components/d3/LICENSE
rename to public/demo/components/d3/LICENSE
diff --git a/demo/components/d3/Makefile b/public/demo/components/d3/Makefile
similarity index 100%
rename from demo/components/d3/Makefile
rename to public/demo/components/d3/Makefile
diff --git a/demo/components/d3/README.md b/public/demo/components/d3/README.md
similarity index 100%
rename from demo/components/d3/README.md
rename to public/demo/components/d3/README.md
diff --git a/demo/components/d3/component.json b/public/demo/components/d3/component.json
similarity index 100%
rename from demo/components/d3/component.json
rename to public/demo/components/d3/component.json
diff --git a/demo/components/d3/d3.js b/public/demo/components/d3/d3.js
similarity index 100%
rename from demo/components/d3/d3.js
rename to public/demo/components/d3/d3.js
diff --git a/demo/components/d3/d3.min.js b/public/demo/components/d3/d3.min.js
similarity index 100%
rename from demo/components/d3/d3.min.js
rename to public/demo/components/d3/d3.min.js
diff --git a/demo/components/d3/globals.js b/public/demo/components/d3/globals.js
similarity index 100%
rename from demo/components/d3/globals.js
rename to public/demo/components/d3/globals.js
diff --git a/demo/components/d3/index-browserify.js b/public/demo/components/d3/index-browserify.js
similarity index 100%
rename from demo/components/d3/index-browserify.js
rename to public/demo/components/d3/index-browserify.js
diff --git a/demo/components/d3/index.js b/public/demo/components/d3/index.js
similarity index 100%
rename from demo/components/d3/index.js
rename to public/demo/components/d3/index.js
diff --git a/demo/components/d3/lib/colorbrewer/LICENSE b/public/demo/components/d3/lib/colorbrewer/LICENSE
similarity index 100%
rename from demo/components/d3/lib/colorbrewer/LICENSE
rename to public/demo/components/d3/lib/colorbrewer/LICENSE
diff --git a/demo/components/d3/lib/colorbrewer/colorbrewer.css b/public/demo/components/d3/lib/colorbrewer/colorbrewer.css
similarity index 100%
rename from demo/components/d3/lib/colorbrewer/colorbrewer.css
rename to public/demo/components/d3/lib/colorbrewer/colorbrewer.css
diff --git a/demo/components/d3/lib/colorbrewer/colorbrewer.js b/public/demo/components/d3/lib/colorbrewer/colorbrewer.js
similarity index 100%
rename from demo/components/d3/lib/colorbrewer/colorbrewer.js
rename to public/demo/components/d3/lib/colorbrewer/colorbrewer.js
diff --git a/demo/components/d3/lib/jit/LICENSE b/public/demo/components/d3/lib/jit/LICENSE
similarity index 100%
rename from demo/components/d3/lib/jit/LICENSE
rename to public/demo/components/d3/lib/jit/LICENSE
diff --git a/demo/components/d3/lib/penner/LICENSE b/public/demo/components/d3/lib/penner/LICENSE
similarity index 100%
rename from demo/components/d3/lib/penner/LICENSE
rename to public/demo/components/d3/lib/penner/LICENSE
diff --git a/demo/components/d3/lib/polymaps/LICENSE b/public/demo/components/d3/lib/polymaps/LICENSE
similarity index 100%
rename from demo/components/d3/lib/polymaps/LICENSE
rename to public/demo/components/d3/lib/polymaps/LICENSE
diff --git a/demo/components/d3/lib/protovis/LICENSE b/public/demo/components/d3/lib/protovis/LICENSE
similarity index 100%
rename from demo/components/d3/lib/protovis/LICENSE
rename to public/demo/components/d3/lib/protovis/LICENSE
diff --git a/demo/components/d3/lib/queue/LICENSE b/public/demo/components/d3/lib/queue/LICENSE
similarity index 100%
rename from demo/components/d3/lib/queue/LICENSE
rename to public/demo/components/d3/lib/queue/LICENSE
diff --git a/demo/components/d3/lib/queue/queue.js b/public/demo/components/d3/lib/queue/queue.js
similarity index 100%
rename from demo/components/d3/lib/queue/queue.js
rename to public/demo/components/d3/lib/queue/queue.js
diff --git a/demo/components/d3/lib/queue/queue.min.js b/public/demo/components/d3/lib/queue/queue.min.js
similarity index 100%
rename from demo/components/d3/lib/queue/queue.min.js
rename to public/demo/components/d3/lib/queue/queue.min.js
diff --git a/demo/components/d3/lib/science/LICENSE b/public/demo/components/d3/lib/science/LICENSE
similarity index 100%
rename from demo/components/d3/lib/science/LICENSE
rename to public/demo/components/d3/lib/science/LICENSE
diff --git a/demo/components/d3/lib/science/science.js b/public/demo/components/d3/lib/science/science.js
similarity index 100%
rename from demo/components/d3/lib/science/science.js
rename to public/demo/components/d3/lib/science/science.js
diff --git a/demo/components/d3/lib/science/science.lin.js b/public/demo/components/d3/lib/science/science.lin.js
similarity index 100%
rename from demo/components/d3/lib/science/science.lin.js
rename to public/demo/components/d3/lib/science/science.lin.js
diff --git a/demo/components/d3/lib/science/science.lin.min.js b/public/demo/components/d3/lib/science/science.lin.min.js
similarity index 100%
rename from demo/components/d3/lib/science/science.lin.min.js
rename to public/demo/components/d3/lib/science/science.lin.min.js
diff --git a/demo/components/d3/lib/science/science.min.js b/public/demo/components/d3/lib/science/science.min.js
similarity index 100%
rename from demo/components/d3/lib/science/science.min.js
rename to public/demo/components/d3/lib/science/science.min.js
diff --git a/demo/components/d3/lib/science/science.stats.js b/public/demo/components/d3/lib/science/science.stats.js
similarity index 100%
rename from demo/components/d3/lib/science/science.stats.js
rename to public/demo/components/d3/lib/science/science.stats.js
diff --git a/demo/components/d3/lib/science/science.stats.min.js b/public/demo/components/d3/lib/science/science.stats.min.js
similarity index 100%
rename from demo/components/d3/lib/science/science.stats.min.js
rename to public/demo/components/d3/lib/science/science.stats.min.js
diff --git a/demo/components/d3/package.json b/public/demo/components/d3/package.json
similarity index 100%
rename from demo/components/d3/package.json
rename to public/demo/components/d3/package.json
diff --git a/demo/components/d3/src/behavior/behavior.js b/public/demo/components/d3/src/behavior/behavior.js
similarity index 100%
rename from demo/components/d3/src/behavior/behavior.js
rename to public/demo/components/d3/src/behavior/behavior.js
diff --git a/demo/components/d3/src/behavior/drag.js b/public/demo/components/d3/src/behavior/drag.js
similarity index 100%
rename from demo/components/d3/src/behavior/drag.js
rename to public/demo/components/d3/src/behavior/drag.js
diff --git a/demo/components/d3/src/behavior/zoom.js b/public/demo/components/d3/src/behavior/zoom.js
similarity index 100%
rename from demo/components/d3/src/behavior/zoom.js
rename to public/demo/components/d3/src/behavior/zoom.js
diff --git a/demo/components/d3/src/compat/date.js b/public/demo/components/d3/src/compat/date.js
similarity index 100%
rename from demo/components/d3/src/compat/date.js
rename to public/demo/components/d3/src/compat/date.js
diff --git a/demo/components/d3/src/compat/style.js b/public/demo/components/d3/src/compat/style.js
similarity index 100%
rename from demo/components/d3/src/compat/style.js
rename to public/demo/components/d3/src/compat/style.js
diff --git a/demo/components/d3/src/component.js b/public/demo/components/d3/src/component.js
similarity index 100%
rename from demo/components/d3/src/component.js
rename to public/demo/components/d3/src/component.js
diff --git a/demo/components/d3/src/core/array.js b/public/demo/components/d3/src/core/array.js
similarity index 100%
rename from demo/components/d3/src/core/array.js
rename to public/demo/components/d3/src/core/array.js
diff --git a/demo/components/d3/src/core/ascending.js b/public/demo/components/d3/src/core/ascending.js
similarity index 100%
rename from demo/components/d3/src/core/ascending.js
rename to public/demo/components/d3/src/core/ascending.js
diff --git a/demo/components/d3/src/core/bisect.js b/public/demo/components/d3/src/core/bisect.js
similarity index 100%
rename from demo/components/d3/src/core/bisect.js
rename to public/demo/components/d3/src/core/bisect.js
diff --git a/demo/components/d3/src/core/class.js b/public/demo/components/d3/src/core/class.js
similarity index 100%
rename from demo/components/d3/src/core/class.js
rename to public/demo/components/d3/src/core/class.js
diff --git a/demo/components/d3/src/core/collapse.js b/public/demo/components/d3/src/core/collapse.js
similarity index 100%
rename from demo/components/d3/src/core/collapse.js
rename to public/demo/components/d3/src/core/collapse.js
diff --git a/demo/components/d3/src/core/color.js b/public/demo/components/d3/src/core/color.js
similarity index 100%
rename from demo/components/d3/src/core/color.js
rename to public/demo/components/d3/src/core/color.js
diff --git a/demo/components/d3/src/core/core.js b/public/demo/components/d3/src/core/core.js
similarity index 100%
rename from demo/components/d3/src/core/core.js
rename to public/demo/components/d3/src/core/core.js
diff --git a/demo/components/d3/src/core/descending.js b/public/demo/components/d3/src/core/descending.js
similarity index 100%
rename from demo/components/d3/src/core/descending.js
rename to public/demo/components/d3/src/core/descending.js
diff --git a/demo/components/d3/src/core/dispatch.js b/public/demo/components/d3/src/core/dispatch.js
similarity index 100%
rename from demo/components/d3/src/core/dispatch.js
rename to public/demo/components/d3/src/core/dispatch.js
diff --git a/demo/components/d3/src/core/ease.js b/public/demo/components/d3/src/core/ease.js
similarity index 100%
rename from demo/components/d3/src/core/ease.js
rename to public/demo/components/d3/src/core/ease.js
diff --git a/demo/components/d3/src/core/entries.js b/public/demo/components/d3/src/core/entries.js
similarity index 100%
rename from demo/components/d3/src/core/entries.js
rename to public/demo/components/d3/src/core/entries.js
diff --git a/demo/components/d3/src/core/event.js b/public/demo/components/d3/src/core/event.js
similarity index 100%
rename from demo/components/d3/src/core/event.js
rename to public/demo/components/d3/src/core/event.js
diff --git a/demo/components/d3/src/core/extent.js b/public/demo/components/d3/src/core/extent.js
similarity index 100%
rename from demo/components/d3/src/core/extent.js
rename to public/demo/components/d3/src/core/extent.js
diff --git a/demo/components/d3/src/core/format-locale.js b/public/demo/components/d3/src/core/format-locale.js
similarity index 100%
rename from demo/components/d3/src/core/format-locale.js
rename to public/demo/components/d3/src/core/format-locale.js
diff --git a/demo/components/d3/src/core/format.js b/public/demo/components/d3/src/core/format.js
similarity index 100%
rename from demo/components/d3/src/core/format.js
rename to public/demo/components/d3/src/core/format.js
diff --git a/demo/components/d3/src/core/formatPrefix.js b/public/demo/components/d3/src/core/formatPrefix.js
similarity index 100%
rename from demo/components/d3/src/core/formatPrefix.js
rename to public/demo/components/d3/src/core/formatPrefix.js
diff --git a/demo/components/d3/src/core/functor.js b/public/demo/components/d3/src/core/functor.js
similarity index 100%
rename from demo/components/d3/src/core/functor.js
rename to public/demo/components/d3/src/core/functor.js
diff --git a/demo/components/d3/src/core/hcl.js b/public/demo/components/d3/src/core/hcl.js
similarity index 100%
rename from demo/components/d3/src/core/hcl.js
rename to public/demo/components/d3/src/core/hcl.js
diff --git a/demo/components/d3/src/core/hsl.js b/public/demo/components/d3/src/core/hsl.js
similarity index 100%
rename from demo/components/d3/src/core/hsl.js
rename to public/demo/components/d3/src/core/hsl.js
diff --git a/demo/components/d3/src/core/html.js b/public/demo/components/d3/src/core/html.js
similarity index 100%
rename from demo/components/d3/src/core/html.js
rename to public/demo/components/d3/src/core/html.js
diff --git a/demo/components/d3/src/core/identity.js b/public/demo/components/d3/src/core/identity.js
similarity index 100%
rename from demo/components/d3/src/core/identity.js
rename to public/demo/components/d3/src/core/identity.js
diff --git a/demo/components/d3/src/core/interpolate.js b/public/demo/components/d3/src/core/interpolate.js
similarity index 100%
rename from demo/components/d3/src/core/interpolate.js
rename to public/demo/components/d3/src/core/interpolate.js
diff --git a/demo/components/d3/src/core/json.js b/public/demo/components/d3/src/core/json.js
similarity index 100%
rename from demo/components/d3/src/core/json.js
rename to public/demo/components/d3/src/core/json.js
diff --git a/demo/components/d3/src/core/keys.js b/public/demo/components/d3/src/core/keys.js
similarity index 100%
rename from demo/components/d3/src/core/keys.js
rename to public/demo/components/d3/src/core/keys.js
diff --git a/demo/components/d3/src/core/lab.js b/public/demo/components/d3/src/core/lab.js
similarity index 100%
rename from demo/components/d3/src/core/lab.js
rename to public/demo/components/d3/src/core/lab.js
diff --git a/demo/components/d3/src/core/map.js b/public/demo/components/d3/src/core/map.js
similarity index 100%
rename from demo/components/d3/src/core/map.js
rename to public/demo/components/d3/src/core/map.js
diff --git a/demo/components/d3/src/core/max.js b/public/demo/components/d3/src/core/max.js
similarity index 100%
rename from demo/components/d3/src/core/max.js
rename to public/demo/components/d3/src/core/max.js
diff --git a/demo/components/d3/src/core/mean.js b/public/demo/components/d3/src/core/mean.js
similarity index 100%
rename from demo/components/d3/src/core/mean.js
rename to public/demo/components/d3/src/core/mean.js
diff --git a/demo/components/d3/src/core/median.js b/public/demo/components/d3/src/core/median.js
similarity index 100%
rename from demo/components/d3/src/core/median.js
rename to public/demo/components/d3/src/core/median.js
diff --git a/demo/components/d3/src/core/merge.js b/public/demo/components/d3/src/core/merge.js
similarity index 100%
rename from demo/components/d3/src/core/merge.js
rename to public/demo/components/d3/src/core/merge.js
diff --git a/demo/components/d3/src/core/min.js b/public/demo/components/d3/src/core/min.js
similarity index 100%
rename from demo/components/d3/src/core/min.js
rename to public/demo/components/d3/src/core/min.js
diff --git a/demo/components/d3/src/core/mouse.js b/public/demo/components/d3/src/core/mouse.js
similarity index 100%
rename from demo/components/d3/src/core/mouse.js
rename to public/demo/components/d3/src/core/mouse.js
diff --git a/demo/components/d3/src/core/nest.js b/public/demo/components/d3/src/core/nest.js
similarity index 100%
rename from demo/components/d3/src/core/nest.js
rename to public/demo/components/d3/src/core/nest.js
diff --git a/demo/components/d3/src/core/noop.js b/public/demo/components/d3/src/core/noop.js
similarity index 100%
rename from demo/components/d3/src/core/noop.js
rename to public/demo/components/d3/src/core/noop.js
diff --git a/demo/components/d3/src/core/ns.js b/public/demo/components/d3/src/core/ns.js
similarity index 100%
rename from demo/components/d3/src/core/ns.js
rename to public/demo/components/d3/src/core/ns.js
diff --git a/demo/components/d3/src/core/number.js b/public/demo/components/d3/src/core/number.js
similarity index 100%
rename from demo/components/d3/src/core/number.js
rename to public/demo/components/d3/src/core/number.js
diff --git a/demo/components/d3/src/core/permute.js b/public/demo/components/d3/src/core/permute.js
similarity index 100%
rename from demo/components/d3/src/core/permute.js
rename to public/demo/components/d3/src/core/permute.js
diff --git a/demo/components/d3/src/core/quantile.js b/public/demo/components/d3/src/core/quantile.js
similarity index 100%
rename from demo/components/d3/src/core/quantile.js
rename to public/demo/components/d3/src/core/quantile.js
diff --git a/demo/components/d3/src/core/random.js b/public/demo/components/d3/src/core/random.js
similarity index 100%
rename from demo/components/d3/src/core/random.js
rename to public/demo/components/d3/src/core/random.js
diff --git a/demo/components/d3/src/core/range.js b/public/demo/components/d3/src/core/range.js
similarity index 100%
rename from demo/components/d3/src/core/range.js
rename to public/demo/components/d3/src/core/range.js
diff --git a/demo/components/d3/src/core/rebind.js b/public/demo/components/d3/src/core/rebind.js
similarity index 100%
rename from demo/components/d3/src/core/rebind.js
rename to public/demo/components/d3/src/core/rebind.js
diff --git a/demo/components/d3/src/core/requote.js b/public/demo/components/d3/src/core/requote.js
similarity index 100%
rename from demo/components/d3/src/core/requote.js
rename to public/demo/components/d3/src/core/requote.js
diff --git a/demo/components/d3/src/core/rgb.js b/public/demo/components/d3/src/core/rgb.js
similarity index 100%
rename from demo/components/d3/src/core/rgb.js
rename to public/demo/components/d3/src/core/rgb.js
diff --git a/demo/components/d3/src/core/round.js b/public/demo/components/d3/src/core/round.js
similarity index 100%
rename from demo/components/d3/src/core/round.js
rename to public/demo/components/d3/src/core/round.js
diff --git a/demo/components/d3/src/core/selection-append.js b/public/demo/components/d3/src/core/selection-append.js
similarity index 100%
rename from demo/components/d3/src/core/selection-append.js
rename to public/demo/components/d3/src/core/selection-append.js
diff --git a/demo/components/d3/src/core/selection-attr.js b/public/demo/components/d3/src/core/selection-attr.js
similarity index 100%
rename from demo/components/d3/src/core/selection-attr.js
rename to public/demo/components/d3/src/core/selection-attr.js
diff --git a/demo/components/d3/src/core/selection-call.js b/public/demo/components/d3/src/core/selection-call.js
similarity index 100%
rename from demo/components/d3/src/core/selection-call.js
rename to public/demo/components/d3/src/core/selection-call.js
diff --git a/demo/components/d3/src/core/selection-classed.js b/public/demo/components/d3/src/core/selection-classed.js
similarity index 100%
rename from demo/components/d3/src/core/selection-classed.js
rename to public/demo/components/d3/src/core/selection-classed.js
diff --git a/demo/components/d3/src/core/selection-data.js b/public/demo/components/d3/src/core/selection-data.js
similarity index 100%
rename from demo/components/d3/src/core/selection-data.js
rename to public/demo/components/d3/src/core/selection-data.js
diff --git a/demo/components/d3/src/core/selection-datum.js b/public/demo/components/d3/src/core/selection-datum.js
similarity index 100%
rename from demo/components/d3/src/core/selection-datum.js
rename to public/demo/components/d3/src/core/selection-datum.js
diff --git a/demo/components/d3/src/core/selection-each.js b/public/demo/components/d3/src/core/selection-each.js
similarity index 100%
rename from demo/components/d3/src/core/selection-each.js
rename to public/demo/components/d3/src/core/selection-each.js
diff --git a/demo/components/d3/src/core/selection-empty.js b/public/demo/components/d3/src/core/selection-empty.js
similarity index 100%
rename from demo/components/d3/src/core/selection-empty.js
rename to public/demo/components/d3/src/core/selection-empty.js
diff --git a/demo/components/d3/src/core/selection-enter-select.js b/public/demo/components/d3/src/core/selection-enter-select.js
similarity index 100%
rename from demo/components/d3/src/core/selection-enter-select.js
rename to public/demo/components/d3/src/core/selection-enter-select.js
diff --git a/demo/components/d3/src/core/selection-enter.js b/public/demo/components/d3/src/core/selection-enter.js
similarity index 100%
rename from demo/components/d3/src/core/selection-enter.js
rename to public/demo/components/d3/src/core/selection-enter.js
diff --git a/demo/components/d3/src/core/selection-filter.js b/public/demo/components/d3/src/core/selection-filter.js
similarity index 100%
rename from demo/components/d3/src/core/selection-filter.js
rename to public/demo/components/d3/src/core/selection-filter.js
diff --git a/demo/components/d3/src/core/selection-html.js b/public/demo/components/d3/src/core/selection-html.js
similarity index 100%
rename from demo/components/d3/src/core/selection-html.js
rename to public/demo/components/d3/src/core/selection-html.js
diff --git a/demo/components/d3/src/core/selection-insert.js b/public/demo/components/d3/src/core/selection-insert.js
similarity index 100%
rename from demo/components/d3/src/core/selection-insert.js
rename to public/demo/components/d3/src/core/selection-insert.js
diff --git a/demo/components/d3/src/core/selection-node.js b/public/demo/components/d3/src/core/selection-node.js
similarity index 100%
rename from demo/components/d3/src/core/selection-node.js
rename to public/demo/components/d3/src/core/selection-node.js
diff --git a/demo/components/d3/src/core/selection-on.js b/public/demo/components/d3/src/core/selection-on.js
similarity index 100%
rename from demo/components/d3/src/core/selection-on.js
rename to public/demo/components/d3/src/core/selection-on.js
diff --git a/demo/components/d3/src/core/selection-order.js b/public/demo/components/d3/src/core/selection-order.js
similarity index 100%
rename from demo/components/d3/src/core/selection-order.js
rename to public/demo/components/d3/src/core/selection-order.js
diff --git a/demo/components/d3/src/core/selection-property.js b/public/demo/components/d3/src/core/selection-property.js
similarity index 100%
rename from demo/components/d3/src/core/selection-property.js
rename to public/demo/components/d3/src/core/selection-property.js
diff --git a/demo/components/d3/src/core/selection-remove.js b/public/demo/components/d3/src/core/selection-remove.js
similarity index 100%
rename from demo/components/d3/src/core/selection-remove.js
rename to public/demo/components/d3/src/core/selection-remove.js
diff --git a/demo/components/d3/src/core/selection-root.js b/public/demo/components/d3/src/core/selection-root.js
similarity index 100%
rename from demo/components/d3/src/core/selection-root.js
rename to public/demo/components/d3/src/core/selection-root.js
diff --git a/demo/components/d3/src/core/selection-select.js b/public/demo/components/d3/src/core/selection-select.js
similarity index 100%
rename from demo/components/d3/src/core/selection-select.js
rename to public/demo/components/d3/src/core/selection-select.js
diff --git a/demo/components/d3/src/core/selection-selectAll.js b/public/demo/components/d3/src/core/selection-selectAll.js
similarity index 100%
rename from demo/components/d3/src/core/selection-selectAll.js
rename to public/demo/components/d3/src/core/selection-selectAll.js
diff --git a/demo/components/d3/src/core/selection-sort.js b/public/demo/components/d3/src/core/selection-sort.js
similarity index 100%
rename from demo/components/d3/src/core/selection-sort.js
rename to public/demo/components/d3/src/core/selection-sort.js
diff --git a/demo/components/d3/src/core/selection-style.js b/public/demo/components/d3/src/core/selection-style.js
similarity index 100%
rename from demo/components/d3/src/core/selection-style.js
rename to public/demo/components/d3/src/core/selection-style.js
diff --git a/demo/components/d3/src/core/selection-text.js b/public/demo/components/d3/src/core/selection-text.js
similarity index 100%
rename from demo/components/d3/src/core/selection-text.js
rename to public/demo/components/d3/src/core/selection-text.js
diff --git a/demo/components/d3/src/core/selection-transition.js b/public/demo/components/d3/src/core/selection-transition.js
similarity index 100%
rename from demo/components/d3/src/core/selection-transition.js
rename to public/demo/components/d3/src/core/selection-transition.js
diff --git a/demo/components/d3/src/core/selection.js b/public/demo/components/d3/src/core/selection.js
similarity index 100%
rename from demo/components/d3/src/core/selection.js
rename to public/demo/components/d3/src/core/selection.js
diff --git a/demo/components/d3/src/core/shuffle.js b/public/demo/components/d3/src/core/shuffle.js
similarity index 100%
rename from demo/components/d3/src/core/shuffle.js
rename to public/demo/components/d3/src/core/shuffle.js
diff --git a/demo/components/d3/src/core/sum.js b/public/demo/components/d3/src/core/sum.js
similarity index 100%
rename from demo/components/d3/src/core/sum.js
rename to public/demo/components/d3/src/core/sum.js
diff --git a/demo/components/d3/src/core/text.js b/public/demo/components/d3/src/core/text.js
similarity index 100%
rename from demo/components/d3/src/core/text.js
rename to public/demo/components/d3/src/core/text.js
diff --git a/demo/components/d3/src/core/timer.js b/public/demo/components/d3/src/core/timer.js
similarity index 100%
rename from demo/components/d3/src/core/timer.js
rename to public/demo/components/d3/src/core/timer.js
diff --git a/demo/components/d3/src/core/touches.js b/public/demo/components/d3/src/core/touches.js
similarity index 100%
rename from demo/components/d3/src/core/touches.js
rename to public/demo/components/d3/src/core/touches.js
diff --git a/demo/components/d3/src/core/transform.js b/public/demo/components/d3/src/core/transform.js
similarity index 100%
rename from demo/components/d3/src/core/transform.js
rename to public/demo/components/d3/src/core/transform.js
diff --git a/demo/components/d3/src/core/transition-attr.js b/public/demo/components/d3/src/core/transition-attr.js
similarity index 100%
rename from demo/components/d3/src/core/transition-attr.js
rename to public/demo/components/d3/src/core/transition-attr.js
diff --git a/demo/components/d3/src/core/transition-delay.js b/public/demo/components/d3/src/core/transition-delay.js
similarity index 100%
rename from demo/components/d3/src/core/transition-delay.js
rename to public/demo/components/d3/src/core/transition-delay.js
diff --git a/demo/components/d3/src/core/transition-duration.js b/public/demo/components/d3/src/core/transition-duration.js
similarity index 100%
rename from demo/components/d3/src/core/transition-duration.js
rename to public/demo/components/d3/src/core/transition-duration.js
diff --git a/demo/components/d3/src/core/transition-each.js b/public/demo/components/d3/src/core/transition-each.js
similarity index 100%
rename from demo/components/d3/src/core/transition-each.js
rename to public/demo/components/d3/src/core/transition-each.js
diff --git a/demo/components/d3/src/core/transition-ease.js b/public/demo/components/d3/src/core/transition-ease.js
similarity index 100%
rename from demo/components/d3/src/core/transition-ease.js
rename to public/demo/components/d3/src/core/transition-ease.js
diff --git a/demo/components/d3/src/core/transition-filter.js b/public/demo/components/d3/src/core/transition-filter.js
similarity index 100%
rename from demo/components/d3/src/core/transition-filter.js
rename to public/demo/components/d3/src/core/transition-filter.js
diff --git a/demo/components/d3/src/core/transition-remove.js b/public/demo/components/d3/src/core/transition-remove.js
similarity index 100%
rename from demo/components/d3/src/core/transition-remove.js
rename to public/demo/components/d3/src/core/transition-remove.js
diff --git a/demo/components/d3/src/core/transition-select.js b/public/demo/components/d3/src/core/transition-select.js
similarity index 100%
rename from demo/components/d3/src/core/transition-select.js
rename to public/demo/components/d3/src/core/transition-select.js
diff --git a/demo/components/d3/src/core/transition-selectAll.js b/public/demo/components/d3/src/core/transition-selectAll.js
similarity index 100%
rename from demo/components/d3/src/core/transition-selectAll.js
rename to public/demo/components/d3/src/core/transition-selectAll.js
diff --git a/demo/components/d3/src/core/transition-style.js b/public/demo/components/d3/src/core/transition-style.js
similarity index 100%
rename from demo/components/d3/src/core/transition-style.js
rename to public/demo/components/d3/src/core/transition-style.js
diff --git a/demo/components/d3/src/core/transition-text.js b/public/demo/components/d3/src/core/transition-text.js
similarity index 100%
rename from demo/components/d3/src/core/transition-text.js
rename to public/demo/components/d3/src/core/transition-text.js
diff --git a/demo/components/d3/src/core/transition-transition.js b/public/demo/components/d3/src/core/transition-transition.js
similarity index 100%
rename from demo/components/d3/src/core/transition-transition.js
rename to public/demo/components/d3/src/core/transition-transition.js
diff --git a/demo/components/d3/src/core/transition-tween.js b/public/demo/components/d3/src/core/transition-tween.js
similarity index 100%
rename from demo/components/d3/src/core/transition-tween.js
rename to public/demo/components/d3/src/core/transition-tween.js
diff --git a/demo/components/d3/src/core/transition.js b/public/demo/components/d3/src/core/transition.js
similarity index 100%
rename from demo/components/d3/src/core/transition.js
rename to public/demo/components/d3/src/core/transition.js
diff --git a/demo/components/d3/src/core/transpose.js b/public/demo/components/d3/src/core/transpose.js
similarity index 100%
rename from demo/components/d3/src/core/transpose.js
rename to public/demo/components/d3/src/core/transpose.js
diff --git a/demo/components/d3/src/core/true.js b/public/demo/components/d3/src/core/true.js
similarity index 100%
rename from demo/components/d3/src/core/true.js
rename to public/demo/components/d3/src/core/true.js
diff --git a/demo/components/d3/src/core/uninterpolate.js b/public/demo/components/d3/src/core/uninterpolate.js
similarity index 100%
rename from demo/components/d3/src/core/uninterpolate.js
rename to public/demo/components/d3/src/core/uninterpolate.js
diff --git a/demo/components/d3/src/core/values.js b/public/demo/components/d3/src/core/values.js
similarity index 100%
rename from demo/components/d3/src/core/values.js
rename to public/demo/components/d3/src/core/values.js
diff --git a/demo/components/d3/src/core/xhr.js b/public/demo/components/d3/src/core/xhr.js
similarity index 100%
rename from demo/components/d3/src/core/xhr.js
rename to public/demo/components/d3/src/core/xhr.js
diff --git a/demo/components/d3/src/core/xml.js b/public/demo/components/d3/src/core/xml.js
similarity index 100%
rename from demo/components/d3/src/core/xml.js
rename to public/demo/components/d3/src/core/xml.js
diff --git a/demo/components/d3/src/core/xyz.js b/public/demo/components/d3/src/core/xyz.js
similarity index 100%
rename from demo/components/d3/src/core/xyz.js
rename to public/demo/components/d3/src/core/xyz.js
diff --git a/demo/components/d3/src/core/zip.js b/public/demo/components/d3/src/core/zip.js
similarity index 100%
rename from demo/components/d3/src/core/zip.js
rename to public/demo/components/d3/src/core/zip.js
diff --git a/demo/components/d3/src/dsv/csv.js b/public/demo/components/d3/src/dsv/csv.js
similarity index 100%
rename from demo/components/d3/src/dsv/csv.js
rename to public/demo/components/d3/src/dsv/csv.js
diff --git a/demo/components/d3/src/dsv/dsv.js b/public/demo/components/d3/src/dsv/dsv.js
similarity index 100%
rename from demo/components/d3/src/dsv/dsv.js
rename to public/demo/components/d3/src/dsv/dsv.js
diff --git a/demo/components/d3/src/dsv/tsv.js b/public/demo/components/d3/src/dsv/tsv.js
similarity index 100%
rename from demo/components/d3/src/dsv/tsv.js
rename to public/demo/components/d3/src/dsv/tsv.js
diff --git a/demo/components/d3/src/end.js b/public/demo/components/d3/src/end.js
similarity index 100%
rename from demo/components/d3/src/end.js
rename to public/demo/components/d3/src/end.js
diff --git a/demo/components/d3/src/geo/albers-usa.js b/public/demo/components/d3/src/geo/albers-usa.js
similarity index 100%
rename from demo/components/d3/src/geo/albers-usa.js
rename to public/demo/components/d3/src/geo/albers-usa.js
diff --git a/demo/components/d3/src/geo/albers.js b/public/demo/components/d3/src/geo/albers.js
similarity index 100%
rename from demo/components/d3/src/geo/albers.js
rename to public/demo/components/d3/src/geo/albers.js
diff --git a/demo/components/d3/src/geo/area.js b/public/demo/components/d3/src/geo/area.js
similarity index 100%
rename from demo/components/d3/src/geo/area.js
rename to public/demo/components/d3/src/geo/area.js
diff --git a/demo/components/d3/src/geo/azimuthal-equal-area.js b/public/demo/components/d3/src/geo/azimuthal-equal-area.js
similarity index 100%
rename from demo/components/d3/src/geo/azimuthal-equal-area.js
rename to public/demo/components/d3/src/geo/azimuthal-equal-area.js
diff --git a/demo/components/d3/src/geo/azimuthal-equidistant.js b/public/demo/components/d3/src/geo/azimuthal-equidistant.js
similarity index 100%
rename from demo/components/d3/src/geo/azimuthal-equidistant.js
rename to public/demo/components/d3/src/geo/azimuthal-equidistant.js
diff --git a/demo/components/d3/src/geo/azimuthal.js b/public/demo/components/d3/src/geo/azimuthal.js
similarity index 100%
rename from demo/components/d3/src/geo/azimuthal.js
rename to public/demo/components/d3/src/geo/azimuthal.js
diff --git a/demo/components/d3/src/geo/bounds.js b/public/demo/components/d3/src/geo/bounds.js
similarity index 100%
rename from demo/components/d3/src/geo/bounds.js
rename to public/demo/components/d3/src/geo/bounds.js
diff --git a/demo/components/d3/src/geo/cartesian.js b/public/demo/components/d3/src/geo/cartesian.js
similarity index 100%
rename from demo/components/d3/src/geo/cartesian.js
rename to public/demo/components/d3/src/geo/cartesian.js
diff --git a/demo/components/d3/src/geo/centroid.js b/public/demo/components/d3/src/geo/centroid.js
similarity index 100%
rename from demo/components/d3/src/geo/centroid.js
rename to public/demo/components/d3/src/geo/centroid.js
diff --git a/demo/components/d3/src/geo/circle.js b/public/demo/components/d3/src/geo/circle.js
similarity index 100%
rename from demo/components/d3/src/geo/circle.js
rename to public/demo/components/d3/src/geo/circle.js
diff --git a/demo/components/d3/src/geo/clip-antimeridian.js b/public/demo/components/d3/src/geo/clip-antimeridian.js
similarity index 100%
rename from demo/components/d3/src/geo/clip-antimeridian.js
rename to public/demo/components/d3/src/geo/clip-antimeridian.js
diff --git a/demo/components/d3/src/geo/clip-circle.js b/public/demo/components/d3/src/geo/clip-circle.js
similarity index 100%
rename from demo/components/d3/src/geo/clip-circle.js
rename to public/demo/components/d3/src/geo/clip-circle.js
diff --git a/demo/components/d3/src/geo/clip.js b/public/demo/components/d3/src/geo/clip.js
similarity index 100%
rename from demo/components/d3/src/geo/clip.js
rename to public/demo/components/d3/src/geo/clip.js
diff --git a/demo/components/d3/src/geo/compose.js b/public/demo/components/d3/src/geo/compose.js
similarity index 100%
rename from demo/components/d3/src/geo/compose.js
rename to public/demo/components/d3/src/geo/compose.js
diff --git a/demo/components/d3/src/geo/equirectangular.js b/public/demo/components/d3/src/geo/equirectangular.js
similarity index 100%
rename from demo/components/d3/src/geo/equirectangular.js
rename to public/demo/components/d3/src/geo/equirectangular.js
diff --git a/demo/components/d3/src/geo/geo.js b/public/demo/components/d3/src/geo/geo.js
similarity index 100%
rename from demo/components/d3/src/geo/geo.js
rename to public/demo/components/d3/src/geo/geo.js
diff --git a/demo/components/d3/src/geo/gnomonic.js b/public/demo/components/d3/src/geo/gnomonic.js
similarity index 100%
rename from demo/components/d3/src/geo/gnomonic.js
rename to public/demo/components/d3/src/geo/gnomonic.js
diff --git a/demo/components/d3/src/geo/graticule.js b/public/demo/components/d3/src/geo/graticule.js
similarity index 100%
rename from demo/components/d3/src/geo/graticule.js
rename to public/demo/components/d3/src/geo/graticule.js
diff --git a/demo/components/d3/src/geo/greatArc.js b/public/demo/components/d3/src/geo/greatArc.js
similarity index 100%
rename from demo/components/d3/src/geo/greatArc.js
rename to public/demo/components/d3/src/geo/greatArc.js
diff --git a/demo/components/d3/src/geo/haversin.js b/public/demo/components/d3/src/geo/haversin.js
similarity index 100%
rename from demo/components/d3/src/geo/haversin.js
rename to public/demo/components/d3/src/geo/haversin.js
diff --git a/demo/components/d3/src/geo/interpolate.js b/public/demo/components/d3/src/geo/interpolate.js
similarity index 100%
rename from demo/components/d3/src/geo/interpolate.js
rename to public/demo/components/d3/src/geo/interpolate.js
diff --git a/demo/components/d3/src/geo/mercator.js b/public/demo/components/d3/src/geo/mercator.js
similarity index 100%
rename from demo/components/d3/src/geo/mercator.js
rename to public/demo/components/d3/src/geo/mercator.js
diff --git a/demo/components/d3/src/geo/orthographic.js b/public/demo/components/d3/src/geo/orthographic.js
similarity index 100%
rename from demo/components/d3/src/geo/orthographic.js
rename to public/demo/components/d3/src/geo/orthographic.js
diff --git a/demo/components/d3/src/geo/path-area.js b/public/demo/components/d3/src/geo/path-area.js
similarity index 100%
rename from demo/components/d3/src/geo/path-area.js
rename to public/demo/components/d3/src/geo/path-area.js
diff --git a/demo/components/d3/src/geo/path-buffer.js b/public/demo/components/d3/src/geo/path-buffer.js
similarity index 100%
rename from demo/components/d3/src/geo/path-buffer.js
rename to public/demo/components/d3/src/geo/path-buffer.js
diff --git a/demo/components/d3/src/geo/path-centroid.js b/public/demo/components/d3/src/geo/path-centroid.js
similarity index 100%
rename from demo/components/d3/src/geo/path-centroid.js
rename to public/demo/components/d3/src/geo/path-centroid.js
diff --git a/demo/components/d3/src/geo/path-context.js b/public/demo/components/d3/src/geo/path-context.js
similarity index 100%
rename from demo/components/d3/src/geo/path-context.js
rename to public/demo/components/d3/src/geo/path-context.js
diff --git a/demo/components/d3/src/geo/path.js b/public/demo/components/d3/src/geo/path.js
similarity index 100%
rename from demo/components/d3/src/geo/path.js
rename to public/demo/components/d3/src/geo/path.js
diff --git a/demo/components/d3/src/geo/projection.js b/public/demo/components/d3/src/geo/projection.js
similarity index 100%
rename from demo/components/d3/src/geo/projection.js
rename to public/demo/components/d3/src/geo/projection.js
diff --git a/demo/components/d3/src/geo/resample.js b/public/demo/components/d3/src/geo/resample.js
similarity index 100%
rename from demo/components/d3/src/geo/resample.js
rename to public/demo/components/d3/src/geo/resample.js
diff --git a/demo/components/d3/src/geo/rotation.js b/public/demo/components/d3/src/geo/rotation.js
similarity index 100%
rename from demo/components/d3/src/geo/rotation.js
rename to public/demo/components/d3/src/geo/rotation.js
diff --git a/demo/components/d3/src/geo/spherical.js b/public/demo/components/d3/src/geo/spherical.js
similarity index 100%
rename from demo/components/d3/src/geo/spherical.js
rename to public/demo/components/d3/src/geo/spherical.js
diff --git a/demo/components/d3/src/geo/stereographic.js b/public/demo/components/d3/src/geo/stereographic.js
similarity index 100%
rename from demo/components/d3/src/geo/stereographic.js
rename to public/demo/components/d3/src/geo/stereographic.js
diff --git a/demo/components/d3/src/geo/stream.js b/public/demo/components/d3/src/geo/stream.js
similarity index 100%
rename from demo/components/d3/src/geo/stream.js
rename to public/demo/components/d3/src/geo/stream.js
diff --git a/demo/components/d3/src/geom/delaunay.js b/public/demo/components/d3/src/geom/delaunay.js
similarity index 100%
rename from demo/components/d3/src/geom/delaunay.js
rename to public/demo/components/d3/src/geom/delaunay.js
diff --git a/demo/components/d3/src/geom/geom.js b/public/demo/components/d3/src/geom/geom.js
similarity index 100%
rename from demo/components/d3/src/geom/geom.js
rename to public/demo/components/d3/src/geom/geom.js
diff --git a/demo/components/d3/src/geom/hull.js b/public/demo/components/d3/src/geom/hull.js
similarity index 100%
rename from demo/components/d3/src/geom/hull.js
rename to public/demo/components/d3/src/geom/hull.js
diff --git a/demo/components/d3/src/geom/polygon.js b/public/demo/components/d3/src/geom/polygon.js
similarity index 100%
rename from demo/components/d3/src/geom/polygon.js
rename to public/demo/components/d3/src/geom/polygon.js
diff --git a/demo/components/d3/src/geom/quadtree.js b/public/demo/components/d3/src/geom/quadtree.js
similarity index 100%
rename from demo/components/d3/src/geom/quadtree.js
rename to public/demo/components/d3/src/geom/quadtree.js
diff --git a/demo/components/d3/src/geom/voronoi.js b/public/demo/components/d3/src/geom/voronoi.js
similarity index 100%
rename from demo/components/d3/src/geom/voronoi.js
rename to public/demo/components/d3/src/geom/voronoi.js
diff --git a/demo/components/d3/src/layout/bundle.js b/public/demo/components/d3/src/layout/bundle.js
similarity index 100%
rename from demo/components/d3/src/layout/bundle.js
rename to public/demo/components/d3/src/layout/bundle.js
diff --git a/demo/components/d3/src/layout/chord.js b/public/demo/components/d3/src/layout/chord.js
similarity index 100%
rename from demo/components/d3/src/layout/chord.js
rename to public/demo/components/d3/src/layout/chord.js
diff --git a/demo/components/d3/src/layout/cluster.js b/public/demo/components/d3/src/layout/cluster.js
similarity index 100%
rename from demo/components/d3/src/layout/cluster.js
rename to public/demo/components/d3/src/layout/cluster.js
diff --git a/demo/components/d3/src/layout/force.js b/public/demo/components/d3/src/layout/force.js
similarity index 100%
rename from demo/components/d3/src/layout/force.js
rename to public/demo/components/d3/src/layout/force.js
diff --git a/demo/components/d3/src/layout/hierarchy.js b/public/demo/components/d3/src/layout/hierarchy.js
similarity index 100%
rename from demo/components/d3/src/layout/hierarchy.js
rename to public/demo/components/d3/src/layout/hierarchy.js
diff --git a/demo/components/d3/src/layout/histogram.js b/public/demo/components/d3/src/layout/histogram.js
similarity index 100%
rename from demo/components/d3/src/layout/histogram.js
rename to public/demo/components/d3/src/layout/histogram.js
diff --git a/demo/components/d3/src/layout/layout.js b/public/demo/components/d3/src/layout/layout.js
similarity index 100%
rename from demo/components/d3/src/layout/layout.js
rename to public/demo/components/d3/src/layout/layout.js
diff --git a/demo/components/d3/src/layout/pack.js b/public/demo/components/d3/src/layout/pack.js
similarity index 100%
rename from demo/components/d3/src/layout/pack.js
rename to public/demo/components/d3/src/layout/pack.js
diff --git a/demo/components/d3/src/layout/partition.js b/public/demo/components/d3/src/layout/partition.js
similarity index 100%
rename from demo/components/d3/src/layout/partition.js
rename to public/demo/components/d3/src/layout/partition.js
diff --git a/demo/components/d3/src/layout/pie.js b/public/demo/components/d3/src/layout/pie.js
similarity index 100%
rename from demo/components/d3/src/layout/pie.js
rename to public/demo/components/d3/src/layout/pie.js
diff --git a/demo/components/d3/src/layout/stack.js b/public/demo/components/d3/src/layout/stack.js
similarity index 100%
rename from demo/components/d3/src/layout/stack.js
rename to public/demo/components/d3/src/layout/stack.js
diff --git a/demo/components/d3/src/layout/tree.js b/public/demo/components/d3/src/layout/tree.js
similarity index 100%
rename from demo/components/d3/src/layout/tree.js
rename to public/demo/components/d3/src/layout/tree.js
diff --git a/demo/components/d3/src/layout/treemap.js b/public/demo/components/d3/src/layout/treemap.js
similarity index 100%
rename from demo/components/d3/src/layout/treemap.js
rename to public/demo/components/d3/src/layout/treemap.js
diff --git a/demo/components/d3/src/locale.js b/public/demo/components/d3/src/locale.js
similarity index 100%
rename from demo/components/d3/src/locale.js
rename to public/demo/components/d3/src/locale.js
diff --git a/demo/components/d3/src/package.js b/public/demo/components/d3/src/package.js
similarity index 100%
rename from demo/components/d3/src/package.js
rename to public/demo/components/d3/src/package.js
diff --git a/demo/components/d3/src/scale/bilinear.js b/public/demo/components/d3/src/scale/bilinear.js
similarity index 100%
rename from demo/components/d3/src/scale/bilinear.js
rename to public/demo/components/d3/src/scale/bilinear.js
diff --git a/demo/components/d3/src/scale/category.js b/public/demo/components/d3/src/scale/category.js
similarity index 100%
rename from demo/components/d3/src/scale/category.js
rename to public/demo/components/d3/src/scale/category.js
diff --git a/demo/components/d3/src/scale/identity.js b/public/demo/components/d3/src/scale/identity.js
similarity index 100%
rename from demo/components/d3/src/scale/identity.js
rename to public/demo/components/d3/src/scale/identity.js
diff --git a/demo/components/d3/src/scale/linear.js b/public/demo/components/d3/src/scale/linear.js
similarity index 100%
rename from demo/components/d3/src/scale/linear.js
rename to public/demo/components/d3/src/scale/linear.js
diff --git a/demo/components/d3/src/scale/log.js b/public/demo/components/d3/src/scale/log.js
similarity index 100%
rename from demo/components/d3/src/scale/log.js
rename to public/demo/components/d3/src/scale/log.js
diff --git a/demo/components/d3/src/scale/nice.js b/public/demo/components/d3/src/scale/nice.js
similarity index 100%
rename from demo/components/d3/src/scale/nice.js
rename to public/demo/components/d3/src/scale/nice.js
diff --git a/demo/components/d3/src/scale/ordinal.js b/public/demo/components/d3/src/scale/ordinal.js
similarity index 100%
rename from demo/components/d3/src/scale/ordinal.js
rename to public/demo/components/d3/src/scale/ordinal.js
diff --git a/demo/components/d3/src/scale/polylinear.js b/public/demo/components/d3/src/scale/polylinear.js
similarity index 100%
rename from demo/components/d3/src/scale/polylinear.js
rename to public/demo/components/d3/src/scale/polylinear.js
diff --git a/demo/components/d3/src/scale/pow.js b/public/demo/components/d3/src/scale/pow.js
similarity index 100%
rename from demo/components/d3/src/scale/pow.js
rename to public/demo/components/d3/src/scale/pow.js
diff --git a/demo/components/d3/src/scale/quantile.js b/public/demo/components/d3/src/scale/quantile.js
similarity index 100%
rename from demo/components/d3/src/scale/quantile.js
rename to public/demo/components/d3/src/scale/quantile.js
diff --git a/demo/components/d3/src/scale/quantize.js b/public/demo/components/d3/src/scale/quantize.js
similarity index 100%
rename from demo/components/d3/src/scale/quantize.js
rename to public/demo/components/d3/src/scale/quantize.js
diff --git a/demo/components/d3/src/scale/scale.js b/public/demo/components/d3/src/scale/scale.js
similarity index 100%
rename from demo/components/d3/src/scale/scale.js
rename to public/demo/components/d3/src/scale/scale.js
diff --git a/demo/components/d3/src/scale/sqrt.js b/public/demo/components/d3/src/scale/sqrt.js
similarity index 100%
rename from demo/components/d3/src/scale/sqrt.js
rename to public/demo/components/d3/src/scale/sqrt.js
diff --git a/demo/components/d3/src/scale/threshold.js b/public/demo/components/d3/src/scale/threshold.js
similarity index 100%
rename from demo/components/d3/src/scale/threshold.js
rename to public/demo/components/d3/src/scale/threshold.js
diff --git a/demo/components/d3/src/start.js b/public/demo/components/d3/src/start.js
similarity index 100%
rename from demo/components/d3/src/start.js
rename to public/demo/components/d3/src/start.js
diff --git a/demo/components/d3/src/svg/arc.js b/public/demo/components/d3/src/svg/arc.js
similarity index 100%
rename from demo/components/d3/src/svg/arc.js
rename to public/demo/components/d3/src/svg/arc.js
diff --git a/demo/components/d3/src/svg/area-radial.js b/public/demo/components/d3/src/svg/area-radial.js
similarity index 100%
rename from demo/components/d3/src/svg/area-radial.js
rename to public/demo/components/d3/src/svg/area-radial.js
diff --git a/demo/components/d3/src/svg/area.js b/public/demo/components/d3/src/svg/area.js
similarity index 100%
rename from demo/components/d3/src/svg/area.js
rename to public/demo/components/d3/src/svg/area.js
diff --git a/demo/components/d3/src/svg/axis.js b/public/demo/components/d3/src/svg/axis.js
similarity index 100%
rename from demo/components/d3/src/svg/axis.js
rename to public/demo/components/d3/src/svg/axis.js
diff --git a/demo/components/d3/src/svg/brush.js b/public/demo/components/d3/src/svg/brush.js
similarity index 100%
rename from demo/components/d3/src/svg/brush.js
rename to public/demo/components/d3/src/svg/brush.js
diff --git a/demo/components/d3/src/svg/chord.js b/public/demo/components/d3/src/svg/chord.js
similarity index 100%
rename from demo/components/d3/src/svg/chord.js
rename to public/demo/components/d3/src/svg/chord.js
diff --git a/demo/components/d3/src/svg/diagonal-radial.js b/public/demo/components/d3/src/svg/diagonal-radial.js
similarity index 100%
rename from demo/components/d3/src/svg/diagonal-radial.js
rename to public/demo/components/d3/src/svg/diagonal-radial.js
diff --git a/demo/components/d3/src/svg/diagonal.js b/public/demo/components/d3/src/svg/diagonal.js
similarity index 100%
rename from demo/components/d3/src/svg/diagonal.js
rename to public/demo/components/d3/src/svg/diagonal.js
diff --git a/demo/components/d3/src/svg/line-radial.js b/public/demo/components/d3/src/svg/line-radial.js
similarity index 100%
rename from demo/components/d3/src/svg/line-radial.js
rename to public/demo/components/d3/src/svg/line-radial.js
diff --git a/demo/components/d3/src/svg/line.js b/public/demo/components/d3/src/svg/line.js
similarity index 100%
rename from demo/components/d3/src/svg/line.js
rename to public/demo/components/d3/src/svg/line.js
diff --git a/demo/components/d3/src/svg/svg.js b/public/demo/components/d3/src/svg/svg.js
similarity index 100%
rename from demo/components/d3/src/svg/svg.js
rename to public/demo/components/d3/src/svg/svg.js
diff --git a/demo/components/d3/src/svg/symbol.js b/public/demo/components/d3/src/svg/symbol.js
similarity index 100%
rename from demo/components/d3/src/svg/symbol.js
rename to public/demo/components/d3/src/svg/symbol.js
diff --git a/demo/components/d3/src/time/day.js b/public/demo/components/d3/src/time/day.js
similarity index 100%
rename from demo/components/d3/src/time/day.js
rename to public/demo/components/d3/src/time/day.js
diff --git a/demo/components/d3/src/time/format-iso.js b/public/demo/components/d3/src/time/format-iso.js
similarity index 100%
rename from demo/components/d3/src/time/format-iso.js
rename to public/demo/components/d3/src/time/format-iso.js
diff --git a/demo/components/d3/src/time/format-locale.js b/public/demo/components/d3/src/time/format-locale.js
similarity index 100%
rename from demo/components/d3/src/time/format-locale.js
rename to public/demo/components/d3/src/time/format-locale.js
diff --git a/demo/components/d3/src/time/format-utc.js b/public/demo/components/d3/src/time/format-utc.js
similarity index 100%
rename from demo/components/d3/src/time/format-utc.js
rename to public/demo/components/d3/src/time/format-utc.js
diff --git a/demo/components/d3/src/time/format.js b/public/demo/components/d3/src/time/format.js
similarity index 100%
rename from demo/components/d3/src/time/format.js
rename to public/demo/components/d3/src/time/format.js
diff --git a/demo/components/d3/src/time/hour.js b/public/demo/components/d3/src/time/hour.js
similarity index 100%
rename from demo/components/d3/src/time/hour.js
rename to public/demo/components/d3/src/time/hour.js
diff --git a/demo/components/d3/src/time/interval.js b/public/demo/components/d3/src/time/interval.js
similarity index 100%
rename from demo/components/d3/src/time/interval.js
rename to public/demo/components/d3/src/time/interval.js
diff --git a/demo/components/d3/src/time/minute.js b/public/demo/components/d3/src/time/minute.js
similarity index 100%
rename from demo/components/d3/src/time/minute.js
rename to public/demo/components/d3/src/time/minute.js
diff --git a/demo/components/d3/src/time/month.js b/public/demo/components/d3/src/time/month.js
similarity index 100%
rename from demo/components/d3/src/time/month.js
rename to public/demo/components/d3/src/time/month.js
diff --git a/demo/components/d3/src/time/scale-utc.js b/public/demo/components/d3/src/time/scale-utc.js
similarity index 100%
rename from demo/components/d3/src/time/scale-utc.js
rename to public/demo/components/d3/src/time/scale-utc.js
diff --git a/demo/components/d3/src/time/scale.js b/public/demo/components/d3/src/time/scale.js
similarity index 100%
rename from demo/components/d3/src/time/scale.js
rename to public/demo/components/d3/src/time/scale.js
diff --git a/demo/components/d3/src/time/second.js b/public/demo/components/d3/src/time/second.js
similarity index 100%
rename from demo/components/d3/src/time/second.js
rename to public/demo/components/d3/src/time/second.js
diff --git a/demo/components/d3/src/time/time.js b/public/demo/components/d3/src/time/time.js
similarity index 100%
rename from demo/components/d3/src/time/time.js
rename to public/demo/components/d3/src/time/time.js
diff --git a/demo/components/d3/src/time/week.js b/public/demo/components/d3/src/time/week.js
similarity index 100%
rename from demo/components/d3/src/time/week.js
rename to public/demo/components/d3/src/time/week.js
diff --git a/demo/components/d3/src/time/year.js b/public/demo/components/d3/src/time/year.js
similarity index 100%
rename from demo/components/d3/src/time/year.js
rename to public/demo/components/d3/src/time/year.js
diff --git a/demo/components/d3/test/core/ascending-test.js b/public/demo/components/d3/test/core/ascending-test.js
similarity index 100%
rename from demo/components/d3/test/core/ascending-test.js
rename to public/demo/components/d3/test/core/ascending-test.js
diff --git a/demo/components/d3/test/core/bisect-test.js b/public/demo/components/d3/test/core/bisect-test.js
similarity index 100%
rename from demo/components/d3/test/core/bisect-test.js
rename to public/demo/components/d3/test/core/bisect-test.js
diff --git a/demo/components/d3/test/core/descending-test.js b/public/demo/components/d3/test/core/descending-test.js
similarity index 100%
rename from demo/components/d3/test/core/descending-test.js
rename to public/demo/components/d3/test/core/descending-test.js
diff --git a/demo/components/d3/test/core/dispatch-test.js b/public/demo/components/d3/test/core/dispatch-test.js
similarity index 100%
rename from demo/components/d3/test/core/dispatch-test.js
rename to public/demo/components/d3/test/core/dispatch-test.js
diff --git a/demo/components/d3/test/core/ease-test.js b/public/demo/components/d3/test/core/ease-test.js
similarity index 100%
rename from demo/components/d3/test/core/ease-test.js
rename to public/demo/components/d3/test/core/ease-test.js
diff --git a/demo/components/d3/test/core/entries-test.js b/public/demo/components/d3/test/core/entries-test.js
similarity index 100%
rename from demo/components/d3/test/core/entries-test.js
rename to public/demo/components/d3/test/core/entries-test.js
diff --git a/demo/components/d3/test/core/extent-test.js b/public/demo/components/d3/test/core/extent-test.js
similarity index 100%
rename from demo/components/d3/test/core/extent-test.js
rename to public/demo/components/d3/test/core/extent-test.js
diff --git a/demo/components/d3/test/core/format-test.js b/public/demo/components/d3/test/core/format-test.js
similarity index 100%
rename from demo/components/d3/test/core/format-test.js
rename to public/demo/components/d3/test/core/format-test.js
diff --git a/demo/components/d3/test/core/formatPrefix-test.js b/public/demo/components/d3/test/core/formatPrefix-test.js
similarity index 100%
rename from demo/components/d3/test/core/formatPrefix-test.js
rename to public/demo/components/d3/test/core/formatPrefix-test.js
diff --git a/demo/components/d3/test/core/functor-test.js b/public/demo/components/d3/test/core/functor-test.js
similarity index 100%
rename from demo/components/d3/test/core/functor-test.js
rename to public/demo/components/d3/test/core/functor-test.js
diff --git a/demo/components/d3/test/core/hcl-test.js b/public/demo/components/d3/test/core/hcl-test.js
similarity index 100%
rename from demo/components/d3/test/core/hcl-test.js
rename to public/demo/components/d3/test/core/hcl-test.js
diff --git a/demo/components/d3/test/core/hsl-test.js b/public/demo/components/d3/test/core/hsl-test.js
similarity index 100%
rename from demo/components/d3/test/core/hsl-test.js
rename to public/demo/components/d3/test/core/hsl-test.js
diff --git a/demo/components/d3/test/core/html-test.js b/public/demo/components/d3/test/core/html-test.js
similarity index 100%
rename from demo/components/d3/test/core/html-test.js
rename to public/demo/components/d3/test/core/html-test.js
diff --git a/demo/components/d3/test/core/interpolate-test.js b/public/demo/components/d3/test/core/interpolate-test.js
similarity index 100%
rename from demo/components/d3/test/core/interpolate-test.js
rename to public/demo/components/d3/test/core/interpolate-test.js
diff --git a/demo/components/d3/test/core/json-test.js b/public/demo/components/d3/test/core/json-test.js
similarity index 100%
rename from demo/components/d3/test/core/json-test.js
rename to public/demo/components/d3/test/core/json-test.js
diff --git a/demo/components/d3/test/core/keys-test.js b/public/demo/components/d3/test/core/keys-test.js
similarity index 100%
rename from demo/components/d3/test/core/keys-test.js
rename to public/demo/components/d3/test/core/keys-test.js
diff --git a/demo/components/d3/test/core/lab-test.js b/public/demo/components/d3/test/core/lab-test.js
similarity index 100%
rename from demo/components/d3/test/core/lab-test.js
rename to public/demo/components/d3/test/core/lab-test.js
diff --git a/demo/components/d3/test/core/map-test.js b/public/demo/components/d3/test/core/map-test.js
similarity index 100%
rename from demo/components/d3/test/core/map-test.js
rename to public/demo/components/d3/test/core/map-test.js
diff --git a/demo/components/d3/test/core/max-test.js b/public/demo/components/d3/test/core/max-test.js
similarity index 100%
rename from demo/components/d3/test/core/max-test.js
rename to public/demo/components/d3/test/core/max-test.js
diff --git a/demo/components/d3/test/core/mean-test.js b/public/demo/components/d3/test/core/mean-test.js
similarity index 100%
rename from demo/components/d3/test/core/mean-test.js
rename to public/demo/components/d3/test/core/mean-test.js
diff --git a/demo/components/d3/test/core/median-test.js b/public/demo/components/d3/test/core/median-test.js
similarity index 100%
rename from demo/components/d3/test/core/median-test.js
rename to public/demo/components/d3/test/core/median-test.js
diff --git a/demo/components/d3/test/core/merge-test.js b/public/demo/components/d3/test/core/merge-test.js
similarity index 100%
rename from demo/components/d3/test/core/merge-test.js
rename to public/demo/components/d3/test/core/merge-test.js
diff --git a/demo/components/d3/test/core/min-test.js b/public/demo/components/d3/test/core/min-test.js
similarity index 100%
rename from demo/components/d3/test/core/min-test.js
rename to public/demo/components/d3/test/core/min-test.js
diff --git a/demo/components/d3/test/core/mouse-test.html b/public/demo/components/d3/test/core/mouse-test.html
similarity index 100%
rename from demo/components/d3/test/core/mouse-test.html
rename to public/demo/components/d3/test/core/mouse-test.html
diff --git a/demo/components/d3/test/core/nest-test.js b/public/demo/components/d3/test/core/nest-test.js
similarity index 100%
rename from demo/components/d3/test/core/nest-test.js
rename to public/demo/components/d3/test/core/nest-test.js
diff --git a/demo/components/d3/test/core/ns-test.js b/public/demo/components/d3/test/core/ns-test.js
similarity index 100%
rename from demo/components/d3/test/core/ns-test.js
rename to public/demo/components/d3/test/core/ns-test.js
diff --git a/demo/components/d3/test/core/permute-test.js b/public/demo/components/d3/test/core/permute-test.js
similarity index 100%
rename from demo/components/d3/test/core/permute-test.js
rename to public/demo/components/d3/test/core/permute-test.js
diff --git a/demo/components/d3/test/core/quantile-test.js b/public/demo/components/d3/test/core/quantile-test.js
similarity index 100%
rename from demo/components/d3/test/core/quantile-test.js
rename to public/demo/components/d3/test/core/quantile-test.js
diff --git a/demo/components/d3/test/core/random-test.js b/public/demo/components/d3/test/core/random-test.js
similarity index 100%
rename from demo/components/d3/test/core/random-test.js
rename to public/demo/components/d3/test/core/random-test.js
diff --git a/demo/components/d3/test/core/range-test.js b/public/demo/components/d3/test/core/range-test.js
similarity index 100%
rename from demo/components/d3/test/core/range-test.js
rename to public/demo/components/d3/test/core/range-test.js
diff --git a/demo/components/d3/test/core/rebind-test.js b/public/demo/components/d3/test/core/rebind-test.js
similarity index 100%
rename from demo/components/d3/test/core/rebind-test.js
rename to public/demo/components/d3/test/core/rebind-test.js
diff --git a/demo/components/d3/test/core/requote-test.js b/public/demo/components/d3/test/core/requote-test.js
similarity index 100%
rename from demo/components/d3/test/core/requote-test.js
rename to public/demo/components/d3/test/core/requote-test.js
diff --git a/demo/components/d3/test/core/rgb-test.js b/public/demo/components/d3/test/core/rgb-test.js
similarity index 100%
rename from demo/components/d3/test/core/rgb-test.js
rename to public/demo/components/d3/test/core/rgb-test.js
diff --git a/demo/components/d3/test/core/round-test.js b/public/demo/components/d3/test/core/round-test.js
similarity index 100%
rename from demo/components/d3/test/core/round-test.js
rename to public/demo/components/d3/test/core/round-test.js
diff --git a/demo/components/d3/test/core/select-test.js b/public/demo/components/d3/test/core/select-test.js
similarity index 100%
rename from demo/components/d3/test/core/select-test.js
rename to public/demo/components/d3/test/core/select-test.js
diff --git a/demo/components/d3/test/core/selectAll-test.js b/public/demo/components/d3/test/core/selectAll-test.js
similarity index 100%
rename from demo/components/d3/test/core/selectAll-test.js
rename to public/demo/components/d3/test/core/selectAll-test.js
diff --git a/demo/components/d3/test/core/selection-append-test.js b/public/demo/components/d3/test/core/selection-append-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-append-test.js
rename to public/demo/components/d3/test/core/selection-append-test.js
diff --git a/demo/components/d3/test/core/selection-attr-test.js b/public/demo/components/d3/test/core/selection-attr-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-attr-test.js
rename to public/demo/components/d3/test/core/selection-attr-test.js
diff --git a/demo/components/d3/test/core/selection-call-test.js b/public/demo/components/d3/test/core/selection-call-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-call-test.js
rename to public/demo/components/d3/test/core/selection-call-test.js
diff --git a/demo/components/d3/test/core/selection-classed-test.js b/public/demo/components/d3/test/core/selection-classed-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-classed-test.js
rename to public/demo/components/d3/test/core/selection-classed-test.js
diff --git a/demo/components/d3/test/core/selection-data-test.js b/public/demo/components/d3/test/core/selection-data-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-data-test.js
rename to public/demo/components/d3/test/core/selection-data-test.js
diff --git a/demo/components/d3/test/core/selection-datum-test.js b/public/demo/components/d3/test/core/selection-datum-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-datum-test.js
rename to public/demo/components/d3/test/core/selection-datum-test.js
diff --git a/demo/components/d3/test/core/selection-each-test.js b/public/demo/components/d3/test/core/selection-each-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-each-test.js
rename to public/demo/components/d3/test/core/selection-each-test.js
diff --git a/demo/components/d3/test/core/selection-empty-test.js b/public/demo/components/d3/test/core/selection-empty-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-empty-test.js
rename to public/demo/components/d3/test/core/selection-empty-test.js
diff --git a/demo/components/d3/test/core/selection-enter-test.js b/public/demo/components/d3/test/core/selection-enter-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-enter-test.js
rename to public/demo/components/d3/test/core/selection-enter-test.js
diff --git a/demo/components/d3/test/core/selection-filter-test.js b/public/demo/components/d3/test/core/selection-filter-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-filter-test.js
rename to public/demo/components/d3/test/core/selection-filter-test.js
diff --git a/demo/components/d3/test/core/selection-html-test.js b/public/demo/components/d3/test/core/selection-html-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-html-test.js
rename to public/demo/components/d3/test/core/selection-html-test.js
diff --git a/demo/components/d3/test/core/selection-insert-test.js b/public/demo/components/d3/test/core/selection-insert-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-insert-test.js
rename to public/demo/components/d3/test/core/selection-insert-test.js
diff --git a/demo/components/d3/test/core/selection-node-test.js b/public/demo/components/d3/test/core/selection-node-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-node-test.js
rename to public/demo/components/d3/test/core/selection-node-test.js
diff --git a/demo/components/d3/test/core/selection-on-test.js b/public/demo/components/d3/test/core/selection-on-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-on-test.js
rename to public/demo/components/d3/test/core/selection-on-test.js
diff --git a/demo/components/d3/test/core/selection-order-test.js b/public/demo/components/d3/test/core/selection-order-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-order-test.js
rename to public/demo/components/d3/test/core/selection-order-test.js
diff --git a/demo/components/d3/test/core/selection-property-test.js b/public/demo/components/d3/test/core/selection-property-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-property-test.js
rename to public/demo/components/d3/test/core/selection-property-test.js
diff --git a/demo/components/d3/test/core/selection-remove-test.js b/public/demo/components/d3/test/core/selection-remove-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-remove-test.js
rename to public/demo/components/d3/test/core/selection-remove-test.js
diff --git a/demo/components/d3/test/core/selection-select-test.js b/public/demo/components/d3/test/core/selection-select-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-select-test.js
rename to public/demo/components/d3/test/core/selection-select-test.js
diff --git a/demo/components/d3/test/core/selection-selectAll-test.js b/public/demo/components/d3/test/core/selection-selectAll-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-selectAll-test.js
rename to public/demo/components/d3/test/core/selection-selectAll-test.js
diff --git a/demo/components/d3/test/core/selection-sort-test.js b/public/demo/components/d3/test/core/selection-sort-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-sort-test.js
rename to public/demo/components/d3/test/core/selection-sort-test.js
diff --git a/demo/components/d3/test/core/selection-style-test.js b/public/demo/components/d3/test/core/selection-style-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-style-test.js
rename to public/demo/components/d3/test/core/selection-style-test.js
diff --git a/demo/components/d3/test/core/selection-test.js b/public/demo/components/d3/test/core/selection-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-test.js
rename to public/demo/components/d3/test/core/selection-test.js
diff --git a/demo/components/d3/test/core/selection-text-test.js b/public/demo/components/d3/test/core/selection-text-test.js
similarity index 100%
rename from demo/components/d3/test/core/selection-text-test.js
rename to public/demo/components/d3/test/core/selection-text-test.js
diff --git a/demo/components/d3/test/core/sum-test.js b/public/demo/components/d3/test/core/sum-test.js
similarity index 100%
rename from demo/components/d3/test/core/sum-test.js
rename to public/demo/components/d3/test/core/sum-test.js
diff --git a/demo/components/d3/test/core/text-test.js b/public/demo/components/d3/test/core/text-test.js
similarity index 100%
rename from demo/components/d3/test/core/text-test.js
rename to public/demo/components/d3/test/core/text-test.js
diff --git a/demo/components/d3/test/core/timer-test.js b/public/demo/components/d3/test/core/timer-test.js
similarity index 100%
rename from demo/components/d3/test/core/timer-test.js
rename to public/demo/components/d3/test/core/timer-test.js
diff --git a/demo/components/d3/test/core/touch-test.html b/public/demo/components/d3/test/core/touch-test.html
similarity index 100%
rename from demo/components/d3/test/core/touch-test.html
rename to public/demo/components/d3/test/core/touch-test.html
diff --git a/demo/components/d3/test/core/transform-null-matrix-test.html b/public/demo/components/d3/test/core/transform-null-matrix-test.html
similarity index 100%
rename from demo/components/d3/test/core/transform-null-matrix-test.html
rename to public/demo/components/d3/test/core/transform-null-matrix-test.html
diff --git a/demo/components/d3/test/core/transform-null-test.html b/public/demo/components/d3/test/core/transform-null-test.html
similarity index 100%
rename from demo/components/d3/test/core/transform-null-test.html
rename to public/demo/components/d3/test/core/transform-null-test.html
diff --git a/demo/components/d3/test/core/transform-rotate-origin-test.html b/public/demo/components/d3/test/core/transform-rotate-origin-test.html
similarity index 100%
rename from demo/components/d3/test/core/transform-rotate-origin-test.html
rename to public/demo/components/d3/test/core/transform-rotate-origin-test.html
diff --git a/demo/components/d3/test/core/transform-rotate-test.html b/public/demo/components/d3/test/core/transform-rotate-test.html
similarity index 100%
rename from demo/components/d3/test/core/transform-rotate-test.html
rename to public/demo/components/d3/test/core/transform-rotate-test.html
diff --git a/demo/components/d3/test/core/transform-test.html b/public/demo/components/d3/test/core/transform-test.html
similarity index 100%
rename from demo/components/d3/test/core/transform-test.html
rename to public/demo/components/d3/test/core/transform-test.html
diff --git a/demo/components/d3/test/core/transition-test-attr.js b/public/demo/components/d3/test/core/transition-test-attr.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-attr.js
rename to public/demo/components/d3/test/core/transition-test-attr.js
diff --git a/demo/components/d3/test/core/transition-test-attrTween.js b/public/demo/components/d3/test/core/transition-test-attrTween.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-attrTween.js
rename to public/demo/components/d3/test/core/transition-test-attrTween.js
diff --git a/demo/components/d3/test/core/transition-test-call.js b/public/demo/components/d3/test/core/transition-test-call.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-call.js
rename to public/demo/components/d3/test/core/transition-test-call.js
diff --git a/demo/components/d3/test/core/transition-test-delay.js b/public/demo/components/d3/test/core/transition-test-delay.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-delay.js
rename to public/demo/components/d3/test/core/transition-test-delay.js
diff --git a/demo/components/d3/test/core/transition-test-duration.js b/public/demo/components/d3/test/core/transition-test-duration.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-duration.js
rename to public/demo/components/d3/test/core/transition-test-duration.js
diff --git a/demo/components/d3/test/core/transition-test-each.js b/public/demo/components/d3/test/core/transition-test-each.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-each.js
rename to public/demo/components/d3/test/core/transition-test-each.js
diff --git a/demo/components/d3/test/core/transition-test-filter.js b/public/demo/components/d3/test/core/transition-test-filter.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-filter.js
rename to public/demo/components/d3/test/core/transition-test-filter.js
diff --git a/demo/components/d3/test/core/transition-test-id.js b/public/demo/components/d3/test/core/transition-test-id.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-id.js
rename to public/demo/components/d3/test/core/transition-test-id.js
diff --git a/demo/components/d3/test/core/transition-test-remove.js b/public/demo/components/d3/test/core/transition-test-remove.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-remove.js
rename to public/demo/components/d3/test/core/transition-test-remove.js
diff --git a/demo/components/d3/test/core/transition-test-select.js b/public/demo/components/d3/test/core/transition-test-select.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-select.js
rename to public/demo/components/d3/test/core/transition-test-select.js
diff --git a/demo/components/d3/test/core/transition-test-selectAll.js b/public/demo/components/d3/test/core/transition-test-selectAll.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-selectAll.js
rename to public/demo/components/d3/test/core/transition-test-selectAll.js
diff --git a/demo/components/d3/test/core/transition-test-style.js b/public/demo/components/d3/test/core/transition-test-style.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-style.js
rename to public/demo/components/d3/test/core/transition-test-style.js
diff --git a/demo/components/d3/test/core/transition-test-styleTween.js b/public/demo/components/d3/test/core/transition-test-styleTween.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-styleTween.js
rename to public/demo/components/d3/test/core/transition-test-styleTween.js
diff --git a/demo/components/d3/test/core/transition-test-text.js b/public/demo/components/d3/test/core/transition-test-text.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-text.js
rename to public/demo/components/d3/test/core/transition-test-text.js
diff --git a/demo/components/d3/test/core/transition-test-time.js b/public/demo/components/d3/test/core/transition-test-time.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-time.js
rename to public/demo/components/d3/test/core/transition-test-time.js
diff --git a/demo/components/d3/test/core/transition-test-transition.js b/public/demo/components/d3/test/core/transition-test-transition.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-transition.js
rename to public/demo/components/d3/test/core/transition-test-transition.js
diff --git a/demo/components/d3/test/core/transition-test-tween.js b/public/demo/components/d3/test/core/transition-test-tween.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test-tween.js
rename to public/demo/components/d3/test/core/transition-test-tween.js
diff --git a/demo/components/d3/test/core/transition-test.js b/public/demo/components/d3/test/core/transition-test.js
similarity index 100%
rename from demo/components/d3/test/core/transition-test.js
rename to public/demo/components/d3/test/core/transition-test.js
diff --git a/demo/components/d3/test/core/transpose-test.js b/public/demo/components/d3/test/core/transpose-test.js
similarity index 100%
rename from demo/components/d3/test/core/transpose-test.js
rename to public/demo/components/d3/test/core/transpose-test.js
diff --git a/demo/components/d3/test/core/values-test.js b/public/demo/components/d3/test/core/values-test.js
similarity index 100%
rename from demo/components/d3/test/core/values-test.js
rename to public/demo/components/d3/test/core/values-test.js
diff --git a/demo/components/d3/test/core/version-test.js b/public/demo/components/d3/test/core/version-test.js
similarity index 100%
rename from demo/components/d3/test/core/version-test.js
rename to public/demo/components/d3/test/core/version-test.js
diff --git a/demo/components/d3/test/core/xhr-test.js b/public/demo/components/d3/test/core/xhr-test.js
similarity index 100%
rename from demo/components/d3/test/core/xhr-test.js
rename to public/demo/components/d3/test/core/xhr-test.js
diff --git a/demo/components/d3/test/core/xml-test.js b/public/demo/components/d3/test/core/xml-test.js
similarity index 100%
rename from demo/components/d3/test/core/xml-test.js
rename to public/demo/components/d3/test/core/xml-test.js
diff --git a/demo/components/d3/test/core/zip-test.js b/public/demo/components/d3/test/core/zip-test.js
similarity index 100%
rename from demo/components/d3/test/core/zip-test.js
rename to public/demo/components/d3/test/core/zip-test.js
diff --git a/demo/components/d3/test/data/sample.csv b/public/demo/components/d3/test/data/sample.csv
similarity index 100%
rename from demo/components/d3/test/data/sample.csv
rename to public/demo/components/d3/test/data/sample.csv
diff --git a/demo/components/d3/test/data/sample.html b/public/demo/components/d3/test/data/sample.html
similarity index 100%
rename from demo/components/d3/test/data/sample.html
rename to public/demo/components/d3/test/data/sample.html
diff --git a/demo/components/d3/test/data/sample.json b/public/demo/components/d3/test/data/sample.json
similarity index 100%
rename from demo/components/d3/test/data/sample.json
rename to public/demo/components/d3/test/data/sample.json
diff --git a/demo/components/d3/test/data/sample.tsv b/public/demo/components/d3/test/data/sample.tsv
similarity index 100%
rename from demo/components/d3/test/data/sample.tsv
rename to public/demo/components/d3/test/data/sample.tsv
diff --git a/demo/components/d3/test/data/sample.txt b/public/demo/components/d3/test/data/sample.txt
similarity index 100%
rename from demo/components/d3/test/data/sample.txt
rename to public/demo/components/d3/test/data/sample.txt
diff --git a/demo/components/d3/test/data/sample.xml b/public/demo/components/d3/test/data/sample.xml
similarity index 100%
rename from demo/components/d3/test/data/sample.xml
rename to public/demo/components/d3/test/data/sample.xml
diff --git a/demo/components/d3/test/data/us-counties.json b/public/demo/components/d3/test/data/us-counties.json
similarity index 100%
rename from demo/components/d3/test/data/us-counties.json
rename to public/demo/components/d3/test/data/us-counties.json
diff --git a/demo/components/d3/test/dsv/csv-test.js b/public/demo/components/d3/test/dsv/csv-test.js
similarity index 100%
rename from demo/components/d3/test/dsv/csv-test.js
rename to public/demo/components/d3/test/dsv/csv-test.js
diff --git a/demo/components/d3/test/dsv/tsv-test.js b/public/demo/components/d3/test/dsv/tsv-test.js
similarity index 100%
rename from demo/components/d3/test/dsv/tsv-test.js
rename to public/demo/components/d3/test/dsv/tsv-test.js
diff --git a/demo/components/d3/test/env-assert.js b/public/demo/components/d3/test/env-assert.js
similarity index 100%
rename from demo/components/d3/test/env-assert.js
rename to public/demo/components/d3/test/env-assert.js
diff --git a/demo/components/d3/test/env-fragment.js b/public/demo/components/d3/test/env-fragment.js
similarity index 100%
rename from demo/components/d3/test/env-fragment.js
rename to public/demo/components/d3/test/env-fragment.js
diff --git a/demo/components/d3/test/env-xhr.js b/public/demo/components/d3/test/env-xhr.js
similarity index 100%
rename from demo/components/d3/test/env-xhr.js
rename to public/demo/components/d3/test/env-xhr.js
diff --git a/demo/components/d3/test/env.js b/public/demo/components/d3/test/env.js
similarity index 100%
rename from demo/components/d3/test/env.js
rename to public/demo/components/d3/test/env.js
diff --git a/demo/components/d3/test/geo/albers-test.js b/public/demo/components/d3/test/geo/albers-test.js
similarity index 100%
rename from demo/components/d3/test/geo/albers-test.js
rename to public/demo/components/d3/test/geo/albers-test.js
diff --git a/demo/components/d3/test/geo/area-benchmark.js b/public/demo/components/d3/test/geo/area-benchmark.js
similarity index 100%
rename from demo/components/d3/test/geo/area-benchmark.js
rename to public/demo/components/d3/test/geo/area-benchmark.js
diff --git a/demo/components/d3/test/geo/area-test.js b/public/demo/components/d3/test/geo/area-test.js
similarity index 100%
rename from demo/components/d3/test/geo/area-test.js
rename to public/demo/components/d3/test/geo/area-test.js
diff --git a/demo/components/d3/test/geo/azimuthal-equal-area-test.js b/public/demo/components/d3/test/geo/azimuthal-equal-area-test.js
similarity index 100%
rename from demo/components/d3/test/geo/azimuthal-equal-area-test.js
rename to public/demo/components/d3/test/geo/azimuthal-equal-area-test.js
diff --git a/demo/components/d3/test/geo/azimuthal-equidistant-test.js b/public/demo/components/d3/test/geo/azimuthal-equidistant-test.js
similarity index 100%
rename from demo/components/d3/test/geo/azimuthal-equidistant-test.js
rename to public/demo/components/d3/test/geo/azimuthal-equidistant-test.js
diff --git a/demo/components/d3/test/geo/benchmark.js b/public/demo/components/d3/test/geo/benchmark.js
similarity index 100%
rename from demo/components/d3/test/geo/benchmark.js
rename to public/demo/components/d3/test/geo/benchmark.js
diff --git a/demo/components/d3/test/geo/bounds-test.js b/public/demo/components/d3/test/geo/bounds-test.js
similarity index 100%
rename from demo/components/d3/test/geo/bounds-test.js
rename to public/demo/components/d3/test/geo/bounds-test.js
diff --git a/demo/components/d3/test/geo/centroid-test.js b/public/demo/components/d3/test/geo/centroid-test.js
similarity index 100%
rename from demo/components/d3/test/geo/centroid-test.js
rename to public/demo/components/d3/test/geo/centroid-test.js
diff --git a/demo/components/d3/test/geo/circle-test.js b/public/demo/components/d3/test/geo/circle-test.js
similarity index 100%
rename from demo/components/d3/test/geo/circle-test.js
rename to public/demo/components/d3/test/geo/circle-test.js
diff --git a/demo/components/d3/test/geo/equirectangular-test.js b/public/demo/components/d3/test/geo/equirectangular-test.js
similarity index 100%
rename from demo/components/d3/test/geo/equirectangular-test.js
rename to public/demo/components/d3/test/geo/equirectangular-test.js
diff --git a/demo/components/d3/test/geo/gnomonic-test.js b/public/demo/components/d3/test/geo/gnomonic-test.js
similarity index 100%
rename from demo/components/d3/test/geo/gnomonic-test.js
rename to public/demo/components/d3/test/geo/gnomonic-test.js
diff --git a/demo/components/d3/test/geo/graticule-test.js b/public/demo/components/d3/test/geo/graticule-test.js
similarity index 100%
rename from demo/components/d3/test/geo/graticule-test.js
rename to public/demo/components/d3/test/geo/graticule-test.js
diff --git a/demo/components/d3/test/geo/greatArc-test.js b/public/demo/components/d3/test/geo/greatArc-test.js
similarity index 100%
rename from demo/components/d3/test/geo/greatArc-test.js
rename to public/demo/components/d3/test/geo/greatArc-test.js
diff --git a/demo/components/d3/test/geo/interpolate-test.js b/public/demo/components/d3/test/geo/interpolate-test.js
similarity index 100%
rename from demo/components/d3/test/geo/interpolate-test.js
rename to public/demo/components/d3/test/geo/interpolate-test.js
diff --git a/demo/components/d3/test/geo/mercator-test.js b/public/demo/components/d3/test/geo/mercator-test.js
similarity index 100%
rename from demo/components/d3/test/geo/mercator-test.js
rename to public/demo/components/d3/test/geo/mercator-test.js
diff --git a/demo/components/d3/test/geo/orthographic-test.js b/public/demo/components/d3/test/geo/orthographic-test.js
similarity index 100%
rename from demo/components/d3/test/geo/orthographic-test.js
rename to public/demo/components/d3/test/geo/orthographic-test.js
diff --git a/demo/components/d3/test/geo/path-test.js b/public/demo/components/d3/test/geo/path-test.js
similarity index 100%
rename from demo/components/d3/test/geo/path-test.js
rename to public/demo/components/d3/test/geo/path-test.js
diff --git a/demo/components/d3/test/geo/projection-test.js b/public/demo/components/d3/test/geo/projection-test.js
similarity index 100%
rename from demo/components/d3/test/geo/projection-test.js
rename to public/demo/components/d3/test/geo/projection-test.js
diff --git a/demo/components/d3/test/geo/stereographic-test.js b/public/demo/components/d3/test/geo/stereographic-test.js
similarity index 100%
rename from demo/components/d3/test/geo/stereographic-test.js
rename to public/demo/components/d3/test/geo/stereographic-test.js
diff --git a/demo/components/d3/test/geo/stream-test.js b/public/demo/components/d3/test/geo/stream-test.js
similarity index 100%
rename from demo/components/d3/test/geo/stream-test.js
rename to public/demo/components/d3/test/geo/stream-test.js
diff --git a/demo/components/d3/test/geom/polygon-test.js b/public/demo/components/d3/test/geom/polygon-test.js
similarity index 100%
rename from demo/components/d3/test/geom/polygon-test.js
rename to public/demo/components/d3/test/geom/polygon-test.js
diff --git a/demo/components/d3/test/geom/quadtree-test.js b/public/demo/components/d3/test/geom/quadtree-test.js
similarity index 100%
rename from demo/components/d3/test/geom/quadtree-test.js
rename to public/demo/components/d3/test/geom/quadtree-test.js
diff --git a/demo/components/d3/test/geom/voronoi-test.js b/public/demo/components/d3/test/geom/voronoi-test.js
similarity index 100%
rename from demo/components/d3/test/geom/voronoi-test.js
rename to public/demo/components/d3/test/geom/voronoi-test.js
diff --git a/demo/components/d3/test/layout/cluster-test.js b/public/demo/components/d3/test/layout/cluster-test.js
similarity index 100%
rename from demo/components/d3/test/layout/cluster-test.js
rename to public/demo/components/d3/test/layout/cluster-test.js
diff --git a/demo/components/d3/test/layout/force-test.js b/public/demo/components/d3/test/layout/force-test.js
similarity index 100%
rename from demo/components/d3/test/layout/force-test.js
rename to public/demo/components/d3/test/layout/force-test.js
diff --git a/demo/components/d3/test/layout/hierarchy-test.js b/public/demo/components/d3/test/layout/hierarchy-test.js
similarity index 100%
rename from demo/components/d3/test/layout/hierarchy-test.js
rename to public/demo/components/d3/test/layout/hierarchy-test.js
diff --git a/demo/components/d3/test/layout/histogram-test.js b/public/demo/components/d3/test/layout/histogram-test.js
similarity index 100%
rename from demo/components/d3/test/layout/histogram-test.js
rename to public/demo/components/d3/test/layout/histogram-test.js
diff --git a/demo/components/d3/test/layout/pack-test.js b/public/demo/components/d3/test/layout/pack-test.js
similarity index 100%
rename from demo/components/d3/test/layout/pack-test.js
rename to public/demo/components/d3/test/layout/pack-test.js
diff --git a/demo/components/d3/test/layout/partition-test.js b/public/demo/components/d3/test/layout/partition-test.js
similarity index 100%
rename from demo/components/d3/test/layout/partition-test.js
rename to public/demo/components/d3/test/layout/partition-test.js
diff --git a/demo/components/d3/test/layout/pie-test.js b/public/demo/components/d3/test/layout/pie-test.js
similarity index 100%
rename from demo/components/d3/test/layout/pie-test.js
rename to public/demo/components/d3/test/layout/pie-test.js
diff --git a/demo/components/d3/test/layout/tree-test.js b/public/demo/components/d3/test/layout/tree-test.js
similarity index 100%
rename from demo/components/d3/test/layout/tree-test.js
rename to public/demo/components/d3/test/layout/tree-test.js
diff --git a/demo/components/d3/test/layout/treemap-test.js b/public/demo/components/d3/test/layout/treemap-test.js
similarity index 100%
rename from demo/components/d3/test/layout/treemap-test.js
rename to public/demo/components/d3/test/layout/treemap-test.js
diff --git a/demo/components/d3/test/scale/category-test.js b/public/demo/components/d3/test/scale/category-test.js
similarity index 100%
rename from demo/components/d3/test/scale/category-test.js
rename to public/demo/components/d3/test/scale/category-test.js
diff --git a/demo/components/d3/test/scale/identity-test.js b/public/demo/components/d3/test/scale/identity-test.js
similarity index 100%
rename from demo/components/d3/test/scale/identity-test.js
rename to public/demo/components/d3/test/scale/identity-test.js
diff --git a/demo/components/d3/test/scale/linear-test.js b/public/demo/components/d3/test/scale/linear-test.js
similarity index 100%
rename from demo/components/d3/test/scale/linear-test.js
rename to public/demo/components/d3/test/scale/linear-test.js
diff --git a/demo/components/d3/test/scale/log-test.js b/public/demo/components/d3/test/scale/log-test.js
similarity index 100%
rename from demo/components/d3/test/scale/log-test.js
rename to public/demo/components/d3/test/scale/log-test.js
diff --git a/demo/components/d3/test/scale/ordinal-test.js b/public/demo/components/d3/test/scale/ordinal-test.js
similarity index 100%
rename from demo/components/d3/test/scale/ordinal-test.js
rename to public/demo/components/d3/test/scale/ordinal-test.js
diff --git a/demo/components/d3/test/scale/pow-test.js b/public/demo/components/d3/test/scale/pow-test.js
similarity index 100%
rename from demo/components/d3/test/scale/pow-test.js
rename to public/demo/components/d3/test/scale/pow-test.js
diff --git a/demo/components/d3/test/scale/quantile-test.js b/public/demo/components/d3/test/scale/quantile-test.js
similarity index 100%
rename from demo/components/d3/test/scale/quantile-test.js
rename to public/demo/components/d3/test/scale/quantile-test.js
diff --git a/demo/components/d3/test/scale/quantize-test.js b/public/demo/components/d3/test/scale/quantize-test.js
similarity index 100%
rename from demo/components/d3/test/scale/quantize-test.js
rename to public/demo/components/d3/test/scale/quantize-test.js
diff --git a/demo/components/d3/test/scale/sqrt-test.js b/public/demo/components/d3/test/scale/sqrt-test.js
similarity index 100%
rename from demo/components/d3/test/scale/sqrt-test.js
rename to public/demo/components/d3/test/scale/sqrt-test.js
diff --git a/demo/components/d3/test/scale/threshold-test.js b/public/demo/components/d3/test/scale/threshold-test.js
similarity index 100%
rename from demo/components/d3/test/scale/threshold-test.js
rename to public/demo/components/d3/test/scale/threshold-test.js
diff --git a/demo/components/d3/test/svg/arc-test.js b/public/demo/components/d3/test/svg/arc-test.js
similarity index 100%
rename from demo/components/d3/test/svg/arc-test.js
rename to public/demo/components/d3/test/svg/arc-test.js
diff --git a/demo/components/d3/test/svg/area-radial-test.js b/public/demo/components/d3/test/svg/area-radial-test.js
similarity index 100%
rename from demo/components/d3/test/svg/area-radial-test.js
rename to public/demo/components/d3/test/svg/area-radial-test.js
diff --git a/demo/components/d3/test/svg/area-test.js b/public/demo/components/d3/test/svg/area-test.js
similarity index 100%
rename from demo/components/d3/test/svg/area-test.js
rename to public/demo/components/d3/test/svg/area-test.js
diff --git a/demo/components/d3/test/svg/axis-test.js b/public/demo/components/d3/test/svg/axis-test.js
similarity index 100%
rename from demo/components/d3/test/svg/axis-test.js
rename to public/demo/components/d3/test/svg/axis-test.js
diff --git a/demo/components/d3/test/svg/brush-test.js b/public/demo/components/d3/test/svg/brush-test.js
similarity index 100%
rename from demo/components/d3/test/svg/brush-test.js
rename to public/demo/components/d3/test/svg/brush-test.js
diff --git a/demo/components/d3/test/svg/line-radial-test.js b/public/demo/components/d3/test/svg/line-radial-test.js
similarity index 100%
rename from demo/components/d3/test/svg/line-radial-test.js
rename to public/demo/components/d3/test/svg/line-radial-test.js
diff --git a/demo/components/d3/test/svg/line-test.js b/public/demo/components/d3/test/svg/line-test.js
similarity index 100%
rename from demo/components/d3/test/svg/line-test.js
rename to public/demo/components/d3/test/svg/line-test.js
diff --git a/demo/components/d3/test/svg/symbol-test.js b/public/demo/components/d3/test/svg/symbol-test.js
similarity index 100%
rename from demo/components/d3/test/svg/symbol-test.js
rename to public/demo/components/d3/test/svg/symbol-test.js
diff --git a/demo/components/d3/test/time/day-test.js b/public/demo/components/d3/test/time/day-test.js
similarity index 100%
rename from demo/components/d3/test/time/day-test.js
rename to public/demo/components/d3/test/time/day-test.js
diff --git a/demo/components/d3/test/time/dayOfYear-test.js b/public/demo/components/d3/test/time/dayOfYear-test.js
similarity index 100%
rename from demo/components/d3/test/time/dayOfYear-test.js
rename to public/demo/components/d3/test/time/dayOfYear-test.js
diff --git a/demo/components/d3/test/time/days-test.js b/public/demo/components/d3/test/time/days-test.js
similarity index 100%
rename from demo/components/d3/test/time/days-test.js
rename to public/demo/components/d3/test/time/days-test.js
diff --git a/demo/components/d3/test/time/format-test.js b/public/demo/components/d3/test/time/format-test.js
similarity index 100%
rename from demo/components/d3/test/time/format-test.js
rename to public/demo/components/d3/test/time/format-test.js
diff --git a/demo/components/d3/test/time/hour-test.js b/public/demo/components/d3/test/time/hour-test.js
similarity index 100%
rename from demo/components/d3/test/time/hour-test.js
rename to public/demo/components/d3/test/time/hour-test.js
diff --git a/demo/components/d3/test/time/hours-test.js b/public/demo/components/d3/test/time/hours-test.js
similarity index 100%
rename from demo/components/d3/test/time/hours-test.js
rename to public/demo/components/d3/test/time/hours-test.js
diff --git a/demo/components/d3/test/time/minute-test.js b/public/demo/components/d3/test/time/minute-test.js
similarity index 100%
rename from demo/components/d3/test/time/minute-test.js
rename to public/demo/components/d3/test/time/minute-test.js
diff --git a/demo/components/d3/test/time/minutes-test.js b/public/demo/components/d3/test/time/minutes-test.js
similarity index 100%
rename from demo/components/d3/test/time/minutes-test.js
rename to public/demo/components/d3/test/time/minutes-test.js
diff --git a/demo/components/d3/test/time/month-test.js b/public/demo/components/d3/test/time/month-test.js
similarity index 100%
rename from demo/components/d3/test/time/month-test.js
rename to public/demo/components/d3/test/time/month-test.js
diff --git a/demo/components/d3/test/time/months-test.js b/public/demo/components/d3/test/time/months-test.js
similarity index 100%
rename from demo/components/d3/test/time/months-test.js
rename to public/demo/components/d3/test/time/months-test.js
diff --git a/demo/components/d3/test/time/scale-test.js b/public/demo/components/d3/test/time/scale-test.js
similarity index 100%
rename from demo/components/d3/test/time/scale-test.js
rename to public/demo/components/d3/test/time/scale-test.js
diff --git a/demo/components/d3/test/time/second-test.js b/public/demo/components/d3/test/time/second-test.js
similarity index 100%
rename from demo/components/d3/test/time/second-test.js
rename to public/demo/components/d3/test/time/second-test.js
diff --git a/demo/components/d3/test/time/seconds-test.js b/public/demo/components/d3/test/time/seconds-test.js
similarity index 100%
rename from demo/components/d3/test/time/seconds-test.js
rename to public/demo/components/d3/test/time/seconds-test.js
diff --git a/demo/components/d3/test/time/time.js b/public/demo/components/d3/test/time/time.js
similarity index 100%
rename from demo/components/d3/test/time/time.js
rename to public/demo/components/d3/test/time/time.js
diff --git a/demo/components/d3/test/time/week-test.js b/public/demo/components/d3/test/time/week-test.js
similarity index 100%
rename from demo/components/d3/test/time/week-test.js
rename to public/demo/components/d3/test/time/week-test.js
diff --git a/demo/components/d3/test/time/weeks-test.js b/public/demo/components/d3/test/time/weeks-test.js
similarity index 100%
rename from demo/components/d3/test/time/weeks-test.js
rename to public/demo/components/d3/test/time/weeks-test.js
diff --git a/demo/components/d3/test/time/year-test.js b/public/demo/components/d3/test/time/year-test.js
similarity index 100%
rename from demo/components/d3/test/time/year-test.js
rename to public/demo/components/d3/test/time/year-test.js
diff --git a/demo/components/d3/test/time/years-test.js b/public/demo/components/d3/test/time/years-test.js
similarity index 100%
rename from demo/components/d3/test/time/years-test.js
rename to public/demo/components/d3/test/time/years-test.js
diff --git a/demo/components/jquery/.bower.json b/public/demo/components/jquery/.bower.json
similarity index 100%
rename from demo/components/jquery/.bower.json
rename to public/demo/components/jquery/.bower.json
diff --git a/demo/components/jquery/.gitignore b/public/demo/components/jquery/.gitignore
similarity index 100%
rename from demo/components/jquery/.gitignore
rename to public/demo/components/jquery/.gitignore
diff --git a/demo/components/jquery/README.md b/public/demo/components/jquery/README.md
similarity index 100%
rename from demo/components/jquery/README.md
rename to public/demo/components/jquery/README.md
diff --git a/demo/components/jquery/component.json b/public/demo/components/jquery/component.json
similarity index 100%
rename from demo/components/jquery/component.json
rename to public/demo/components/jquery/component.json
diff --git a/demo/components/jquery/composer.json b/public/demo/components/jquery/composer.json
similarity index 100%
rename from demo/components/jquery/composer.json
rename to public/demo/components/jquery/composer.json
diff --git a/demo/components/jquery/jquery-migrate.js b/public/demo/components/jquery/jquery-migrate.js
similarity index 100%
rename from demo/components/jquery/jquery-migrate.js
rename to public/demo/components/jquery/jquery-migrate.js
diff --git a/demo/components/jquery/jquery-migrate.min.js b/public/demo/components/jquery/jquery-migrate.min.js
similarity index 100%
rename from demo/components/jquery/jquery-migrate.min.js
rename to public/demo/components/jquery/jquery-migrate.min.js
diff --git a/demo/components/jquery/jquery.js b/public/demo/components/jquery/jquery.js
similarity index 100%
rename from demo/components/jquery/jquery.js
rename to public/demo/components/jquery/jquery.js
diff --git a/demo/components/jquery/jquery.min.js b/public/demo/components/jquery/jquery.min.js
similarity index 100%
rename from demo/components/jquery/jquery.min.js
rename to public/demo/components/jquery/jquery.min.js
diff --git a/demo/components/jquery/jquery.min.map b/public/demo/components/jquery/jquery.min.map
similarity index 100%
rename from demo/components/jquery/jquery.min.map
rename to public/demo/components/jquery/jquery.min.map
diff --git a/demo/components/jquery/package.json b/public/demo/components/jquery/package.json
similarity index 100%
rename from demo/components/jquery/package.json
rename to public/demo/components/jquery/package.json
diff --git a/demo/img/credits.txt b/public/demo/img/credits.txt
similarity index 100%
rename from demo/img/credits.txt
rename to public/demo/img/credits.txt
diff --git a/demo/img/noun_project_122_off.svg b/public/demo/img/noun_project_122_off.svg
similarity index 100%
rename from demo/img/noun_project_122_off.svg
rename to public/demo/img/noun_project_122_off.svg
diff --git a/demo/img/noun_project_122_on.svg b/public/demo/img/noun_project_122_on.svg
similarity index 100%
rename from demo/img/noun_project_122_on.svg
rename to public/demo/img/noun_project_122_on.svg
diff --git a/demo/img/noun_project_2023.svg b/public/demo/img/noun_project_2023.svg
similarity index 100%
rename from demo/img/noun_project_2023.svg
rename to public/demo/img/noun_project_2023.svg
diff --git a/demo/img/noun_project_5546.svg b/public/demo/img/noun_project_5546.svg
similarity index 100%
rename from demo/img/noun_project_5546.svg
rename to public/demo/img/noun_project_5546.svg
diff --git a/demo/img/noun_project_868.svg b/public/demo/img/noun_project_868.svg
similarity index 100%
rename from demo/img/noun_project_868.svg
rename to public/demo/img/noun_project_868.svg
diff --git a/demo/img/offline.png b/public/demo/img/offline.png
similarity index 100%
rename from demo/img/offline.png
rename to public/demo/img/offline.png
diff --git a/demo/img/roof_CLOSE.svg b/public/demo/img/roof_CLOSE.svg
similarity index 100%
rename from demo/img/roof_CLOSE.svg
rename to public/demo/img/roof_CLOSE.svg
diff --git a/demo/img/roof_OPEN.svg b/public/demo/img/roof_OPEN.svg
similarity index 100%
rename from demo/img/roof_OPEN.svg
rename to public/demo/img/roof_OPEN.svg
diff --git a/demo/index.html b/public/demo/index.html
similarity index 100%
rename from demo/index.html
rename to public/demo/index.html
diff --git a/demo/js/app.js b/public/demo/js/app.js
similarity index 100%
rename from demo/js/app.js
rename to public/demo/js/app.js
diff --git a/demo/js/config.js b/public/demo/js/config.js
similarity index 100%
rename from demo/js/config.js
rename to public/demo/js/config.js
diff --git a/demo/js/controllers.js b/public/demo/js/controllers.js
similarity index 100%
rename from demo/js/controllers.js
rename to public/demo/js/controllers.js
diff --git a/demo/js/mqttws31.js b/public/demo/js/mqttws31.js
similarity index 100%
rename from demo/js/mqttws31.js
rename to public/demo/js/mqttws31.js
diff --git a/demo/js/services.js b/public/demo/js/services.js
similarity index 100%
rename from demo/js/services.js
rename to public/demo/js/services.js
diff --git a/demo/partials/device-detail.html b/public/demo/partials/device-detail.html
similarity index 100%
rename from demo/partials/device-detail.html
rename to public/demo/partials/device-detail.html
diff --git a/documents/2014-04-08-MQTT-Interop-test-day-report.html b/public/documents/2014-04-08-MQTT-Interop-test-day-report.html
similarity index 100%
rename from documents/2014-04-08-MQTT-Interop-test-day-report.html
rename to public/documents/2014-04-08-MQTT-Interop-test-day-report.html
diff --git a/documents/2014-04-08-MQTT-Interop-test-day-report.pdf b/public/documents/2014-04-08-MQTT-Interop-test-day-report.pdf
similarity index 100%
rename from documents/2014-04-08-MQTT-Interop-test-day-report.pdf
rename to public/documents/2014-04-08-MQTT-Interop-test-day-report.pdf
diff --git a/ecosystem.html b/public/ecosystem.html
similarity index 100%
rename from ecosystem.html
rename to public/ecosystem.html
diff --git a/public/event/index.xml b/public/event/index.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4085649c2c9f29ae89072a05c4b3a61d9aea3227
--- /dev/null
+++ b/public/event/index.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+      <title>Events on  </title>
+      <generator uri="https://hugo.spf13.com">Hugo</generator>
+    <link>/event/index.xml/</link>
+    
+    
+    
+    <updated>Mon, 09 Mar 2015 00:00:00 UTC</updated>
+    
+    <item>
+      <title>EclipseCon NA 2015</title>
+      <link>/event/xx/</link>
+      <pubDate>Mon, 09 Mar 2015 00:00:00 UTC</pubDate>
+      
+      <guid>/event/xx/</guid>
+      <description>&lt;p&gt;xx&lt;/p&gt;
+</description>
+    </item>
+    
+  </channel>
+</rss>
\ No newline at end of file
diff --git a/frameworks.html b/public/frameworks.html
similarity index 100%
rename from frameworks.html
rename to public/frameworks.html
diff --git a/getting-started.html b/public/getting-started.html
similarity index 100%
rename from getting-started.html
rename to public/getting-started.html
diff --git a/gruntfile.js b/public/gruntfile.js
similarity index 100%
rename from gruntfile.js
rename to public/gruntfile.js
diff --git a/humans.txt b/public/humans.txt
similarity index 100%
rename from humans.txt
rename to public/humans.txt
diff --git a/images/_home/iotchallenge_background.jpg b/public/images/_home/iotchallenge_background.jpg
similarity index 100%
rename from images/_home/iotchallenge_background.jpg
rename to public/images/_home/iotchallenge_background.jpg
diff --git a/images/_home/iotchallenge_text_overlay.png b/public/images/_home/iotchallenge_text_overlay.png
similarity index 100%
rename from images/_home/iotchallenge_text_overlay.png
rename to public/images/_home/iotchallenge_text_overlay.png
diff --git a/images/_home/javalaunch_background.jpg b/public/images/_home/javalaunch_background.jpg
similarity index 100%
rename from images/_home/javalaunch_background.jpg
rename to public/images/_home/javalaunch_background.jpg
diff --git a/images/_home/javalaunch_background.png b/public/images/_home/javalaunch_background.png
similarity index 100%
rename from images/_home/javalaunch_background.png
rename to public/images/_home/javalaunch_background.png
diff --git a/images/_home/javalaunch_background_text_overlay.png b/public/images/_home/javalaunch_background_text_overlay.png
similarity index 100%
rename from images/_home/javalaunch_background_text_overlay.png
rename to public/images/_home/javalaunch_background_text_overlay.png
diff --git a/images/ecosystem/logo-2lemetry.gif b/public/images/ecosystem/logo-2lemetry.gif
similarity index 100%
rename from images/ecosystem/logo-2lemetry.gif
rename to public/images/ecosystem/logo-2lemetry.gif
diff --git a/images/ecosystem/logo-2lemetry.png b/public/images/ecosystem/logo-2lemetry.png
similarity index 100%
rename from images/ecosystem/logo-2lemetry.png
rename to public/images/ecosystem/logo-2lemetry.png
diff --git a/images/ecosystem/logo-actuate.png b/public/images/ecosystem/logo-actuate.png
similarity index 100%
rename from images/ecosystem/logo-actuate.png
rename to public/images/ecosystem/logo-actuate.png
diff --git a/images/ecosystem/logo-axeda.gif b/public/images/ecosystem/logo-axeda.gif
similarity index 100%
rename from images/ecosystem/logo-axeda.gif
rename to public/images/ecosystem/logo-axeda.gif
diff --git a/images/ecosystem/logo-axeda.png b/public/images/ecosystem/logo-axeda.png
similarity index 100%
rename from images/ecosystem/logo-axeda.png
rename to public/images/ecosystem/logo-axeda.png
diff --git a/images/ecosystem/logo-bandxi.gif b/public/images/ecosystem/logo-bandxi.gif
similarity index 100%
rename from images/ecosystem/logo-bandxi.gif
rename to public/images/ecosystem/logo-bandxi.gif
diff --git a/images/ecosystem/logo-bitreactive.png b/public/images/ecosystem/logo-bitreactive.png
similarity index 100%
rename from images/ecosystem/logo-bitreactive.png
rename to public/images/ecosystem/logo-bitreactive.png
diff --git a/images/ecosystem/logo-bosch.png b/public/images/ecosystem/logo-bosch.png
similarity index 100%
rename from images/ecosystem/logo-bosch.png
rename to public/images/ecosystem/logo-bosch.png
diff --git a/images/ecosystem/logo-canonical.png b/public/images/ecosystem/logo-canonical.png
similarity index 100%
rename from images/ecosystem/logo-canonical.png
rename to public/images/ecosystem/logo-canonical.png
diff --git a/images/ecosystem/logo-dcsquare.png b/public/images/ecosystem/logo-dcsquare.png
similarity index 100%
rename from images/ecosystem/logo-dcsquare.png
rename to public/images/ecosystem/logo-dcsquare.png
diff --git a/images/ecosystem/logo-dtag.png b/public/images/ecosystem/logo-dtag.png
similarity index 100%
rename from images/ecosystem/logo-dtag.png
rename to public/images/ecosystem/logo-dtag.png
diff --git a/images/ecosystem/logo-eurotech.gif b/public/images/ecosystem/logo-eurotech.gif
similarity index 100%
rename from images/ecosystem/logo-eurotech.gif
rename to public/images/ecosystem/logo-eurotech.gif
diff --git a/images/ecosystem/logo-eurotech.png b/public/images/ecosystem/logo-eurotech.png
similarity index 100%
rename from images/ecosystem/logo-eurotech.png
rename to public/images/ecosystem/logo-eurotech.png
diff --git a/images/ecosystem/logo-gadgetkeeper.png b/public/images/ecosystem/logo-gadgetkeeper.png
similarity index 100%
rename from images/ecosystem/logo-gadgetkeeper.png
rename to public/images/ecosystem/logo-gadgetkeeper.png
diff --git a/images/ecosystem/logo-ibh.gif b/public/images/ecosystem/logo-ibh.gif
similarity index 100%
rename from images/ecosystem/logo-ibh.gif
rename to public/images/ecosystem/logo-ibh.gif
diff --git a/images/ecosystem/logo-ibh.png b/public/images/ecosystem/logo-ibh.png
similarity index 100%
rename from images/ecosystem/logo-ibh.png
rename to public/images/ecosystem/logo-ibh.png
diff --git a/images/ecosystem/logo-ibm.gif b/public/images/ecosystem/logo-ibm.gif
similarity index 100%
rename from images/ecosystem/logo-ibm.gif
rename to public/images/ecosystem/logo-ibm.gif
diff --git a/images/ecosystem/logo-ibm.png b/public/images/ecosystem/logo-ibm.png
similarity index 100%
rename from images/ecosystem/logo-ibm.png
rename to public/images/ecosystem/logo-ibm.png
diff --git a/images/ecosystem/logo-itemis.png b/public/images/ecosystem/logo-itemis.png
similarity index 100%
rename from images/ecosystem/logo-itemis.png
rename to public/images/ecosystem/logo-itemis.png
diff --git a/images/ecosystem/logo-laas.png b/public/images/ecosystem/logo-laas.png
similarity index 100%
rename from images/ecosystem/logo-laas.png
rename to public/images/ecosystem/logo-laas.png
diff --git a/images/ecosystem/logo-litmus.png b/public/images/ecosystem/logo-litmus.png
similarity index 100%
rename from images/ecosystem/logo-litmus.png
rename to public/images/ecosystem/logo-litmus.png
diff --git a/images/ecosystem/logo-m2m-alliance.gif b/public/images/ecosystem/logo-m2m-alliance.gif
similarity index 100%
rename from images/ecosystem/logo-m2m-alliance.gif
rename to public/images/ecosystem/logo-m2m-alliance.gif
diff --git a/images/ecosystem/logo-m2m-alliance.png b/public/images/ecosystem/logo-m2m-alliance.png
similarity index 100%
rename from images/ecosystem/logo-m2m-alliance.png
rename to public/images/ecosystem/logo-m2m-alliance.png
diff --git a/images/ecosystem/logo-openhab.png b/public/images/ecosystem/logo-openhab.png
similarity index 100%
rename from images/ecosystem/logo-openhab.png
rename to public/images/ecosystem/logo-openhab.png
diff --git a/images/ecosystem/logo-oracle.png b/public/images/ecosystem/logo-oracle.png
similarity index 100%
rename from images/ecosystem/logo-oracle.png
rename to public/images/ecosystem/logo-oracle.png
diff --git a/images/ecosystem/logo-sierra.gif b/public/images/ecosystem/logo-sierra.gif
similarity index 100%
rename from images/ecosystem/logo-sierra.gif
rename to public/images/ecosystem/logo-sierra.gif
diff --git a/images/ecosystem/logo-sierra.png b/public/images/ecosystem/logo-sierra.png
similarity index 100%
rename from images/ecosystem/logo-sierra.png
rename to public/images/ecosystem/logo-sierra.png
diff --git a/images/ecosystem/logo-ubuntu.png b/public/images/ecosystem/logo-ubuntu.png
similarity index 100%
rename from images/ecosystem/logo-ubuntu.png
rename to public/images/ecosystem/logo-ubuntu.png
diff --git a/images/frameworks/frameworks-vision.png b/public/images/frameworks/frameworks-vision.png
similarity index 100%
rename from images/frameworks/frameworks-vision.png
rename to public/images/frameworks/frameworks-vision.png
diff --git a/images/frameworks/m2m-fwk-overview.png b/public/images/frameworks/m2m-fwk-overview.png
similarity index 100%
rename from images/frameworks/m2m-fwk-overview.png
rename to public/images/frameworks/m2m-fwk-overview.png
diff --git a/images/layout/members-info-link-sep-a.gif b/public/images/layout/members-info-link-sep-a.gif
similarity index 100%
rename from images/layout/members-info-link-sep-a.gif
rename to public/images/layout/members-info-link-sep-a.gif
diff --git a/images/layout/members-info-link-sep-b.gif b/public/images/layout/members-info-link-sep-b.gif
similarity index 100%
rename from images/layout/members-info-link-sep-b.gif
rename to public/images/layout/members-info-link-sep-b.gif
diff --git a/images/layout/members-info-top-left.gif b/public/images/layout/members-info-top-left.gif
similarity index 100%
rename from images/layout/members-info-top-left.gif
rename to public/images/layout/members-info-top-left.gif
diff --git a/images/layout/section-heading-end.gif b/public/images/layout/section-heading-end.gif
similarity index 100%
rename from images/layout/section-heading-end.gif
rename to public/images/layout/section-heading-end.gif
diff --git a/images/layout/section-heading-grey-end.gif b/public/images/layout/section-heading-grey-end.gif
similarity index 100%
rename from images/layout/section-heading-grey-end.gif
rename to public/images/layout/section-heading-grey-end.gif
diff --git a/images/protocols/omadm-simulator.png b/public/images/protocols/omadm-simulator.png
similarity index 100%
rename from images/protocols/omadm-simulator.png
rename to public/images/protocols/omadm-simulator.png
diff --git a/images/protocols/protocols-vision.png b/public/images/protocols/protocols-vision.png
similarity index 100%
rename from images/protocols/protocols-vision.png
rename to public/images/protocols/protocols-vision.png
diff --git a/images/tools/ldt.png b/public/images/tools/ldt.png
similarity index 100%
rename from images/tools/ldt.png
rename to public/images/tools/ldt.png
diff --git a/images/tools/tools-vision.png b/public/images/tools/tools-vision.png
similarity index 100%
rename from images/tools/tools-vision.png
rename to public/images/tools/tools-vision.png
diff --git a/index-javaone.html b/public/index-javaone.html
similarity index 100%
rename from index-javaone.html
rename to public/index-javaone.html
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..c706ac48365797e8afc1fdf6e9350b5f51d4e3fb
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,381 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <meta itemprop="name" content="iot.eclipse.org - IoT development made simple">
+  <meta itemprop="description" content="iot.eclipse.org is where you can learn about the technologies developed at Eclipse to make Internet of Things (IoT) development simpler. These technologies aim at establishing an open, end-to-end, IoT stack.">
+  <title>iot.eclipse.org - IoT development made simple</title>
+
+  
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+  
+  <link href="/assets/css/icomoon.css" rel="stylesheet">
+
+  
+  
+  
+
+  <script src="https://apis.google.com/js/platform.js" async defer></script>
+
+
+</head>
+
+<body class="homepage">
+
+  <header>
+
+    <nav class="navbar navbar-default">
+      <div class="container">
+        
+        <div class="navbar-header">
+          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+            <span class="sr-only">Toggle navigation</span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <a class="navbar-brand" href="/">
+            <img alt="Brand" src="/assets/images/iot-logo.png">
+          </a>
+        </div>
+
+        
+        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+          <ul class="nav navbar-nav navbar-right">
+            <li><a href="/getting-started">Getting Started</a>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="/standards">Standards</a>
+                </li>
+                <li><a href="/frameworks">Services &amp; Frameworks</a>
+                </li>
+                <li><a href="/projects">All the projects</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="#">Resources</a>
+                </li>
+                <li><a href="#">News</a>
+                </li>
+                <li><a href="#">Events</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="/ecosystem">Working Group</a>
+            </li>
+            <li style="min-width: 100px; padding-top: 15px; padding-left: 8px;">
+              <div class="g-plusone" data-size="medium" data-href="http://iot.eclipse.org"></div>
+            </li>
+          </ul>
+        </div>
+        
+      </div>
+      
+    </nav>
+
+
+
+    <section class="container">
+      <div class="row">
+        <div class="col-md-8 col-sm-12">
+          <h1><span class="green">Open Source</span> for <span class="green">IoT</span></h1>
+          <p>IoT needs open source to be successful.
+            <br>
+            <span class="green">Eclipse IoT</span> simplifies IoT development.</p>
+        </div>
+        
+      </div>
+    </section>
+
+    <section class="header-divider">
+      <img src="assets/images/header-divider.png">
+    </section>
+
+  </header>
+
+  <main class="main">
+    <section class="first">
+      <div class="container">
+        <div class="row">
+
+          <div class="col-md-4 first-col">
+
+            <a href="/protocols.html">
+              <div class="row">
+                <div class="col-xs-2 col-md-3">
+                  <span class="icon-bulb" aria-hidden="true"></span>
+                </div>
+                <div class="col-xs-10 col-md-9">
+                  <h2>Standards</h2>
+                  <p>Implementation of IoT standards like MQTT, CoAP, LWM2M and OneM2M</p>
+                </div>
+              </div>
+            </a>
+
+            <a href="#">
+              <div class="row">
+                <div class="col-xs-2 col-md-3">
+                  <span class="icon-switch" aria-hidden="true"></span>
+                </div>
+                <div class="col-xs-10 col-md-9">
+                  <h2>Getting Started</h2>
+
+                  <p>Step-by-step guide to getting started on IoT development</p>
+                </div>
+              </div>
+            </a>
+
+          </div>
+
+
+          <div class="col-md-4 second-col">
+
+            <a href="/frameworks.html">
+              <div class="row">
+                <div class="col-xs-2 col-md-3">
+                  <span class="icon-cogs" aria-hidden="true"></span>
+                </div>
+                <div class="col-xs-10 col-md-9">
+                  <h2>Services &amp; Frameworks</h2>
+                  <p>Building blocks to accelerate IoT development</p>
+                </div>
+              </div>
+            </a>
+
+            <a href="/projects.html">
+              <div class="row">
+                <div class="col-xs-2 col-md-3">
+                  <span class="icon-embed" aria-hidden="true"></span>
+                </div>
+                <div class="col-xs-10 col-md-9">
+                  <h2>All projects</h2>
+                  <p>Check out all our IoT open source projects</p>
+                </div>
+              </div>
+            </a>
+
+          </div>
+
+          <div class="col-md-4 third-col line-divider-left">
+
+            <h1 class="purple">Technology</h1>
+            <p>Eclipse IoT provides open source implementations of the standards, services and frameworks that enable an Open Internet of Things.</p>
+          </div>
+
+        </div>
+      </div>
+    </section>
+
+
+    <section class="second">
+      <div class="container">
+        <div class="row">
+
+          <div class="col-md-5">
+            <section class="community">
+              <h1 class="purple">Community</h1>
+              <p>
+                <strong>Eclipse IoT</strong> is an ecosystem of companies and individuals that are working together to establish an Internet of Things based on open technologies.
+              </p>
+            </section>
+          </div>
+
+          <div class="col-md-6 col-md-offset-1">
+            <section class="subsection-header featured-articles">
+              <h2>Featured Articles</h2>
+
+              <div class="row">
+
+                <div class="col-md-6">
+                  <div class=" featured-articles-item">
+                    <a href="/java/tutorial">
+                      <h3>Open IoT Stack for Java Tutorial</h3>
+                      
+                    </a>
+                  </div>
+
+                </div>
+                <div class="col-md-6">
+                  <div class="featured-articles-item">
+                    <h3>Open IoT Stack for Java Tutorial</h3>
+                    
+                  </div>
+                </div>
+
+              </div>
+            </section>
+            
+          </div>
+
+
+
+          <div class="col-md-6">
+            <section class="subsection-header latest-news">
+              <h2>Latest News</h2>
+              <div class="latest-news-item">
+                <h3>Announcing the Open IoT challenge</h3>
+                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec blandit pellentesque euismod. Curabitur mattis</p>
+                <p class="date">12/04/2015</p>
+              </div>
+              <div class="latest-news-item">
+                <h3>Announcing the Open IoT challenge</h3>
+                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec blandit pellentesque euismod. Curabitur mattis</p>
+                <p class="date">12/04/2015</p>
+              </div>
+              
+
+              <p><a href="#" class="btn btn-primary">More News...</a>
+              </p>
+            </section>
+            
+          </div>
+          
+
+
+          <div class="col-md-6">
+            <section class="subsection-header upcoming-events">
+              <h2>Upcoming Events</h2>
+              <div class="row">
+
+
+                 
+
+                <div class="col-sm-6">
+                  <a href="http://www.eclipsecon.org/na2015" target="_blank">
+                    <div class="upcoming-events-item">
+                      <h3>
+                      EclipseCon NA 2015<br>
+                      <span class="date">Mar 9-12, 2015</span>
+                      </h3>
+                      <p></p>
+                    </div>
+                  </a>
+                </div>
+
+
+                   
+
+
+              </div>
+            </section>
+            
+          </div>
+
+          
+        </div>
+      </div>
+    </section>
+
+
+    <section class="third">
+      <div class="container">
+        <div class="row">
+          <div class="col-md-8 logos">
+
+            <div class="row">
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-eurotech.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-ibm.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-sierra.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-bosch.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-bitreactive.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-dcsquare.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-gadgetkeeper.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-cisco.jpg" class="img-responsive">
+              </div>
+              <div class="col-md-4 col-xs-6">
+                <img src="assets/images/wg-2lemetry.jpg" class="img-responsive">
+              </div>
+
+              
+            </div>
+
+          </div>
+          <section class="working-group col-md-4 line-divider-left">
+            <h1 class="purple">Working Group</h1>
+            <p>The <strong>Eclipse IoT Working Group</strong> is an industry collaboration of companies who invest and promote an open source community for IoT. <a href="/ecosystem"><strong>Join Us</strong></a>!
+            </p>
+            <p><a href="/ecosystem" class="btn btn-primary">Ecosystem</a>
+            </p>
+          </section>
+        </div>
+      </div>
+    </section>
+
+  </main>
+
+
+  <footer>
+
+    <div class="container">
+      <div class="row">
+        <div class="col-md-6">
+          <nav>
+            <ul class="list-inline menu">
+              <li><a href="#">Technology</a>
+              </li>
+              <li><a href="#">Community</a>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </nav>
+          <div class="socials">
+            <a href="#" class="social-facebook">&nbsp;</a>
+            <a href="#" class="social-twitter">&nbsp;</a>
+            <a href="#" class="social-youtube">&nbsp;</a>
+            <a href="#" class="social-share">&nbsp;</a>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+        </div>
+      </div>
+    </div>
+
+
+  </footer>
+
+
+  
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
+  
+  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
+
+
+  <script src="js/index.js"></script>
+
+</body>
+
+</html>
diff --git a/public/index.html.bak.html b/public/index.html.bak.html
new file mode 100644
index 0000000000000000000000000000000000000000..cc8fccaadfe61f359e9bbb8036fe1078d6c807c6
--- /dev/null
+++ b/public/index.html.bak.html
@@ -0,0 +1,342 @@
+<!DOCTYPE html>
+<html itemscope itemtype="http://schema.org/Article" lang="en">
+
+<head>
+    <!-- Add the following three tags inside head. -->
+    <meta itemprop="name" content="iot.eclipse.org - IoT development made simple">
+    <meta itemprop="description" content="iot.eclipse.org is where you can learn about the technologies developed at Eclipse to make Internet of Things (IoT) development simpler.
+
+These technologies aim at establishing an open, end-to-end, IoT stack.">
+    <meta itemprop="image" content="http://iot.eclipse.org/site_preview.jpg">
+
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>iot.eclipse.org &mdash; IoT development made simple</title>
+    <meta name="description" content="iot.eclipse.org developer portal: open source tools, frameworks and protocols for IoT and M2M developers">
+    <meta name="author" content="Eclipse.org">
+    <link rel="author" href="humans.txt" />
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+    <!-- Custom Fonts -->
+    <link href='http://fonts.googleapis.com/css?family=Lato:300,400' rel='stylesheet' type='text/css'>
+    <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+
+    <!-- Le styles -->
+    <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet">
+    <link href="css/theme.css" rel="stylesheet">
+    <link href="css/bootstrap/bootstrap-responsive.min.css" rel="stylesheet">
+
+    <script type="text/javascript">
+    var _gaq = _gaq || [];
+    _gaq.push(['_setAccount', 'UA-594061-11']);
+    _gaq.push(['_trackPageview']);
+
+    (function() {
+        var ga = document.createElement('script');
+        ga.type = 'text/javascript';
+        ga.async = true;
+        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(ga, s);
+    })();
+    </script>
+</head>
+
+<body class="index">
+
+    <div class="navbar navbar-fixed-top">
+        <div class="navbar-inner">
+            <div class="container">
+                <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span>
+                </a> <a class="brand" href="/">iot.eclipse.org</a>
+
+                <div class="nav-collapse">
+                    <ul class="nav">
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/frameworks.html">Services &amp; Frameworks</a>
+                                </li>
+                                <li><a href="/protocols.html">Protocols</a>
+                                </li>
+                                <li><a href="/tools.html">Tools</a>
+                                </li>
+                                <li class="divider"></li>
+                                <li><a href="/java"><strong>Open IoT Stack for Java</strong></a>
+                                </li>
+                            </ul>
+                        </li>
+
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Community <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/community.html#projects">Projects</a>
+                                </li>
+                                <li><a href="/community.html#news">News</a>
+                                </li>
+                                <li class="divider"></li>
+                                <li><a href="/open-iot-challenge">Open IoT Challenge </a>
+                                </li>
+                            </ul>
+                        </li>
+
+                        <li><a href="/ecosystem.html">Ecosystem</a>
+                        </li>
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">See it live <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/demo">Live Demo</a>
+                                </li>
+                                <li><a href="/sandbox.html">Sandbox</a>
+                                </li>
+                            </ul>
+                        </li>
+                    </ul>
+
+                    <ul class="nav pull-right">
+                        <li style="margin-left:0px;">
+                            <div style="padding-top: 20px">
+                                <div class="g-plusone" data-href="http://iot.eclipse.org/"></div>
+                            </div>
+                        </li>
+                    </ul>
+                </div>
+                <!--/.nav-collapse -->
+
+            </div>
+        </div>
+    </div>
+
+    <!-- Place this tag after the last +1 button tag. -->
+    <script type="text/javascript">
+    (function() {
+        var po = document.createElement('script');
+        po.type = 'text/javascript';
+        po.async = true;
+        po.src = 'https://apis.google.com/js/plusone.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(po, s);
+    })();
+    </script>
+
+
+    <div class="container">
+        <div class="row">
+            <div class="span6" id="catchline">
+                <h2>iot.eclipse.org</h2>
+                <p class="lead">
+                    This portal is where you can learn about the technologies developed at <a href="http://www.eclipse.org" target="_blank">Eclipse</a> to make Internet of Things (<a href="#" rel="popover" data-content="Technology that supports wired or wireless communication between machines." data-original-title="IoT" id="iot-definition">IoT</a>) development simpler.
+
+                </p>
+                <p class="lead">Our technologies aim at establishing an open IoT/M2M platform to be used by anyone.</p>
+            </div>
+
+            <div class="span5 offset1">
+                <div class="home_featured" id="iotchallenge-launch">
+                    <a href="/open-iot-challenge">
+                        <img alt="Open IoT Challenge" src="/images/_home/iotchallenge_text_overlay.png">
+                    </a>
+                </div>
+            </div>
+        </div>
+
+        <!-- Example row of columns -->
+        <div class="row" style="margin-top: 4em;">
+            <div class="span4 home-box" id="home-frameworks">
+                <h2>
+                    <a href="frameworks.html"><i class="icon-cogs"></i>Services &amp; Frameworks</a>
+                </h2>
+                <p class="lead">Deliver extensible runtimes and services enabling IoT/M2M applications.</p>
+                <p>We provide a set of services and frameworks enabling features such as device managment, software update, vertical solutions,&nbsp;&hellip;</p>
+                <p>
+                    <a class="btn" href="frameworks.html">More »</a>
+                </p>
+            </div>
+
+            <div class="span4 home-box" id="home-protocols">
+                <h2>
+                    <a href="protocols.html"><i class="icon-comments"></i>Protocols</a><br/>&nbsp;
+                </h2>
+                <p class="lead">Provide Open Source implementations of standard IoT/M2M protocols.</p>
+                <p>Currently, we provide tools and libraries for
+                    <a href="protocols.html#mqtt">MQTT</a> and
+                    <a href="protocols.html#coap">CoAP</a>, as well as
+                    <a href="protocols.html#oma-dm">OMA-DM</a> and
+                    <a href="protocols.html#oma-lwm2m">OMA LWM2M</a> Device Management protocols
+                    <p>
+                        <a class="btn" href="protocols.html">More »</a>
+                    </p>
+            </div>
+
+            <div class="span4 home-box" id="home-tools">
+                <h2>
+                    <a href="tools.html"><i class="icon-briefcase"></i>Tools</a><br/>&nbsp;
+                </h2>
+                <p class="lead">Package a "one-stop shop" IDE for IoT/M2M developers.</p>
+                <p>
+                    We believe that Lua is a language very well-tailored for the Internet of Things, therefore an IDE for Lua development is <a href="tools.html#ldt">available</a>.
+                </p>
+                <p>
+                    <a class="btn" href="tools.html">More »</a>
+                </p>
+            </div>
+            <div class="span4 offset2 home-box" id="home-community">
+
+                <h2>
+                    <a href="community.html"><i class="icon-bullhorn"></i>Community<br/>&nbsp;</a>
+                </h2>
+                <p class="lead">Get in touch with us, learn about future events&hellip;
+                </p>
+                <p>
+                    <a class="btn" href="community.html">More »</a>
+                </p>
+            </div>
+
+
+            <div class="span4 home-box" id="home-sandbox">
+                <h2>
+                    <a href="sandbox.html"><i class="icon-inbox"></i>Sandbox<br/>&nbsp;</a>
+                </h2>
+                <p class="lead">Connect your IoT devices to test servers.</p>
+                <p>In order to simplify the evaluation of the open IoT stack developed at Eclipse, we provide sandboxes for your devices to communicate with.</p>
+                <p>
+                    <a class="btn" href="sandbox.html">More »</a>
+                </p>
+            </div>
+
+
+        </div>
+
+        <h2>Our Members</h2>
+
+        <div class="well">
+
+            <h4>Steering Committee </h4>
+            <table class="table" id="sc-members">
+                <tr>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=968"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=968&amp;size=small" style="padding:5px;" alt="Eurotech"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=656"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=656&amp;size=small" style="padding:5px;" alt="IBM"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=843"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=843&amp;size=small" style="padding:5px;" alt="Sierra Wireless"></a></small>
+                    </td>
+                </tr>
+
+            </table>
+
+
+            <h4>
+                Participating Members
+            </h4>
+            <table class="table" id="wg-members">
+                <tr>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1100"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1100&amp;size=small" style="padding:5px;" alt="2lemetry"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=652"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=652&amp;size=small" style="padding:5px;" alt="Actuate"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1103"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1103&amp;size=small" style="padding:5px;" alt="Bitreactive"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=979"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=979&amp;size=small" style="padding:5px;" alt="Robert Bosch GmbH"></a></small>
+                    </td>
+                </tr>
+                <tr style="text-align:center;">
+                    <td>
+                        <small><a href="#"><img width="120" src="./images/ecosystem/logo-canonical.png" style="padding:5px;" alt="Canonical Group Ltd."></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=901"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=901&amp;size=small" style="padding:5px;" alt="Cisco"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1122"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1122&amp;size=small" style="padding:5px;" alt="dc-square GmbH"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1139"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1139&amp;size=small" style="padding:5px;" alt="Deutsche Telekom AG"></a></small>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1152"><img width="100" src="http://eclipse.org/membership/scripts/get_image.php?id=1152&amp;size=small" style="padding:5px;" alt="GadgetKeeper"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1086"><img width="100" src="http://eclipse.org/membership/scripts/get_image.php?id=1086&amp;size=small" style="padding:5px;" alt="IBH SYSTEMS GmbH"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1128"><img width="100" src="http://eclipse.org/membership/scripts/get_image.php?id=1128&amp;size=small" style="padding:5px;" alt="IIC"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1140"><img width="100" src="http://eclipse.org/membership/scripts/get_image.php?id=1140&amp;size=small" style="padding:5px;" alt="IS2T"></a></small>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=817"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=817&amp;size=small" style="padding:5px;" alt="itemis"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1108"><img width="120" src="images/ecosystem/logo-laas.png" style="padding:5px;" alt="LAAS CNRS"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1151"><img width="120" src="./images/ecosystem/logo-litmus.png" style="padding:5px;" alt="Litmus Automation"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1101"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1101&amp;size=small" style="padding:5px;" alt="M2M Alliance"></a></small>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1120"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1120&amp;size=small" style="padding:5px;" alt="openHAB UG"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1046"><img width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1046&amp;size=small" style="padding:5px;" alt="SMB"></a></small>
+                    </td>
+                </tr>
+            </table>
+
+        </div>
+
+        <hr>
+
+        <footer>
+            <ul class="nav nav-pills">
+                <li><a href="/">Home</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/" target="_blank">Legal</a>
+                </li>
+                <li><a href="contact.html" data-toggle="modal" data-target="#contact-modal">Contact Us</a>
+                </li>
+                <li class="pull-right">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</li>
+            </ul>
+        </footer>
+
+        <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;">
+        </div>
+
+    </div>
+    <!-- /container -->
+
+
+    <!-- JS is at the end of the document so the pages load faster -->
+    <script src="js/jquery.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/shuffle.js"></script>
+    <script src="js/index.js"></script>
+
+</body>
+
+</html>
diff --git a/public/index.xml b/public/index.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ac126e3e92a0f62f0ad1cc0ecbcd0f1666631739
--- /dev/null
+++ b/public/index.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+      <title>Recent Content on  </title>
+      <generator uri="https://hugo.spf13.com">Hugo</generator>
+    <link>/index.xml/</link>
+    
+    
+    
+    <updated>Mon, 09 Mar 2015 00:00:00 UTC</updated>
+    
+    <item>
+      <title>EclipseCon NA 2015</title>
+      <link>/event/xx/</link>
+      <pubDate>Mon, 09 Mar 2015 00:00:00 UTC</pubDate>
+      
+      <guid>/event/xx/</guid>
+      <description>&lt;p&gt;xx&lt;/p&gt;
+</description>
+    </item>
+    
+    <item>
+      <title>first</title>
+      <link>/post/first/</link>
+      <pubDate>Thu, 05 Mar 2015 12:16:25 CET</pubDate>
+      
+      <guid>/post/first/</guid>
+      <description>&lt;p&gt;When faced with the same need, I past the lwm2m_context_t pointer in the object lwm2m_object_t::userData (directly on inside a struct). See code snippets below.&lt;/p&gt;
+</description>
+    </item>
+    
+  </channel>
+</rss>
\ No newline at end of file
diff --git a/java/config.codekit b/public/java/config.codekit
similarity index 100%
rename from java/config.codekit
rename to public/java/config.codekit
diff --git a/java/demo/app/css/.gitkeep b/public/java/demo/app/css/.gitkeep
similarity index 100%
rename from java/demo/app/css/.gitkeep
rename to public/java/demo/app/css/.gitkeep
diff --git a/java/demo/app/css/animation.css b/public/java/demo/app/css/animation.css
similarity index 100%
rename from java/demo/app/css/animation.css
rename to public/java/demo/app/css/animation.css
diff --git a/java/demo/app/css/app.css b/public/java/demo/app/css/app.css
similarity index 100%
rename from java/demo/app/css/app.css
rename to public/java/demo/app/css/app.css
diff --git a/java/demo/app/css/fontello-codes.css b/public/java/demo/app/css/fontello-codes.css
similarity index 100%
rename from java/demo/app/css/fontello-codes.css
rename to public/java/demo/app/css/fontello-codes.css
diff --git a/java/demo/app/css/fontello-embedded.css b/public/java/demo/app/css/fontello-embedded.css
similarity index 100%
rename from java/demo/app/css/fontello-embedded.css
rename to public/java/demo/app/css/fontello-embedded.css
diff --git a/java/demo/app/css/fontello-ie7-codes.css b/public/java/demo/app/css/fontello-ie7-codes.css
similarity index 100%
rename from java/demo/app/css/fontello-ie7-codes.css
rename to public/java/demo/app/css/fontello-ie7-codes.css
diff --git a/java/demo/app/css/fontello-ie7.css b/public/java/demo/app/css/fontello-ie7.css
similarity index 100%
rename from java/demo/app/css/fontello-ie7.css
rename to public/java/demo/app/css/fontello-ie7.css
diff --git a/java/demo/app/css/fontello.css b/public/java/demo/app/css/fontello.css
similarity index 100%
rename from java/demo/app/css/fontello.css
rename to public/java/demo/app/css/fontello.css
diff --git a/java/demo/app/font/fontello.eot b/public/java/demo/app/font/fontello.eot
similarity index 100%
rename from java/demo/app/font/fontello.eot
rename to public/java/demo/app/font/fontello.eot
diff --git a/java/demo/app/font/fontello.svg b/public/java/demo/app/font/fontello.svg
similarity index 100%
rename from java/demo/app/font/fontello.svg
rename to public/java/demo/app/font/fontello.svg
diff --git a/java/demo/app/font/fontello.ttf b/public/java/demo/app/font/fontello.ttf
similarity index 100%
rename from java/demo/app/font/fontello.ttf
rename to public/java/demo/app/font/fontello.ttf
diff --git a/java/demo/app/font/fontello.woff b/public/java/demo/app/font/fontello.woff
similarity index 100%
rename from java/demo/app/font/fontello.woff
rename to public/java/demo/app/font/fontello.woff
diff --git a/java/demo/app/img/.gitkeep b/public/java/demo/app/img/.gitkeep
similarity index 100%
rename from java/demo/app/img/.gitkeep
rename to public/java/demo/app/img/.gitkeep
diff --git a/java/demo/app/img/greenhouse.png b/public/java/demo/app/img/greenhouse.png
similarity index 100%
rename from java/demo/app/img/greenhouse.png
rename to public/java/demo/app/img/greenhouse.png
diff --git a/java/demo/app/index-async.html b/public/java/demo/app/index-async.html
similarity index 100%
rename from java/demo/app/index-async.html
rename to public/java/demo/app/index-async.html
diff --git a/java/demo/app/index.html b/public/java/demo/app/index.html
similarity index 100%
rename from java/demo/app/index.html
rename to public/java/demo/app/index.html
diff --git a/java/demo/app/js/app.js b/public/java/demo/app/js/app.js
similarity index 100%
rename from java/demo/app/js/app.js
rename to public/java/demo/app/js/app.js
diff --git a/java/demo/app/js/controllers.js b/public/java/demo/app/js/controllers.js
similarity index 100%
rename from java/demo/app/js/controllers.js
rename to public/java/demo/app/js/controllers.js
diff --git a/java/demo/app/js/directives.js b/public/java/demo/app/js/directives.js
similarity index 100%
rename from java/demo/app/js/directives.js
rename to public/java/demo/app/js/directives.js
diff --git a/java/demo/app/js/filters.js b/public/java/demo/app/js/filters.js
similarity index 100%
rename from java/demo/app/js/filters.js
rename to public/java/demo/app/js/filters.js
diff --git a/java/demo/app/js/services.js b/public/java/demo/app/js/services.js
similarity index 100%
rename from java/demo/app/js/services.js
rename to public/java/demo/app/js/services.js
diff --git a/java/demo/app/js/ui-bootstrap-tpls-0.11.0.min.js b/public/java/demo/app/js/ui-bootstrap-tpls-0.11.0.min.js
similarity index 100%
rename from java/demo/app/js/ui-bootstrap-tpls-0.11.0.min.js
rename to public/java/demo/app/js/ui-bootstrap-tpls-0.11.0.min.js
diff --git a/java/demo/app/partials/greenhouses-list.html b/public/java/demo/app/partials/greenhouses-list.html
similarity index 100%
rename from java/demo/app/partials/greenhouses-list.html
rename to public/java/demo/app/partials/greenhouses-list.html
diff --git a/java/demo/bower.json b/public/java/demo/bower.json
similarity index 100%
rename from java/demo/bower.json
rename to public/java/demo/bower.json
diff --git a/java/demo/org.eclipse.greenhouse.iot-0.1.0.dp b/public/java/demo/org.eclipse.greenhouse.iot-0.1.0.dp
similarity index 100%
rename from java/demo/org.eclipse.greenhouse.iot-0.1.0.dp
rename to public/java/demo/org.eclipse.greenhouse.iot-0.1.0.dp
diff --git a/java/demo/package.json b/public/java/demo/package.json
similarity index 100%
rename from java/demo/package.json
rename to public/java/demo/package.json
diff --git a/java/discover.html b/public/java/discover.html
similarity index 100%
rename from java/discover.html
rename to public/java/discover.html
diff --git a/java/download/index.html b/public/java/download/index.html
similarity index 100%
rename from java/download/index.html
rename to public/java/download/index.html
diff --git a/java/fonts/FontAwesome.otf b/public/java/fonts/FontAwesome.otf
similarity index 100%
rename from java/fonts/FontAwesome.otf
rename to public/java/fonts/FontAwesome.otf
diff --git a/java/fonts/fontawesome-webfont.eot b/public/java/fonts/fontawesome-webfont.eot
similarity index 100%
rename from java/fonts/fontawesome-webfont.eot
rename to public/java/fonts/fontawesome-webfont.eot
diff --git a/java/fonts/fontawesome-webfont.svg b/public/java/fonts/fontawesome-webfont.svg
similarity index 100%
rename from java/fonts/fontawesome-webfont.svg
rename to public/java/fonts/fontawesome-webfont.svg
diff --git a/java/fonts/fontawesome-webfont.ttf b/public/java/fonts/fontawesome-webfont.ttf
similarity index 100%
rename from java/fonts/fontawesome-webfont.ttf
rename to public/java/fonts/fontawesome-webfont.ttf
diff --git a/java/fonts/fontawesome-webfont.woff b/public/java/fonts/fontawesome-webfont.woff
similarity index 100%
rename from java/fonts/fontawesome-webfont.woff
rename to public/java/fonts/fontawesome-webfont.woff
diff --git a/java/images/discover-bg.png b/public/java/images/discover-bg.png
similarity index 100%
rename from java/images/discover-bg.png
rename to public/java/images/discover-bg.png
diff --git a/java/images/footer-bg.png b/public/java/images/footer-bg.png
similarity index 100%
rename from java/images/footer-bg.png
rename to public/java/images/footer-bg.png
diff --git a/java/images/header-bg.png b/public/java/images/header-bg.png
similarity index 100%
rename from java/images/header-bg.png
rename to public/java/images/header-bg.png
diff --git a/java/images/icon-connect.jpg b/public/java/images/icon-connect.jpg
similarity index 100%
rename from java/images/icon-connect.jpg
rename to public/java/images/icon-connect.jpg
diff --git a/java/images/icon-download.jpg b/public/java/images/icon-download.jpg
similarity index 100%
rename from java/images/icon-download.jpg
rename to public/java/images/icon-download.jpg
diff --git a/java/images/icon-live.jpg b/public/java/images/icon-live.jpg
similarity index 100%
rename from java/images/icon-live.jpg
rename to public/java/images/icon-live.jpg
diff --git a/java/images/icon-tutorial.jpg b/public/java/images/icon-tutorial.jpg
similarity index 100%
rename from java/images/icon-tutorial.jpg
rename to public/java/images/icon-tutorial.jpg
diff --git a/java/images/logo-01.png b/public/java/images/logo-01.png
similarity index 100%
rename from java/images/logo-01.png
rename to public/java/images/logo-01.png
diff --git a/java/images/logo-02.png b/public/java/images/logo-02.png
similarity index 100%
rename from java/images/logo-02.png
rename to public/java/images/logo-02.png
diff --git a/java/images/logo-2lemetry.jpg b/public/java/images/logo-2lemetry.jpg
similarity index 100%
rename from java/images/logo-2lemetry.jpg
rename to public/java/images/logo-2lemetry.jpg
diff --git a/java/images/logo-actuate.jpg b/public/java/images/logo-actuate.jpg
similarity index 100%
rename from java/images/logo-actuate.jpg
rename to public/java/images/logo-actuate.jpg
diff --git a/java/images/logo-axeda.jpg b/public/java/images/logo-axeda.jpg
similarity index 100%
rename from java/images/logo-axeda.jpg
rename to public/java/images/logo-axeda.jpg
diff --git a/java/images/logo-bitreactive.jpg b/public/java/images/logo-bitreactive.jpg
similarity index 100%
rename from java/images/logo-bitreactive.jpg
rename to public/java/images/logo-bitreactive.jpg
diff --git a/java/images/logo-eurotech.jpg b/public/java/images/logo-eurotech.jpg
similarity index 100%
rename from java/images/logo-eurotech.jpg
rename to public/java/images/logo-eurotech.jpg
diff --git a/java/images/logo-ibm.jpg b/public/java/images/logo-ibm.jpg
similarity index 100%
rename from java/images/logo-ibm.jpg
rename to public/java/images/logo-ibm.jpg
diff --git a/java/images/logo-sierra.jpg b/public/java/images/logo-sierra.jpg
similarity index 100%
rename from java/images/logo-sierra.jpg
rename to public/java/images/logo-sierra.jpg
diff --git a/java/images/m2m_eclipse_logo.png b/public/java/images/m2m_eclipse_logo.png
similarity index 100%
rename from java/images/m2m_eclipse_logo.png
rename to public/java/images/m2m_eclipse_logo.png
diff --git a/java/images/vision.png b/public/java/images/vision.png
similarity index 100%
rename from java/images/vision.png
rename to public/java/images/vision.png
diff --git a/java/index.html b/public/java/index.html
similarity index 100%
rename from java/index.html
rename to public/java/index.html
diff --git a/java/js/bootstrap-lightbox.min.js b/public/java/js/bootstrap-lightbox.min.js
similarity index 100%
rename from java/js/bootstrap-lightbox.min.js
rename to public/java/js/bootstrap-lightbox.min.js
diff --git a/java/js/bootstrap/bootstrap.min.js b/public/java/js/bootstrap/bootstrap.min.js
similarity index 100%
rename from java/js/bootstrap/bootstrap.min.js
rename to public/java/js/bootstrap/bootstrap.min.js
diff --git a/java/js/bootstrap/min/bootstrap.min-min.js b/public/java/js/bootstrap/min/bootstrap.min-min.js
similarity index 100%
rename from java/js/bootstrap/min/bootstrap.min-min.js
rename to public/java/js/bootstrap/min/bootstrap.min-min.js
diff --git a/java/js/index.js b/public/java/js/index.js
similarity index 100%
rename from java/js/index.js
rename to public/java/js/index.js
diff --git a/java/js/jquery.min.js b/public/java/js/jquery.min.js
similarity index 100%
rename from java/js/jquery.min.js
rename to public/java/js/jquery.min.js
diff --git a/java/js/min/jquery.min-min.js b/public/java/js/min/jquery.min-min.js
similarity index 100%
rename from java/js/min/jquery.min-min.js
rename to public/java/js/min/jquery.min-min.js
diff --git a/java/js/prism.js b/public/java/js/prism.js
similarity index 100%
rename from java/js/prism.js
rename to public/java/js/prism.js
diff --git a/java/open-iot-stack-for-java.html b/public/java/open-iot-stack-for-java.html
similarity index 100%
rename from java/open-iot-stack-for-java.html
rename to public/java/open-iot-stack-for-java.html
diff --git a/java/stylesheet/bootstrap-lightbox.min.css b/public/java/stylesheet/bootstrap-lightbox.min.css
similarity index 100%
rename from java/stylesheet/bootstrap-lightbox.min.css
rename to public/java/stylesheet/bootstrap-lightbox.min.css
diff --git a/java/stylesheet/bootstrap/bootstrap-responsive.min.css b/public/java/stylesheet/bootstrap/bootstrap-responsive.min.css
similarity index 100%
rename from java/stylesheet/bootstrap/bootstrap-responsive.min.css
rename to public/java/stylesheet/bootstrap/bootstrap-responsive.min.css
diff --git a/java/stylesheet/bootstrap/bootstrap.min.css b/public/java/stylesheet/bootstrap/bootstrap.min.css
similarity index 100%
rename from java/stylesheet/bootstrap/bootstrap.min.css
rename to public/java/stylesheet/bootstrap/bootstrap.min.css
diff --git a/java/stylesheet/font-awesome.min.css b/public/java/stylesheet/font-awesome.min.css
similarity index 100%
rename from java/stylesheet/font-awesome.min.css
rename to public/java/stylesheet/font-awesome.min.css
diff --git a/java/stylesheet/prism.css b/public/java/stylesheet/prism.css
similarity index 100%
rename from java/stylesheet/prism.css
rename to public/java/stylesheet/prism.css
diff --git a/java/stylesheet/theme.css b/public/java/stylesheet/theme.css
similarity index 100%
rename from java/stylesheet/theme.css
rename to public/java/stylesheet/theme.css
diff --git a/java/tutorial/index.html b/public/java/tutorial/index.html
similarity index 100%
rename from java/tutorial/index.html
rename to public/java/tutorial/index.html
diff --git a/js/bootstrap/bootstrap-carousel.js b/public/js/bootstrap/bootstrap-carousel.js
similarity index 100%
rename from js/bootstrap/bootstrap-carousel.js
rename to public/js/bootstrap/bootstrap-carousel.js
diff --git a/js/bootstrap/bootstrap-modal.js b/public/js/bootstrap/bootstrap-modal.js
similarity index 100%
rename from js/bootstrap/bootstrap-modal.js
rename to public/js/bootstrap/bootstrap-modal.js
diff --git a/js/bootstrap/bootstrap.min.js b/public/js/bootstrap/bootstrap.min.js
similarity index 100%
rename from js/bootstrap/bootstrap.min.js
rename to public/js/bootstrap/bootstrap.min.js
diff --git a/js/community.js b/public/js/community.js
similarity index 100%
rename from js/community.js
rename to public/js/community.js
diff --git a/js/community.min.js b/public/js/community.min.js
similarity index 100%
rename from js/community.min.js
rename to public/js/community.min.js
diff --git a/js/ecosystem.js b/public/js/ecosystem.js
similarity index 100%
rename from js/ecosystem.js
rename to public/js/ecosystem.js
diff --git a/js/ecosystem.min.js b/public/js/ecosystem.min.js
similarity index 100%
rename from js/ecosystem.min.js
rename to public/js/ecosystem.min.js
diff --git a/js/getting-started.js b/public/js/getting-started.js
similarity index 100%
rename from js/getting-started.js
rename to public/js/getting-started.js
diff --git a/js/index.js b/public/js/index.js
similarity index 100%
rename from js/index.js
rename to public/js/index.js
diff --git a/js/jquery.js b/public/js/jquery.js
similarity index 100%
rename from js/jquery.js
rename to public/js/jquery.js
diff --git a/js/npm-debug.log b/public/js/npm-debug.log
similarity index 100%
rename from js/npm-debug.log
rename to public/js/npm-debug.log
diff --git a/js/projects.js b/public/js/projects.js
similarity index 100%
rename from js/projects.js
rename to public/js/projects.js
diff --git a/js/rss_update.js b/public/js/rss_update.js
similarity index 100%
rename from js/rss_update.js
rename to public/js/rss_update.js
diff --git a/js/shuffle.js b/public/js/shuffle.js
similarity index 100%
rename from js/shuffle.js
rename to public/js/shuffle.js
diff --git a/less/Makefile b/public/less/Makefile
similarity index 100%
rename from less/Makefile
rename to public/less/Makefile
diff --git a/less/README b/public/less/README
similarity index 100%
rename from less/README
rename to public/less/README
diff --git a/less/accordion.less b/public/less/accordion.less
similarity index 100%
rename from less/accordion.less
rename to public/less/accordion.less
diff --git a/less/alerts.less b/public/less/alerts.less
similarity index 100%
rename from less/alerts.less
rename to public/less/alerts.less
diff --git a/less/bootstrap.less b/public/less/bootstrap.less
similarity index 100%
rename from less/bootstrap.less
rename to public/less/bootstrap.less
diff --git a/less/breadcrumbs.less b/public/less/breadcrumbs.less
similarity index 100%
rename from less/breadcrumbs.less
rename to public/less/breadcrumbs.less
diff --git a/less/button-groups.less b/public/less/button-groups.less
similarity index 100%
rename from less/button-groups.less
rename to public/less/button-groups.less
diff --git a/less/buttons.less b/public/less/buttons.less
similarity index 100%
rename from less/buttons.less
rename to public/less/buttons.less
diff --git a/less/carousel.less b/public/less/carousel.less
similarity index 100%
rename from less/carousel.less
rename to public/less/carousel.less
diff --git a/less/close.less b/public/less/close.less
similarity index 100%
rename from less/close.less
rename to public/less/close.less
diff --git a/less/code.less b/public/less/code.less
similarity index 100%
rename from less/code.less
rename to public/less/code.less
diff --git a/less/component-animations.less b/public/less/component-animations.less
similarity index 100%
rename from less/component-animations.less
rename to public/less/component-animations.less
diff --git a/less/dropdowns.less b/public/less/dropdowns.less
similarity index 100%
rename from less/dropdowns.less
rename to public/less/dropdowns.less
diff --git a/less/font-awesome.less b/public/less/font-awesome.less
similarity index 100%
rename from less/font-awesome.less
rename to public/less/font-awesome.less
diff --git a/less/forms.less b/public/less/forms.less
similarity index 100%
rename from less/forms.less
rename to public/less/forms.less
diff --git a/less/grid.less b/public/less/grid.less
similarity index 100%
rename from less/grid.less
rename to public/less/grid.less
diff --git a/less/hero-unit.less b/public/less/hero-unit.less
similarity index 100%
rename from less/hero-unit.less
rename to public/less/hero-unit.less
diff --git a/less/labels-badges.less b/public/less/labels-badges.less
similarity index 100%
rename from less/labels-badges.less
rename to public/less/labels-badges.less
diff --git a/less/layouts.less b/public/less/layouts.less
similarity index 100%
rename from less/layouts.less
rename to public/less/layouts.less
diff --git a/less/m2m.eclipse.org.animations.less b/public/less/m2m.eclipse.org.animations.less
similarity index 100%
rename from less/m2m.eclipse.org.animations.less
rename to public/less/m2m.eclipse.org.animations.less
diff --git a/less/m2m.eclipse.org.less b/public/less/m2m.eclipse.org.less
similarity index 100%
rename from less/m2m.eclipse.org.less
rename to public/less/m2m.eclipse.org.less
diff --git a/less/mixins.less b/public/less/mixins.less
similarity index 100%
rename from less/mixins.less
rename to public/less/mixins.less
diff --git a/less/modals.less b/public/less/modals.less
similarity index 100%
rename from less/modals.less
rename to public/less/modals.less
diff --git a/less/navbar.less b/public/less/navbar.less
similarity index 100%
rename from less/navbar.less
rename to public/less/navbar.less
diff --git a/less/navbar.less.orig b/public/less/navbar.less.orig
similarity index 100%
rename from less/navbar.less.orig
rename to public/less/navbar.less.orig
diff --git a/less/navs.less b/public/less/navs.less
similarity index 100%
rename from less/navs.less
rename to public/less/navs.less
diff --git a/less/pager.less b/public/less/pager.less
similarity index 100%
rename from less/pager.less
rename to public/less/pager.less
diff --git a/less/pagination.less b/public/less/pagination.less
similarity index 100%
rename from less/pagination.less
rename to public/less/pagination.less
diff --git a/less/popovers.less b/public/less/popovers.less
similarity index 100%
rename from less/popovers.less
rename to public/less/popovers.less
diff --git a/less/progress-bars.less b/public/less/progress-bars.less
similarity index 100%
rename from less/progress-bars.less
rename to public/less/progress-bars.less
diff --git a/less/reset.less b/public/less/reset.less
similarity index 100%
rename from less/reset.less
rename to public/less/reset.less
diff --git a/less/responsive-1200px-min.less b/public/less/responsive-1200px-min.less
similarity index 100%
rename from less/responsive-1200px-min.less
rename to public/less/responsive-1200px-min.less
diff --git a/less/responsive-767px-max.less b/public/less/responsive-767px-max.less
similarity index 100%
rename from less/responsive-767px-max.less
rename to public/less/responsive-767px-max.less
diff --git a/less/responsive-768px-979px.less b/public/less/responsive-768px-979px.less
similarity index 100%
rename from less/responsive-768px-979px.less
rename to public/less/responsive-768px-979px.less
diff --git a/less/responsive-navbar.less b/public/less/responsive-navbar.less
similarity index 100%
rename from less/responsive-navbar.less
rename to public/less/responsive-navbar.less
diff --git a/less/responsive-utilities.less b/public/less/responsive-utilities.less
similarity index 100%
rename from less/responsive-utilities.less
rename to public/less/responsive-utilities.less
diff --git a/less/responsive.less b/public/less/responsive.less
similarity index 100%
rename from less/responsive.less
rename to public/less/responsive.less
diff --git a/less/scaffolding.less b/public/less/scaffolding.less
similarity index 100%
rename from less/scaffolding.less
rename to public/less/scaffolding.less
diff --git a/less/sprites.less b/public/less/sprites.less
similarity index 100%
rename from less/sprites.less
rename to public/less/sprites.less
diff --git a/less/tables.less b/public/less/tables.less
similarity index 100%
rename from less/tables.less
rename to public/less/tables.less
diff --git a/less/tests/css-tests.css b/public/less/tests/css-tests.css
similarity index 100%
rename from less/tests/css-tests.css
rename to public/less/tests/css-tests.css
diff --git a/less/tests/css-tests.html b/public/less/tests/css-tests.html
similarity index 100%
rename from less/tests/css-tests.html
rename to public/less/tests/css-tests.html
diff --git a/less/tests/forms.html b/public/less/tests/forms.html
similarity index 100%
rename from less/tests/forms.html
rename to public/less/tests/forms.html
diff --git a/less/tests/navbar.html b/public/less/tests/navbar.html
similarity index 100%
rename from less/tests/navbar.html
rename to public/less/tests/navbar.html
diff --git a/less/thumbnails.less b/public/less/thumbnails.less
similarity index 100%
rename from less/thumbnails.less
rename to public/less/thumbnails.less
diff --git a/less/tooltip.less b/public/less/tooltip.less
similarity index 100%
rename from less/tooltip.less
rename to public/less/tooltip.less
diff --git a/less/type.less b/public/less/type.less
similarity index 100%
rename from less/type.less
rename to public/less/type.less
diff --git a/less/utilities.less b/public/less/utilities.less
similarity index 100%
rename from less/utilities.less
rename to public/less/utilities.less
diff --git a/less/variables.less b/public/less/variables.less
similarity index 100%
rename from less/variables.less
rename to public/less/variables.less
diff --git a/less/variables.less.orig b/public/less/variables.less.orig
similarity index 100%
rename from less/variables.less.orig
rename to public/less/variables.less.orig
diff --git a/less/wells.less b/public/less/wells.less
similarity index 100%
rename from less/wells.less
rename to public/less/wells.less
diff --git a/open-iot-challenge/fonts/FontAwesome.otf b/public/open-iot-challenge/fonts/FontAwesome.otf
similarity index 100%
rename from open-iot-challenge/fonts/FontAwesome.otf
rename to public/open-iot-challenge/fonts/FontAwesome.otf
diff --git a/open-iot-challenge/fonts/fontawesome-webfont.eot b/public/open-iot-challenge/fonts/fontawesome-webfont.eot
similarity index 100%
rename from open-iot-challenge/fonts/fontawesome-webfont.eot
rename to public/open-iot-challenge/fonts/fontawesome-webfont.eot
diff --git a/open-iot-challenge/fonts/fontawesome-webfont.svg b/public/open-iot-challenge/fonts/fontawesome-webfont.svg
similarity index 100%
rename from open-iot-challenge/fonts/fontawesome-webfont.svg
rename to public/open-iot-challenge/fonts/fontawesome-webfont.svg
diff --git a/open-iot-challenge/fonts/fontawesome-webfont.ttf b/public/open-iot-challenge/fonts/fontawesome-webfont.ttf
similarity index 100%
rename from open-iot-challenge/fonts/fontawesome-webfont.ttf
rename to public/open-iot-challenge/fonts/fontawesome-webfont.ttf
diff --git a/open-iot-challenge/fonts/fontawesome-webfont.woff b/public/open-iot-challenge/fonts/fontawesome-webfont.woff
similarity index 100%
rename from open-iot-challenge/fonts/fontawesome-webfont.woff
rename to public/open-iot-challenge/fonts/fontawesome-webfont.woff
diff --git a/open-iot-challenge/images/contest-prizes-01.jpg b/public/open-iot-challenge/images/contest-prizes-01.jpg
similarity index 100%
rename from open-iot-challenge/images/contest-prizes-01.jpg
rename to public/open-iot-challenge/images/contest-prizes-01.jpg
diff --git a/open-iot-challenge/images/contest-prizes-02.jpg b/public/open-iot-challenge/images/contest-prizes-02.jpg
similarity index 100%
rename from open-iot-challenge/images/contest-prizes-02.jpg
rename to public/open-iot-challenge/images/contest-prizes-02.jpg
diff --git a/open-iot-challenge/images/contest-prizes-03.jpg b/public/open-iot-challenge/images/contest-prizes-03.jpg
similarity index 100%
rename from open-iot-challenge/images/contest-prizes-03.jpg
rename to public/open-iot-challenge/images/contest-prizes-03.jpg
diff --git a/open-iot-challenge/images/discover-bg.jpg b/public/open-iot-challenge/images/discover-bg.jpg
similarity index 100%
rename from open-iot-challenge/images/discover-bg.jpg
rename to public/open-iot-challenge/images/discover-bg.jpg
diff --git a/open-iot-challenge/images/footer-bg.jpg b/public/open-iot-challenge/images/footer-bg.jpg
similarity index 100%
rename from open-iot-challenge/images/footer-bg.jpg
rename to public/open-iot-challenge/images/footer-bg.jpg
diff --git a/open-iot-challenge/images/header-bg.jpg b/public/open-iot-challenge/images/header-bg.jpg
similarity index 100%
rename from open-iot-challenge/images/header-bg.jpg
rename to public/open-iot-challenge/images/header-bg.jpg
diff --git a/open-iot-challenge/images/header-logo.png b/public/open-iot-challenge/images/header-logo.png
similarity index 100%
rename from open-iot-challenge/images/header-logo.png
rename to public/open-iot-challenge/images/header-logo.png
diff --git a/open-iot-challenge/images/icon-connect.jpg b/public/open-iot-challenge/images/icon-connect.jpg
similarity index 100%
rename from open-iot-challenge/images/icon-connect.jpg
rename to public/open-iot-challenge/images/icon-connect.jpg
diff --git a/open-iot-challenge/images/icon-download.jpg b/public/open-iot-challenge/images/icon-download.jpg
similarity index 100%
rename from open-iot-challenge/images/icon-download.jpg
rename to public/open-iot-challenge/images/icon-download.jpg
diff --git a/open-iot-challenge/images/icon-live.jpg b/public/open-iot-challenge/images/icon-live.jpg
similarity index 100%
rename from open-iot-challenge/images/icon-live.jpg
rename to public/open-iot-challenge/images/icon-live.jpg
diff --git a/open-iot-challenge/images/icon-tutorial.jpg b/public/open-iot-challenge/images/icon-tutorial.jpg
similarity index 100%
rename from open-iot-challenge/images/icon-tutorial.jpg
rename to public/open-iot-challenge/images/icon-tutorial.jpg
diff --git a/open-iot-challenge/images/logo-01.png b/public/open-iot-challenge/images/logo-01.png
similarity index 100%
rename from open-iot-challenge/images/logo-01.png
rename to public/open-iot-challenge/images/logo-01.png
diff --git a/open-iot-challenge/images/logo-02.png b/public/open-iot-challenge/images/logo-02.png
similarity index 100%
rename from open-iot-challenge/images/logo-02.png
rename to public/open-iot-challenge/images/logo-02.png
diff --git a/open-iot-challenge/images/m2m_eclipse_logo.png b/public/open-iot-challenge/images/m2m_eclipse_logo.png
similarity index 100%
rename from open-iot-challenge/images/m2m_eclipse_logo.png
rename to public/open-iot-challenge/images/m2m_eclipse_logo.png
diff --git a/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.jpg b/public/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.jpg
similarity index 100%
rename from open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.jpg
rename to public/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.jpg
diff --git a/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.png b/public/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.png
similarity index 100%
rename from open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.png
rename to public/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.png
diff --git a/open-iot-challenge/images/plus.jpg b/public/open-iot-challenge/images/plus.jpg
similarity index 100%
rename from open-iot-challenge/images/plus.jpg
rename to public/open-iot-challenge/images/plus.jpg
diff --git a/open-iot-challenge/images/purple-check.png b/public/open-iot-challenge/images/purple-check.png
similarity index 100%
rename from open-iot-challenge/images/purple-check.png
rename to public/open-iot-challenge/images/purple-check.png
diff --git a/open-iot-challenge/images/social-facebook.jpg b/public/open-iot-challenge/images/social-facebook.jpg
similarity index 100%
rename from open-iot-challenge/images/social-facebook.jpg
rename to public/open-iot-challenge/images/social-facebook.jpg
diff --git a/open-iot-challenge/images/social-twitter.jpg b/public/open-iot-challenge/images/social-twitter.jpg
similarity index 100%
rename from open-iot-challenge/images/social-twitter.jpg
rename to public/open-iot-challenge/images/social-twitter.jpg
diff --git a/open-iot-challenge/images/social-youtube.jpg b/public/open-iot-challenge/images/social-youtube.jpg
similarity index 100%
rename from open-iot-challenge/images/social-youtube.jpg
rename to public/open-iot-challenge/images/social-youtube.jpg
diff --git a/open-iot-challenge/images/tech-bg.jpg b/public/open-iot-challenge/images/tech-bg.jpg
similarity index 100%
rename from open-iot-challenge/images/tech-bg.jpg
rename to public/open-iot-challenge/images/tech-bg.jpg
diff --git a/open-iot-challenge/images/tech-board.jpg b/public/open-iot-challenge/images/tech-board.jpg
similarity index 100%
rename from open-iot-challenge/images/tech-board.jpg
rename to public/open-iot-challenge/images/tech-board.jpg
diff --git a/open-iot-challenge/index.html b/public/open-iot-challenge/index.html
similarity index 100%
rename from open-iot-challenge/index.html
rename to public/open-iot-challenge/index.html
diff --git a/open-iot-challenge/js/bootstrap/bootstrap.min.js b/public/open-iot-challenge/js/bootstrap/bootstrap.min.js
similarity index 100%
rename from open-iot-challenge/js/bootstrap/bootstrap.min.js
rename to public/open-iot-challenge/js/bootstrap/bootstrap.min.js
diff --git a/open-iot-challenge/js/bootstrap/min/bootstrap.min-min.js b/public/open-iot-challenge/js/bootstrap/min/bootstrap.min-min.js
similarity index 100%
rename from open-iot-challenge/js/bootstrap/min/bootstrap.min-min.js
rename to public/open-iot-challenge/js/bootstrap/min/bootstrap.min-min.js
diff --git a/open-iot-challenge/js/custom.js b/public/open-iot-challenge/js/custom.js
similarity index 100%
rename from open-iot-challenge/js/custom.js
rename to public/open-iot-challenge/js/custom.js
diff --git a/open-iot-challenge/js/index.js b/public/open-iot-challenge/js/index.js
similarity index 100%
rename from open-iot-challenge/js/index.js
rename to public/open-iot-challenge/js/index.js
diff --git a/open-iot-challenge/js/jquery.min.js b/public/open-iot-challenge/js/jquery.min.js
similarity index 100%
rename from open-iot-challenge/js/jquery.min.js
rename to public/open-iot-challenge/js/jquery.min.js
diff --git a/open-iot-challenge/js/min/jquery.min-min.js b/public/open-iot-challenge/js/min/jquery.min-min.js
similarity index 100%
rename from open-iot-challenge/js/min/jquery.min-min.js
rename to public/open-iot-challenge/js/min/jquery.min-min.js
diff --git a/open-iot-challenge/js/shuffle.js b/public/open-iot-challenge/js/shuffle.js
similarity index 100%
rename from open-iot-challenge/js/shuffle.js
rename to public/open-iot-challenge/js/shuffle.js
diff --git a/open-iot-challenge/js/smoothscroll.js b/public/open-iot-challenge/js/smoothscroll.js
similarity index 100%
rename from open-iot-challenge/js/smoothscroll.js
rename to public/open-iot-challenge/js/smoothscroll.js
diff --git a/open-iot-challenge/js/tweecool.min.js b/public/open-iot-challenge/js/tweecool.min.js
similarity index 100%
rename from open-iot-challenge/js/tweecool.min.js
rename to public/open-iot-challenge/js/tweecool.min.js
diff --git a/open-iot-challenge/js/tweetie.min.js b/public/open-iot-challenge/js/tweetie.min.js
similarity index 100%
rename from open-iot-challenge/js/tweetie.min.js
rename to public/open-iot-challenge/js/tweetie.min.js
diff --git a/open-iot-challenge/stylesheet/bootstrap/bootstrap-responsive.min.css b/public/open-iot-challenge/stylesheet/bootstrap/bootstrap-responsive.min.css
similarity index 100%
rename from open-iot-challenge/stylesheet/bootstrap/bootstrap-responsive.min.css
rename to public/open-iot-challenge/stylesheet/bootstrap/bootstrap-responsive.min.css
diff --git a/open-iot-challenge/stylesheet/bootstrap/bootstrap.min.css b/public/open-iot-challenge/stylesheet/bootstrap/bootstrap.min.css
similarity index 100%
rename from open-iot-challenge/stylesheet/bootstrap/bootstrap.min.css
rename to public/open-iot-challenge/stylesheet/bootstrap/bootstrap.min.css
diff --git a/open-iot-challenge/stylesheet/font-awesome.min.css b/public/open-iot-challenge/stylesheet/font-awesome.min.css
similarity index 100%
rename from open-iot-challenge/stylesheet/font-awesome.min.css
rename to public/open-iot-challenge/stylesheet/font-awesome.min.css
diff --git a/open-iot-challenge/stylesheet/theme.css b/public/open-iot-challenge/stylesheet/theme.css
similarity index 100%
rename from open-iot-challenge/stylesheet/theme.css
rename to public/open-iot-challenge/stylesheet/theme.css
diff --git a/package.json b/public/package.json
similarity index 100%
rename from package.json
rename to public/package.json
diff --git a/public/post/index.html b/public/post/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..4567046ba5dcbfda7f1cd4fcf8833d82354e4bf6
--- /dev/null
+++ b/public/post/index.html
@@ -0,0 +1,8 @@
+<section id="main">
+    <div>
+        <h1 id="title">Posts</h1>
+        <ul id="list">
+              
+        </ul>
+    </div>
+</section>
diff --git a/public/post/index.xml b/public/post/index.xml
new file mode 100644
index 0000000000000000000000000000000000000000..530966b3aac0e0833c4674ab88934de231ec7a5f
--- /dev/null
+++ b/public/post/index.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+  <channel>
+      <title>Posts on  </title>
+      <generator uri="https://hugo.spf13.com">Hugo</generator>
+    <link>/post/index.xml/</link>
+    
+    
+    
+    <updated>Thu, 05 Mar 2015 12:16:25 CET</updated>
+    
+    <item>
+      <title>first</title>
+      <link>/post/first/</link>
+      <pubDate>Thu, 05 Mar 2015 12:16:25 CET</pubDate>
+      
+      <guid>/post/first/</guid>
+      <description>&lt;p&gt;When faced with the same need, I past the lwm2m_context_t pointer in the object lwm2m_object_t::userData (directly on inside a struct). See code snippets below.&lt;/p&gt;
+</description>
+    </item>
+    
+  </channel>
+</rss>
\ No newline at end of file
diff --git a/projects.html b/public/projects.html
similarity index 100%
rename from projects.html
rename to public/projects.html
diff --git a/protocols.html b/public/protocols.html
similarity index 100%
rename from protocols.html
rename to public/protocols.html
diff --git a/robots.txt b/public/robots.txt
similarity index 100%
rename from robots.txt
rename to public/robots.txt
diff --git a/sandbox.html b/public/sandbox.html
similarity index 100%
rename from sandbox.html
rename to public/sandbox.html
diff --git a/site_preview.jpg b/public/site_preview.jpg
similarity index 100%
rename from site_preview.jpg
rename to public/site_preview.jpg
diff --git a/sitemap.html b/public/sitemap.html
similarity index 100%
rename from sitemap.html
rename to public/sitemap.html
diff --git a/public/sitemap.xml b/public/sitemap.xml
new file mode 100644
index 0000000000000000000000000000000000000000..af52a7f851741ce58ce2daef36db82c80155905f
--- /dev/null
+++ b/public/sitemap.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+  
+  <url>
+    <loc>/</loc>
+    <lastmod>2015-03-09T00:00:00+00:00</lastmod>
+    <priority>0</priority>
+  </url>
+  
+  <url>
+    <loc>/event/xx/</loc>
+    <lastmod>2015-03-09T00:00:00+00:00</lastmod>
+  </url>
+  
+  <url>
+    <loc>/post/first/</loc>
+    <lastmod>2015-03-05T12:16:25+01:00</lastmod>
+  </url>
+  
+</urlset>
\ No newline at end of file
diff --git a/sitemap.xml.gz b/public/sitemap.xml.gz
similarity index 100%
rename from sitemap.xml.gz
rename to public/sitemap.xml.gz
diff --git a/standards.html b/public/standards.html
similarity index 100%
rename from standards.html
rename to public/standards.html
diff --git a/tools.html b/public/tools.html
similarity index 100%
rename from tools.html
rename to public/tools.html
diff --git a/urllist.txt b/public/urllist.txt
similarity index 100%
rename from urllist.txt
rename to public/urllist.txt
diff --git a/static/.gitignore b/static/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..54749a29bf0fce58dbd8715cdc6c8ae4f87ab9c7
--- /dev/null
+++ b/static/.gitignore
@@ -0,0 +1,2 @@
+node_modules
+.grunt
\ No newline at end of file
diff --git a/static/.htaccess b/static/.htaccess
new file mode 100644
index 0000000000000000000000000000000000000000..2dc8be5f682f7fa38053ee01968a02ad3a51841d
--- /dev/null
+++ b/static/.htaccess
@@ -0,0 +1,9 @@
+# Redirects domain.com/file.html to domain.com/file
+#RewriteCond %{REQUEST_FILENAME} !-d          # is not directory
+#RewriteCond %{REQUEST_FILENAME}\.html -f     # is an existing html file
+#RewriteCond %{REQUEST_URI} ^(.+)\.html$      # request URI ends with .html
+#RewriteRule (.*)\.html$ /$1 [R=301,L]        # redirect from index.html to index
+
+<IfModule pagespeed_module>
+    ModPagespeed off
+</IfModule>
\ No newline at end of file
diff --git a/static/.jsbeautifyrc b/static/.jsbeautifyrc
new file mode 100644
index 0000000000000000000000000000000000000000..07aea46f3b3404cb6722a5314cdd37599aaa8c68
--- /dev/null
+++ b/static/.jsbeautifyrc
@@ -0,0 +1,5 @@
+{
+    "html": {
+        "indent_size": 2 // Indentation size
+    }
+}
diff --git a/static/.project b/static/.project
new file mode 100644
index 0000000000000000000000000000000000000000..f4ca2a1802015991bb2ddc0061b848c27192174b
--- /dev/null
+++ b/static/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>m2m.eclipse.org</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/static/assets/css/bootstrap.css b/static/assets/css/bootstrap.css
new file mode 100644
index 0000000000000000000000000000000000000000..c3bc14a87cf148139e3c11fe476840e60cdf3925
--- /dev/null
+++ b/static/assets/css/bootstrap.css
@@ -0,0 +1,4463 @@
+@import url(http://fonts.googleapis.com/css?family=Montserrat:400,700);
+.green {
+  color: #6eb553; }
+
+.blue {
+  color: #3085cb; }
+
+.white {
+  color: whitesmoke; }
+
+.black {
+  color: #403c40; }
+
+.purple {
+  color: #551f62; }
+
+.right {
+  float: right; }
+
+.left {
+  float: left; }
+
+a.btn {
+  text-transform: uppercase;
+  padding: 10px 40px;
+  font-size: 12px; }
+
+a.btn.btn-primary {
+  background-color: transparent;
+  border-color: #3085cb;
+  color: #403c40;
+  -webkit-transition: all 300ms ease-out;
+  -moz-transition: all 300ms ease-out;
+  transition: all 300ms ease-out; }
+  a.btn.btn-primary:hover {
+    background-color: #3085cb;
+    color: whitesmoke; }
+
+
+.line-divider-right {
+  border-right: 1px solid #c2c2c2; }
+
+.align-center {
+  text-align: center; }
+
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+html {
+  font-family: sans-serif;
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%; }
+
+body {
+  margin: 0; }
+
+article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary {
+  display: block; }
+
+audio, canvas, progress, video {
+  display: inline-block;
+  vertical-align: baseline; }
+
+audio:not([controls]) {
+  display: none;
+  height: 0; }
+
+[hidden], template {
+  display: none; }
+
+a {
+  background-color: transparent; }
+
+a:active, a:hover {
+  outline: 0; }
+
+abbr[title] {
+  border-bottom: 1px dotted; }
+
+b, strong {
+  font-weight: bold; }
+
+dfn {
+  font-style: italic; }
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0; }
+
+mark {
+  background: yellow;
+  color: black; }
+
+small {
+  font-size: 80%; }
+
+sub, sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline; }
+
+sup {
+  top: -0.5em; }
+
+sub {
+  bottom: -0.25em; }
+
+img {
+  border: 0; }
+
+svg:not(:root) {
+  overflow: hidden; }
+
+figure {
+  margin: 1em 40px; }
+
+hr {
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  height: 0; }
+
+pre {
+  overflow: auto; }
+
+code, kbd, pre, samp {
+  font-family: monospace, monospace;
+  font-size: 1em; }
+
+button, input, optgroup, select, textarea {
+  color: inherit;
+  font: inherit;
+  margin: 0; }
+
+button {
+  overflow: visible; }
+
+button, select {
+  text-transform: none; }
+
+button, html input[type="button"], input[type="reset"], input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer; }
+
+button[disabled], html input[disabled] {
+  cursor: default; }
+
+button::-moz-focus-inner, input::-moz-focus-inner {
+  border: 0;
+  padding: 0; }
+
+input {
+  line-height: normal; }
+
+input[type="checkbox"], input[type="radio"] {
+  box-sizing: border-box;
+  padding: 0; }
+
+input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button {
+  height: auto; }
+
+input[type="search"] {
+  -webkit-appearance: textfield;
+  -moz-box-sizing: content-box;
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box; }
+
+input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none; }
+
+fieldset {
+  border: 1px solid silver;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em; }
+
+legend {
+  border: 0;
+  padding: 0; }
+
+textarea {
+  overflow: auto; }
+
+optgroup {
+  font-weight: bold; }
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0; }
+
+td, th {
+  padding: 0; }
+
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+  *, *:before, *:after {
+    background: transparent !important;
+    color: black !important;
+    box-shadow: none !important;
+    text-shadow: none !important; }
+  a, a:visited {
+    text-decoration: underline; }
+  a[href]:after {
+    content: " (" attr(href) ")"; }
+  abbr[title]:after {
+    content: " (" attr(title) ")"; }
+  a[href^="#"]:after, a[href^="javascript:"]:after {
+    content: ""; }
+  pre, blockquote {
+    border: 1px solid #999999;
+    page-break-inside: avoid; }
+  thead {
+    display: table-header-group; }
+  tr, img {
+    page-break-inside: avoid; }
+  img {
+    max-width: 100% !important; }
+  p, h2, h3 {
+    orphans: 3;
+    widows: 3; }
+  h2, h3 {
+    page-break-after: avoid; }
+  select {
+    background: white !important; }
+  .navbar {
+    display: none; }
+  .btn > .caret, .dropup > .btn > .caret {
+    border-top-color: black !important; }
+  .label {
+    border: 1px solid black; }
+  .table {
+    border-collapse: collapse !important; }
+    .table td, .table th {
+      background-color: white !important; }
+  .table-bordered th, .table-bordered td {
+    border: 1px solid #dddddd !important; } }
+
+* {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box; }
+
+*:before, *:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box; }
+
+html {
+  font-size: 10px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
+
+body {
+  font-family: "Montserrat", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.8;
+  color: #333333;
+  background-color: white; }
+
+input, button, select, textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit; }
+
+a {
+  color: #6eb553;
+  text-decoration: none; }
+  a:hover, a:focus {
+    color: #4e8338;
+    text-decoration: underline; }
+  a:focus {
+    outline: thin dotted;
+    outline: 5px auto-webkit-focus-ring-color;
+    outline-offset: -2px; }
+
+figure {
+  margin: 0; }
+
+img {
+  vertical-align: middle; }
+
+.img-responsive {
+  display: block;
+  max-width: 100%;
+  height: auto; }
+
+.img-rounded {
+  border-radius: 6px; }
+
+.img-thumbnail {
+  padding: 4px;
+  line-height: 1.8;
+  background-color: white;
+  border: 1px solid #dddddd;
+  border-radius: 4px;
+  -webkit-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto; }
+
+.img-circle {
+  border-radius: 50%; }
+
+hr {
+  margin-top: 25px;
+  margin-bottom: 25px;
+  border: 0;
+  border-top: 1px solid #eeeeee; }
+
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0; }
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto; }
+
+h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
+  font-family: inherit;
+  font-weight: 500;
+  line-height: 1.1;
+  color: inherit; }
+  h1 small, h1 .small, h2 small, h2 .small, h3 small, h3 .small, h4 small, h4 .small, h5 small, h5 .small, h6 small, h6 .small, .h1 small, .h1 .small, .h2 small, .h2 .small, .h3 small, .h3 .small, .h4 small, .h4 .small, .h5 small, .h5 .small, .h6 small, .h6 .small {
+    font-weight: normal;
+    line-height: 1;
+    color: #777777; }
+
+h1, .h1, h2, .h2, h3, .h3 {
+  margin-top: 25px;
+  margin-bottom: 12.5px; }
+  h1 small, h1 .small, .h1 small, .h1 .small, h2 small, h2 .small, .h2 small, .h2 .small, h3 small, h3 .small, .h3 small, .h3 .small {
+    font-size: 65%; }
+
+h4, .h4, h5, .h5, h6, .h6 {
+  margin-top: 12.5px;
+  margin-bottom: 12.5px; }
+  h4 small, h4 .small, .h4 small, .h4 .small, h5 small, h5 .small, .h5 small, .h5 .small, h6 small, h6 .small, .h6 small, .h6 .small {
+    font-size: 75%; }
+
+h1, .h1 {
+  font-size: 36px; }
+
+h2, .h2 {
+  font-size: 30px; }
+
+h3, .h3 {
+  font-size: 24px; }
+
+h4, .h4 {
+  font-size: 18px; }
+
+h5, .h5 {
+  font-size: 14px; }
+
+h6, .h6 {
+  font-size: 12px; }
+
+p {
+  margin: 0 0 12.5px; }
+
+.lead {
+  margin-bottom: 25px;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 1.4; }
+  @media (min-width: 768px) {
+    .lead {
+      font-size: 21px; } }
+
+small, .small {
+  font-size: 85%; }
+
+mark, .mark {
+  background-color: #fcf8e3;
+  padding: 0.2em; }
+
+.text-left {
+  text-align: left; }
+
+.text-right {
+  text-align: right; }
+
+.text-center {
+  text-align: center; }
+
+.text-justify {
+  text-align: justify; }
+
+.text-nowrap {
+  white-space: nowrap; }
+
+.text-lowercase {
+  text-transform: lowercase; }
+
+.text-uppercase {
+  text-transform: uppercase; }
+
+.text-capitalize {
+  text-transform: capitalize; }
+
+.text-muted {
+  color: #777777; }
+
+.text-primary {
+  color: #6eb553; }
+
+a.text-primary:hover {
+  color: #589540; }
+
+.text-success {
+  color: #3c763d; }
+
+a.text-success:hover {
+  color: #2b542b; }
+
+.text-info {
+  color: #31708f; }
+
+a.text-info:hover {
+  color: #245369; }
+
+.text-warning {
+  color: #8a6d3b; }
+
+a.text-warning:hover {
+  color: #66502c; }
+
+.text-danger {
+  color: #a94442; }
+
+a.text-danger:hover {
+  color: #843534; }
+
+.bg-primary {
+  color: white; }
+
+.bg-primary {
+  background-color: #6eb553; }
+
+a.bg-primary:hover {
+  background-color: #589540; }
+
+.bg-success {
+  background-color: #dff0d8; }
+
+a.bg-success:hover {
+  background-color: #c1e2b3; }
+
+.bg-info {
+  background-color: #d9edf7; }
+
+a.bg-info:hover {
+  background-color: #afdaee; }
+
+.bg-warning {
+  background-color: #fcf8e3; }
+
+a.bg-warning:hover {
+  background-color: #f7ecb5; }
+
+.bg-danger {
+  background-color: #f2dede; }
+
+a.bg-danger:hover {
+  background-color: #e4b9b9; }
+
+.page-header {
+  padding-bottom: 11.5px;
+  margin: 50px 0 25px;
+  border-bottom: 1px solid #eeeeee; }
+
+ul, ol {
+  margin-top: 0;
+  margin-bottom: 12.5px; }
+  ul ul, ul ol, ol ul, ol ol {
+    margin-bottom: 0; }
+
+.list-unstyled {
+  padding-left: 0;
+  list-style: none; }
+
+.list-inline {
+  padding-left: 0;
+  list-style: none;
+  margin-left: -5px; }
+  .list-inline > li {
+    display: inline-block;
+    padding-left: 5px;
+    padding-right: 5px; }
+
+dl {
+  margin-top: 0;
+  margin-bottom: 25px; }
+
+dt, dd {
+  line-height: 1.8; }
+
+dt {
+  font-weight: bold; }
+
+dd {
+  margin-left: 0; }
+
+.dl-horizontal dd:before, .dl-horizontal dd:after {
+  content: " ";
+  display: table; }
+.dl-horizontal dd:after {
+  clear: both; }
+@media (min-width: 768px) {
+  .dl-horizontal dt {
+    float: left;
+    width: 160px;
+    clear: left;
+    text-align: right;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap; }
+  .dl-horizontal dd {
+    margin-left: 180px; } }
+
+abbr[title], abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #777777; }
+
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase; }
+
+blockquote {
+  padding: 12.5px 25px;
+  margin: 0 0 25px;
+  font-size: 17.5px;
+  border-left: 5px solid #eeeeee; }
+  blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child {
+    margin-bottom: 0; }
+  blockquote footer, blockquote small, blockquote .small {
+    display: block;
+    font-size: 80%;
+    line-height: 1.8;
+    color: #777777; }
+    blockquote footer:before, blockquote small:before, blockquote .small:before {
+      content: '\2014 \00A0'; }
+
+.blockquote-reverse, blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+  text-align: right; }
+  .blockquote-reverse footer:before, .blockquote-reverse small:before, .blockquote-reverse .small:before, blockquote.pull-right footer:before, blockquote.pull-right small:before, blockquote.pull-right .small:before {
+    content: ''; }
+  .blockquote-reverse footer:after, .blockquote-reverse small:after, .blockquote-reverse .small:after, blockquote.pull-right footer:after, blockquote.pull-right small:after, blockquote.pull-right .small:after {
+    content: '\00A0 \2014'; }
+
+address {
+  margin-bottom: 25px;
+  font-style: normal;
+  line-height: 1.8; }
+
+code, kbd, pre, samp {
+  font-family: Menlo, Monaco, Consolas, "Courier New", monospace; }
+
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #c7254e;
+  background-color: #f9f2f4;
+  border-radius: 4px; }
+
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: white;
+  background-color: #333333;
+  border-radius: 3px;
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }
+  kbd kbd {
+    padding: 0;
+    font-size: 100%;
+    font-weight: bold;
+    box-shadow: none; }
+
+pre {
+  display: block;
+  padding: 12px;
+  margin: 0 0 12.5px;
+  font-size: 13px;
+  line-height: 1.8;
+  word-break: break-all;
+  word-wrap: break-word;
+  color: #333333;
+  background-color: whitesmoke;
+  border: 1px solid #cccccc;
+  border-radius: 4px; }
+  pre code {
+    padding: 0;
+    font-size: inherit;
+    color: inherit;
+    white-space: pre-wrap;
+    background-color: transparent;
+    border-radius: 0; }
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll; }
+
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  padding-left: 15px;
+  padding-right: 15px; }
+  .container:before, .container:after {
+    content: " ";
+    display: table; }
+  .container:after {
+    clear: both; }
+  @media (min-width: 768px) {
+    .container {
+      width: 750px; } }
+  @media (min-width: 992px) {
+    .container {
+      width: 970px; } }
+  @media (min-width: 1200px) {
+    .container {
+      width: 1170px; } }
+
+.container-fluid {
+  margin-right: auto;
+  margin-left: auto;
+  padding-left: 15px;
+  padding-right: 15px; }
+  .container-fluid:before, .container-fluid:after {
+    content: " ";
+    display: table; }
+  .container-fluid:after {
+    clear: both; }
+
+.row {
+  margin-left: -15px;
+  margin-right: -15px; }
+  .row:before, .row:after {
+    content: " ";
+    display: table; }
+  .row:after {
+    clear: both; }
+
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-left: 15px;
+  padding-right: 15px; }
+
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+  float: left; }
+
+.col-xs-1 {
+  width: 8.33333%; }
+
+.col-xs-2 {
+  width: 16.66667%; }
+
+.col-xs-3 {
+  width: 25%; }
+
+.col-xs-4 {
+  width: 33.33333%; }
+
+.col-xs-5 {
+  width: 41.66667%; }
+
+.col-xs-6 {
+  width: 50%; }
+
+.col-xs-7 {
+  width: 58.33333%; }
+
+.col-xs-8 {
+  width: 66.66667%; }
+
+.col-xs-9 {
+  width: 75%; }
+
+.col-xs-10 {
+  width: 83.33333%; }
+
+.col-xs-11 {
+  width: 91.66667%; }
+
+.col-xs-12 {
+  width: 100%; }
+
+.col-xs-pull-0 {
+  right: auto; }
+
+.col-xs-pull-1 {
+  right: 8.33333%; }
+
+.col-xs-pull-2 {
+  right: 16.66667%; }
+
+.col-xs-pull-3 {
+  right: 25%; }
+
+.col-xs-pull-4 {
+  right: 33.33333%; }
+
+.col-xs-pull-5 {
+  right: 41.66667%; }
+
+.col-xs-pull-6 {
+  right: 50%; }
+
+.col-xs-pull-7 {
+  right: 58.33333%; }
+
+.col-xs-pull-8 {
+  right: 66.66667%; }
+
+.col-xs-pull-9 {
+  right: 75%; }
+
+.col-xs-pull-10 {
+  right: 83.33333%; }
+
+.col-xs-pull-11 {
+  right: 91.66667%; }
+
+.col-xs-pull-12 {
+  right: 100%; }
+
+.col-xs-push-0 {
+  left: auto; }
+
+.col-xs-push-1 {
+  left: 8.33333%; }
+
+.col-xs-push-2 {
+  left: 16.66667%; }
+
+.col-xs-push-3 {
+  left: 25%; }
+
+.col-xs-push-4 {
+  left: 33.33333%; }
+
+.col-xs-push-5 {
+  left: 41.66667%; }
+
+.col-xs-push-6 {
+  left: 50%; }
+
+.col-xs-push-7 {
+  left: 58.33333%; }
+
+.col-xs-push-8 {
+  left: 66.66667%; }
+
+.col-xs-push-9 {
+  left: 75%; }
+
+.col-xs-push-10 {
+  left: 83.33333%; }
+
+.col-xs-push-11 {
+  left: 91.66667%; }
+
+.col-xs-push-12 {
+  left: 100%; }
+
+.col-xs-offset-0 {
+  margin-left: 0%; }
+
+.col-xs-offset-1 {
+  margin-left: 8.33333%; }
+
+.col-xs-offset-2 {
+  margin-left: 16.66667%; }
+
+.col-xs-offset-3 {
+  margin-left: 25%; }
+
+.col-xs-offset-4 {
+  margin-left: 33.33333%; }
+
+.col-xs-offset-5 {
+  margin-left: 41.66667%; }
+
+.col-xs-offset-6 {
+  margin-left: 50%; }
+
+.col-xs-offset-7 {
+  margin-left: 58.33333%; }
+
+.col-xs-offset-8 {
+  margin-left: 66.66667%; }
+
+.col-xs-offset-9 {
+  margin-left: 75%; }
+
+.col-xs-offset-10 {
+  margin-left: 83.33333%; }
+
+.col-xs-offset-11 {
+  margin-left: 91.66667%; }
+
+.col-xs-offset-12 {
+  margin-left: 100%; }
+
+@media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+    float: left; }
+  .col-sm-1 {
+    width: 8.33333%; }
+  .col-sm-2 {
+    width: 16.66667%; }
+  .col-sm-3 {
+    width: 25%; }
+  .col-sm-4 {
+    width: 33.33333%; }
+  .col-sm-5 {
+    width: 41.66667%; }
+  .col-sm-6 {
+    width: 50%; }
+  .col-sm-7 {
+    width: 58.33333%; }
+  .col-sm-8 {
+    width: 66.66667%; }
+  .col-sm-9 {
+    width: 75%; }
+  .col-sm-10 {
+    width: 83.33333%; }
+  .col-sm-11 {
+    width: 91.66667%; }
+  .col-sm-12 {
+    width: 100%; }
+  .col-sm-pull-0 {
+    right: auto; }
+  .col-sm-pull-1 {
+    right: 8.33333%; }
+  .col-sm-pull-2 {
+    right: 16.66667%; }
+  .col-sm-pull-3 {
+    right: 25%; }
+  .col-sm-pull-4 {
+    right: 33.33333%; }
+  .col-sm-pull-5 {
+    right: 41.66667%; }
+  .col-sm-pull-6 {
+    right: 50%; }
+  .col-sm-pull-7 {
+    right: 58.33333%; }
+  .col-sm-pull-8 {
+    right: 66.66667%; }
+  .col-sm-pull-9 {
+    right: 75%; }
+  .col-sm-pull-10 {
+    right: 83.33333%; }
+  .col-sm-pull-11 {
+    right: 91.66667%; }
+  .col-sm-pull-12 {
+    right: 100%; }
+  .col-sm-push-0 {
+    left: auto; }
+  .col-sm-push-1 {
+    left: 8.33333%; }
+  .col-sm-push-2 {
+    left: 16.66667%; }
+  .col-sm-push-3 {
+    left: 25%; }
+  .col-sm-push-4 {
+    left: 33.33333%; }
+  .col-sm-push-5 {
+    left: 41.66667%; }
+  .col-sm-push-6 {
+    left: 50%; }
+  .col-sm-push-7 {
+    left: 58.33333%; }
+  .col-sm-push-8 {
+    left: 66.66667%; }
+  .col-sm-push-9 {
+    left: 75%; }
+  .col-sm-push-10 {
+    left: 83.33333%; }
+  .col-sm-push-11 {
+    left: 91.66667%; }
+  .col-sm-push-12 {
+    left: 100%; }
+  .col-sm-offset-0 {
+    margin-left: 0%; }
+  .col-sm-offset-1 {
+    margin-left: 8.33333%; }
+  .col-sm-offset-2 {
+    margin-left: 16.66667%; }
+  .col-sm-offset-3 {
+    margin-left: 25%; }
+  .col-sm-offset-4 {
+    margin-left: 33.33333%; }
+  .col-sm-offset-5 {
+    margin-left: 41.66667%; }
+  .col-sm-offset-6 {
+    margin-left: 50%; }
+  .col-sm-offset-7 {
+    margin-left: 58.33333%; }
+  .col-sm-offset-8 {
+    margin-left: 66.66667%; }
+  .col-sm-offset-9 {
+    margin-left: 75%; }
+  .col-sm-offset-10 {
+    margin-left: 83.33333%; }
+  .col-sm-offset-11 {
+    margin-left: 91.66667%; }
+  .col-sm-offset-12 {
+    margin-left: 100%; } }
+
+@media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+    float: left; }
+  .col-md-1 {
+    width: 8.33333%; }
+  .col-md-2 {
+    width: 16.66667%; }
+  .col-md-3 {
+    width: 25%; }
+  .col-md-4 {
+    width: 33.33333%; }
+  .col-md-5 {
+    width: 41.66667%; }
+  .col-md-6 {
+    width: 50%; }
+  .col-md-7 {
+    width: 58.33333%; }
+  .col-md-8 {
+    width: 66.66667%; }
+  .col-md-9 {
+    width: 75%; }
+  .col-md-10 {
+    width: 83.33333%; }
+  .col-md-11 {
+    width: 91.66667%; }
+  .col-md-12 {
+    width: 100%; }
+  .col-md-pull-0 {
+    right: auto; }
+  .col-md-pull-1 {
+    right: 8.33333%; }
+  .col-md-pull-2 {
+    right: 16.66667%; }
+  .col-md-pull-3 {
+    right: 25%; }
+  .col-md-pull-4 {
+    right: 33.33333%; }
+  .col-md-pull-5 {
+    right: 41.66667%; }
+  .col-md-pull-6 {
+    right: 50%; }
+  .col-md-pull-7 {
+    right: 58.33333%; }
+  .col-md-pull-8 {
+    right: 66.66667%; }
+  .col-md-pull-9 {
+    right: 75%; }
+  .col-md-pull-10 {
+    right: 83.33333%; }
+  .col-md-pull-11 {
+    right: 91.66667%; }
+  .col-md-pull-12 {
+    right: 100%; }
+  .col-md-push-0 {
+    left: auto; }
+  .col-md-push-1 {
+    left: 8.33333%; }
+  .col-md-push-2 {
+    left: 16.66667%; }
+  .col-md-push-3 {
+    left: 25%; }
+  .col-md-push-4 {
+    left: 33.33333%; }
+  .col-md-push-5 {
+    left: 41.66667%; }
+  .col-md-push-6 {
+    left: 50%; }
+  .col-md-push-7 {
+    left: 58.33333%; }
+  .col-md-push-8 {
+    left: 66.66667%; }
+  .col-md-push-9 {
+    left: 75%; }
+  .col-md-push-10 {
+    left: 83.33333%; }
+  .col-md-push-11 {
+    left: 91.66667%; }
+  .col-md-push-12 {
+    left: 100%; }
+  .col-md-offset-0 {
+    margin-left: 0%; }
+  .col-md-offset-1 {
+    margin-left: 8.33333%; }
+  .col-md-offset-2 {
+    margin-left: 16.66667%; }
+  .col-md-offset-3 {
+    margin-left: 25%; }
+  .col-md-offset-4 {
+    margin-left: 33.33333%; }
+  .col-md-offset-5 {
+    margin-left: 41.66667%; }
+  .col-md-offset-6 {
+    margin-left: 50%; }
+  .col-md-offset-7 {
+    margin-left: 58.33333%; }
+  .col-md-offset-8 {
+    margin-left: 66.66667%; }
+  .col-md-offset-9 {
+    margin-left: 75%; }
+  .col-md-offset-10 {
+    margin-left: 83.33333%; }
+  .col-md-offset-11 {
+    margin-left: 91.66667%; }
+  .col-md-offset-12 {
+    margin-left: 100%; } }
+
+@media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+    float: left; }
+  .col-lg-1 {
+    width: 8.33333%; }
+  .col-lg-2 {
+    width: 16.66667%; }
+  .col-lg-3 {
+    width: 25%; }
+  .col-lg-4 {
+    width: 33.33333%; }
+  .col-lg-5 {
+    width: 41.66667%; }
+  .col-lg-6 {
+    width: 50%; }
+  .col-lg-7 {
+    width: 58.33333%; }
+  .col-lg-8 {
+    width: 66.66667%; }
+  .col-lg-9 {
+    width: 75%; }
+  .col-lg-10 {
+    width: 83.33333%; }
+  .col-lg-11 {
+    width: 91.66667%; }
+  .col-lg-12 {
+    width: 100%; }
+  .col-lg-pull-0 {
+    right: auto; }
+  .col-lg-pull-1 {
+    right: 8.33333%; }
+  .col-lg-pull-2 {
+    right: 16.66667%; }
+  .col-lg-pull-3 {
+    right: 25%; }
+  .col-lg-pull-4 {
+    right: 33.33333%; }
+  .col-lg-pull-5 {
+    right: 41.66667%; }
+  .col-lg-pull-6 {
+    right: 50%; }
+  .col-lg-pull-7 {
+    right: 58.33333%; }
+  .col-lg-pull-8 {
+    right: 66.66667%; }
+  .col-lg-pull-9 {
+    right: 75%; }
+  .col-lg-pull-10 {
+    right: 83.33333%; }
+  .col-lg-pull-11 {
+    right: 91.66667%; }
+  .col-lg-pull-12 {
+    right: 100%; }
+  .col-lg-push-0 {
+    left: auto; }
+  .col-lg-push-1 {
+    left: 8.33333%; }
+  .col-lg-push-2 {
+    left: 16.66667%; }
+  .col-lg-push-3 {
+    left: 25%; }
+  .col-lg-push-4 {
+    left: 33.33333%; }
+  .col-lg-push-5 {
+    left: 41.66667%; }
+  .col-lg-push-6 {
+    left: 50%; }
+  .col-lg-push-7 {
+    left: 58.33333%; }
+  .col-lg-push-8 {
+    left: 66.66667%; }
+  .col-lg-push-9 {
+    left: 75%; }
+  .col-lg-push-10 {
+    left: 83.33333%; }
+  .col-lg-push-11 {
+    left: 91.66667%; }
+  .col-lg-push-12 {
+    left: 100%; }
+  .col-lg-offset-0 {
+    margin-left: 0%; }
+  .col-lg-offset-1 {
+    margin-left: 8.33333%; }
+  .col-lg-offset-2 {
+    margin-left: 16.66667%; }
+  .col-lg-offset-3 {
+    margin-left: 25%; }
+  .col-lg-offset-4 {
+    margin-left: 33.33333%; }
+  .col-lg-offset-5 {
+    margin-left: 41.66667%; }
+  .col-lg-offset-6 {
+    margin-left: 50%; }
+  .col-lg-offset-7 {
+    margin-left: 58.33333%; }
+  .col-lg-offset-8 {
+    margin-left: 66.66667%; }
+  .col-lg-offset-9 {
+    margin-left: 75%; }
+  .col-lg-offset-10 {
+    margin-left: 83.33333%; }
+  .col-lg-offset-11 {
+    margin-left: 91.66667%; }
+  .col-lg-offset-12 {
+    margin-left: 100%; } }
+
+table {
+  background-color: transparent; }
+
+caption {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  color: #777777;
+  text-align: left; }
+
+th {
+  text-align: left; }
+
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 25px; }
+  .table > thead > tr > th, .table > thead > tr > td, .table > tbody > tr > th, .table > tbody > tr > td, .table > tfoot > tr > th, .table > tfoot > tr > td {
+    padding: 8px;
+    line-height: 1.8;
+    vertical-align: top;
+    border-top: 1px solid #dddddd; }
+  .table > thead > tr > th {
+    vertical-align: bottom;
+    border-bottom: 2px solid #dddddd; }
+  .table > caption + thead > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > th, .table > thead:first-child > tr:first-child > td {
+    border-top: 0; }
+  .table > tbody + tbody {
+    border-top: 2px solid #dddddd; }
+  .table .table {
+    background-color: white; }
+
+.table-condensed > thead > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > th, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > th, .table-condensed > tfoot > tr > td {
+  padding: 5px; }
+
+.table-bordered {
+  border: 1px solid #dddddd; }
+  .table-bordered > thead > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > th, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > th, .table-bordered > tfoot > tr > td {
+    border: 1px solid #dddddd; }
+  .table-bordered > thead > tr > th, .table-bordered > thead > tr > td {
+    border-bottom-width: 2px; }
+
+.table-striped > tbody > tr:nth-of-type(odd) {
+  background-color: #f9f9f9; }
+
+.table-hover > tbody > tr:hover {
+  background-color: whitesmoke; }
+
+table col[class*="col-"] {
+  position: static;
+  float: none;
+  display: table-column; }
+
+table td[class*="col-"], table th[class*="col-"] {
+  position: static;
+  float: none;
+  display: table-cell; }
+
+.table > thead > tr > td.active, .table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr > td.active, .table > tbody > tr > th.active, .table > tbody > tr.active > td, .table > tbody > tr.active > th, .table > tfoot > tr > td.active, .table > tfoot > tr > th.active, .table > tfoot > tr.active > td, .table > tfoot > tr.active > th {
+  background-color: whitesmoke; }
+
+.table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th {
+  background-color: #e8e8e8; }
+
+.table > thead > tr > td.success, .table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr > td.success, .table > tbody > tr > th.success, .table > tbody > tr.success > td, .table > tbody > tr.success > th, .table > tfoot > tr > td.success, .table > tfoot > tr > th.success, .table > tfoot > tr.success > td, .table > tfoot > tr.success > th {
+  background-color: #dff0d8; }
+
+.table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th {
+  background-color: #d0e9c6; }
+
+.table > thead > tr > td.info, .table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr > td.info, .table > tbody > tr > th.info, .table > tbody > tr.info > td, .table > tbody > tr.info > th, .table > tfoot > tr > td.info, .table > tfoot > tr > th.info, .table > tfoot > tr.info > td, .table > tfoot > tr.info > th {
+  background-color: #d9edf7; }
+
+.table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th {
+  background-color: #c4e4f3; }
+
+.table > thead > tr > td.warning, .table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr > td.warning, .table > tbody > tr > th.warning, .table > tbody > tr.warning > td, .table > tbody > tr.warning > th, .table > tfoot > tr > td.warning, .table > tfoot > tr > th.warning, .table > tfoot > tr.warning > td, .table > tfoot > tr.warning > th {
+  background-color: #fcf8e3; }
+
+.table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th {
+  background-color: #faf2cc; }
+
+.table > thead > tr > td.danger, .table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr > td.danger, .table > tbody > tr > th.danger, .table > tbody > tr.danger > td, .table > tbody > tr.danger > th, .table > tfoot > tr > td.danger, .table > tfoot > tr > th.danger, .table > tfoot > tr.danger > td, .table > tfoot > tr.danger > th {
+  background-color: #f2dede; }
+
+.table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th {
+  background-color: #ebcccc; }
+
+.table-responsive {
+  overflow-x: auto;
+  min-height: 0.01%; }
+  @media screen and (max-width: 767px) {
+    .table-responsive {
+      width: 100%;
+      margin-bottom: 18.75px;
+      overflow-y: hidden;
+      -ms-overflow-style: -ms-autohiding-scrollbar;
+      border: 1px solid #dddddd; }
+      .table-responsive > .table {
+        margin-bottom: 0; }
+        .table-responsive > .table > thead > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > tfoot > tr > td {
+          white-space: nowrap; }
+      .table-responsive > .table-bordered {
+        border: 0; }
+        .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+          border-left: 0; }
+        .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+          border-right: 0; }
+        .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+          border-bottom: 0; } }
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+  min-width: 0; }
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 25px;
+  font-size: 21px;
+  line-height: inherit;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5; }
+
+label {
+  display: inline-block;
+  max-width: 100%;
+  margin-bottom: 5px;
+  font-weight: bold; }
+
+input[type="search"] {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box; }
+
+input[type="radio"], input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  line-height: normal; }
+
+input[type="file"] {
+  display: block; }
+
+input[type="range"] {
+  display: block;
+  width: 100%; }
+
+select[multiple], select[size] {
+  height: auto; }
+
+input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus {
+  outline: thin dotted;
+  outline: 5px auto-webkit-focus-ring-color;
+  outline-offset: -2px; }
+
+output {
+  display: block;
+  padding-top: 7px;
+  font-size: 14px;
+  line-height: 1.8;
+  color: #58595b; }
+
+.form-control {
+  display: block;
+  width: 100%;
+  height: 39px;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.8;
+  color: #58595b;
+  background-color: white;
+  background-image: none;
+  border: 1px solid #cccccc;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; }
+  .form-control:focus {
+    border-color: #66afe9;
+    outline: 0;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); }
+  .form-control::-moz-placeholder {
+    color: #999999;
+    opacity: 1; }
+  .form-control:-ms-input-placeholder {
+    color: #999999; }
+  .form-control::-webkit-input-placeholder {
+    color: #999999; }
+  .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
+    cursor: not-allowed;
+    background-color: #eeeeee;
+    opacity: 1; }
+
+textarea.form-control {
+  height: auto; }
+
+input[type="search"] {
+  -webkit-appearance: none; }
+
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  input[type="date"], input[type="time"], input[type="datetime-local"], input[type="month"] {
+    line-height: 39px; }
+    input[type="date"].input-sm, .input-group-sm input[type="date"], input[type="time"].input-sm, .input-group-sm input[type="time"], input[type="datetime-local"].input-sm, .input-group-sm input[type="datetime-local"], input[type="month"].input-sm, .input-group-sm input[type="month"] {
+      line-height: 30px; }
+    input[type="date"].input-lg, .input-group-lg input[type="date"], input[type="time"].input-lg, .input-group-lg input[type="time"], input[type="datetime-local"].input-lg, .input-group-lg input[type="datetime-local"], input[type="month"].input-lg, .input-group-lg input[type="month"] {
+      line-height: 46px; } }
+
+.form-group {
+  margin-bottom: 15px; }
+
+.radio, .checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px; }
+  .radio label, .checkbox label {
+    min-height: 25px;
+    padding-left: 20px;
+    margin-bottom: 0;
+    font-weight: normal;
+    cursor: pointer; }
+
+.radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-left: -20px;
+  margin-top: 4px \9; }
+
+.radio + .radio, .checkbox + .checkbox {
+  margin-top: -5px; }
+
+.radio-inline, .checkbox-inline {
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  vertical-align: middle;
+  font-weight: normal;
+  cursor: pointer; }
+
+.radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px; }
+
+input[type="radio"][disabled], input[type="radio"].disabled, fieldset[disabled] input[type="radio"], input[type="checkbox"][disabled], input[type="checkbox"].disabled, fieldset[disabled] input[type="checkbox"] {
+  cursor: not-allowed; }
+
+.radio-inline.disabled, fieldset[disabled] .radio-inline, .checkbox-inline.disabled, fieldset[disabled] .checkbox-inline {
+  cursor: not-allowed; }
+
+.radio.disabled label, fieldset[disabled] .radio label, .checkbox.disabled label, fieldset[disabled] .checkbox label {
+  cursor: not-allowed; }
+
+.form-control-static {
+  padding-top: 7px;
+  padding-bottom: 7px;
+  margin-bottom: 0; }
+  .form-control-static.input-lg, .form-control-static.input-sm {
+    padding-left: 0;
+    padding-right: 0; }
+
+.input-sm, .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px; }
+
+select.input-sm {
+  height: 30px;
+  line-height: 30px; }
+
+textarea.input-sm, select[multiple].input-sm {
+  height: auto; }
+
+.form-group-sm .form-control {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px; }
+.form-group-sm select.form-control {
+  height: 30px;
+  line-height: 30px; }
+.form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control {
+  height: auto; }
+.form-group-sm .form-control-static {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5; }
+
+.input-lg, .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.33333;
+  border-radius: 6px; }
+
+select.input-lg {
+  height: 46px;
+  line-height: 46px; }
+
+textarea.input-lg, select[multiple].input-lg {
+  height: auto; }
+
+.form-group-lg .form-control {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.33333;
+  border-radius: 6px; }
+.form-group-lg select.form-control {
+  height: 46px;
+  line-height: 46px; }
+.form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control {
+  height: auto; }
+.form-group-lg .form-control-static {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.33333; }
+
+.has-feedback {
+  position: relative; }
+  .has-feedback .form-control {
+    padding-right: 48.75px; }
+
+.form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 39px;
+  height: 39px;
+  line-height: 39px;
+  text-align: center;
+  pointer-events: none; }
+
+.input-lg + .form-control-feedback {
+  width: 46px;
+  height: 46px;
+  line-height: 46px; }
+
+.input-sm + .form-control-feedback {
+  width: 30px;
+  height: 30px;
+  line-height: 30px; }
+
+.has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label {
+  color: #3c763d; }
+.has-success .form-control {
+  border-color: #3c763d;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
+  .has-success .form-control:focus {
+    border-color: #2b542b;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; }
+.has-success .input-group-addon {
+  color: #3c763d;
+  border-color: #3c763d;
+  background-color: #dff0d8; }
+.has-success .form-control-feedback {
+  color: #3c763d; }
+
+.has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label {
+  color: #8a6d3b; }
+.has-warning .form-control {
+  border-color: #8a6d3b;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
+  .has-warning .form-control:focus {
+    border-color: #66502c;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c09f6b;
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c09f6b; }
+.has-warning .input-group-addon {
+  color: #8a6d3b;
+  border-color: #8a6d3b;
+  background-color: #fcf8e3; }
+.has-warning .form-control-feedback {
+  color: #8a6d3b; }
+
+.has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label {
+  color: #a94442; }
+.has-error .form-control {
+  border-color: #a94442;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); }
+  .has-error .form-control:focus {
+    border-color: #843534;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; }
+.has-error .input-group-addon {
+  color: #a94442;
+  border-color: #a94442;
+  background-color: #f2dede; }
+.has-error .form-control-feedback {
+  color: #a94442; }
+
+.has-feedback label ~ .form-control-feedback {
+  top: 30px; }
+.has-feedback label.sr-only ~ .form-control-feedback {
+  top: 0; }
+
+.help-block {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: #737373; }
+
+@media (min-width: 768px) {
+  .form-inline .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle; }
+  .form-inline .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle; }
+  .form-inline .form-control-static {
+    display: inline-block; }
+  .form-inline .input-group {
+    display: inline-table;
+    vertical-align: middle; }
+    .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control {
+      width: auto; }
+  .form-inline .input-group > .form-control {
+    width: 100%; }
+  .form-inline .control-label {
+    margin-bottom: 0;
+    vertical-align: middle; }
+  .form-inline .radio, .form-inline .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle; }
+    .form-inline .radio label, .form-inline .checkbox label {
+      padding-left: 0; }
+  .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0; }
+  .form-inline .has-feedback .form-control-feedback {
+    top: 0; } }
+
+.form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline {
+  margin-top: 0;
+  margin-bottom: 0;
+  padding-top: 7px; }
+.form-horizontal .radio, .form-horizontal .checkbox {
+  min-height: 32px; }
+.form-horizontal .form-group {
+  margin-left: -15px;
+  margin-right: -15px; }
+  .form-horizontal .form-group:before, .form-horizontal .form-group:after {
+    content: " ";
+    display: table; }
+  .form-horizontal .form-group:after {
+    clear: both; }
+@media (min-width: 768px) {
+  .form-horizontal .control-label {
+    text-align: right;
+    margin-bottom: 0;
+    padding-top: 7px; } }
+.form-horizontal .has-feedback .form-control-feedback {
+  right: 15px; }
+@media (min-width: 768px) {
+  .form-horizontal .form-group-lg .control-label {
+    padding-top: 14.33333px; } }
+@media (min-width: 768px) {
+  .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px; } }
+
+.btn {
+  display: inline-block;
+  margin-bottom: 0;
+  font-weight: normal;
+  text-align: center;
+  vertical-align: middle;
+  touch-action: manipulation;
+  cursor: pointer;
+  background-image: none;
+  border: 1px solid transparent;
+  white-space: nowrap;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.8;
+  border-radius: 4px;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none; }
+  .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {
+    outline: thin dotted;
+    outline: 5px auto-webkit-focus-ring-color;
+    outline-offset: -2px; }
+  .btn:hover, .btn:focus, .btn.focus {
+    color: #333333;
+    text-decoration: none; }
+  .btn:active, .btn.active {
+    outline: 0;
+    background-image: none;
+    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
+  .btn.disabled, .btn[disabled], fieldset[disabled] .btn {
+    cursor: not-allowed;
+    pointer-events: none;
+    opacity: 0.65;
+    filter: alpha(opacity=65);
+    -webkit-box-shadow: none;
+    box-shadow: none; }
+
+.btn-default {
+  color: #333333;
+  background-color: white;
+  border-color: #cccccc; }
+  .btn-default:hover, .btn-default:focus, .btn-default.focus, .btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle {
+    color: #333333;
+    background-color: #e6e6e6;
+    border-color: #adadad; }
+  .btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle {
+    background-image: none; }
+  .btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus, .btn-default[disabled]:active, .btn-default[disabled].active, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default.focus, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default.active {
+    background-color: white;
+    border-color: #cccccc; }
+  .btn-default .badge {
+    color: white;
+    background-color: #333333; }
+
+.btn-primary {
+  color: white;
+  background-color: #6eb553;
+  border-color: #63a748; }
+  .btn-primary:hover, .btn-primary:focus, .btn-primary.focus, .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle {
+    color: white;
+    background-color: #589540;
+    border-color: #4b7c36; }
+  .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle {
+    background-image: none; }
+  .btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled].focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary.focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active {
+    background-color: #6eb553;
+    border-color: #63a748; }
+  .btn-primary .badge {
+    color: #6eb553;
+    background-color: white; }
+
+.btn-success {
+  color: white;
+  background-color: #5cb85c;
+  border-color: #4eae4c; }
+  .btn-success:hover, .btn-success:focus, .btn-success.focus, .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle {
+    color: white;
+    background-color: #469d44;
+    border-color: #3c8339; }
+  .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle {
+    background-image: none; }
+  .btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success.focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active {
+    background-color: #5cb85c;
+    border-color: #4eae4c; }
+  .btn-success .badge {
+    color: #5cb85c;
+    background-color: white; }
+
+.btn-info {
+  color: white;
+  background-color: #5bc0de;
+  border-color: #46bada; }
+  .btn-info:hover, .btn-info:focus, .btn-info.focus, .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle {
+    color: white;
+    background-color: #31b2d5;
+    border-color: #269fbd; }
+  .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle {
+    background-image: none; }
+  .btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info.focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active {
+    background-color: #5bc0de;
+    border-color: #46bada; }
+  .btn-info .badge {
+    color: #5bc0de;
+    background-color: white; }
+
+.btn-warning {
+  color: white;
+  background-color: #f0ad4e;
+  border-color: #eea236; }
+  .btn-warning:hover, .btn-warning:focus, .btn-warning.focus, .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle {
+    color: white;
+    background-color: #ec971f;
+    border-color: #d58412; }
+  .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle {
+    background-image: none; }
+  .btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning.focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active {
+    background-color: #f0ad4e;
+    border-color: #eea236; }
+  .btn-warning .badge {
+    color: #f0ad4e;
+    background-color: white; }
+
+.btn-danger {
+  color: white;
+  background-color: #d9534f;
+  border-color: #d43d3a; }
+  .btn-danger:hover, .btn-danger:focus, .btn-danger.focus, .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle {
+    color: white;
+    background-color: #c92e2c;
+    border-color: #ab2825; }
+  .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle {
+    background-image: none; }
+  .btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus, .btn-danger[disabled]:active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger.focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active {
+    background-color: #d9534f;
+    border-color: #d43d3a; }
+  .btn-danger .badge {
+    color: #d9534f;
+    background-color: white; }
+
+.btn-link {
+  color: #6eb553;
+  font-weight: normal;
+  border-radius: 0; }
+  .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link {
+    background-color: transparent;
+    -webkit-box-shadow: none;
+    box-shadow: none; }
+  .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {
+    border-color: transparent; }
+  .btn-link:hover, .btn-link:focus {
+    color: #4e8338;
+    text-decoration: underline;
+    background-color: transparent; }
+  .btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus {
+    color: #777777;
+    text-decoration: none; }
+
+.btn-lg, .btn-group-lg > .btn {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.33333;
+  border-radius: 6px; }
+
+.btn-sm, .btn-group-sm > .btn {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px; }
+
+.btn-xs, .btn-group-xs > .btn {
+  padding: 1px 5px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px; }
+
+.btn-block {
+  display: block;
+  width: 100%; }
+
+.btn-block + .btn-block {
+  margin-top: 5px; }
+
+input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block {
+  width: 100%; }
+
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+  -o-transition: opacity 0.15s linear;
+  transition: opacity 0.15s linear; }
+  .fade.in {
+    opacity: 1; }
+
+.collapse {
+  display: none;
+  visibility: hidden; }
+  .collapse.in {
+    display: block;
+    visibility: visible; }
+
+tr.collapse.in {
+  display: table-row; }
+
+tbody.collapse.in {
+  display: table-row-group; }
+
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition-property: height, visibility;
+  transition-property: height, visibility;
+  -webkit-transition-duration: 0.35s;
+  transition-duration: 0.35s;
+  -webkit-transition-timing-function: ease;
+  transition-timing-function: ease; }
+
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top: 4px solid;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent; }
+
+.dropup, .dropdown {
+  position: relative; }
+
+.dropdown-toggle:focus {
+  outline: 0; }
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  font-size: 14px;
+  text-align: left;
+  background-color: white;
+  border: 1px solid #cccccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  border-radius: 4px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  background-clip: padding-box; }
+  .dropdown-menu.pull-right {
+    right: 0;
+    left: auto; }
+  .dropdown-menu .divider {
+    height: 1px;
+    margin: 11.5px 0;
+    overflow: hidden;
+    background-color: #e5e5e5; }
+  .dropdown-menu > li > a {
+    display: block;
+    padding: 3px 20px;
+    clear: both;
+    font-weight: normal;
+    line-height: 1.8;
+    color: #333333;
+    white-space: nowrap; }
+
+.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
+  text-decoration: none;
+  color: #262626;
+  background-color: whitesmoke; }
+
+.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {
+  color: white;
+  text-decoration: none;
+  outline: 0;
+  background-color: #6eb553; }
+
+.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
+  color: #777777; }
+.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  cursor: not-allowed; }
+
+.open > .dropdown-menu {
+  display: block; }
+.open > a {
+  outline: 0; }
+
+.dropdown-menu-right {
+  left: auto;
+  right: 0; }
+
+.dropdown-menu-left {
+  left: 0;
+  right: auto; }
+
+.dropdown-header {
+  display: block;
+  padding: 3px 20px;
+  font-size: 12px;
+  line-height: 1.8;
+  color: #777777;
+  white-space: nowrap; }
+
+.dropdown-backdrop {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  top: 0;
+  z-index: 990; }
+
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto; }
+
+.dropup .caret, .navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid;
+  content: ""; }
+.dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 2px; }
+
+@media (min-width: 768px) {
+  .navbar-right .dropdown-menu {
+    right: 0;
+    left: auto; }
+  .navbar-right .dropdown-menu-left {
+    left: 0;
+    right: auto; } }
+
+.btn-group, .btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle; }
+  .btn-group > .btn, .btn-group-vertical > .btn {
+    position: relative;
+    float: left; }
+    .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn:hover, .btn-group-vertical > .btn:focus, .btn-group-vertical > .btn:active, .btn-group-vertical > .btn.active {
+      z-index: 2; }
+
+.btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group {
+  margin-left: -1px; }
+
+.btn-toolbar {
+  margin-left: -5px; }
+  .btn-toolbar:before, .btn-toolbar:after {
+    content: " ";
+    display: table; }
+  .btn-toolbar:after {
+    clear: both; }
+  .btn-toolbar .btn-group, .btn-toolbar .input-group {
+    float: left; }
+  .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group {
+    margin-left: 5px; }
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0; }
+
+.btn-group > .btn:first-child {
+  margin-left: 0; }
+  .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+    border-bottom-right-radius: 0;
+    border-top-right-radius: 0; }
+
+.btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0; }
+
+.btn-group > .btn-group {
+  float: left; }
+
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0; }
+
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0; }
+
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0; }
+
+.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle {
+  outline: 0; }
+
+
+
+
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px; }
+
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px; }
+
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); }
+  .btn-group.open .dropdown-toggle.btn-link {
+    -webkit-box-shadow: none;
+    box-shadow: none; }
+
+.btn .caret {
+  margin-left: 0; }
+
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0; }
+
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px; }
+
+.btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%; }
+.btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after {
+  content: " ";
+  display: table; }
+.btn-group-vertical > .btn-group:after {
+  clear: both; }
+.btn-group-vertical > .btn-group > .btn {
+  float: none; }
+.btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0; }
+
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0; }
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0; }
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-bottom-left-radius: 4px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0; }
+
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0; }
+
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0; }
+
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0; }
+
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate; }
+  .btn-group-justified > .btn, .btn-group-justified > .btn-group {
+    float: none;
+    display: table-cell;
+    width: 1%; }
+  .btn-group-justified > .btn-group .btn {
+    width: 100%; }
+  .btn-group-justified > .btn-group .dropdown-menu {
+    left: auto; }
+
+[data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none; }
+
+.input-group {
+  position: relative;
+  display: table;
+  border-collapse: separate; }
+  .input-group[class*="col-"] {
+    float: none;
+    padding-left: 0;
+    padding-right: 0; }
+  .input-group .form-control {
+    position: relative;
+    z-index: 2;
+    float: left;
+    width: 100%;
+    margin-bottom: 0; }
+
+
+
+.input-group-addon, .input-group-btn, .input-group .form-control {
+  display: table-cell; }
+  .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) {
+    border-radius: 0; }
+
+.input-group-addon, .input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle; }
+
+.input-group-addon {
+  padding: 6px 12px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1;
+  color: #58595b;
+  text-align: center;
+  background-color: #eeeeee;
+  border: 1px solid #cccccc;
+  border-radius: 4px; }
+  .input-group-addon.input-sm {
+    padding: 5px 10px;
+    font-size: 12px;
+    border-radius: 3px; }
+  .input-group-addon.input-lg {
+    padding: 10px 16px;
+    font-size: 18px;
+    border-radius: 6px; }
+  .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] {
+    margin-top: 0; }
+
+.input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0; }
+
+.input-group-addon:first-child {
+  border-right: 0; }
+
+.input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0; }
+
+.input-group-addon:last-child {
+  border-left: 0; }
+
+.input-group-btn {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap; }
+  .input-group-btn > .btn {
+    position: relative; }
+    .input-group-btn > .btn + .btn {
+      margin-left: -1px; }
+    .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active {
+      z-index: 2; }
+  .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group {
+    margin-right: -1px; }
+  .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group {
+    margin-left: -1px; }
+
+.nav {
+  margin-bottom: 0;
+  padding-left: 0;
+  list-style: none; }
+  .nav:before, .nav:after {
+    content: " ";
+    display: table; }
+  .nav:after {
+    clear: both; }
+  .nav > li {
+    position: relative;
+    display: block; }
+    .nav > li > a {
+      position: relative;
+      display: block;
+      padding: 10px 15px; }
+      .nav > li > a:hover, .nav > li > a:focus {
+        text-decoration: none;
+        background-color: #eeeeee; }
+    .nav > li.disabled > a {
+      color: #777777; }
+      .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {
+        color: #777777;
+        text-decoration: none;
+        background-color: transparent;
+        cursor: not-allowed; }
+  .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {
+    background-color: #eeeeee;
+    border-color: #6eb553; }
+  .nav .nav-divider {
+    height: 1px;
+    margin: 11.5px 0;
+    overflow: hidden;
+    background-color: #e5e5e5; }
+  .nav > li > a > img {
+    max-width: none; }
+
+.nav-tabs {
+  border-bottom: 1px solid #dddddd; }
+  .nav-tabs > li {
+    float: left;
+    margin-bottom: -1px; }
+    .nav-tabs > li > a {
+      margin-right: 2px;
+      line-height: 1.8;
+      border: 1px solid transparent;
+      border-radius: 4px 4px 0 0; }
+      .nav-tabs > li > a:hover {
+        border-color: #eeeeee #eeeeee #dddddd; }
+    .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
+      color: #58595b;
+      background-color: white;
+      border: 1px solid #dddddd;
+      border-bottom-color: transparent;
+      cursor: default; }
+
+.nav-pills > li {
+  float: left; }
+  .nav-pills > li > a {
+    border-radius: 4px; }
+  .nav-pills > li + li {
+    margin-left: 2px; }
+  .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {
+    color: white;
+    background-color: #6eb553; }
+
+.nav-stacked > li {
+  float: none; }
+  .nav-stacked > li + li {
+    margin-top: 2px;
+    margin-left: 0; }
+
+.nav-justified, .nav-tabs.nav-justified {
+  width: 100%; }
+  .nav-justified > li {
+    float: none; }
+    .nav-justified > li > a {
+      text-align: center;
+      margin-bottom: 5px; }
+  .nav-justified > .dropdown .dropdown-menu {
+    top: auto;
+    left: auto; }
+  @media (min-width: 768px) {
+    .nav-justified > li {
+      display: table-cell;
+      width: 1%; }
+      .nav-justified > li > a {
+        margin-bottom: 0; } }
+
+.nav-tabs-justified, .nav-tabs.nav-justified {
+  border-bottom: 0; }
+  .nav-tabs-justified > li > a {
+    margin-right: 0;
+    border-radius: 4px; }
+  .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus {
+    border: 1px solid #dddddd; }
+  @media (min-width: 768px) {
+    .nav-tabs-justified > li > a {
+      border-bottom: 1px solid #dddddd;
+      border-radius: 4px 4px 0 0; }
+    .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus {
+      border-bottom-color: white; } }
+
+.tab-content > .tab-pane {
+  display: none;
+  visibility: hidden; }
+.tab-content > .active {
+  display: block;
+  visibility: visible; }
+
+.nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0; }
+
+.navbar {
+  position: relative;
+  min-height: 50px;
+  margin-bottom: 25px;
+  border: 1px solid transparent; }
+  .navbar:before, .navbar:after {
+    content: " ";
+    display: table; }
+  .navbar:after {
+    clear: both; }
+  @media (min-width: 768px) {
+    .navbar {
+      border-radius: 4px; } }
+
+.navbar-header:before, .navbar-header:after {
+  content: " ";
+  display: table; }
+.navbar-header:after {
+  clear: both; }
+@media (min-width: 768px) {
+  .navbar-header {
+    float: left; } }
+
+.navbar-collapse {
+  overflow-x: visible;
+  padding-right: 15px;
+  padding-left: 15px;
+  border-top: 1px solid transparent;
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+  -webkit-overflow-scrolling: touch; }
+  .navbar-collapse:before, .navbar-collapse:after {
+    content: " ";
+    display: table; }
+  .navbar-collapse:after {
+    clear: both; }
+  .navbar-collapse.in {
+    overflow-y: auto; }
+  @media (min-width: 768px) {
+    .navbar-collapse {
+      width: auto;
+      border-top: 0;
+      box-shadow: none; }
+      .navbar-collapse.collapse {
+        display: block !important;
+        visibility: visible !important;
+        height: auto !important;
+        padding-bottom: 0;
+        overflow: visible !important; }
+      .navbar-collapse.in {
+        overflow-y: visible; }
+      .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse {
+        padding-left: 0;
+        padding-right: 0; } }
+
+.navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse {
+  max-height: 340px; }
+  @media (max-device-width: 480px) and (orientation: landscape) {
+    .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse {
+      max-height: 200px; } }
+
+.container > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-header, .container-fluid > .navbar-collapse {
+  margin-right: -15px;
+  margin-left: -15px; }
+  @media (min-width: 768px) {
+    .container > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-header, .container-fluid > .navbar-collapse {
+      margin-right: 0;
+      margin-left: 0; } }
+
+.navbar-static-top {
+  z-index: 1000;
+  border-width: 0 0 1px; }
+  @media (min-width: 768px) {
+    .navbar-static-top {
+      border-radius: 0; } }
+
+.navbar-fixed-top, .navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030; }
+  @media (min-width: 768px) {
+    .navbar-fixed-top, .navbar-fixed-bottom {
+      border-radius: 0; } }
+
+.navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px; }
+
+.navbar-fixed-bottom {
+  bottom: 0;
+  margin-bottom: 0;
+  border-width: 1px 0 0; }
+
+.navbar-brand {
+  float: left;
+  padding: 12.5px 15px;
+  font-size: 18px;
+  line-height: 25px;
+  height: 50px; }
+  .navbar-brand:hover, .navbar-brand:focus {
+    text-decoration: none; }
+  .navbar-brand > img {
+    display: block; }
+  @media (min-width: 768px) {
+    .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand {
+      margin-left: -15px; } }
+
+.navbar-toggle {
+  position: relative;
+  float: right;
+  margin-right: 15px;
+  padding: 9px 10px;
+  margin-top: 8px;
+  margin-bottom: 8px;
+  background-color: transparent;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px; }
+  .navbar-toggle:focus {
+    outline: 0; }
+  .navbar-toggle .icon-bar {
+    display: block;
+    width: 22px;
+    height: 2px;
+    border-radius: 1px; }
+  .navbar-toggle .icon-bar + .icon-bar {
+    margin-top: 4px; }
+  @media (min-width: 768px) {
+    .navbar-toggle {
+      display: none; } }
+
+.navbar-nav {
+  margin: 6.25px -15px; }
+  .navbar-nav > li > a {
+    padding-top: 10px;
+    padding-bottom: 10px;
+    line-height: 25px; }
+  @media (max-width: 767px) {
+    .navbar-nav .open .dropdown-menu {
+      position: static;
+      float: none;
+      width: auto;
+      margin-top: 0;
+      background-color: transparent;
+      border: 0;
+      box-shadow: none; }
+      .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header {
+        padding: 5px 15px 5px 25px; }
+      .navbar-nav .open .dropdown-menu > li > a {
+        line-height: 25px; }
+        .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {
+          background-image: none; } }
+  @media (min-width: 768px) {
+    .navbar-nav {
+      float: left;
+      margin: 0; }
+      .navbar-nav > li {
+        float: left; }
+        .navbar-nav > li > a {
+          padding-top: 12.5px;
+          padding-bottom: 12.5px; } }
+
+.navbar-form {
+  margin-left: -15px;
+  margin-right: -15px;
+  padding: 10px 15px;
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  margin-top: 5.5px;
+  margin-bottom: 5.5px; }
+  @media (min-width: 768px) {
+    .navbar-form .form-group {
+      display: inline-block;
+      margin-bottom: 0;
+      vertical-align: middle; }
+    .navbar-form .form-control {
+      display: inline-block;
+      width: auto;
+      vertical-align: middle; }
+    .navbar-form .form-control-static {
+      display: inline-block; }
+    .navbar-form .input-group {
+      display: inline-table;
+      vertical-align: middle; }
+      .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control {
+        width: auto; }
+    .navbar-form .input-group > .form-control {
+      width: 100%; }
+    .navbar-form .control-label {
+      margin-bottom: 0;
+      vertical-align: middle; }
+    .navbar-form .radio, .navbar-form .checkbox {
+      display: inline-block;
+      margin-top: 0;
+      margin-bottom: 0;
+      vertical-align: middle; }
+      .navbar-form .radio label, .navbar-form .checkbox label {
+        padding-left: 0; }
+    .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] {
+      position: relative;
+      margin-left: 0; }
+    .navbar-form .has-feedback .form-control-feedback {
+      top: 0; } }
+  @media (max-width: 767px) {
+    .navbar-form .form-group {
+      margin-bottom: 5px; }
+      .navbar-form .form-group:last-child {
+        margin-bottom: 0; } }
+  @media (min-width: 768px) {
+    .navbar-form {
+      width: auto;
+      border: 0;
+      margin-left: 0;
+      margin-right: 0;
+      padding-top: 0;
+      padding-bottom: 0;
+      -webkit-box-shadow: none;
+      box-shadow: none; } }
+
+.navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0; }
+
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+  margin-bottom: 0;
+  border-top-right-radius: 4px;
+  border-top-left-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0; }
+
+.navbar-btn {
+  margin-top: 5.5px;
+  margin-bottom: 5.5px; }
+  .navbar-btn.btn-sm {
+    margin-top: 10px;
+    margin-bottom: 10px; }
+  .navbar-btn.btn-xs {
+    margin-top: 14px;
+    margin-bottom: 14px; }
+
+.navbar-text {
+  margin-top: 12.5px;
+  margin-bottom: 12.5px; }
+  @media (min-width: 768px) {
+    .navbar-text {
+      float: left;
+      margin-left: 15px;
+      margin-right: 15px; } }
+
+@media (min-width: 768px) {
+  .navbar-left {
+    float: left !important; }
+  .navbar-right {
+    float: right !important;
+    margin-right: -15px; }
+    .navbar-right ~ .navbar-right {
+      margin-right: 0; } }
+
+.navbar-default {
+  background-color: rgba(255, 255, 255, 0);
+  border-color: none; }
+  .navbar-default .navbar-brand {
+    color: whitesmoke; }
+    .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
+      color: gainsboro;
+      background-color: transparent; }
+  .navbar-default .navbar-text {
+    color: whitesmoke; }
+  .navbar-default .navbar-nav > li > a {
+    color: whitesmoke; }
+    .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
+      color: whitesmoke;
+      background-color: transparent; }
+  .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
+    color: #555555;
+    background-color: rgba(238, 238, 238, 0); }
+  .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {
+    color: #cccccc;
+    background-color: transparent; }
+  .navbar-default .navbar-toggle {
+    border-color: #dddddd; }
+    .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
+      background-color: #dddddd; }
+    .navbar-default .navbar-toggle .icon-bar {
+      background-color: #888888; }
+  .navbar-default .navbar-collapse, .navbar-default .navbar-form {
+    border-color: none; }
+  .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
+    background-color: rgba(238, 238, 238, 0);
+    color: #555555; }
+  @media (max-width: 767px) {
+    .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+      color: whitesmoke; }
+      .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+        color: whitesmoke;
+        background-color: transparent; }
+    .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+      color: #555555;
+      background-color: rgba(238, 238, 238, 0); }
+    .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+      color: #cccccc;
+      background-color: transparent; } }
+  .navbar-default .navbar-link {
+    color: whitesmoke; }
+    .navbar-default .navbar-link:hover {
+      color: whitesmoke; }
+  .navbar-default .btn-link {
+    color: whitesmoke; }
+    .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {
+      color: whitesmoke; }
+    .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus {
+      color: #cccccc; }
+
+.navbar-inverse {
+  background-color: #222222;
+  border-color: #090909; }
+  .navbar-inverse .navbar-brand {
+    color: #9d9d9d; }
+    .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {
+      color: white;
+      background-color: transparent; }
+  .navbar-inverse .navbar-text {
+    color: #9d9d9d; }
+  .navbar-inverse .navbar-nav > li > a {
+    color: #9d9d9d; }
+    .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {
+      color: white;
+      background-color: transparent; }
+  .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {
+    color: white;
+    background-color: #090909; }
+  .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {
+    color: #444444;
+    background-color: transparent; }
+  .navbar-inverse .navbar-toggle {
+    border-color: #333333; }
+    .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {
+      background-color: #333333; }
+    .navbar-inverse .navbar-toggle .icon-bar {
+      background-color: white; }
+  .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form {
+    border-color: #101010; }
+  .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {
+    background-color: #090909;
+    color: white; }
+  @media (max-width: 767px) {
+    .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+      border-color: #090909; }
+    .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+      background-color: #090909; }
+    .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+      color: #9d9d9d; }
+      .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+        color: white;
+        background-color: transparent; }
+    .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+      color: white;
+      background-color: #090909; }
+    .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+      color: #444444;
+      background-color: transparent; } }
+  .navbar-inverse .navbar-link {
+    color: #9d9d9d; }
+    .navbar-inverse .navbar-link:hover {
+      color: white; }
+  .navbar-inverse .btn-link {
+    color: #9d9d9d; }
+    .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {
+      color: white; }
+    .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus {
+      color: #444444; }
+
+.breadcrumb {
+  padding: 8px 15px;
+  margin-bottom: 25px;
+  list-style: none;
+  background-color: whitesmoke;
+  border-radius: 4px; }
+  .breadcrumb > li {
+    display: inline-block; }
+    .breadcrumb > li + li:before {
+      content: /\00a0;
+      padding: 0 5px;
+      color: #cccccc; }
+  .breadcrumb > .active {
+    color: #777777; }
+
+.pagination {
+  display: inline-block;
+  padding-left: 0;
+  margin: 25px 0;
+  border-radius: 4px; }
+  .pagination > li {
+    display: inline; }
+    .pagination > li > a, .pagination > li > span {
+      position: relative;
+      float: left;
+      padding: 6px 12px;
+      line-height: 1.8;
+      text-decoration: none;
+      color: #6eb553;
+      background-color: white;
+      border: 1px solid #dddddd;
+      margin-left: -1px; }
+    .pagination > li:first-child > a, .pagination > li:first-child > span {
+      margin-left: 0;
+      border-bottom-left-radius: 4px;
+      border-top-left-radius: 4px; }
+    .pagination > li:last-child > a, .pagination > li:last-child > span {
+      border-bottom-right-radius: 4px;
+      border-top-right-radius: 4px; }
+  .pagination > li > a:hover, .pagination > li > a:focus, .pagination > li > span:hover, .pagination > li > span:focus {
+    color: #4e8338;
+    background-color: #eeeeee;
+    border-color: #dddddd; }
+  .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, .pagination > .active > span, .pagination > .active > span:hover, .pagination > .active > span:focus {
+    z-index: 2;
+    color: white;
+    background-color: #6eb553;
+    border-color: #6eb553;
+    cursor: default; }
+  .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus {
+    color: #777777;
+    background-color: white;
+    border-color: #dddddd;
+    cursor: not-allowed; }
+
+.pagination-lg > li > a, .pagination-lg > li > span {
+  padding: 10px 16px;
+  font-size: 18px; }
+.pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span {
+  border-bottom-left-radius: 6px;
+  border-top-left-radius: 6px; }
+.pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span {
+  border-bottom-right-radius: 6px;
+  border-top-right-radius: 6px; }
+
+.pagination-sm > li > a, .pagination-sm > li > span {
+  padding: 5px 10px;
+  font-size: 12px; }
+.pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span {
+  border-bottom-left-radius: 3px;
+  border-top-left-radius: 3px; }
+.pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span {
+  border-bottom-right-radius: 3px;
+  border-top-right-radius: 3px; }
+
+.pager {
+  padding-left: 0;
+  margin: 25px 0;
+  list-style: none;
+  text-align: center; }
+  .pager:before, .pager:after {
+    content: " ";
+    display: table; }
+  .pager:after {
+    clear: both; }
+  .pager li {
+    display: inline; }
+    .pager li > a, .pager li > span {
+      display: inline-block;
+      padding: 5px 14px;
+      background-color: white;
+      border: 1px solid #dddddd;
+      border-radius: 15px; }
+    .pager li > a:hover, .pager li > a:focus {
+      text-decoration: none;
+      background-color: #eeeeee; }
+  .pager .next > a, .pager .next > span {
+    float: right; }
+  .pager .previous > a, .pager .previous > span {
+    float: left; }
+  .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span {
+    color: #777777;
+    background-color: white;
+    cursor: not-allowed; }
+
+.label {
+  display: inline;
+  padding: 0.2em 0.6em 0.3em;
+  font-size: 75%;
+  font-weight: bold;
+  line-height: 1;
+  color: white;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: 0.25em; }
+  .label:empty {
+    display: none; }
+  .btn .label {
+    position: relative;
+    top: -1px; }
+
+a.label:hover, a.label:focus {
+  color: white;
+  text-decoration: none;
+  cursor: pointer; }
+
+.label-default {
+  background-color: #777777; }
+  .label-default[href]:hover, .label-default[href]:focus {
+    background-color: #5e5e5e; }
+
+.label-primary {
+  background-color: #6eb553; }
+  .label-primary[href]:hover, .label-primary[href]:focus {
+    background-color: #589540; }
+
+.label-success {
+  background-color: #5cb85c; }
+  .label-success[href]:hover, .label-success[href]:focus {
+    background-color: #469d44; }
+
+.label-info {
+  background-color: #5bc0de; }
+  .label-info[href]:hover, .label-info[href]:focus {
+    background-color: #31b2d5; }
+
+.label-warning {
+  background-color: #f0ad4e; }
+  .label-warning[href]:hover, .label-warning[href]:focus {
+    background-color: #ec971f; }
+
+.label-danger {
+  background-color: #d9534f; }
+  .label-danger[href]:hover, .label-danger[href]:focus {
+    background-color: #c92e2c; }
+
+.badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: 3px 7px;
+  font-size: 12px;
+  font-weight: bold;
+  color: white;
+  line-height: 1;
+  vertical-align: baseline;
+  white-space: nowrap;
+  text-align: center;
+  background-color: #777777;
+  border-radius: 10px; }
+  .badge:empty {
+    display: none; }
+  .btn .badge {
+    position: relative;
+    top: -1px; }
+  .btn-xs .badge {
+    top: 0;
+    padding: 1px 5px; }
+  .list-group-item.active > .badge, .nav-pills > .active > a > .badge {
+    color: #6eb553;
+    background-color: white; }
+  .list-group-item > .badge {
+    float: right; }
+  .list-group-item > .badge + .badge {
+    margin-right: 5px; }
+  .nav-pills > li > a > .badge {
+    margin-left: 3px; }
+
+a.badge:hover, a.badge:focus {
+  color: white;
+  text-decoration: none;
+  cursor: pointer; }
+
+.jumbotron {
+  padding: 30px 15px;
+  margin-bottom: 30px;
+  color: inherit;
+  background-color: #eeeeee; }
+  .jumbotron h1, .jumbotron .h1 {
+    color: inherit; }
+  .jumbotron p {
+    margin-bottom: 15px;
+    font-size: 21px;
+    font-weight: 200; }
+  .jumbotron > hr {
+    border-top-color: #d4d4d4; }
+  .container .jumbotron, .container-fluid .jumbotron {
+    border-radius: 6px; }
+  .jumbotron .container {
+    max-width: 100%; }
+  @media screen and (min-width: 768px) {
+    .jumbotron {
+      padding: 48px 0; }
+      .container .jumbotron, .container-fluid .jumbotron {
+        padding-left: 60px;
+        padding-right: 60px; }
+      .jumbotron h1, .jumbotron .h1 {
+        font-size: 63px; } }
+
+.thumbnail {
+  display: block;
+  padding: 4px;
+  margin-bottom: 25px;
+  line-height: 1.8;
+  background-color: white;
+  border: 1px solid #dddddd;
+  border-radius: 4px;
+  -webkit-transition: border 0.2s ease-in-out;
+  -o-transition: border 0.2s ease-in-out;
+  transition: border 0.2s ease-in-out; }
+  .thumbnail > img, .thumbnail a > img {
+    display: block;
+    max-width: 100%;
+    height: auto;
+    margin-left: auto;
+    margin-right: auto; }
+  .thumbnail .caption {
+    padding: 9px;
+    color: #333333; }
+
+a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active {
+  border-color: #6eb553; }
+
+.alert {
+  padding: 15px;
+  margin-bottom: 25px;
+  border: 1px solid transparent;
+  border-radius: 4px; }
+  .alert h4 {
+    margin-top: 0;
+    color: inherit; }
+  .alert .alert-link {
+    font-weight: bold; }
+  .alert > p, .alert > ul {
+    margin-bottom: 0; }
+  .alert > p + p {
+    margin-top: 5px; }
+
+.alert-dismissable, .alert-dismissible {
+  padding-right: 35px; }
+  .alert-dismissable .close, .alert-dismissible .close {
+    position: relative;
+    top: -2px;
+    right: -21px;
+    color: inherit; }
+
+.alert-success {
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+  color: #3c763d; }
+  .alert-success hr {
+    border-top-color: #c9e2b4; }
+  .alert-success .alert-link {
+    color: #2b542b; }
+
+.alert-info {
+  background-color: #d9edf7;
+  border-color: #bceaf1;
+  color: #31708f; }
+  .alert-info hr {
+    border-top-color: #a7e4ed; }
+  .alert-info .alert-link {
+    color: #245369; }
+
+.alert-warning {
+  background-color: #fcf8e3;
+  border-color: #faeacc;
+  color: #8a6d3b; }
+  .alert-warning hr {
+    border-top-color: #f8e0b5; }
+  .alert-warning .alert-link {
+    color: #66502c; }
+
+.alert-danger {
+  background-color: #f2dede;
+  border-color: #ebccd0;
+  color: #a94442; }
+  .alert-danger hr {
+    border-top-color: #e4babf; }
+  .alert-danger .alert-link {
+    color: #843534; }
+
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0; }
+
+  to {
+    background-position: 0 0; } }
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0; }
+
+  to {
+    background-position: 0 0; } }
+
+.progress {
+  overflow: hidden;
+  height: 25px;
+  margin-bottom: 25px;
+  background-color: whitesmoke;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); }
+
+.progress-bar {
+  float: left;
+  width: 0%;
+  height: 100%;
+  font-size: 12px;
+  line-height: 25px;
+  color: white;
+  text-align: center;
+  background-color: #6eb553;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-transition: width 0.6s ease;
+  -o-transition: width 0.6s ease;
+  transition: width 0.6s ease; }
+
+.progress-striped .progress-bar, .progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-size: 40px 40px; }
+
+.progress.active .progress-bar, .progress-bar.active {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+  -o-animation: progress-bar-stripes 2s linear infinite;
+  animation: progress-bar-stripes 2s linear infinite; }
+
+.progress-bar-success {
+  background-color: #5cb85c; }
+  .progress-striped .progress-bar-success {
+    background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+    background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+    background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+
+.progress-bar-info {
+  background-color: #5bc0de; }
+  .progress-striped .progress-bar-info {
+    background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+    background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+    background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+
+.progress-bar-warning {
+  background-color: #f0ad4e; }
+  .progress-striped .progress-bar-warning {
+    background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+    background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+    background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+
+.progress-bar-danger {
+  background-color: #d9534f; }
+  .progress-striped .progress-bar-danger {
+    background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+    background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+    background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); }
+
+.media {
+  margin-top: 15px; }
+  .media:first-child {
+    margin-top: 0; }
+
+.media, .media-body {
+  zoom: 1;
+  overflow: hidden; }
+
+.media-body {
+  width: 10000px; }
+
+.media-object {
+  display: block; }
+
+.media-right, .media > .pull-right {
+  padding-left: 10px; }
+
+.media-left, .media > .pull-left {
+  padding-right: 10px; }
+
+.media-left, .media-right, .media-body {
+  display: table-cell;
+  vertical-align: top; }
+
+.media-middle {
+  vertical-align: middle; }
+
+.media-bottom {
+  vertical-align: bottom; }
+
+.media-heading {
+  margin-top: 0;
+  margin-bottom: 5px; }
+
+.media-list {
+  padding-left: 0;
+  list-style: none; }
+
+.list-group {
+  margin-bottom: 20px;
+  padding-left: 0; }
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: white;
+  border: 1px solid #dddddd; }
+  .list-group-item:first-child {
+    border-top-right-radius: 4px;
+    border-top-left-radius: 4px; }
+  .list-group-item:last-child {
+    margin-bottom: 0;
+    border-bottom-right-radius: 4px;
+    border-bottom-left-radius: 4px; }
+
+a.list-group-item {
+  color: #555555; }
+  a.list-group-item .list-group-item-heading {
+    color: #333333; }
+  a.list-group-item:hover, a.list-group-item:focus {
+    text-decoration: none;
+    color: #555555;
+    background-color: whitesmoke; }
+
+.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {
+  background-color: #eeeeee;
+  color: #777777;
+  cursor: not-allowed; }
+  .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {
+    color: inherit; }
+  .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {
+    color: #777777; }
+.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {
+  z-index: 2;
+  color: white;
+  background-color: #6eb553;
+  border-color: #6eb553; }
+  .list-group-item.active .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > .small {
+    color: inherit; }
+  .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {
+    color: #e6f2e2; }
+
+.list-group-item-success {
+  color: #3c763d;
+  background-color: #dff0d8; }
+
+a.list-group-item-success {
+  color: #3c763d; }
+  a.list-group-item-success .list-group-item-heading {
+    color: inherit; }
+  a.list-group-item-success:hover, a.list-group-item-success:focus {
+    color: #3c763d;
+    background-color: #d0e9c6; }
+  a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus {
+    color: white;
+    background-color: #3c763d;
+    border-color: #3c763d; }
+
+.list-group-item-info {
+  color: #31708f;
+  background-color: #d9edf7; }
+
+a.list-group-item-info {
+  color: #31708f; }
+  a.list-group-item-info .list-group-item-heading {
+    color: inherit; }
+  a.list-group-item-info:hover, a.list-group-item-info:focus {
+    color: #31708f;
+    background-color: #c4e4f3; }
+  a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus {
+    color: white;
+    background-color: #31708f;
+    border-color: #31708f; }
+
+.list-group-item-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3; }
+
+a.list-group-item-warning {
+  color: #8a6d3b; }
+  a.list-group-item-warning .list-group-item-heading {
+    color: inherit; }
+  a.list-group-item-warning:hover, a.list-group-item-warning:focus {
+    color: #8a6d3b;
+    background-color: #faf2cc; }
+  a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus {
+    color: white;
+    background-color: #8a6d3b;
+    border-color: #8a6d3b; }
+
+.list-group-item-danger {
+  color: #a94442;
+  background-color: #f2dede; }
+
+a.list-group-item-danger {
+  color: #a94442; }
+  a.list-group-item-danger .list-group-item-heading {
+    color: inherit; }
+  a.list-group-item-danger:hover, a.list-group-item-danger:focus {
+    color: #a94442;
+    background-color: #ebcccc; }
+  a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus {
+    color: white;
+    background-color: #a94442;
+    border-color: #a94442; }
+
+.list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px; }
+
+.list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3; }
+
+.panel {
+  margin-bottom: 25px;
+  background-color: white;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); }
+
+.panel-body {
+  padding: 15px; }
+  .panel-body:before, .panel-body:after {
+    content: " ";
+    display: table; }
+  .panel-body:after {
+    clear: both; }
+
+.panel-heading {
+  padding: 10px 15px;
+  border-bottom: 1px solid transparent;
+  border-top-right-radius: 3px;
+  border-top-left-radius: 3px; }
+  .panel-heading > .dropdown .dropdown-toggle {
+    color: inherit; }
+
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: 16px;
+  color: inherit; }
+  .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a {
+    color: inherit; }
+
+.panel-footer {
+  padding: 10px 15px;
+  background-color: whitesmoke;
+  border-top: 1px solid #dddddd;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px; }
+
+.panel > .list-group, .panel > .panel-collapse > .list-group {
+  margin-bottom: 0; }
+  .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item {
+    border-width: 1px 0;
+    border-radius: 0; }
+  .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+    border-top: 0;
+    border-top-right-radius: 3px;
+    border-top-left-radius: 3px; }
+  .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+    border-bottom: 0;
+    border-bottom-right-radius: 3px;
+    border-bottom-left-radius: 3px; }
+
+.panel-heading + .list-group .list-group-item:first-child {
+  border-top-width: 0; }
+
+.list-group + .panel-footer {
+  border-top-width: 0; }
+
+.panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table {
+  margin-bottom: 0; }
+  .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption {
+    padding-left: 15px;
+    padding-right: 15px; }
+.panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child {
+  border-top-right-radius: 3px;
+  border-top-left-radius: 3px; }
+  .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+    border-top-left-radius: 3px;
+    border-top-right-radius: 3px; }
+    .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+      border-top-left-radius: 3px; }
+    .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+      border-top-right-radius: 3px; }
+.panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px; }
+  .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+    border-bottom-left-radius: 3px;
+    border-bottom-right-radius: 3px; }
+    .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+      border-bottom-left-radius: 3px; }
+    .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+      border-bottom-right-radius: 3px; }
+.panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body {
+  border-top: 1px solid #dddddd; }
+.panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td {
+  border-top: 0; }
+.panel > .table-bordered, .panel > .table-responsive > .table-bordered {
+  border: 0; }
+  .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0; }
+  .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0; }
+  .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+    border-bottom: 0; }
+  .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+    border-bottom: 0; }
+.panel > .table-responsive {
+  border: 0;
+  margin-bottom: 0; }
+
+.panel-group {
+  margin-bottom: 25px; }
+  .panel-group .panel {
+    margin-bottom: 0;
+    border-radius: 4px; }
+    .panel-group .panel + .panel {
+      margin-top: 5px; }
+  .panel-group .panel-heading {
+    border-bottom: 0; }
+    .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group {
+      border-top: 1px solid #dddddd; }
+  .panel-group .panel-footer {
+    border-top: 0; }
+    .panel-group .panel-footer + .panel-collapse .panel-body {
+      border-bottom: 1px solid #dddddd; }
+
+.panel-default {
+  border-color: #dddddd; }
+  .panel-default > .panel-heading {
+    color: #333333;
+    background-color: whitesmoke;
+    border-color: #dddddd; }
+    .panel-default > .panel-heading + .panel-collapse > .panel-body {
+      border-top-color: #dddddd; }
+    .panel-default > .panel-heading .badge {
+      color: whitesmoke;
+      background-color: #333333; }
+  .panel-default > .panel-footer + .panel-collapse > .panel-body {
+    border-bottom-color: #dddddd; }
+
+.panel-primary {
+  border-color: #6eb553; }
+  .panel-primary > .panel-heading {
+    color: white;
+    background-color: #6eb553;
+    border-color: #6eb553; }
+    .panel-primary > .panel-heading + .panel-collapse > .panel-body {
+      border-top-color: #6eb553; }
+    .panel-primary > .panel-heading .badge {
+      color: #6eb553;
+      background-color: white; }
+  .panel-primary > .panel-footer + .panel-collapse > .panel-body {
+    border-bottom-color: #6eb553; }
+
+.panel-success {
+  border-color: #d6e9c6; }
+  .panel-success > .panel-heading {
+    color: #3c763d;
+    background-color: #dff0d8;
+    border-color: #d6e9c6; }
+    .panel-success > .panel-heading + .panel-collapse > .panel-body {
+      border-top-color: #d6e9c6; }
+    .panel-success > .panel-heading .badge {
+      color: #dff0d8;
+      background-color: #3c763d; }
+  .panel-success > .panel-footer + .panel-collapse > .panel-body {
+    border-bottom-color: #d6e9c6; }
+
+.panel-info {
+  border-color: #bceaf1; }
+  .panel-info > .panel-heading {
+    color: #31708f;
+    background-color: #d9edf7;
+    border-color: #bceaf1; }
+    .panel-info > .panel-heading + .panel-collapse > .panel-body {
+      border-top-color: #bceaf1; }
+    .panel-info > .panel-heading .badge {
+      color: #d9edf7;
+      background-color: #31708f; }
+  .panel-info > .panel-footer + .panel-collapse > .panel-body {
+    border-bottom-color: #bceaf1; }
+
+.panel-warning {
+  border-color: #faeacc; }
+  .panel-warning > .panel-heading {
+    color: #8a6d3b;
+    background-color: #fcf8e3;
+    border-color: #faeacc; }
+    .panel-warning > .panel-heading + .panel-collapse > .panel-body {
+      border-top-color: #faeacc; }
+    .panel-warning > .panel-heading .badge {
+      color: #fcf8e3;
+      background-color: #8a6d3b; }
+  .panel-warning > .panel-footer + .panel-collapse > .panel-body {
+    border-bottom-color: #faeacc; }
+
+.panel-danger {
+  border-color: #ebccd0; }
+  .panel-danger > .panel-heading {
+    color: #a94442;
+    background-color: #f2dede;
+    border-color: #ebccd0; }
+    .panel-danger > .panel-heading + .panel-collapse > .panel-body {
+      border-top-color: #ebccd0; }
+    .panel-danger > .panel-heading .badge {
+      color: #f2dede;
+      background-color: #a94442; }
+  .panel-danger > .panel-footer + .panel-collapse > .panel-body {
+    border-bottom-color: #ebccd0; }
+
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden; }
+  .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video {
+    position: absolute;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    height: 100%;
+    width: 100%;
+    border: 0; }
+  .embed-responsive.embed-responsive-16by9 {
+    padding-bottom: 56.25%; }
+  .embed-responsive.embed-responsive-4by3 {
+    padding-bottom: 75%; }
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: whitesmoke;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); }
+  .well blockquote {
+    border-color: #dddddd;
+    border-color: rgba(0, 0, 0, 0.15); }
+
+.well-lg {
+  padding: 24px;
+  border-radius: 6px; }
+
+.well-sm {
+  padding: 9px;
+  border-radius: 3px; }
+
+.close {
+  float: right;
+  font-size: 21px;
+  font-weight: bold;
+  line-height: 1;
+  color: black;
+  text-shadow: 0 1px 0 white;
+  opacity: 0.2;
+  filter: alpha(opacity=20); }
+  .close:hover, .close:focus {
+    color: black;
+    text-decoration: none;
+    cursor: pointer;
+    opacity: 0.5;
+    filter: alpha(opacity=50); }
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none; }
+
+.modal-open {
+  overflow: hidden; }
+
+.modal {
+  display: none;
+  overflow: hidden;
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  -webkit-overflow-scrolling: touch;
+  outline: 0; }
+  .modal.fade .modal-dialog {
+    -webkit-transform: translate(0, -25%);
+    -ms-transform: translate(0, -25%);
+    -o-transform: translate(0, -25%);
+    transform: translate(0, -25%);
+    -webkit-transition: -webkit-transform 0.3s ease-out;
+    -moz-transition: -moz-transform 0.3s ease-out;
+    -o-transition: -o-transform 0.3s ease-out;
+    transition: transform 0.3s ease-out; }
+  .modal.in .modal-dialog {
+    -webkit-transform: translate(0, 0);
+    -ms-transform: translate(0, 0);
+    -o-transform: translate(0, 0);
+    transform: translate(0, 0); }
+
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto; }
+
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px; }
+
+.modal-content {
+  position: relative;
+  background-color: white;
+  border: 1px solid #999999;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+  background-clip: padding-box;
+  outline: 0; }
+
+.modal-backdrop {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  background-color: black; }
+  .modal-backdrop.fade {
+    opacity: 0;
+    filter: alpha(opacity=0); }
+  .modal-backdrop.in {
+    opacity: 0.5;
+    filter: alpha(opacity=50); }
+
+.modal-header {
+  padding: 15px;
+  border-bottom: 1px solid #e5e5e5;
+  min-height: 16.8px; }
+
+.modal-header .close {
+  margin-top: -2px; }
+
+.modal-title {
+  margin: 0;
+  line-height: 1.8; }
+
+.modal-body {
+  position: relative;
+  padding: 15px; }
+
+.modal-footer {
+  padding: 15px;
+  text-align: right;
+  border-top: 1px solid #e5e5e5; }
+  .modal-footer:before, .modal-footer:after {
+    content: " ";
+    display: table; }
+  .modal-footer:after {
+    clear: both; }
+  .modal-footer .btn + .btn {
+    margin-left: 5px;
+    margin-bottom: 0; }
+  .modal-footer .btn-group .btn + .btn {
+    margin-left: -1px; }
+  .modal-footer .btn-block + .btn-block {
+    margin-left: 0; }
+
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll; }
+
+@media (min-width: 768px) {
+  .modal-dialog {
+    width: 600px;
+    margin: 30px auto; }
+  .modal-content {
+    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); }
+  .modal-sm {
+    width: 300px; } }
+
+@media (min-width: 992px) {
+  .modal-lg {
+    width: 900px; } }
+
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  visibility: visible;
+  font-family: "Montserrat", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 1.4;
+  opacity: 0;
+  filter: alpha(opacity=0); }
+  .tooltip.in {
+    opacity: 0.9;
+    filter: alpha(opacity=90); }
+  .tooltip.top {
+    margin-top: -3px;
+    padding: 5px 0; }
+  .tooltip.right {
+    margin-left: 3px;
+    padding: 0 5px; }
+  .tooltip.bottom {
+    margin-top: 3px;
+    padding: 5px 0; }
+  .tooltip.left {
+    margin-left: -3px;
+    padding: 0 5px; }
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: white;
+  text-align: center;
+  text-decoration: none;
+  background-color: black;
+  border-radius: 4px; }
+
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid; }
+
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: black; }
+.tooltip.top-left .tooltip-arrow {
+  bottom: 0;
+  right: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: black; }
+.tooltip.top-right .tooltip-arrow {
+  bottom: 0;
+  left: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: black; }
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: black; }
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: black; }
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: black; }
+.tooltip.bottom-left .tooltip-arrow {
+  top: 0;
+  right: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: black; }
+.tooltip.bottom-right .tooltip-arrow {
+  top: 0;
+  left: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: black; }
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  font-family: "Montserrat", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1.8;
+  text-align: left;
+  background-color: white;
+  background-clip: padding-box;
+  border: 1px solid #cccccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  white-space: normal; }
+  .popover.top {
+    margin-top: -10px; }
+  .popover.right {
+    margin-left: 10px; }
+  .popover.bottom {
+    margin-top: 10px; }
+  .popover.left {
+    margin-left: -10px; }
+
+.popover-title {
+  margin: 0;
+  padding: 8px 14px;
+  font-size: 14px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #eaeaea;
+  border-radius: 5px 5px 0 0; }
+
+.popover-content {
+  padding: 9px 14px; }
+
+.popover > .arrow, .popover > .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid; }
+
+.popover > .arrow {
+  border-width: 11px; }
+
+.popover > .arrow:after {
+  border-width: 10px;
+  content: ""; }
+
+.popover.top > .arrow {
+  left: 50%;
+  margin-left: -11px;
+  border-bottom-width: 0;
+  border-top-color: #999999;
+  border-top-color: fade_in(rgba(0, 0, 0, 0.2), 0.05);
+  bottom: -11px; }
+  .popover.top > .arrow:after {
+    content: " ";
+    bottom: 1px;
+    margin-left: -10px;
+    border-bottom-width: 0;
+    border-top-color: white; }
+.popover.right > .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-left-width: 0;
+  border-right-color: #999999;
+  border-right-color: fade_in(rgba(0, 0, 0, 0.2), 0.05); }
+  .popover.right > .arrow:after {
+    content: " ";
+    left: 1px;
+    bottom: -10px;
+    border-left-width: 0;
+    border-right-color: white; }
+.popover.bottom > .arrow {
+  left: 50%;
+  margin-left: -11px;
+  border-top-width: 0;
+  border-bottom-color: #999999;
+  border-bottom-color: fade_in(rgba(0, 0, 0, 0.2), 0.05);
+  top: -11px; }
+  .popover.bottom > .arrow:after {
+    content: " ";
+    top: 1px;
+    margin-left: -10px;
+    border-top-width: 0;
+    border-bottom-color: white; }
+.popover.left > .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-right-width: 0;
+  border-left-color: #999999;
+  border-left-color: fade_in(rgba(0, 0, 0, 0.2), 0.05); }
+  .popover.left > .arrow:after {
+    content: " ";
+    right: 1px;
+    border-right-width: 0;
+    border-left-color: white;
+    bottom: -10px; }
+
+.carousel {
+  position: relative; }
+
+.carousel-inner {
+  position: relative;
+  overflow: hidden;
+  width: 100%; }
+  .carousel-inner > .item {
+    display: none;
+    position: relative;
+    -webkit-transition: 0.6s ease-in-out left;
+    -o-transition: 0.6s ease-in-out left;
+    transition: 0.6s ease-in-out left; }
+    .carousel-inner > .item > img, .carousel-inner > .item > a > img {
+      display: block;
+      max-width: 100%;
+      height: auto;
+      line-height: 1; }
+    @media all and (transform-3d), (-webkit-transform-3d) {
+      .carousel-inner > .item {
+        -webkit-transition: -webkit-transform 0.6s ease-in-out;
+        -moz-transition: -moz-transform 0.6s ease-in-out;
+        -o-transition: -o-transform 0.6s ease-in-out;
+        transition: transform 0.6s ease-in-out;
+        -webkit-backface-visibility: hidden;
+        -moz-backface-visibility: hidden;
+        backface-visibility: hidden;
+        -webkit-perspective: 1000;
+        -moz-perspective: 1000;
+        perspective: 1000; }
+        .carousel-inner > .item.next, .carousel-inner > .item.active.right {
+          -webkit-transform: translate3d(100%, 0, 0);
+          transform: translate3d(100%, 0, 0);
+          left: 0; }
+        .carousel-inner > .item.prev, .carousel-inner > .item.active.left {
+          -webkit-transform: translate3d(-100%, 0, 0);
+          transform: translate3d(-100%, 0, 0);
+          left: 0; }
+        .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {
+          -webkit-transform: translate3d(0, 0, 0);
+          transform: translate3d(0, 0, 0);
+          left: 0; } }
+  .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev {
+    display: block; }
+  .carousel-inner > .active {
+    left: 0; }
+  .carousel-inner > .next, .carousel-inner > .prev {
+    position: absolute;
+    top: 0;
+    width: 100%; }
+  .carousel-inner > .next {
+    left: 100%; }
+  .carousel-inner > .prev {
+    left: -100%; }
+  .carousel-inner > .next.left, .carousel-inner > .prev.right {
+    left: 0; }
+  .carousel-inner > .active.left {
+    left: -100%; }
+  .carousel-inner > .active.right {
+    left: 100%; }
+
+.carousel-control {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  width: 15%;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+  font-size: 20px;
+  color: white;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }
+  .carousel-control.left {
+    background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+    background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+    background-repeat: repeat-x;
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); }
+  .carousel-control.right {
+    left: auto;
+    right: 0;
+    background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+    background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+    background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+    background-repeat: repeat-x;
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); }
+  .carousel-control:hover, .carousel-control:focus {
+    outline: 0;
+    color: white;
+    text-decoration: none;
+    opacity: 0.9;
+    filter: alpha(opacity=90); }
+  .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right {
+    position: absolute;
+    top: 50%;
+    z-index: 5;
+    display: inline-block; }
+  .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left {
+    left: 50%;
+    margin-left: -10px; }
+  .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right {
+    right: 50%;
+    margin-right: -10px; }
+  .carousel-control .icon-prev, .carousel-control .icon-next {
+    width: 20px;
+    height: 20px;
+    margin-top: -10px;
+    line-height: 1;
+    font-family: serif; }
+  .carousel-control .icon-prev:before {
+    content: '\2039'; }
+  .carousel-control .icon-next:before {
+    content: '\203a'; }
+
+.carousel-indicators {
+  position: absolute;
+  bottom: 10px;
+  left: 50%;
+  z-index: 15;
+  width: 60%;
+  margin-left: -30%;
+  padding-left: 0;
+  list-style: none;
+  text-align: center; }
+  .carousel-indicators li {
+    display: inline-block;
+    width: 10px;
+    height: 10px;
+    margin: 1px;
+    text-indent: -999px;
+    border: 1px solid white;
+    border-radius: 10px;
+    cursor: pointer;
+    background-color: black \9;
+    background-color: rgba(0, 0, 0, 0); }
+  .carousel-indicators .active {
+    margin: 0;
+    width: 12px;
+    height: 12px;
+    background-color: white; }
+
+.carousel-caption {
+  position: absolute;
+  left: 15%;
+  right: 15%;
+  bottom: 20px;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: white;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }
+  .carousel-caption .btn {
+    text-shadow: none; }
+
+@media screen and (min-width: 768px) {
+  .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next {
+    width: 30px;
+    height: 30px;
+    margin-top: -15px;
+    font-size: 30px; }
+  .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev {
+    margin-left: -15px; }
+  .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next {
+    margin-right: -15px; }
+  .carousel-caption {
+    left: 20%;
+    right: 20%;
+    padding-bottom: 30px; }
+  .carousel-indicators {
+    bottom: 20px; } }
+
+.clearfix:before, .clearfix:after {
+  content: " ";
+  display: table; }
+.clearfix:after {
+  clear: both; }
+
+.center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto; }
+
+.pull-right {
+  float: right !important; }
+
+.pull-left {
+  float: left !important; }
+
+.hide {
+  display: none !important; }
+
+.show {
+  display: block !important; }
+
+.invisible {
+  visibility: hidden; }
+
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0; }
+
+.hidden {
+  display: none !important;
+  visibility: hidden !important; }
+
+.affix {
+  position: fixed; }
+
+@-ms-viewport {
+  width: device-width; }
+
+.visible-xs {
+  display: none !important; }
+
+.visible-sm {
+  display: none !important; }
+
+.visible-md {
+  display: none !important; }
+
+.visible-lg {
+  display: none !important; }
+
+.visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block {
+  display: none !important; }
+
+@media (max-width: 767px) {
+  .visible-xs {
+    display: block !important; }
+  table.visible-xs {
+    display: table; }
+  tr.visible-xs {
+    display: table-row !important; }
+  th.visible-xs, td.visible-xs {
+    display: table-cell !important; } }
+
+@media (max-width: 767px) {
+  .visible-xs-block {
+    display: block !important; } }
+
+@media (max-width: 767px) {
+  .visible-xs-inline {
+    display: inline !important; } }
+
+@media (max-width: 767px) {
+  .visible-xs-inline-block {
+    display: inline-block !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm {
+    display: block !important; }
+  table.visible-sm {
+    display: table; }
+  tr.visible-sm {
+    display: table-row !important; }
+  th.visible-sm, td.visible-sm {
+    display: table-cell !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-block {
+    display: block !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline {
+    display: inline !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline-block {
+    display: inline-block !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md {
+    display: block !important; }
+  table.visible-md {
+    display: table; }
+  tr.visible-md {
+    display: table-row !important; }
+  th.visible-md, td.visible-md {
+    display: table-cell !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-block {
+    display: block !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline {
+    display: inline !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline-block {
+    display: inline-block !important; } }
+
+@media (min-width: 1200px) {
+  .visible-lg {
+    display: block !important; }
+  table.visible-lg {
+    display: table; }
+  tr.visible-lg {
+    display: table-row !important; }
+  th.visible-lg, td.visible-lg {
+    display: table-cell !important; } }
+
+@media (min-width: 1200px) {
+  .visible-lg-block {
+    display: block !important; } }
+
+@media (min-width: 1200px) {
+  .visible-lg-inline {
+    display: inline !important; } }
+
+@media (min-width: 1200px) {
+  .visible-lg-inline-block {
+    display: inline-block !important; } }
+
+@media (max-width: 767px) {
+  .hidden-xs {
+    display: none !important; } }
+
+@media (min-width: 768px) and (max-width: 991px) {
+  .hidden-sm {
+    display: none !important; } }
+
+@media (min-width: 992px) and (max-width: 1199px) {
+  .hidden-md {
+    display: none !important; } }
+
+@media (min-width: 1200px) {
+  .hidden-lg {
+    display: none !important; } }
+
+.visible-print {
+  display: none !important; }
+
+@media print {
+  .visible-print {
+    display: block !important; }
+  table.visible-print {
+    display: table; }
+  tr.visible-print {
+    display: table-row !important; }
+  th.visible-print, td.visible-print {
+    display: table-cell !important; } }
+
+.visible-print-block {
+  display: none !important; }
+  @media print {
+    .visible-print-block {
+      display: block !important; } }
+
+.visible-print-inline {
+  display: none !important; }
+  @media print {
+    .visible-print-inline {
+      display: inline !important; } }
+
+.visible-print-inline-block {
+  display: none !important; }
+  @media print {
+    .visible-print-inline-block {
+      display: inline-block !important; } }
+
+@media print {
+  .hidden-print {
+    display: none !important; } }
+
+html {
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased; }
+
+header {
+  background-repeat: repeat-x;
+  background-image: -webkit-linear-gradient(-45deg, #4d2258, #141421);
+  background-image: -o-linear-gradient(-45deg, #4d2258, #141421);
+  background-image: linear-gradient(-45deg, #4d2258, #141421);
+  padding-bottom: 2px; }
+  .homepage header {
+    background-image: url(../images/header-bg.jpg);
+    background-size: cover;
+    background-repeat: no-repeat;
+    background-position: bottom center;
+    padding-bottom: 50px; }
+  header nav {
+    padding-top: 20px; }
+    header nav ul.navbar-nav {
+      margin-top: 40px;
+      text-transform: uppercase;
+      text-align: center; }
+      header nav ul.navbar-nav li {
+        position: relative; }
+        header nav ul.navbar-nav li a {
+          color: whitesmoke; }
+        header nav ul.navbar-nav li ul.dropdown-menu {
+          background-color: rgba(0, 0, 0, 0.8);
+          border: 0;
+          border-top: 5px solid #3085cb;
+          border-radius: 0;
+          padding: 0;
+          margin-top: 10px;
+          left: -55px; }
+          .homepage header nav ul.navbar-nav li ul.dropdown-menu {
+            background-color: rgba(0, 0, 0, 0.5); }
+          header nav ul.navbar-nav li ul.dropdown-menu li {
+            text-transform: none; }
+            header nav ul.navbar-nav li ul.dropdown-menu li a {
+              padding: 20px;
+              -webkit-transition: ;
+              -o-transition: ;
+              transition: ; }
+              header nav ul.navbar-nav li ul.dropdown-menu li a:hover {
+                color: whitesmoke;
+                background-color: rgba(0, 0, 0, 0.4); }
+          header nav ul.navbar-nav li ul.dropdown-menu:after {
+            width: 0;
+            height: 0;
+            border-left: 10px solid transparent;
+            border-right: 10px solid transparent;
+            border-bottom: 10px solid #3085cb;
+            content: " ";
+            display: table;
+            top: -10px;
+            position: absolute;
+            left: 50%;
+            margin-left: -10px; }
+  header section {
+    color: whitesmoke;
+    margin-top: 50px; }
+    header section h1 {
+      font-size: 6rem;
+      font-weight: bold;
+      margin-bottom: 20px; }
+    header section p {
+      font-size: 2.5rem;
+      line-height: 1.4em; }
+    @media (max-width: 767px) {
+      header section h1 {
+        font-size: 4.5rem;
+        font-weight: bold;
+        margin-bottom: 20px; }
+      header section p {
+        font-size: 2.2rem;
+        line-height: 1.4em; } }
+  header .header-divider {
+    text-align: center;
+    margin-bottom: -75px; }
+
+main.main {
+  /* Item box: Layout item */ }
+  main.main p {
+    color: #58595b; }
+  main.main .line-divider-left {
+    padding-left: 3em; }
+  main.main .well {
+    background-color: #3085cb;
+    background-image: url(../images/well-bg-tl.png), url(../images/well-bg-br.png);
+    background-position: left top, right bottom;
+    background-repeat: no-repeat;
+    color: whitesmoke !important;
+    border: 0px;
+    margin-bottom: 0px; }
+    main.main .well h1 {
+      font-size: 5rem;
+      font-weight: 700; }
+    main.main .well p {
+      font-size: 2.4rem;
+      color: whitesmoke !important; }
+  main.main .subsection-header {
+    margin-bottom: 20px; }
+    main.main .subsection-header h2 {
+      color: whitesmoke;
+      display: block;
+      height: 79px;
+      width: 100%;
+      background-size: 100%;
+      padding: 28px;
+      font-size: 21px;
+      margin-bottom: 30px; }
+  main.main section.first {
+    background-color: whitesmoke;
+    background-image: url(../images/section-first-divider.png);
+    background-repeat: no-repeat;
+    background-size: 100%;
+    background-position: bottom center;
+    padding: 50px 0 125px; }
+    main.main section.first .first-col h2, main.main section.first .second-col h2 {
+      font-size: 22px;
+      font-weight: 700;
+      color: #403c40 !important; }
+    main.main section.first .first-col p, main.main section.first .second-col p {
+      text-align: justify;
+      font-weight: 400; }
+    main.main section.first .first-col span, main.main section.first .second-col span {
+      width: 100%;
+      display: block;
+      font-size: 5em;
+      text-align: right;
+      color: #3085cb;
+      margin-top: 12px;
+      margin-left: 4px; }
+      @media (max-width: 767px) {
+        main.main section.first .first-col span, main.main section.first .second-col span {
+          font-size: 4em;
+          margin-top: 20px;
+          margin-left: 0px; } }
+    main.main section.first .first-col .row:hover, main.main section.first .second-col .row:hover {
+      background-color: rgba(48, 133, 203, 0.05);
+      -webkit-box-shadow: 0px 0px 5px #fcfdfe;
+      box-shadow: 0px 0px 5px #fcfdfe; }
+    main.main section.first .third-col h1 {
+      margin-top: -20px; }
+      @media (max-width: 1199px) {
+        main.main section.first .third-col h1 {
+          margin-top: 30px; } }
+    main.main section.first .third-col p {
+      font-size: 1.5em; }
+  main.main section.second {
+    background-image: url(../images/section-second-divider.png);
+    background-repeat: no-repeat;
+    background-size: 100%;
+    background-position: bottom center;
+    padding: 20px 0 75px; }
+    main.main section.second .community p {
+      font-size: 1.5em; }
+    main.main section.second .latest-news h2 {
+      background-image: url(../images/heading-latest_news.jpg); }
+    main.main section.second .latest-news .latest-news-item {
+      border-bottom: 1px solid #c2c2c2;
+      padding-bottom: 10px;
+      margin-bottom: 20px; }
+      main.main section.second .latest-news .latest-news-item h3 {
+        font-size: 18px; }
+      main.main section.second .latest-news .latest-news-item p {
+        font-size: 14px; }
+      main.main section.second .latest-news .latest-news-item p.date {
+        color: #6eb553;
+        font-size: 12px; }
+    main.main section.second .latest-news .latest-news-item:last-of-type {
+      margin-bottom: 35px;
+      border-bottom: 0px; }
+    main.main section.second .featured-articles h2 {
+      background-image: url(../images/heading-featured.jpg); }
+    main.main section.second .featured-articles .featured-articles-item {
+      background-image: url(../images/open-iot-bg.jpg);
+      background-size: cover;
+      background-repeat: no-repeat;
+      color: whitesmoke;
+      text-align: center;
+      margin-bottom: 30px; }
+      main.main section.second .featured-articles .featured-articles-item h3 {
+        font-size: 18px;
+        color: whitesmoke;
+        padding: 40px 0;
+        margin: 0; }
+    main.main section.second .upcoming-events h2 {
+      background-image: url(../images/heading-upcoming_events.jpg); }
+    main.main section.second .upcoming-events .upcoming-events-item {
+      text-align: center;
+      color: whitesmoke;
+      margin-bottom: 30px; }
+      main.main section.second .upcoming-events .upcoming-events-item h3 {
+        background-image: url(../images/upcoming-events-bg.png);
+        background-size: 100%;
+        padding: 40px 0;
+        font-size: 18px;
+        font-weight: bold;
+        margin: 0; }
+        main.main section.second .upcoming-events .upcoming-events-item h3 span.date {
+          font-weight: normal;
+          font-size: 14px; }
+      main.main section.second .upcoming-events .upcoming-events-item h3:hover {
+        background: url(../images/upcoming-events-bg_hover.png);
+        background-size: 100%; }
+      main.main section.second .upcoming-events .upcoming-events-item p {
+        background-color: #3085cb;
+        padding: 10px 0;
+        font-size: 14px;
+        line-height: 1.2;
+        position: relative;
+        color: whitesmoke; }
+        main.main section.second .upcoming-events .upcoming-events-item p:after {
+          width: 0;
+          height: 0;
+          border-bottom: 20px solid #3085cb;
+          border-left: 20px solid transparent;
+          content: " ";
+          display: table;
+          right: 1px;
+          top: -20px;
+          position: absolute; }
+  main.main section.third {
+    background-color: whitesmoke; }
+    main.main section.third .logos {
+      text-align: center; }
+    main.main section.third .btn {
+      margin-top: 2em; }
+    main.main section.third .working-group p {
+      font-size: 1.5em; }
+  main.main .itembox {
+    margin-bottom: 20px;
+    padding: 0px 20px;
+    position: relative;
+    cursor: pointer; }
+    main.main .itembox p {
+      color: #58595b !important; }
+    main.main .itembox a.readmore:link, main.main .itembox a.readmore:visited {
+      display: block;
+      position: absolute;
+      bottom: 0;
+      background: #3085cb;
+      color: white;
+      text-align: center;
+      padding: 8px 20px;
+      margin-bottom: 10px; }
+    main.main .itembox a.readmore:hover {
+      background: #551f62; }
+  main.main .itembox:hover {
+    background: white; }
+  main.main .project-list {
+    /* Project list: community.html */ }
+    main.main .project-list .loading {
+      min-height: 400px;
+      text-align: center;
+      font-size: 2em;
+      color: #551f62; }
+    main.main .project-list .itembox h3, main.main .project-list .itembox p {
+      padding: 0 10px; }
+    main.main .project-list .itembox .logo {
+      padding: 15px;
+      max-width: 80%; }
+    main.main .project-list .itembox h3 {
+      font-size: 21px; }
+    main.main .project-list .itembox p {
+      font-size: 15px;
+      padding-bottom: 50px;
+      color: #551f62; }
+  main.main .videos h2 {
+    background-image: url(../images/heading-upcoming_events.jpg); }
+  main.main .presentations h2 {
+    background-image: url(../images/heading-upcoming_events.jpg); }
+
+footer {
+  background-image: url(../images/footer-bg.jpg);
+  background-size: cover;
+  background-position: center bottom;
+  background-repeat: no-repeat;
+  background-color: whitesmoke;
+  padding: 100px 0 50px; }
+  @media (max-width: 991px) {
+    footer {
+      padding-top: 50px; }
+      footer .container {
+        padding-top: 40px; } }
+  @media (min-width: 1199px) {
+    footer {
+      padding-top: 200px; }
+      footer .container {
+        padding-bottom: 100px; } }
+  footer nav a {
+    color: #c2c2c2;
+    text-transform: uppercase;
+    font-size: 12px; }
+  footer p.copyright {
+    color: #8b7193;
+    font-size: 12px;
+    text-align: right; }
+  footer .social-facebook, footer .social-twitter, footer .social-youtube, footer .social-share {
+    display: block;
+    width: 36px;
+    height: 35px;
+    background-repeat: no-repeat;
+    float: left;
+    margin-right: 10px; }
+  footer .social-facebook {
+    background-image: url(../images/icon-facebook.png); }
+  footer .social-twitter {
+    background-image: url(../images/icon-twitter.png); }
+  footer .social-youtube {
+    background-image: url(../images/icon-youtube.png); }
+  footer .social-share {
+    background-image: url(../images/icon-share.png); }
diff --git a/static/assets/css/icomoon.css b/static/assets/css/icomoon.css
new file mode 100755
index 0000000000000000000000000000000000000000..76e3113674676ddd8081a03fdd46c2373b6e5b7f
--- /dev/null
+++ b/static/assets/css/icomoon.css
@@ -0,0 +1,53 @@
+@font-face {
+	font-family: 'icomoon';
+	src:url('../fonts/icomoon.eot?ywhq9g');
+	src:url('../fonts/icomoon.eot?#iefixywhq9g') format('embedded-opentype'),
+		url('../fonts/icomoon.woff?ywhq9g') format('woff'),
+		url('../fonts/icomoon.ttf?ywhq9g') format('truetype'),
+		url('../fonts/icomoon.svg?ywhq9g#icomoon') format('svg');
+	font-weight: normal;
+	font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+	font-family: 'icomoon';
+	speak: none;
+	font-style: normal;
+	font-weight: normal;
+	font-variant: normal;
+	text-transform: none;
+	line-height: 1;
+	
+	/* Enable Ligatures ================ */
+	-webkit-font-feature-settings: "liga";
+	-moz-font-feature-settings: "liga=1";
+	-moz-font-feature-settings: "liga";
+	-ms-font-feature-settings: "liga" 1;
+	-o-font-feature-settings: "liga";
+	font-feature-settings: "liga";
+
+	/* Better Font Rendering =========== */
+	-webkit-font-smoothing: antialiased;
+	-moz-osx-font-smoothing: grayscale;
+}
+
+.icon-cogs:before {
+	content: "\e995";
+}
+
+.icon-switch:before {
+	content: "\e9b6";
+}
+
+.icon-embed:before {
+	content: "\ea7f";
+}
+
+.icon-embed2:before {
+	content: "\ea80";
+}
+
+.icon-bulb:before {
+	content: "\e600";
+}
+
diff --git a/static/assets/css/jquery.oembed.css b/static/assets/css/jquery.oembed.css
new file mode 100644
index 0000000000000000000000000000000000000000..512dfecd399bc71441dae36944b125a2351be9f8
--- /dev/null
+++ b/static/assets/css/jquery.oembed.css
@@ -0,0 +1,369 @@
+div.oembedall-githubrepos {
+    border: 1px solid #DDD;
+    border-radius: 4px 4px 4px 4px;
+    list-style-type: none;
+    margin: 0 0 10px;
+    padding: 8px 10px 0;
+    font: 13.34px/1.4 helvetica, arial, freesans, clean, sans-serif;
+    /*background: url("http://github.com/images/icons/public.png") no-repeat scroll 6px 9px transparent;*/
+    
+    width: 452px;
+    background-color: #fff;
+}
+div.oembedall-githubrepos .oembedall-body {
+    background: -moz-linear-gradient(center top, #FAFAFA, #EFEFEF) repeat scroll 0 0 transparent;
+    background: -webkit-gradient(linear, left top, left bottom, from(#FAFAFA), to(#EFEFEF));
+    ;
+    border-bottom-left-radius: 4px;
+    border-bottom-right-radius: 4px;
+    border-top: 1px solid #EEE;
+    margin-left: -10px;
+    margin-top: 8px;
+    padding: 5px 10px;
+    width: 100%;
+}
+div.oembedall-githubrepos h3 {
+    font-size: 14px;
+    margin: 0;
+    padding-left: 18px;
+    white-space: nowrap;
+}
+div.oembedall-githubrepos p.oembedall-description {
+    color: #444;
+    font-size: 12px;
+    margin: 0 0 3px;
+}
+div.oembedall-githubrepos p.oembedall-updated-at {
+    color: #888;
+    font-size: 11px;
+    margin: 0;
+}
+div.oembedall-githubrepos ul.oembedall-repo-stats {
+    /*background: url("http://github.com/images/modules/pagehead/actions_fade.png") no-repeat scroll 0 0 transparent;*/
+    
+    border: medium none;
+    float: right;
+    font-size: 11px;
+    font-weight: bold;
+    padding-left: 15px;
+    position: relative;
+    z-index: 5;
+    margin: 0;
+}
+div.oembedall-githubrepos ul.oembedall-repo-stats li {
+    border: medium none;
+    color: #666;
+    display: inline-block;
+    list-style-type: none;
+    margin: 0 !important;
+}
+div.oembedall-githubrepos ul.oembedall-repo-stats li a {
+    background-color: transparent;
+    background-position: 5px -2px;
+    border: medium none;
+    color: #666 !important;
+    background-position: 5px -2px;
+    background-repeat: no-repeat;
+    border-left: 1px solid #DDD;
+    display: inline-block;
+    height: 21px;
+    line-height: 21px;
+    padding: 0 5px 0 23px;
+}
+div.oembedall-githubrepos ul.oembedall-repo-stats li:first-child a {
+    border-left: medium none;
+    margin-right: -3px;
+}
+div.oembedall-githubrepos ul.oembedall-repo-stats li a:hover {
+    background: none no-repeat scroll 5px -27px #4183C4;
+    color: #FFFFFF !important;
+    text-decoration: none;
+}
+div.oembedall-githubrepos ul.oembedall-repo-stats li:first-child a:hover {
+    border-bottom-left-radius: 3px;
+    border-top-left-radius: 3px;
+}
+ul.oembedall-repo-stats li:last-child a:hover {
+    border-bottom-right-radius: 3px;
+    border-top-right-radius: 3px;
+}
+div.oembedall-githubrepos ul.oembedall-repo-stats li.oembedall-watchers a {
+    /*background-image: url("http://github.com/images/modules/pagehead/repostat_watchers.png");*/
+}
+div.oembedall-githubrepos ul.oembedall-repo-stats li.oembedall-forks a {
+    /*background-image: url("http://github.com/images/modules/pagehead/repostat_forks.png");*/
+}
+span.oembedall-closehide {
+    background-color: #aaa;
+    border-radius: 2px;
+    cursor: pointer;
+    margin-right: 3px;
+}
+div.oembedall-container {
+    margin-top: 5px;
+    text-align: left;
+}
+.oembedall-ljuser {
+    font-weight: bold;
+}
+.oembedall-ljuser img {
+    vertical-align: bottom;
+    border: 0;
+    padding-right: 1px;
+}
+.oembedall-stoqembed {
+    border-bottom: 1px dotted #999999;
+    float: left;
+    overflow: hidden;
+    padding: 11px 0;
+    width: 730px;
+    line-height: 1;
+    background: none repeat scroll 0 0 #FFFFFF;
+    color: #000000;
+    font-family: Arial, Liberation Sans, DejaVu Sans, sans-serif;
+    font-size: 80%;
+    text-align: left;
+    margin: 0;
+    padding: 0;
+}
+.oembedall-stoqembed a {
+    color: #0077CC;
+    text-decoration: none;
+    margin: 0;
+    padding: 0;
+}
+.oembedall-stoqembed a:hover {
+    text-decoration: underline;
+}
+.oembedall-stoqembed a:visited {
+    color: #4A6B82;
+}
+.oembedall-stoqembed h3 {
+    font-family: Trebuchet MS, Liberation Sans, DejaVu Sans, sans-serif;
+    font-size: 130%;
+    font-weight: bold;
+    margin: 0;
+    padding: 0;
+}
+.oembedall-stoqembed .oembedall-reputation-score {
+    color: #444444;
+    font-size: 120%;
+    font-weight: bold;
+    margin-right: 2px;
+}
+.oembedall-stoqembed .oembedall-user-info {
+    height: 35px;
+    width: 185px;
+}
+.oembedall-stoqembed .oembedall-user-info .oembedall-user-gravatar32 {
+    float: left;
+    height: 32px;
+    width: 32px;
+}
+.oembedall-stoqembed .oembedall-user-info .oembedall-user-details {
+    float: left;
+    margin-left: 5px;
+    overflow: hidden;
+    white-space: nowrap;
+    width: 145px;
+}
+.oembedall-stoqembed .oembedall-question-hyperlink {
+    font-weight: bold;
+}
+.oembedall-stoqembed .oembedall-stats {
+    background: none repeat scroll 0 0 #EEEEEE;
+    margin: 0 0 0 7px;
+    padding: 4px 7px 6px;
+    width: 58px;
+}
+.oembedall-stoqembed .oembedall-statscontainer {
+    float: left;
+    margin-right: 8px;
+    width: 86px;
+}
+.oembedall-stoqembed .oembedall-votes {
+    color: #555555;
+    padding: 0 0 7px;
+    text-align: center;
+}
+.oembedall-stoqembed .oembedall-vote-count-post {
+    display: block;
+    font-size: 240%;
+    color: #808185;
+    display: block;
+    font-weight: bold;
+}
+.oembedall-stoqembed .oembedall-views {
+    color: #999999;
+    padding-top: 4px;
+    text-align: center;
+}
+.oembedall-stoqembed .oembedall-status {
+    margin-top: -3px;
+    padding: 4px 0;
+    text-align: center;
+    background: none repeat scroll 0 0 #75845C;
+    color: #FFFFFF;
+}
+.oembedall-stoqembed .oembedall-status strong {
+    color: #FFFFFF;
+    display: block;
+    font-size: 140%;
+}
+.oembedall-stoqembed .oembedall-summary {
+    float: left;
+    width: 635px;
+}
+.oembedall-stoqembed .oembedall-excerpt {
+    line-height: 1.2;
+    margin: 0;
+    padding: 0 0 5px;
+}
+.oembedall-stoqembed .oembedall-tags {
+    float: left;
+    line-height: 18px;
+}
+.oembedall-stoqembed .oembedall-tags a:hover {
+    text-decoration: none;
+}
+.oembedall-stoqembed .oembedall-post-tag {
+    background-color: #E0EAF1;
+    border-bottom: 1px solid #3E6D8E;
+    border-right: 1px solid #7F9FB6;
+    color: #3E6D8E;
+    font-size: 90%;
+    line-height: 2.4;
+    margin: 2px 2px 2px 0;
+    padding: 3px 4px;
+    text-decoration: none;
+    white-space: nowrap;
+}
+.oembedall-stoqembed .oembedall-post-tag:hover {
+    background-color: #3E6D8E;
+    border-bottom: 1px solid #37607D;
+    border-right: 1px solid #37607D;
+    color: #E0EAF1;
+}
+.oembedall-stoqembed .oembedall-fr {
+    float: right;
+}
+.oembedall-stoqembed .oembedall-statsarrow {
+    background-image: url("http://cdn.sstatic.net/stackoverflow/img/sprites.png?v=3");
+    background-repeat: no-repeat;
+    overflow: hidden;
+    background-position: 0 -435px;
+    float: right;
+    height: 13px;
+    margin-top: 12px;
+    width: 7px;
+}
+.oembedall-facebook1 {
+    border: #1A3C6C solid 1px;
+    padding: 0px;
+    font: 13.34px/1.4 verdana;
+    width: 500px;
+}
+.oembedall-facebook2 {
+    background-color: #627add;
+}
+.oembedall-facebook2 a {
+    color: #e8e8e8;
+    text-decoration: none;
+}
+.oembedall-facebookBody {
+    background-color: #fff;
+    vertical-align: top;
+    padding: 5px;
+}
+.oembedall-facebookBody .contents {
+    display: inline-block;
+    width: 100%;
+}
+.oembedall-facebookBody div img {
+    float: left;
+    margin-right: 5px;
+}
+div.oembedall-lanyard {
+    -webkit-box-shadow: none;
+    -webkit-transition-delay: 0s;
+    -webkit-transition-duration: 0.4000000059604645s;
+    -webkit-transition-property: width;
+    -webkit-transition-timing-function: cubic-bezier(0.42, 0, 0.58, 1);
+    background-attachment: scroll;
+    background-clip: border-box;
+    background-color: transparent;
+    background-image: none;
+    background-origin: padding-box;
+    border-bottom-width: 0px;
+    border-left-width: 0px;
+    border-right-width: 0px;
+    border-top-width: 0px;
+    box-shadow: none;
+    color: #112644;
+    display: block;
+    float: left;
+    font-family: 'Trebuchet MS', Trebuchet, sans-serif;
+    font-size: 16px;
+    height: 253px;
+    line-height: 19px;
+    margin-bottom: 0px;
+    margin-left: 0px;
+    margin-right: 0px;
+    margin-top: 0px;
+    max-width: none;
+    min-height: 0px;
+    outline-color: #112644;
+    outline-style: none;
+    outline-width: 0px;
+    overflow-x: visible;
+    overflow-y: visible;
+    padding-bottom: 0px;
+    padding-left: 0px;
+    padding-right: 0px;
+    padding-top: 0px;
+    position: relative;
+    text-align: left;
+    vertical-align: baseline;
+    width: 804px;
+}
+div.oembedall-lanyard .tagline {
+    font-size: 1.5em;
+}
+div.oembedall-lanyard .wrapper {
+    overflow: hidden;
+    clear: both;
+}
+div.oembedall-lanyard .split {
+    float: left;
+    display: inline;
+}
+div.oembedall-lanyard .prominent-place .flag:link, div.oembedall-lanyard .prominent-place .flag:visited, div.oembedall-lanyard .prominent-place .flag:hover, div.oembedall-lanyard .prominent-place .flag:focus, div.oembedall-lanyard .prominent-place .flag:active {
+    float: left;
+    display: block;
+    width: 48px;
+    height: 48px;
+    position: relative;
+    top: -5px;
+    margin-right: 10px;
+}
+div.oembedall-lanyard .place-context {
+    font-size: 0.889em;
+}
+div.oembedall-lanyard .prominent-place .sub-place {
+    display: block;
+}
+div.oembedall-lanyard .prominent-place {
+    font-size: 1.125em;
+    line-height: 1.1em;
+    font-weight: normal;
+}
+div.oembedall-lanyard .main-date {
+    color: #8CB4E0;
+    font-weight: bold;
+    line-height: 1.1;
+}
+div.oembedall-lanyard .first {
+    margin-left: 0;
+    width: 48.57%;
+    margin: 0 0 0 2.857%;
+}
diff --git a/static/assets/fonts/bootstrap/glyphicons-halflings-regular.eot b/static/assets/fonts/bootstrap/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64
Binary files /dev/null and b/static/assets/fonts/bootstrap/glyphicons-halflings-regular.eot differ
diff --git a/static/assets/fonts/bootstrap/glyphicons-halflings-regular.svg b/static/assets/fonts/bootstrap/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000000000000000000000000000000000000..94fb5490a2ed10b2c69a4a567a4fd2e4f706d841
--- /dev/null
+++ b/static/assets/fonts/bootstrap/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?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="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/static/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf b/static/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b
Binary files /dev/null and b/static/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf differ
diff --git a/static/assets/fonts/bootstrap/glyphicons-halflings-regular.woff b/static/assets/fonts/bootstrap/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000000000000000000000000000000000000..9e612858f802245ddcbf59788a0db942224bab35
Binary files /dev/null and b/static/assets/fonts/bootstrap/glyphicons-halflings-regular.woff differ
diff --git a/static/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2 b/static/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0
Binary files /dev/null and b/static/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2 differ
diff --git a/static/assets/fonts/icomoon.eot b/static/assets/fonts/icomoon.eot
new file mode 100755
index 0000000000000000000000000000000000000000..e6ef49b4b603092bdff8d1a64fd104a999f5e02b
Binary files /dev/null and b/static/assets/fonts/icomoon.eot differ
diff --git a/static/assets/fonts/icomoon.svg b/static/assets/fonts/icomoon.svg
new file mode 100755
index 0000000000000000000000000000000000000000..f7f0da912339327435bacf52418bfb842281f13f
--- /dev/null
+++ b/static/assets/fonts/icomoon.svg
@@ -0,0 +1,23 @@
+<?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>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" d="" horiz-adv-x="512" />
+<glyph unicode="&#xe600;" d="M512 960c-194.432 0-352-157.568-352-352 0-128.992 118.016-265.696 160.992-385.76 64.096-179.040 56.992-286.24 191.008-286.24 136 0 126.88 106.688 191.008 285.504 43.104 120.32 160.992 258.496 160.992 386.496 0 194.432-157.632 352-352 352zM594.944 90.368l-158.656-19.808c-5.664 16.384-11.744 35.552-19.136 60.576-0.096 0.32-0.224 0.672-0.288 0.992l198.016 24.736c-2.816-9.44-5.824-19.36-8.448-28.256-4.192-14.368-7.936-26.848-11.488-38.24zM407.552 162.944c-5.824 19.264-12.384 39.552-19.68 61.056h248.512c-3.936-11.488-7.872-23.008-11.264-33.888l-217.568-27.168zM512 0c-32.416 0-47.328 3.744-63.904 40l135.616 16.992c-19.648-52.928-33.952-56.992-71.712-56.992zM661.504 288h-298.656c-15.936 34.56-35.072 69.12-53.952 102.944-41.76 74.72-84.896 152-84.896 217.056 0 158.816 129.184 288 288 288s288-129.184 288-288c0-64.576-43.2-142.272-84.992-217.44-18.688-33.696-37.696-68.192-53.504-102.56zM512 800c8.8 0 16-7.168 16-16s-7.168-16-16-16c-88.224 0-160-71.776-160-160 0-8.832-7.168-16-16-16s-16 7.168-16 16c0 105.888 86.112 192 192 192z" />
+<glyph unicode="&#xe995;" d="M363.722 237.948l41.298 57.816-45.254 45.256-57.818-41.296c-10.722 5.994-22.204 10.774-34.266 14.192l-11.682 70.084h-64l-11.68-70.086c-12.062-3.418-23.544-8.198-34.266-14.192l-57.818 41.298-45.256-45.256 41.298-57.816c-5.994-10.72-10.774-22.206-14.192-34.266l-70.086-11.682v-64l70.086-11.682c3.418-12.060 8.198-23.544 14.192-34.266l-41.298-57.816 45.254-45.256 57.818 41.296c10.722-5.994 22.204-10.774 34.266-14.192l11.682-70.084h64l11.68 70.086c12.062 3.418 23.544 8.198 34.266 14.192l57.818-41.296 45.254 45.256-41.298 57.816c5.994 10.72 10.774 22.206 14.192 34.266l70.088 11.68v64l-70.086 11.682c-3.418 12.060-8.198 23.544-14.192 34.266zM224 96c-35.348 0-64 28.654-64 64s28.652 64 64 64 64-28.654 64-64-28.652-64-64-64zM1024 576v64l-67.382 12.25c-1.242 8.046-2.832 15.978-4.724 23.79l57.558 37.1-24.492 59.128-66.944-14.468c-4.214 6.91-8.726 13.62-13.492 20.13l39.006 56.342-45.256 45.254-56.342-39.006c-6.512 4.766-13.22 9.276-20.13 13.494l14.468 66.944-59.128 24.494-37.1-57.558c-7.812 1.892-15.744 3.482-23.79 4.724l-12.252 67.382h-64l-12.252-67.382c-8.046-1.242-15.976-2.832-23.79-4.724l-37.098 57.558-59.128-24.492 14.468-66.944c-6.91-4.216-13.62-8.728-20.13-13.494l-56.342 39.006-45.254-45.254 39.006-56.342c-4.766-6.51-9.278-13.22-13.494-20.13l-66.944 14.468-24.492-59.128 57.558-37.1c-1.892-7.812-3.482-15.742-4.724-23.79l-67.384-12.252v-64l67.382-12.25c1.242-8.046 2.832-15.978 4.724-23.79l-57.558-37.1 24.492-59.128 66.944 14.468c4.216-6.91 8.728-13.618 13.494-20.13l-39.006-56.342 45.254-45.256 56.342 39.006c6.51-4.766 13.22-9.276 20.13-13.492l-14.468-66.944 59.128-24.492 37.102 57.558c7.81-1.892 15.742-3.482 23.788-4.724l12.252-67.384h64l12.252 67.382c8.044 1.242 15.976 2.832 23.79 4.724l37.1-57.558 59.128 24.492-14.468 66.944c6.91 4.216 13.62 8.726 20.13 13.492l56.342-39.006 45.256 45.256-39.006 56.342c4.766 6.512 9.276 13.22 13.492 20.13l66.944-14.468 24.492 59.13-57.558 37.1c1.892 7.812 3.482 15.742 4.724 23.79l67.382 12.25zM672 468.8c-76.878 0-139.2 62.322-139.2 139.2s62.32 139.2 139.2 139.2 139.2-62.322 139.2-139.2c0-76.878-62.32-139.2-139.2-139.2z" />
+<glyph unicode="&#xe9b6;" d="M640 813.412v-135.958c36.206-15.804 69.5-38.408 98.274-67.18 60.442-60.44 93.726-140.8 93.726-226.274s-33.286-165.834-93.726-226.274c-60.44-60.44-140.798-93.726-226.274-93.726s-165.834 33.286-226.274 93.726c-60.44 60.44-93.726 140.8-93.726 226.274s33.286 165.834 93.726 226.274c28.774 28.774 62.068 51.378 98.274 67.182v135.956c-185.048-55.080-320-226.472-320-429.412 0-247.424 200.578-448 448-448 247.424 0 448 200.576 448 448 0 202.94-134.95 374.332-320 429.412zM448 960h128v-512h-128z" />
+<glyph unicode="&#xea7f;" d="M576 224l96-96 320 320-320 320-96-96 224-224zM448 672l-96 96-320-320 320-320 96 96-224 224z" />
+<glyph unicode="&#xea80;" d="M832 224l96-96 320 320-320 320-96-96 224-224zM448 672l-96 96-320-320 320-320 96 96-224 224zM701.298 809.481l69.468-18.944-191.987-704.026-69.468 18.944 191.987 704.026z" horiz-adv-x="1280" />
+<glyph unicode="" d="M832 224l96-96 320 320-320 320-96-96 224-224zM448 672l-96 96-320-320 320-320 96 96-224 224zM701.298 809.481l69.468-18.944-191.987-704.026-69.468 18.944 191.987 704.026z" horiz-adv-x="1280" />
+<glyph unicode="switch" d="M640 813.412v-135.958c36.206-15.804 69.5-38.408 98.274-67.18 60.442-60.44 93.726-140.8 93.726-226.274s-33.286-165.834-93.726-226.274c-60.44-60.44-140.798-93.726-226.274-93.726s-165.834 33.286-226.274 93.726c-60.44 60.44-93.726 140.8-93.726 226.274s33.286 165.834 93.726 226.274c28.774 28.774 62.068 51.378 98.274 67.182v135.956c-185.048-55.080-320-226.472-320-429.412 0-247.424 200.578-448 448-448 247.424 0 448 200.576 448 448 0 202.94-134.95 374.332-320 429.412zM448 960h128v-512h-128z" />
+<glyph unicode="gears" d="M363.722 237.948l41.298 57.816-45.254 45.256-57.818-41.296c-10.722 5.994-22.204 10.774-34.266 14.192l-11.682 70.084h-64l-11.68-70.086c-12.062-3.418-23.544-8.198-34.266-14.192l-57.818 41.298-45.256-45.256 41.298-57.816c-5.994-10.72-10.774-22.206-14.192-34.266l-70.086-11.682v-64l70.086-11.682c3.418-12.060 8.198-23.544 14.192-34.266l-41.298-57.816 45.254-45.256 57.818 41.296c10.722-5.994 22.204-10.774 34.266-14.192l11.682-70.084h64l11.68 70.086c12.062 3.418 23.544 8.198 34.266 14.192l57.818-41.296 45.254 45.256-41.298 57.816c5.994 10.72 10.774 22.206 14.192 34.266l70.088 11.68v64l-70.086 11.682c-3.418 12.060-8.198 23.544-14.192 34.266zM224 96c-35.348 0-64 28.654-64 64s28.652 64 64 64 64-28.654 64-64-28.652-64-64-64zM1024 576v64l-67.382 12.25c-1.242 8.046-2.832 15.978-4.724 23.79l57.558 37.1-24.492 59.128-66.944-14.468c-4.214 6.91-8.726 13.62-13.492 20.13l39.006 56.342-45.256 45.254-56.342-39.006c-6.512 4.766-13.22 9.276-20.13 13.494l14.468 66.944-59.128 24.494-37.1-57.558c-7.812 1.892-15.744 3.482-23.79 4.724l-12.252 67.382h-64l-12.252-67.382c-8.046-1.242-15.976-2.832-23.79-4.724l-37.098 57.558-59.128-24.492 14.468-66.944c-6.91-4.216-13.62-8.728-20.13-13.494l-56.342 39.006-45.254-45.254 39.006-56.342c-4.766-6.51-9.278-13.22-13.494-20.13l-66.944 14.468-24.492-59.128 57.558-37.1c-1.892-7.812-3.482-15.742-4.724-23.79l-67.384-12.252v-64l67.382-12.25c1.242-8.046 2.832-15.978 4.724-23.79l-57.558-37.1 24.492-59.128 66.944 14.468c4.216-6.91 8.728-13.618 13.494-20.13l-39.006-56.342 45.254-45.256 56.342 39.006c6.51-4.766 13.22-9.276 20.13-13.492l-14.468-66.944 59.128-24.492 37.102 57.558c7.81-1.892 15.742-3.482 23.788-4.724l12.252-67.384h64l12.252 67.382c8.044 1.242 15.976 2.832 23.79 4.724l37.1-57.558 59.128 24.492-14.468 66.944c6.91 4.216 13.62 8.726 20.13 13.492l56.342-39.006 45.256 45.256-39.006 56.342c4.766 6.512 9.276 13.22 13.492 20.13l66.944-14.468 24.492 59.13-57.558 37.1c1.892 7.812 3.482 15.742 4.724 23.79l67.382 12.25zM672 468.8c-76.878 0-139.2 62.322-139.2 139.2s62.32 139.2 139.2 139.2 139.2-62.322 139.2-139.2c0-76.878-62.32-139.2-139.2-139.2z" />
+<glyph unicode="embed2" d="M832 224l96-96 320 320-320 320-96-96 224-224zM448 672l-96 96-320-320 320-320 96 96-224 224zM701.298 809.481l69.468-18.944-191.987-704.026-69.468 18.944 191.987 704.026z" horiz-adv-x="1280" />
+<glyph unicode="embed" d="M576 224l96-96 320 320-320 320-96-96 224-224zM448 672l-96 96-320-320 320-320 96 96-224 224z" />
+<glyph unicode="cogs" d="M363.722 237.948l41.298 57.816-45.254 45.256-57.818-41.296c-10.722 5.994-22.204 10.774-34.266 14.192l-11.682 70.084h-64l-11.68-70.086c-12.062-3.418-23.544-8.198-34.266-14.192l-57.818 41.298-45.256-45.256 41.298-57.816c-5.994-10.72-10.774-22.206-14.192-34.266l-70.086-11.682v-64l70.086-11.682c3.418-12.060 8.198-23.544 14.192-34.266l-41.298-57.816 45.254-45.256 57.818 41.296c10.722-5.994 22.204-10.774 34.266-14.192l11.682-70.084h64l11.68 70.086c12.062 3.418 23.544 8.198 34.266 14.192l57.818-41.296 45.254 45.256-41.298 57.816c5.994 10.72 10.774 22.206 14.192 34.266l70.088 11.68v64l-70.086 11.682c-3.418 12.060-8.198 23.544-14.192 34.266zM224 96c-35.348 0-64 28.654-64 64s28.652 64 64 64 64-28.654 64-64-28.652-64-64-64zM1024 576v64l-67.382 12.25c-1.242 8.046-2.832 15.978-4.724 23.79l57.558 37.1-24.492 59.128-66.944-14.468c-4.214 6.91-8.726 13.62-13.492 20.13l39.006 56.342-45.256 45.254-56.342-39.006c-6.512 4.766-13.22 9.276-20.13 13.494l14.468 66.944-59.128 24.494-37.1-57.558c-7.812 1.892-15.744 3.482-23.79 4.724l-12.252 67.382h-64l-12.252-67.382c-8.046-1.242-15.976-2.832-23.79-4.724l-37.098 57.558-59.128-24.492 14.468-66.944c-6.91-4.216-13.62-8.728-20.13-13.494l-56.342 39.006-45.254-45.254 39.006-56.342c-4.766-6.51-9.278-13.22-13.494-20.13l-66.944 14.468-24.492-59.128 57.558-37.1c-1.892-7.812-3.482-15.742-4.724-23.79l-67.384-12.252v-64l67.382-12.25c1.242-8.046 2.832-15.978 4.724-23.79l-57.558-37.1 24.492-59.128 66.944 14.468c4.216-6.91 8.728-13.618 13.494-20.13l-39.006-56.342 45.254-45.256 56.342 39.006c6.51-4.766 13.22-9.276 20.13-13.492l-14.468-66.944 59.128-24.492 37.102 57.558c7.81-1.892 15.742-3.482 23.788-4.724l12.252-67.384h64l12.252 67.382c8.044 1.242 15.976 2.832 23.79 4.724l37.1-57.558 59.128 24.492-14.468 66.944c6.91 4.216 13.62 8.726 20.13 13.492l56.342-39.006 45.256 45.256-39.006 56.342c4.766 6.512 9.276 13.22 13.492 20.13l66.944-14.468 24.492 59.13-57.558 37.1c1.892 7.812 3.482 15.742 4.724 23.79l67.382 12.25zM672 468.8c-76.878 0-139.2 62.322-139.2 139.2s62.32 139.2 139.2 139.2 139.2-62.322 139.2-139.2c0-76.878-62.32-139.2-139.2-139.2z" />
+<glyph unicode="code2" d="M832 224l96-96 320 320-320 320-96-96 224-224zM448 672l-96 96-320-320 320-320 96 96-224 224zM701.298 809.481l69.468-18.944-191.987-704.026-69.468 18.944 191.987 704.026z" horiz-adv-x="1280" />
+<glyph unicode="code" d="M576 224l96-96 320 320-320 320-96-96 224-224zM448 672l-96 96-320-320 320-320 96 96-224 224z" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/static/assets/fonts/icomoon.ttf b/static/assets/fonts/icomoon.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..1ec19a67b504ced5f69612758a74e50a4c05c273
Binary files /dev/null and b/static/assets/fonts/icomoon.ttf differ
diff --git a/static/assets/fonts/icomoon.woff b/static/assets/fonts/icomoon.woff
new file mode 100755
index 0000000000000000000000000000000000000000..00502744d96cb63f94cc32870a910bf8bd4a4e3c
Binary files /dev/null and b/static/assets/fonts/icomoon.woff differ
diff --git a/static/assets/fonts/selection.json b/static/assets/fonts/selection.json
new file mode 100755
index 0000000000000000000000000000000000000000..ba589e4f8fa9508cbedd741b73f68524f159aa7a
--- /dev/null
+++ b/static/assets/fonts/selection.json
@@ -0,0 +1,173 @@
+{
+	"IcoMoonType": "selection",
+	"icons": [
+		{
+			"icon": {
+				"paths": [
+					"M363.722 722.052l41.298-57.816-45.254-45.256-57.818 41.296c-10.722-5.994-22.204-10.774-34.266-14.192l-11.682-70.084h-64l-11.68 70.086c-12.062 3.418-23.544 8.198-34.266 14.192l-57.818-41.298-45.256 45.256 41.298 57.816c-5.994 10.72-10.774 22.206-14.192 34.266l-70.086 11.682v64l70.086 11.682c3.418 12.060 8.198 23.544 14.192 34.266l-41.298 57.816 45.254 45.256 57.818-41.296c10.722 5.994 22.204 10.774 34.266 14.192l11.682 70.084h64l11.68-70.086c12.062-3.418 23.544-8.198 34.266-14.192l57.818 41.296 45.254-45.256-41.298-57.816c5.994-10.72 10.774-22.206 14.192-34.266l70.088-11.68v-64l-70.086-11.682c-3.418-12.060-8.198-23.544-14.192-34.266zM224 864c-35.348 0-64-28.654-64-64s28.652-64 64-64 64 28.654 64 64-28.652 64-64 64zM1024 384v-64l-67.382-12.25c-1.242-8.046-2.832-15.978-4.724-23.79l57.558-37.1-24.492-59.128-66.944 14.468c-4.214-6.91-8.726-13.62-13.492-20.13l39.006-56.342-45.256-45.254-56.342 39.006c-6.512-4.766-13.22-9.276-20.13-13.494l14.468-66.944-59.128-24.494-37.1 57.558c-7.812-1.892-15.744-3.482-23.79-4.724l-12.252-67.382h-64l-12.252 67.382c-8.046 1.242-15.976 2.832-23.79 4.724l-37.098-57.558-59.128 24.492 14.468 66.944c-6.91 4.216-13.62 8.728-20.13 13.494l-56.342-39.006-45.254 45.254 39.006 56.342c-4.766 6.51-9.278 13.22-13.494 20.13l-66.944-14.468-24.492 59.128 57.558 37.1c-1.892 7.812-3.482 15.742-4.724 23.79l-67.384 12.252v64l67.382 12.25c1.242 8.046 2.832 15.978 4.724 23.79l-57.558 37.1 24.492 59.128 66.944-14.468c4.216 6.91 8.728 13.618 13.494 20.13l-39.006 56.342 45.254 45.256 56.342-39.006c6.51 4.766 13.22 9.276 20.13 13.492l-14.468 66.944 59.128 24.492 37.102-57.558c7.81 1.892 15.742 3.482 23.788 4.724l12.252 67.384h64l12.252-67.382c8.044-1.242 15.976-2.832 23.79-4.724l37.1 57.558 59.128-24.492-14.468-66.944c6.91-4.216 13.62-8.726 20.13-13.492l56.342 39.006 45.256-45.256-39.006-56.342c4.766-6.512 9.276-13.22 13.492-20.13l66.944 14.468 24.492-59.13-57.558-37.1c1.892-7.812 3.482-15.742 4.724-23.79l67.382-12.25zM672 491.2c-76.878 0-139.2-62.322-139.2-139.2s62.32-139.2 139.2-139.2 139.2 62.322 139.2 139.2c0 76.878-62.32 139.2-139.2 139.2z"
+				],
+				"attrs": [],
+				"tags": [
+					"cogs",
+					"gears",
+					"preferences",
+					"settings",
+					"generate",
+					"control",
+					"options"
+				],
+				"defaultCode": 57824,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 570,
+				"order": 4,
+				"prevSize": 32,
+				"code": 59797,
+				"ligatures": "cogs, gears",
+				"name": "cogs"
+			},
+			"setIdx": 0,
+			"iconIdx": 149
+		},
+		{
+			"icon": {
+				"paths": [
+					"M640 146.588v135.958c36.206 15.804 69.5 38.408 98.274 67.18 60.442 60.44 93.726 140.8 93.726 226.274s-33.286 165.834-93.726 226.274c-60.44 60.44-140.798 93.726-226.274 93.726s-165.834-33.286-226.274-93.726c-60.44-60.44-93.726-140.8-93.726-226.274s33.286-165.834 93.726-226.274c28.774-28.774 62.068-51.378 98.274-67.182v-135.956c-185.048 55.080-320 226.472-320 429.412 0 247.424 200.578 448 448 448 247.424 0 448-200.576 448-448 0-202.94-134.95-374.332-320-429.412zM448 0h128v512h-128z"
+				],
+				"attrs": [],
+				"tags": [
+					"switch"
+				],
+				"defaultCode": 58000,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 746,
+				"order": 3,
+				"prevSize": 32,
+				"code": 59830,
+				"ligatures": "switch",
+				"name": "switch"
+			},
+			"setIdx": 0,
+			"iconIdx": 182
+		},
+		{
+			"icon": {
+				"paths": [
+					"M576 736l96 96 320-320-320-320-96 96 224 224z",
+					"M448 288l-96-96-320 320 320 320 96-96-224-224z"
+				],
+				"attrs": [],
+				"tags": [
+					"embed",
+					"code",
+					"html",
+					"xml"
+				],
+				"defaultCode": 58495,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 1271,
+				"order": 5,
+				"prevSize": 32,
+				"code": 60031,
+				"ligatures": "embed, code",
+				"name": "embed"
+			},
+			"setIdx": 0,
+			"iconIdx": 383
+		},
+		{
+			"icon": {
+				"paths": [
+					"M832 736l96 96 320-320-320-320-96 96 224 224z",
+					"M448 288l-96-96-320 320 320 320 96-96-224-224z",
+					"M701.298 150.519l69.468 18.944-191.987 704.026-69.468-18.944 191.987-704.026z"
+				],
+				"width": 1280,
+				"attrs": [],
+				"tags": [
+					"embed",
+					"code",
+					"html",
+					"xml"
+				],
+				"defaultCode": 58496,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 1272,
+				"order": 1,
+				"prevSize": 32,
+				"code": 60032,
+				"ligatures": "embed2, code2",
+				"name": "embed2"
+			},
+			"setIdx": 0,
+			"iconIdx": 384
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 0c-194.432 0-352 157.568-352 352 0 128.992 118.016 265.696 160.992 385.76 64.096 179.040 56.992 286.24 191.008 286.24 136 0 126.88-106.688 191.008-285.504 43.104-120.32 160.992-258.496 160.992-386.496 0-194.432-157.632-352-352-352zM594.944 869.632l-158.656 19.808c-5.664-16.384-11.744-35.552-19.136-60.576-0.096-0.32-0.224-0.672-0.288-0.992l198.016-24.736c-2.816 9.44-5.824 19.36-8.448 28.256-4.192 14.368-7.936 26.848-11.488 38.24zM407.552 797.056c-5.824-19.264-12.384-39.552-19.68-61.056h248.512c-3.936 11.488-7.872 23.008-11.264 33.888l-217.568 27.168zM512 960c-32.416 0-47.328-3.744-63.904-40l135.616-16.992c-19.648 52.928-33.952 56.992-71.712 56.992zM661.504 672h-298.656c-15.936-34.56-35.072-69.12-53.952-102.944-41.76-74.72-84.896-152-84.896-217.056 0-158.816 129.184-288 288-288 158.816 0 288 129.184 288 288 0 64.576-43.2 142.272-84.992 217.44-18.688 33.696-37.696 68.192-53.504 102.56zM512 160c8.8 0 16 7.168 16 16s-7.168 16-16 16c-88.224 0-160 71.776-160 160 0 8.832-7.168 16-16 16-8.832 0-16-7.168-16-16 0-105.888 86.112-192 192-192z"
+				],
+				"attrs": [],
+				"tags": [
+					"bulb",
+					"lamp",
+					"idea"
+				],
+				"grid": 32
+			},
+			"attrs": [],
+			"properties": {
+				"id": 14,
+				"order": 2,
+				"prevSize": 32,
+				"code": 58880,
+				"name": "bulb"
+			},
+			"setIdx": 1,
+			"iconIdx": 14
+		}
+	],
+	"height": 1024,
+	"metadata": {
+		"name": "icomoon"
+	},
+	"preferences": {
+		"showGlyphs": true,
+		"showQuickUse": true,
+		"showQuickUse2": true,
+		"showSVGs": true,
+		"fontPref": {
+			"prefix": "icon-",
+			"metadata": {
+				"fontFamily": "icomoon"
+			},
+			"metrics": {
+				"emSize": 1024,
+				"baseline": 6.25,
+				"whitespace": 50
+			},
+			"resetPoint": 58880
+		},
+		"imagePref": {
+			"prefix": "icon-",
+			"png": true,
+			"useClassSelector": true,
+			"color": 4473924,
+			"bgColor": 16777215
+		},
+		"historySize": 100,
+		"showCodes": true,
+		"showLiga": true
+	}
+}
\ No newline at end of file
diff --git a/static/assets/images/.keep b/static/assets/images/.keep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/static/assets/images/footer-bg.jpg b/static/assets/images/footer-bg.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ac4a2825ed233d69078565cffa619dd7ede6270c
Binary files /dev/null and b/static/assets/images/footer-bg.jpg differ
diff --git a/static/assets/images/header-bg.jpg b/static/assets/images/header-bg.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..819d1b66c32b9d0d4b098a1c83c5eb72be232d8b
Binary files /dev/null and b/static/assets/images/header-bg.jpg differ
diff --git a/static/assets/images/header-divider.png b/static/assets/images/header-divider.png
new file mode 100644
index 0000000000000000000000000000000000000000..ec93141fd7cf8af8d62aeab86463bf6ef4ff78eb
Binary files /dev/null and b/static/assets/images/header-divider.png differ
diff --git a/static/assets/images/heading-community.jpg b/static/assets/images/heading-community.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7ee98e27bde3dfb5ffffafb5438aa05c5dae24f6
Binary files /dev/null and b/static/assets/images/heading-community.jpg differ
diff --git a/static/assets/images/heading-community.png b/static/assets/images/heading-community.png
new file mode 100644
index 0000000000000000000000000000000000000000..f235436afce4572308134ff7a831436d730e9c1f
Binary files /dev/null and b/static/assets/images/heading-community.png differ
diff --git a/static/assets/images/heading-featured.jpg b/static/assets/images/heading-featured.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ccb7e77faa29975ce77a0811eb86275d3c15f518
Binary files /dev/null and b/static/assets/images/heading-featured.jpg differ
diff --git a/static/assets/images/heading-featured.png b/static/assets/images/heading-featured.png
new file mode 100644
index 0000000000000000000000000000000000000000..10e64c132fb129fa95667228f943b6a53e58e742
Binary files /dev/null and b/static/assets/images/heading-featured.png differ
diff --git a/static/assets/images/heading-latest_news.jpg b/static/assets/images/heading-latest_news.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6e7f741395d859b8fcdef486fc930ea230e1332a
Binary files /dev/null and b/static/assets/images/heading-latest_news.jpg differ
diff --git a/static/assets/images/heading-latest_news.png b/static/assets/images/heading-latest_news.png
new file mode 100644
index 0000000000000000000000000000000000000000..1839a48bfe190a90b4be1cfa85fbaf7f1e51c550
Binary files /dev/null and b/static/assets/images/heading-latest_news.png differ
diff --git a/static/assets/images/heading-upcoming_events.jpg b/static/assets/images/heading-upcoming_events.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8e40aad88d131e3d6b6afee7fd58cee2a9596022
Binary files /dev/null and b/static/assets/images/heading-upcoming_events.jpg differ
diff --git a/static/assets/images/heading-upcoming_events.png b/static/assets/images/heading-upcoming_events.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe8062d36897d152e31709680e1faecc72b000fa
Binary files /dev/null and b/static/assets/images/heading-upcoming_events.png differ
diff --git a/static/assets/images/icon-all_projects.png b/static/assets/images/icon-all_projects.png
new file mode 100644
index 0000000000000000000000000000000000000000..c12587a8b7e71d5b2af635df30900ff9e65655f3
Binary files /dev/null and b/static/assets/images/icon-all_projects.png differ
diff --git a/static/assets/images/icon-facebook.png b/static/assets/images/icon-facebook.png
new file mode 100644
index 0000000000000000000000000000000000000000..0123c5969d102da1e01fa3885a075dccc41089e2
Binary files /dev/null and b/static/assets/images/icon-facebook.png differ
diff --git a/static/assets/images/icon-getting_started.png b/static/assets/images/icon-getting_started.png
new file mode 100644
index 0000000000000000000000000000000000000000..9077fd21d14a006c67609b5b581e2f60aa781329
Binary files /dev/null and b/static/assets/images/icon-getting_started.png differ
diff --git a/static/assets/images/icon-services.png b/static/assets/images/icon-services.png
new file mode 100644
index 0000000000000000000000000000000000000000..b050ce0bbaf22d890e0cc814db4e8a6fc06bcbbe
Binary files /dev/null and b/static/assets/images/icon-services.png differ
diff --git a/static/assets/images/icon-share.png b/static/assets/images/icon-share.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a5dca01282a4f47798c711b2d84b5c1bef585f0
Binary files /dev/null and b/static/assets/images/icon-share.png differ
diff --git a/static/assets/images/icon-standards.png b/static/assets/images/icon-standards.png
new file mode 100644
index 0000000000000000000000000000000000000000..028f4888008dcca8568ea13012bec2cd2ff9f8fe
Binary files /dev/null and b/static/assets/images/icon-standards.png differ
diff --git a/static/assets/images/icon-twitter.png b/static/assets/images/icon-twitter.png
new file mode 100644
index 0000000000000000000000000000000000000000..2190f5e8229042f85ad8b613fa1b11e330c4de64
Binary files /dev/null and b/static/assets/images/icon-twitter.png differ
diff --git a/static/assets/images/icon-youtube.png b/static/assets/images/icon-youtube.png
new file mode 100644
index 0000000000000000000000000000000000000000..87cbc3516d95b8382235a5fcc7f32f0e71a0d115
Binary files /dev/null and b/static/assets/images/icon-youtube.png differ
diff --git a/static/assets/images/iot-icon-alt.png b/static/assets/images/iot-icon-alt.png
new file mode 100644
index 0000000000000000000000000000000000000000..35426db7d40d88d55ed412e851fe01ce813ba034
Binary files /dev/null and b/static/assets/images/iot-icon-alt.png differ
diff --git a/static/assets/images/iot-icon.png b/static/assets/images/iot-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e00170fe90fb4ab020a9b26a6e521f027a8815f
Binary files /dev/null and b/static/assets/images/iot-icon.png differ
diff --git a/static/assets/images/iot-logo.png b/static/assets/images/iot-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..653a6f80101c02ecf4a3be93552536e62f1dc960
Binary files /dev/null and b/static/assets/images/iot-logo.png differ
diff --git a/static/assets/images/open-iot-bg.jpg b/static/assets/images/open-iot-bg.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..adf359df6cded332e9d60867c6f3501c25cb9134
Binary files /dev/null and b/static/assets/images/open-iot-bg.jpg differ
diff --git a/static/assets/images/section-first-divider.jpg b/static/assets/images/section-first-divider.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..780374e525c4236b345763cd883092004f134b26
Binary files /dev/null and b/static/assets/images/section-first-divider.jpg differ
diff --git a/static/assets/images/section-first-divider.png b/static/assets/images/section-first-divider.png
new file mode 100644
index 0000000000000000000000000000000000000000..6bec97797bb213e17b6e9adfa49e747b158b0241
Binary files /dev/null and b/static/assets/images/section-first-divider.png differ
diff --git a/static/assets/images/section-second-divider.jpg b/static/assets/images/section-second-divider.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3cdafc6cf1187f29f4eb2df0d12233ca89a4d69a
Binary files /dev/null and b/static/assets/images/section-second-divider.jpg differ
diff --git a/static/assets/images/section-second-divider.png b/static/assets/images/section-second-divider.png
new file mode 100644
index 0000000000000000000000000000000000000000..d148a049d651890f0c5c5c4ccfa46b08bc9311be
Binary files /dev/null and b/static/assets/images/section-second-divider.png differ
diff --git a/static/assets/images/upcoming-events-bg.png b/static/assets/images/upcoming-events-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8f6430df714a456138e717106667960bf7b2a31
Binary files /dev/null and b/static/assets/images/upcoming-events-bg.png differ
diff --git a/static/assets/images/upcoming-events-bg_hover.png b/static/assets/images/upcoming-events-bg_hover.png
new file mode 100644
index 0000000000000000000000000000000000000000..53e6bb98b0ba103a2337a3129d7b22404ffaa8b6
Binary files /dev/null and b/static/assets/images/upcoming-events-bg_hover.png differ
diff --git a/static/assets/images/well-bg-br.png b/static/assets/images/well-bg-br.png
new file mode 100644
index 0000000000000000000000000000000000000000..44e9f26ec74405a0fec53e41b06a383aae08e8cd
Binary files /dev/null and b/static/assets/images/well-bg-br.png differ
diff --git a/static/assets/images/well-bg-tl.png b/static/assets/images/well-bg-tl.png
new file mode 100644
index 0000000000000000000000000000000000000000..28aef91ce500c08cb64c4704e01c53f8ea13524d
Binary files /dev/null and b/static/assets/images/well-bg-tl.png differ
diff --git a/static/assets/images/wg-2lemetry.jpg b/static/assets/images/wg-2lemetry.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..628cf6ebe5daa5ee8271c6de79974dbaf3b061e7
Binary files /dev/null and b/static/assets/images/wg-2lemetry.jpg differ
diff --git a/static/assets/images/wg-bitreactive.jpg b/static/assets/images/wg-bitreactive.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ce7b1c7c4366c8427ed97d2f3d61008c0b4e8cb2
Binary files /dev/null and b/static/assets/images/wg-bitreactive.jpg differ
diff --git a/static/assets/images/wg-bosch.jpg b/static/assets/images/wg-bosch.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..27976aa3dc6d7b7b6f0e77fb21c838fbb7b5014c
Binary files /dev/null and b/static/assets/images/wg-bosch.jpg differ
diff --git a/static/assets/images/wg-cisco.jpg b/static/assets/images/wg-cisco.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a738c49b66b2b39a0b56f68faa26c86127c61da6
Binary files /dev/null and b/static/assets/images/wg-cisco.jpg differ
diff --git a/static/assets/images/wg-dcsquare.jpg b/static/assets/images/wg-dcsquare.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..63ee64cb600460e9aebde3790eb10416d5a41bdf
Binary files /dev/null and b/static/assets/images/wg-dcsquare.jpg differ
diff --git a/static/assets/images/wg-eurotech.jpg b/static/assets/images/wg-eurotech.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..2efc414b23c1a96216e0d407c41aca9f9d0901c1
Binary files /dev/null and b/static/assets/images/wg-eurotech.jpg differ
diff --git a/static/assets/images/wg-gadgetkeeper.jpg b/static/assets/images/wg-gadgetkeeper.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..c934f1e8bf60530764e9783355e5b492552b425a
Binary files /dev/null and b/static/assets/images/wg-gadgetkeeper.jpg differ
diff --git a/static/assets/images/wg-ibm.jpg b/static/assets/images/wg-ibm.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8a1cc6c60185f757f98c12bce5a14482899e596c
Binary files /dev/null and b/static/assets/images/wg-ibm.jpg differ
diff --git a/static/assets/images/wg-sierra.jpg b/static/assets/images/wg-sierra.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..093ff05a783dc91f47c5b0f82530876c1a7074e1
Binary files /dev/null and b/static/assets/images/wg-sierra.jpg differ
diff --git a/static/assets/js/bootstrap-sprockets.js b/static/assets/js/bootstrap-sprockets.js
new file mode 100644
index 0000000000000000000000000000000000000000..1abde496ee7fc07c6f979f5e8fbfcf1c24a09bc5
--- /dev/null
+++ b/static/assets/js/bootstrap-sprockets.js
@@ -0,0 +1,12 @@
+//= require ./bootstrap/affix
+//= require ./bootstrap/alert
+//= require ./bootstrap/button
+//= require ./bootstrap/carousel
+//= require ./bootstrap/collapse
+//= require ./bootstrap/dropdown
+//= require ./bootstrap/tab
+//= require ./bootstrap/transition
+//= require ./bootstrap/scrollspy
+//= require ./bootstrap/modal
+//= require ./bootstrap/tooltip
+//= require ./bootstrap/popover
diff --git a/static/assets/js/bootstrap.js b/static/assets/js/bootstrap.js
new file mode 100644
index 0000000000000000000000000000000000000000..4139b6fc3bb3c3243abcb8c1b72d4db424e86512
--- /dev/null
+++ b/static/assets/js/bootstrap.js
@@ -0,0 +1,2306 @@
+/*!
+ * Bootstrap v3.3.2 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+if (typeof jQuery === 'undefined') {
+  throw new Error('Bootstrap\'s JavaScript requires jQuery')
+}
+
++function ($) {
+  'use strict';
+  var version = $.fn.jquery.split(' ')[0].split('.')
+  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {
+    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher')
+  }
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.3.2
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+  // ============================================================
+
+  function transitionEnd() {
+    var el = document.createElement('bootstrap')
+
+    var transEndEventNames = {
+      WebkitTransition : 'webkitTransitionEnd',
+      MozTransition    : 'transitionend',
+      OTransition      : 'oTransitionEnd otransitionend',
+      transition       : 'transitionend'
+    }
+
+    for (var name in transEndEventNames) {
+      if (el.style[name] !== undefined) {
+        return { end: transEndEventNames[name] }
+      }
+    }
+
+    return false // explicit for ie8 (  ._.)
+  }
+
+  // http://blog.alexmaccaw.com/css-transitions
+  $.fn.emulateTransitionEnd = function (duration) {
+    var called = false
+    var $el = this
+    $(this).one('bsTransitionEnd', function () { called = true })
+    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+    setTimeout(callback, duration)
+    return this
+  }
+
+  $(function () {
+    $.support.transition = transitionEnd()
+
+    if (!$.support.transition) return
+
+    $.event.special.bsTransitionEnd = {
+      bindType: $.support.transition.end,
+      delegateType: $.support.transition.end,
+      handle: function (e) {
+        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+      }
+    }
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.3.2
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // ALERT CLASS DEFINITION
+  // ======================
+
+  var dismiss = '[data-dismiss="alert"]'
+  var Alert   = function (el) {
+    $(el).on('click', dismiss, this.close)
+  }
+
+  Alert.VERSION = '3.3.2'
+
+  Alert.TRANSITION_DURATION = 150
+
+  Alert.prototype.close = function (e) {
+    var $this    = $(this)
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = $(selector)
+
+    if (e) e.preventDefault()
+
+    if (!$parent.length) {
+      $parent = $this.closest('.alert')
+    }
+
+    $parent.trigger(e = $.Event('close.bs.alert'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      // detach from parent, fire event then clean up data
+      $parent.detach().trigger('closed.bs.alert').remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent
+        .one('bsTransitionEnd', removeElement)
+        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+      removeElement()
+  }
+
+
+  // ALERT PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.alert')
+
+      if (!data) $this.data('bs.alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.alert
+
+  $.fn.alert             = Plugin
+  $.fn.alert.Constructor = Alert
+
+
+  // ALERT NO CONFLICT
+  // =================
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+  // ALERT DATA-API
+  // ==============
+
+  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.3.2
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // BUTTON PUBLIC CLASS DEFINITION
+  // ==============================
+
+  var Button = function (element, options) {
+    this.$element  = $(element)
+    this.options   = $.extend({}, Button.DEFAULTS, options)
+    this.isLoading = false
+  }
+
+  Button.VERSION  = '3.3.2'
+
+  Button.DEFAULTS = {
+    loadingText: 'loading...'
+  }
+
+  Button.prototype.setState = function (state) {
+    var d    = 'disabled'
+    var $el  = this.$element
+    var val  = $el.is('input') ? 'val' : 'html'
+    var data = $el.data()
+
+    state = state + 'Text'
+
+    if (data.resetText == null) $el.data('resetText', $el[val]())
+
+    // push to event loop to allow forms to submit
+    setTimeout($.proxy(function () {
+      $el[val](data[state] == null ? this.options[state] : data[state])
+
+      if (state == 'loadingText') {
+        this.isLoading = true
+        $el.addClass(d).attr(d, d)
+      } else if (this.isLoading) {
+        this.isLoading = false
+        $el.removeClass(d).removeAttr(d)
+      }
+    }, this), 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var changed = true
+    var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+    if ($parent.length) {
+      var $input = this.$element.find('input')
+      if ($input.prop('type') == 'radio') {
+        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
+        else $parent.find('.active').removeClass('active')
+      }
+      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
+    } else {
+      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
+    }
+
+    if (changed) this.$element.toggleClass('active')
+  }
+
+
+  // BUTTON PLUGIN DEFINITION
+  // ========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.button')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  var old = $.fn.button
+
+  $.fn.button             = Plugin
+  $.fn.button.Constructor = Button
+
+
+  // BUTTON NO CONFLICT
+  // ==================
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+  // BUTTON DATA-API
+  // ===============
+
+  $(document)
+    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      var $btn = $(e.target)
+      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+      Plugin.call($btn, 'toggle')
+      e.preventDefault()
+    })
+    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
+    })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.3.2
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CAROUSEL CLASS DEFINITION
+  // =========================
+
+  var Carousel = function (element, options) {
+    this.$element    = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options     = options
+    this.paused      =
+    this.sliding     =
+    this.interval    =
+    this.$active     =
+    this.$items      = null
+
+    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+
+    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
+      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+  }
+
+  Carousel.VERSION  = '3.3.2'
+
+  Carousel.TRANSITION_DURATION = 600
+
+  Carousel.DEFAULTS = {
+    interval: 5000,
+    pause: 'hover',
+    wrap: true,
+    keyboard: true
+  }
+
+  Carousel.prototype.keydown = function (e) {
+    if (/input|textarea/i.test(e.target.tagName)) return
+    switch (e.which) {
+      case 37: this.prev(); break
+      case 39: this.next(); break
+      default: return
+    }
+
+    e.preventDefault()
+  }
+
+  Carousel.prototype.cycle = function (e) {
+    e || (this.paused = false)
+
+    this.interval && clearInterval(this.interval)
+
+    this.options.interval
+      && !this.paused
+      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+    return this
+  }
+
+  Carousel.prototype.getItemIndex = function (item) {
+    this.$items = item.parent().children('.item')
+    return this.$items.index(item || this.$active)
+  }
+
+  Carousel.prototype.getItemForDirection = function (direction, active) {
+    var activeIndex = this.getItemIndex(active)
+    var willWrap = (direction == 'prev' && activeIndex === 0)
+                || (direction == 'next' && activeIndex == (this.$items.length - 1))
+    if (willWrap && !this.options.wrap) return active
+    var delta = direction == 'prev' ? -1 : 1
+    var itemIndex = (activeIndex + delta) % this.$items.length
+    return this.$items.eq(itemIndex)
+  }
+
+  Carousel.prototype.to = function (pos) {
+    var that        = this
+    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+    if (pos > (this.$items.length - 1) || pos < 0) return
+
+    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+    if (activeIndex == pos) return this.pause().cycle()
+
+    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
+  }
+
+  Carousel.prototype.pause = function (e) {
+    e || (this.paused = true)
+
+    if (this.$element.find('.next, .prev').length && $.support.transition) {
+      this.$element.trigger($.support.transition.end)
+      this.cycle(true)
+    }
+
+    this.interval = clearInterval(this.interval)
+
+    return this
+  }
+
+  Carousel.prototype.next = function () {
+    if (this.sliding) return
+    return this.slide('next')
+  }
+
+  Carousel.prototype.prev = function () {
+    if (this.sliding) return
+    return this.slide('prev')
+  }
+
+  Carousel.prototype.slide = function (type, next) {
+    var $active   = this.$element.find('.item.active')
+    var $next     = next || this.getItemForDirection(type, $active)
+    var isCycling = this.interval
+    var direction = type == 'next' ? 'left' : 'right'
+    var that      = this
+
+    if ($next.hasClass('active')) return (this.sliding = false)
+
+    var relatedTarget = $next[0]
+    var slideEvent = $.Event('slide.bs.carousel', {
+      relatedTarget: relatedTarget,
+      direction: direction
+    })
+    this.$element.trigger(slideEvent)
+    if (slideEvent.isDefaultPrevented()) return
+
+    this.sliding = true
+
+    isCycling && this.pause()
+
+    if (this.$indicators.length) {
+      this.$indicators.find('.active').removeClass('active')
+      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+      $nextIndicator && $nextIndicator.addClass('active')
+    }
+
+    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+    if ($.support.transition && this.$element.hasClass('slide')) {
+      $next.addClass(type)
+      $next[0].offsetWidth // force reflow
+      $active.addClass(direction)
+      $next.addClass(direction)
+      $active
+        .one('bsTransitionEnd', function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () {
+            that.$element.trigger(slidEvent)
+          }, 0)
+        })
+        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+    } else {
+      $active.removeClass('active')
+      $next.addClass('active')
+      this.sliding = false
+      this.$element.trigger(slidEvent)
+    }
+
+    isCycling && this.cycle()
+
+    return this
+  }
+
+
+  // CAROUSEL PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.carousel')
+      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+      var action  = typeof option == 'string' ? option : options.slide
+
+      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  var old = $.fn.carousel
+
+  $.fn.carousel             = Plugin
+  $.fn.carousel.Constructor = Carousel
+
+
+  // CAROUSEL NO CONFLICT
+  // ====================
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+
+  // CAROUSEL DATA-API
+  // =================
+
+  var clickHandler = function (e) {
+    var href
+    var $this   = $(this)
+    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+    if (!$target.hasClass('carousel')) return
+    var options = $.extend({}, $target.data(), $this.data())
+    var slideIndex = $this.attr('data-slide-to')
+    if (slideIndex) options.interval = false
+
+    Plugin.call($target, options)
+
+    if (slideIndex) {
+      $target.data('bs.carousel').to(slideIndex)
+    }
+
+    e.preventDefault()
+  }
+
+  $(document)
+    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+  $(window).on('load', function () {
+    $('[data-ride="carousel"]').each(function () {
+      var $carousel = $(this)
+      Plugin.call($carousel, $carousel.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.3.2
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // COLLAPSE PUBLIC CLASS DEFINITION
+  // ================================
+
+  var Collapse = function (element, options) {
+    this.$element      = $(element)
+    this.options       = $.extend({}, Collapse.DEFAULTS, options)
+    this.$trigger      = $(this.options.trigger).filter('[href="#' + element.id + '"], [data-target="#' + element.id + '"]')
+    this.transitioning = null
+
+    if (this.options.parent) {
+      this.$parent = this.getParent()
+    } else {
+      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+    }
+
+    if (this.options.toggle) this.toggle()
+  }
+
+  Collapse.VERSION  = '3.3.2'
+
+  Collapse.TRANSITION_DURATION = 350
+
+  Collapse.DEFAULTS = {
+    toggle: true,
+    trigger: '[data-toggle="collapse"]'
+  }
+
+  Collapse.prototype.dimension = function () {
+    var hasWidth = this.$element.hasClass('width')
+    return hasWidth ? 'width' : 'height'
+  }
+
+  Collapse.prototype.show = function () {
+    if (this.transitioning || this.$element.hasClass('in')) return
+
+    var activesData
+    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
+
+    if (actives && actives.length) {
+      activesData = actives.data('bs.collapse')
+      if (activesData && activesData.transitioning) return
+    }
+
+    var startEvent = $.Event('show.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    if (actives && actives.length) {
+      Plugin.call(actives, 'hide')
+      activesData || actives.data('bs.collapse', null)
+    }
+
+    var dimension = this.dimension()
+
+    this.$element
+      .removeClass('collapse')
+      .addClass('collapsing')[dimension](0)
+      .attr('aria-expanded', true)
+
+    this.$trigger
+      .removeClass('collapsed')
+      .attr('aria-expanded', true)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse in')[dimension]('')
+      this.transitioning = 0
+      this.$element
+        .trigger('shown.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+    this.$element
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+  }
+
+  Collapse.prototype.hide = function () {
+    if (this.transitioning || !this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('hide.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var dimension = this.dimension()
+
+    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+    this.$element
+      .addClass('collapsing')
+      .removeClass('collapse in')
+      .attr('aria-expanded', false)
+
+    this.$trigger
+      .addClass('collapsed')
+      .attr('aria-expanded', false)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.transitioning = 0
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse')
+        .trigger('hidden.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    this.$element
+      [dimension](0)
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+  }
+
+  Collapse.prototype.toggle = function () {
+    this[this.$element.hasClass('in') ? 'hide' : 'show']()
+  }
+
+  Collapse.prototype.getParent = function () {
+    return $(this.options.parent)
+      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
+      .each($.proxy(function (i, element) {
+        var $element = $(element)
+        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+      }, this))
+      .end()
+  }
+
+  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+    var isOpen = $element.hasClass('in')
+
+    $element.attr('aria-expanded', isOpen)
+    $trigger
+      .toggleClass('collapsed', !isOpen)
+      .attr('aria-expanded', isOpen)
+  }
+
+  function getTargetFromTrigger($trigger) {
+    var href
+    var target = $trigger.attr('data-target')
+      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+
+    return $(target)
+  }
+
+
+  // COLLAPSE PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.collapse')
+      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data && options.toggle && option == 'show') options.toggle = false
+      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.collapse
+
+  $.fn.collapse             = Plugin
+  $.fn.collapse.Constructor = Collapse
+
+
+  // COLLAPSE NO CONFLICT
+  // ====================
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+  // COLLAPSE DATA-API
+  // =================
+
+  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+    var $this   = $(this)
+
+    if (!$this.attr('data-target')) e.preventDefault()
+
+    var $target = getTargetFromTrigger($this)
+    var data    = $target.data('bs.collapse')
+    var option  = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })
+
+    Plugin.call($target, option)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.3.2
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // DROPDOWN CLASS DEFINITION
+  // =========================
+
+  var backdrop = '.dropdown-backdrop'
+  var toggle   = '[data-toggle="dropdown"]'
+  var Dropdown = function (element) {
+    $(element).on('click.bs.dropdown', this.toggle)
+  }
+
+  Dropdown.VERSION = '3.3.2'
+
+  Dropdown.prototype.toggle = function (e) {
+    var $this = $(this)
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    clearMenus()
+
+    if (!isActive) {
+      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+        // if mobile we use a backdrop because click events don't delegate
+        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
+      }
+
+      var relatedTarget = { relatedTarget: this }
+      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this
+        .trigger('focus')
+        .attr('aria-expanded', 'true')
+
+      $parent
+        .toggleClass('open')
+        .trigger('shown.bs.dropdown', relatedTarget)
+    }
+
+    return false
+  }
+
+  Dropdown.prototype.keydown = function (e) {
+    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+
+    var $this = $(this)
+
+    e.preventDefault()
+    e.stopPropagation()
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
+      if (e.which == 27) $parent.find(toggle).trigger('focus')
+      return $this.trigger('click')
+    }
+
+    var desc = ' li:not(.divider):visible a'
+    var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
+
+    if (!$items.length) return
+
+    var index = $items.index(e.target)
+
+    if (e.which == 38 && index > 0)                 index--                        // up
+    if (e.which == 40 && index < $items.length - 1) index++                        // down
+    if (!~index)                                      index = 0
+
+    $items.eq(index).trigger('focus')
+  }
+
+  function clearMenus(e) {
+    if (e && e.which === 3) return
+    $(backdrop).remove()
+    $(toggle).each(function () {
+      var $this         = $(this)
+      var $parent       = getParent($this)
+      var relatedTarget = { relatedTarget: this }
+
+      if (!$parent.hasClass('open')) return
+
+      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this.attr('aria-expanded', 'false')
+      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
+    })
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = selector && $(selector)
+
+    return $parent && $parent.length ? $parent : $this.parent()
+  }
+
+
+  // DROPDOWN PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.dropdown')
+
+      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown             = Plugin
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  // DROPDOWN NO CONFLICT
+  // ====================
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  // APPLY TO STANDARD DROPDOWN ELEMENTS
+  // ===================================
+
+  $(document)
+    .on('click.bs.dropdown.data-api', clearMenus)
+    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+    .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown)
+    .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.3.2
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // MODAL CLASS DEFINITION
+  // ======================
+
+  var Modal = function (element, options) {
+    this.options        = options
+    this.$body          = $(document.body)
+    this.$element       = $(element)
+    this.$backdrop      =
+    this.isShown        = null
+    this.scrollbarWidth = 0
+
+    if (this.options.remote) {
+      this.$element
+        .find('.modal-content')
+        .load(this.options.remote, $.proxy(function () {
+          this.$element.trigger('loaded.bs.modal')
+        }, this))
+    }
+  }
+
+  Modal.VERSION  = '3.3.2'
+
+  Modal.TRANSITION_DURATION = 300
+  Modal.BACKDROP_TRANSITION_DURATION = 150
+
+  Modal.DEFAULTS = {
+    backdrop: true,
+    keyboard: true,
+    show: true
+  }
+
+  Modal.prototype.toggle = function (_relatedTarget) {
+    return this.isShown ? this.hide() : this.show(_relatedTarget)
+  }
+
+  Modal.prototype.show = function (_relatedTarget) {
+    var that = this
+    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+    this.$element.trigger(e)
+
+    if (this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = true
+
+    this.checkScrollbar()
+    this.setScrollbar()
+    this.$body.addClass('modal-open')
+
+    this.escape()
+    this.resize()
+
+    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+    this.backdrop(function () {
+      var transition = $.support.transition && that.$element.hasClass('fade')
+
+      if (!that.$element.parent().length) {
+        that.$element.appendTo(that.$body) // don't move modals dom position
+      }
+
+      that.$element
+        .show()
+        .scrollTop(0)
+
+      if (that.options.backdrop) that.adjustBackdrop()
+      that.adjustDialog()
+
+      if (transition) {
+        that.$element[0].offsetWidth // force reflow
+      }
+
+      that.$element
+        .addClass('in')
+        .attr('aria-hidden', false)
+
+      that.enforceFocus()
+
+      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+      transition ?
+        that.$element.find('.modal-dialog') // wait for modal to slide in
+          .one('bsTransitionEnd', function () {
+            that.$element.trigger('focus').trigger(e)
+          })
+          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+        that.$element.trigger('focus').trigger(e)
+    })
+  }
+
+  Modal.prototype.hide = function (e) {
+    if (e) e.preventDefault()
+
+    e = $.Event('hide.bs.modal')
+
+    this.$element.trigger(e)
+
+    if (!this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = false
+
+    this.escape()
+    this.resize()
+
+    $(document).off('focusin.bs.modal')
+
+    this.$element
+      .removeClass('in')
+      .attr('aria-hidden', true)
+      .off('click.dismiss.bs.modal')
+
+    $.support.transition && this.$element.hasClass('fade') ?
+      this.$element
+        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+      this.hideModal()
+  }
+
+  Modal.prototype.enforceFocus = function () {
+    $(document)
+      .off('focusin.bs.modal') // guard against infinite focus loop
+      .on('focusin.bs.modal', $.proxy(function (e) {
+        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+          this.$element.trigger('focus')
+        }
+      }, this))
+  }
+
+  Modal.prototype.escape = function () {
+    if (this.isShown && this.options.keyboard) {
+      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+        e.which == 27 && this.hide()
+      }, this))
+    } else if (!this.isShown) {
+      this.$element.off('keydown.dismiss.bs.modal')
+    }
+  }
+
+  Modal.prototype.resize = function () {
+    if (this.isShown) {
+      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+    } else {
+      $(window).off('resize.bs.modal')
+    }
+  }
+
+  Modal.prototype.hideModal = function () {
+    var that = this
+    this.$element.hide()
+    this.backdrop(function () {
+      that.$body.removeClass('modal-open')
+      that.resetAdjustments()
+      that.resetScrollbar()
+      that.$element.trigger('hidden.bs.modal')
+    })
+  }
+
+  Modal.prototype.removeBackdrop = function () {
+    this.$backdrop && this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  Modal.prototype.backdrop = function (callback) {
+    var that = this
+    var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+        .prependTo(this.$element)
+        .on('click.dismiss.bs.modal', $.proxy(function (e) {
+          if (e.target !== e.currentTarget) return
+          this.options.backdrop == 'static'
+            ? this.$element[0].focus.call(this.$element[0])
+            : this.hide.call(this)
+        }, this))
+
+      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      if (!callback) return
+
+      doAnimate ?
+        this.$backdrop
+          .one('bsTransitionEnd', callback)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      var callbackRemove = function () {
+        that.removeBackdrop()
+        callback && callback()
+      }
+      $.support.transition && this.$element.hasClass('fade') ?
+        this.$backdrop
+          .one('bsTransitionEnd', callbackRemove)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callbackRemove()
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+  // these following methods are used to handle overflowing modals
+
+  Modal.prototype.handleUpdate = function () {
+    if (this.options.backdrop) this.adjustBackdrop()
+    this.adjustDialog()
+  }
+
+  Modal.prototype.adjustBackdrop = function () {
+    this.$backdrop
+      .css('height', 0)
+      .css('height', this.$element[0].scrollHeight)
+  }
+
+  Modal.prototype.adjustDialog = function () {
+    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+
+    this.$element.css({
+      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
+    })
+  }
+
+  Modal.prototype.resetAdjustments = function () {
+    this.$element.css({
+      paddingLeft: '',
+      paddingRight: ''
+    })
+  }
+
+  Modal.prototype.checkScrollbar = function () {
+    this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight
+    this.scrollbarWidth = this.measureScrollbar()
+  }
+
+  Modal.prototype.setScrollbar = function () {
+    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
+  }
+
+  Modal.prototype.resetScrollbar = function () {
+    this.$body.css('padding-right', '')
+  }
+
+  Modal.prototype.measureScrollbar = function () { // thx walsh
+    var scrollDiv = document.createElement('div')
+    scrollDiv.className = 'modal-scrollbar-measure'
+    this.$body.append(scrollDiv)
+    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+    this.$body[0].removeChild(scrollDiv)
+    return scrollbarWidth
+  }
+
+
+  // MODAL PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option, _relatedTarget) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.modal')
+      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option](_relatedTarget)
+      else if (options.show) data.show(_relatedTarget)
+    })
+  }
+
+  var old = $.fn.modal
+
+  $.fn.modal             = Plugin
+  $.fn.modal.Constructor = Modal
+
+
+  // MODAL NO CONFLICT
+  // =================
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+  // MODAL DATA-API
+  // ==============
+
+  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this   = $(this)
+    var href    = $this.attr('href')
+    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+    if ($this.is('a')) e.preventDefault()
+
+    $target.one('show.bs.modal', function (showEvent) {
+      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+      $target.one('hidden.bs.modal', function () {
+        $this.is(':visible') && $this.trigger('focus')
+      })
+    })
+    Plugin.call($target, option, this)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.3.2
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TOOLTIP PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Tooltip = function (element, options) {
+    this.type       =
+    this.options    =
+    this.enabled    =
+    this.timeout    =
+    this.hoverState =
+    this.$element   = null
+
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.VERSION  = '3.3.2'
+
+  Tooltip.TRANSITION_DURATION = 150
+
+  Tooltip.DEFAULTS = {
+    animation: true,
+    placement: 'top',
+    selector: false,
+    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
+    trigger: 'hover focus',
+    title: '',
+    delay: 0,
+    html: false,
+    container: false,
+    viewport: {
+      selector: 'body',
+      padding: 0
+    }
+  }
+
+  Tooltip.prototype.init = function (type, element, options) {
+    this.enabled   = true
+    this.type      = type
+    this.$element  = $(element)
+    this.options   = this.getOptions(options)
+    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
+
+    var triggers = this.options.trigger.split(' ')
+
+    for (var i = triggers.length; i--;) {
+      var trigger = triggers[i]
+
+      if (trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (trigger != 'manual') {
+        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
+        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+    }
+
+    this.options.selector ?
+      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+      this.fixTitle()
+  }
+
+  Tooltip.prototype.getDefaults = function () {
+    return Tooltip.DEFAULTS
+  }
+
+  Tooltip.prototype.getOptions = function (options) {
+    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+    if (options.delay && typeof options.delay == 'number') {
+      options.delay = {
+        show: options.delay,
+        hide: options.delay
+      }
+    }
+
+    return options
+  }
+
+  Tooltip.prototype.getDelegateOptions = function () {
+    var options  = {}
+    var defaults = this.getDefaults()
+
+    this._options && $.each(this._options, function (key, value) {
+      if (defaults[key] != value) options[key] = value
+    })
+
+    return options
+  }
+
+  Tooltip.prototype.enter = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (self && self.$tip && self.$tip.is(':visible')) {
+      self.hoverState = 'in'
+      return
+    }
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'in'
+
+    if (!self.options.delay || !self.options.delay.show) return self.show()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'in') self.show()
+    }, self.options.delay.show)
+  }
+
+  Tooltip.prototype.leave = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'out'
+
+    if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'out') self.hide()
+    }, self.options.delay.hide)
+  }
+
+  Tooltip.prototype.show = function () {
+    var e = $.Event('show.bs.' + this.type)
+
+    if (this.hasContent() && this.enabled) {
+      this.$element.trigger(e)
+
+      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
+      if (e.isDefaultPrevented() || !inDom) return
+      var that = this
+
+      var $tip = this.tip()
+
+      var tipId = this.getUID(this.type)
+
+      this.setContent()
+      $tip.attr('id', tipId)
+      this.$element.attr('aria-describedby', tipId)
+
+      if (this.options.animation) $tip.addClass('fade')
+
+      var placement = typeof this.options.placement == 'function' ?
+        this.options.placement.call(this, $tip[0], this.$element[0]) :
+        this.options.placement
+
+      var autoToken = /\s?auto?\s?/i
+      var autoPlace = autoToken.test(placement)
+      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+      $tip
+        .detach()
+        .css({ top: 0, left: 0, display: 'block' })
+        .addClass(placement)
+        .data('bs.' + this.type, this)
+
+      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+      var pos          = this.getPosition()
+      var actualWidth  = $tip[0].offsetWidth
+      var actualHeight = $tip[0].offsetHeight
+
+      if (autoPlace) {
+        var orgPlacement = placement
+        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()
+        var containerDim = this.getPosition($container)
+
+        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :
+                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :
+                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :
+                    placement == 'left'   && pos.left   - actualWidth  < containerDim.left   ? 'right'  :
+                    placement
+
+        $tip
+          .removeClass(orgPlacement)
+          .addClass(placement)
+      }
+
+      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+      this.applyPlacement(calculatedOffset, placement)
+
+      var complete = function () {
+        var prevHoverState = that.hoverState
+        that.$element.trigger('shown.bs.' + that.type)
+        that.hoverState = null
+
+        if (prevHoverState == 'out') that.leave(that)
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        $tip
+          .one('bsTransitionEnd', complete)
+          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+        complete()
+    }
+  }
+
+  Tooltip.prototype.applyPlacement = function (offset, placement) {
+    var $tip   = this.tip()
+    var width  = $tip[0].offsetWidth
+    var height = $tip[0].offsetHeight
+
+    // manually read margins because getBoundingClientRect includes difference
+    var marginTop = parseInt($tip.css('margin-top'), 10)
+    var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+    // we must check for NaN for ie 8/9
+    if (isNaN(marginTop))  marginTop  = 0
+    if (isNaN(marginLeft)) marginLeft = 0
+
+    offset.top  = offset.top  + marginTop
+    offset.left = offset.left + marginLeft
+
+    // $.fn.offset doesn't round pixel values
+    // so we use setOffset directly with our own function B-0
+    $.offset.setOffset($tip[0], $.extend({
+      using: function (props) {
+        $tip.css({
+          top: Math.round(props.top),
+          left: Math.round(props.left)
+        })
+      }
+    }, offset), 0)
+
+    $tip.addClass('in')
+
+    // check to see if placing tip in new offset caused the tip to resize itself
+    var actualWidth  = $tip[0].offsetWidth
+    var actualHeight = $tip[0].offsetHeight
+
+    if (placement == 'top' && actualHeight != height) {
+      offset.top = offset.top + height - actualHeight
+    }
+
+    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+    if (delta.left) offset.left += delta.left
+    else offset.top += delta.top
+
+    var isVertical          = /top|bottom/.test(placement)
+    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+
+    $tip.offset(offset)
+    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+  }
+
+  Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {
+    this.arrow()
+      .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
+      .css(isHorizontal ? 'top' : 'left', '')
+  }
+
+  Tooltip.prototype.setContent = function () {
+    var $tip  = this.tip()
+    var title = this.getTitle()
+
+    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+    $tip.removeClass('fade in top bottom left right')
+  }
+
+  Tooltip.prototype.hide = function (callback) {
+    var that = this
+    var $tip = this.tip()
+    var e    = $.Event('hide.bs.' + this.type)
+
+    function complete() {
+      if (that.hoverState != 'in') $tip.detach()
+      that.$element
+        .removeAttr('aria-describedby')
+        .trigger('hidden.bs.' + that.type)
+      callback && callback()
+    }
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    $tip.removeClass('in')
+
+    $.support.transition && this.$tip.hasClass('fade') ?
+      $tip
+        .one('bsTransitionEnd', complete)
+        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+      complete()
+
+    this.hoverState = null
+
+    return this
+  }
+
+  Tooltip.prototype.fixTitle = function () {
+    var $e = this.$element
+    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
+      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+    }
+  }
+
+  Tooltip.prototype.hasContent = function () {
+    return this.getTitle()
+  }
+
+  Tooltip.prototype.getPosition = function ($element) {
+    $element   = $element || this.$element
+
+    var el     = $element[0]
+    var isBody = el.tagName == 'BODY'
+
+    var elRect    = el.getBoundingClientRect()
+    if (elRect.width == null) {
+      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
+      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
+    }
+    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
+    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
+    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
+
+    return $.extend({}, elRect, scroll, outerDims, elOffset)
+  }
+
+  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+
+  }
+
+  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+    var delta = { top: 0, left: 0 }
+    if (!this.$viewport) return delta
+
+    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+    var viewportDimensions = this.getPosition(this.$viewport)
+
+    if (/right|left/.test(placement)) {
+      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
+      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+      if (topEdgeOffset < viewportDimensions.top) { // top overflow
+        delta.top = viewportDimensions.top - topEdgeOffset
+      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+      }
+    } else {
+      var leftEdgeOffset  = pos.left - viewportPadding
+      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+        delta.left = viewportDimensions.left - leftEdgeOffset
+      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
+        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+      }
+    }
+
+    return delta
+  }
+
+  Tooltip.prototype.getTitle = function () {
+    var title
+    var $e = this.$element
+    var o  = this.options
+
+    title = $e.attr('data-original-title')
+      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+    return title
+  }
+
+  Tooltip.prototype.getUID = function (prefix) {
+    do prefix += ~~(Math.random() * 1000000)
+    while (document.getElementById(prefix))
+    return prefix
+  }
+
+  Tooltip.prototype.tip = function () {
+    return (this.$tip = this.$tip || $(this.options.template))
+  }
+
+  Tooltip.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+  }
+
+  Tooltip.prototype.enable = function () {
+    this.enabled = true
+  }
+
+  Tooltip.prototype.disable = function () {
+    this.enabled = false
+  }
+
+  Tooltip.prototype.toggleEnabled = function () {
+    this.enabled = !this.enabled
+  }
+
+  Tooltip.prototype.toggle = function (e) {
+    var self = this
+    if (e) {
+      self = $(e.currentTarget).data('bs.' + this.type)
+      if (!self) {
+        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+        $(e.currentTarget).data('bs.' + this.type, self)
+      }
+    }
+
+    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+  }
+
+  Tooltip.prototype.destroy = function () {
+    var that = this
+    clearTimeout(this.timeout)
+    this.hide(function () {
+      that.$element.off('.' + that.type).removeData('bs.' + that.type)
+    })
+  }
+
+
+  // TOOLTIP PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.tooltip')
+      var options = typeof option == 'object' && option
+
+      if (!data && option == 'destroy') return
+      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip             = Plugin
+  $.fn.tooltip.Constructor = Tooltip
+
+
+  // TOOLTIP NO CONFLICT
+  // ===================
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.3.2
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // POPOVER PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+  Popover.VERSION  = '3.3.2'
+
+  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+    placement: 'right',
+    trigger: 'click',
+    content: '',
+    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+  // NOTE: POPOVER EXTENDS tooltip.js
+  // ================================
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+  Popover.prototype.constructor = Popover
+
+  Popover.prototype.getDefaults = function () {
+    return Popover.DEFAULTS
+  }
+
+  Popover.prototype.setContent = function () {
+    var $tip    = this.tip()
+    var title   = this.getTitle()
+    var content = this.getContent()
+
+    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
+      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+    ](content)
+
+    $tip.removeClass('fade top bottom left right in')
+
+    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+    // this manually by checking the contents.
+    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+  }
+
+  Popover.prototype.hasContent = function () {
+    return this.getTitle() || this.getContent()
+  }
+
+  Popover.prototype.getContent = function () {
+    var $e = this.$element
+    var o  = this.options
+
+    return $e.attr('data-content')
+      || (typeof o.content == 'function' ?
+            o.content.call($e[0]) :
+            o.content)
+  }
+
+  Popover.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+  }
+
+  Popover.prototype.tip = function () {
+    if (!this.$tip) this.$tip = $(this.options.template)
+    return this.$tip
+  }
+
+
+  // POPOVER PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.popover')
+      var options = typeof option == 'object' && option
+
+      if (!data && option == 'destroy') return
+      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.popover
+
+  $.fn.popover             = Plugin
+  $.fn.popover.Constructor = Popover
+
+
+  // POPOVER NO CONFLICT
+  // ===================
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.3.2
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // SCROLLSPY CLASS DEFINITION
+  // ==========================
+
+  function ScrollSpy(element, options) {
+    var process  = $.proxy(this.process, this)
+
+    this.$body          = $('body')
+    this.$scrollElement = $(element).is('body') ? $(window) : $(element)
+    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
+    this.selector       = (this.options.target || '') + ' .nav li > a'
+    this.offsets        = []
+    this.targets        = []
+    this.activeTarget   = null
+    this.scrollHeight   = 0
+
+    this.$scrollElement.on('scroll.bs.scrollspy', process)
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.VERSION  = '3.3.2'
+
+  ScrollSpy.DEFAULTS = {
+    offset: 10
+  }
+
+  ScrollSpy.prototype.getScrollHeight = function () {
+    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+  }
+
+  ScrollSpy.prototype.refresh = function () {
+    var offsetMethod = 'offset'
+    var offsetBase   = 0
+
+    if (!$.isWindow(this.$scrollElement[0])) {
+      offsetMethod = 'position'
+      offsetBase   = this.$scrollElement.scrollTop()
+    }
+
+    this.offsets = []
+    this.targets = []
+    this.scrollHeight = this.getScrollHeight()
+
+    var self     = this
+
+    this.$body
+      .find(this.selector)
+      .map(function () {
+        var $el   = $(this)
+        var href  = $el.data('target') || $el.attr('href')
+        var $href = /^#./.test(href) && $(href)
+
+        return ($href
+          && $href.length
+          && $href.is(':visible')
+          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+      })
+      .sort(function (a, b) { return a[0] - b[0] })
+      .each(function () {
+        self.offsets.push(this[0])
+        self.targets.push(this[1])
+      })
+  }
+
+  ScrollSpy.prototype.process = function () {
+    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
+    var scrollHeight = this.getScrollHeight()
+    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
+    var offsets      = this.offsets
+    var targets      = this.targets
+    var activeTarget = this.activeTarget
+    var i
+
+    if (this.scrollHeight != scrollHeight) {
+      this.refresh()
+    }
+
+    if (scrollTop >= maxScroll) {
+      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+    }
+
+    if (activeTarget && scrollTop < offsets[0]) {
+      this.activeTarget = null
+      return this.clear()
+    }
+
+    for (i = offsets.length; i--;) {
+      activeTarget != targets[i]
+        && scrollTop >= offsets[i]
+        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+        && this.activate(targets[i])
+    }
+  }
+
+  ScrollSpy.prototype.activate = function (target) {
+    this.activeTarget = target
+
+    this.clear()
+
+    var selector = this.selector +
+        '[data-target="' + target + '"],' +
+        this.selector + '[href="' + target + '"]'
+
+    var active = $(selector)
+      .parents('li')
+      .addClass('active')
+
+    if (active.parent('.dropdown-menu').length) {
+      active = active
+        .closest('li.dropdown')
+        .addClass('active')
+    }
+
+    active.trigger('activate.bs.scrollspy')
+  }
+
+  ScrollSpy.prototype.clear = function () {
+    $(this.selector)
+      .parentsUntil(this.options.target, '.active')
+      .removeClass('active')
+  }
+
+
+  // SCROLLSPY PLUGIN DEFINITION
+  // ===========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.scrollspy')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy             = Plugin
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+
+  // SCROLLSPY NO CONFLICT
+  // =====================
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+  // SCROLLSPY DATA-API
+  // ==================
+
+  $(window).on('load.bs.scrollspy.data-api', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      Plugin.call($spy, $spy.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.3.2
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TAB CLASS DEFINITION
+  // ====================
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.VERSION = '3.3.2'
+
+  Tab.TRANSITION_DURATION = 150
+
+  Tab.prototype.show = function () {
+    var $this    = this.element
+    var $ul      = $this.closest('ul:not(.dropdown-menu)')
+    var selector = $this.data('target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    if ($this.parent('li').hasClass('active')) return
+
+    var $previous = $ul.find('.active:last a')
+    var hideEvent = $.Event('hide.bs.tab', {
+      relatedTarget: $this[0]
+    })
+    var showEvent = $.Event('show.bs.tab', {
+      relatedTarget: $previous[0]
+    })
+
+    $previous.trigger(hideEvent)
+    $this.trigger(showEvent)
+
+    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+    var $target = $(selector)
+
+    this.activate($this.closest('li'), $ul)
+    this.activate($target, $target.parent(), function () {
+      $previous.trigger({
+        type: 'hidden.bs.tab',
+        relatedTarget: $this[0]
+      })
+      $this.trigger({
+        type: 'shown.bs.tab',
+        relatedTarget: $previous[0]
+      })
+    })
+  }
+
+  Tab.prototype.activate = function (element, container, callback) {
+    var $active    = container.find('> .active')
+    var transition = callback
+      && $.support.transition
+      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
+
+    function next() {
+      $active
+        .removeClass('active')
+        .find('> .dropdown-menu > .active')
+          .removeClass('active')
+        .end()
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', false)
+
+      element
+        .addClass('active')
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', true)
+
+      if (transition) {
+        element[0].offsetWidth // reflow for transition
+        element.addClass('in')
+      } else {
+        element.removeClass('fade')
+      }
+
+      if (element.parent('.dropdown-menu')) {
+        element
+          .closest('li.dropdown')
+            .addClass('active')
+          .end()
+          .find('[data-toggle="tab"]')
+            .attr('aria-expanded', true)
+      }
+
+      callback && callback()
+    }
+
+    $active.length && transition ?
+      $active
+        .one('bsTransitionEnd', next)
+        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+      next()
+
+    $active.removeClass('in')
+  }
+
+
+  // TAB PLUGIN DEFINITION
+  // =====================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.tab')
+
+      if (!data) $this.data('bs.tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tab
+
+  $.fn.tab             = Plugin
+  $.fn.tab.Constructor = Tab
+
+
+  // TAB NO CONFLICT
+  // ===============
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+  // TAB DATA-API
+  // ============
+
+  var clickHandler = function (e) {
+    e.preventDefault()
+    Plugin.call($(this), 'show')
+  }
+
+  $(document)
+    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
+    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.2
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // AFFIX CLASS DEFINITION
+  // ======================
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, Affix.DEFAULTS, options)
+
+    this.$target = $(this.options.target)
+      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
+
+    this.$element     = $(element)
+    this.affixed      =
+    this.unpin        =
+    this.pinnedOffset = null
+
+    this.checkPosition()
+  }
+
+  Affix.VERSION  = '3.3.2'
+
+  Affix.RESET    = 'affix affix-top affix-bottom'
+
+  Affix.DEFAULTS = {
+    offset: 0,
+    target: window
+  }
+
+  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+    var scrollTop    = this.$target.scrollTop()
+    var position     = this.$element.offset()
+    var targetHeight = this.$target.height()
+
+    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+    if (this.affixed == 'bottom') {
+      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+    }
+
+    var initializing   = this.affixed == null
+    var colliderTop    = initializing ? scrollTop : position.top
+    var colliderHeight = initializing ? targetHeight : height
+
+    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+    return false
+  }
+
+  Affix.prototype.getPinnedOffset = function () {
+    if (this.pinnedOffset) return this.pinnedOffset
+    this.$element.removeClass(Affix.RESET).addClass('affix')
+    var scrollTop = this.$target.scrollTop()
+    var position  = this.$element.offset()
+    return (this.pinnedOffset = position.top - scrollTop)
+  }
+
+  Affix.prototype.checkPositionWithEventLoop = function () {
+    setTimeout($.proxy(this.checkPosition, this), 1)
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var height       = this.$element.height()
+    var offset       = this.options.offset
+    var offsetTop    = offset.top
+    var offsetBottom = offset.bottom
+    var scrollHeight = $('body').height()
+
+    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+    if (this.affixed != affix) {
+      if (this.unpin != null) this.$element.css('top', '')
+
+      var affixType = 'affix' + (affix ? '-' + affix : '')
+      var e         = $.Event(affixType + '.bs.affix')
+
+      this.$element.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      this.affixed = affix
+      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+      this.$element
+        .removeClass(Affix.RESET)
+        .addClass(affixType)
+        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+    }
+
+    if (affix == 'bottom') {
+      this.$element.offset({
+        top: scrollHeight - height - offsetBottom
+      })
+    }
+  }
+
+
+  // AFFIX PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.affix')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.affix
+
+  $.fn.affix             = Plugin
+  $.fn.affix.Constructor = Affix
+
+
+  // AFFIX NO CONFLICT
+  // =================
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+  // AFFIX DATA-API
+  // ==============
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+      var data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
+
+      Plugin.call($spy, data)
+    })
+  })
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap.min.js b/static/assets/js/bootstrap.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..c6d36920be36e3d61f7807f56db65cfe25d28f35
--- /dev/null
+++ b/static/assets/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.2 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.2",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.2",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.2",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.2",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.2",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.2",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.options.backdrop&&d.adjustBackdrop(),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$element.find(".modal-dialog").one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').prependTo(this.$element).on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.options.backdrop&&this.adjustBackdrop(),this.adjustDialog()},c.prototype.adjustBackdrop=function(){this.$backdrop.css("height",0).css("height",this.$element[0].scrollHeight)},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){this.bodyIsOverflowing=document.body.scrollHeight>document.documentElement.clientHeight,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.2",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=this.tip(),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.2",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.2",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.2",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()
+}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.2",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a("body").height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/static/assets/js/bootstrap/affix.js b/static/assets/js/bootstrap/affix.js
new file mode 100644
index 0000000000000000000000000000000000000000..aaebc8c0f681d55b7ad35dd01e6f312664b5e310
--- /dev/null
+++ b/static/assets/js/bootstrap/affix.js
@@ -0,0 +1,162 @@
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.2
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // AFFIX CLASS DEFINITION
+  // ======================
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, Affix.DEFAULTS, options)
+
+    this.$target = $(this.options.target)
+      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
+
+    this.$element     = $(element)
+    this.affixed      =
+    this.unpin        =
+    this.pinnedOffset = null
+
+    this.checkPosition()
+  }
+
+  Affix.VERSION  = '3.3.2'
+
+  Affix.RESET    = 'affix affix-top affix-bottom'
+
+  Affix.DEFAULTS = {
+    offset: 0,
+    target: window
+  }
+
+  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+    var scrollTop    = this.$target.scrollTop()
+    var position     = this.$element.offset()
+    var targetHeight = this.$target.height()
+
+    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+    if (this.affixed == 'bottom') {
+      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+    }
+
+    var initializing   = this.affixed == null
+    var colliderTop    = initializing ? scrollTop : position.top
+    var colliderHeight = initializing ? targetHeight : height
+
+    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+    return false
+  }
+
+  Affix.prototype.getPinnedOffset = function () {
+    if (this.pinnedOffset) return this.pinnedOffset
+    this.$element.removeClass(Affix.RESET).addClass('affix')
+    var scrollTop = this.$target.scrollTop()
+    var position  = this.$element.offset()
+    return (this.pinnedOffset = position.top - scrollTop)
+  }
+
+  Affix.prototype.checkPositionWithEventLoop = function () {
+    setTimeout($.proxy(this.checkPosition, this), 1)
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var height       = this.$element.height()
+    var offset       = this.options.offset
+    var offsetTop    = offset.top
+    var offsetBottom = offset.bottom
+    var scrollHeight = $('body').height()
+
+    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+    if (this.affixed != affix) {
+      if (this.unpin != null) this.$element.css('top', '')
+
+      var affixType = 'affix' + (affix ? '-' + affix : '')
+      var e         = $.Event(affixType + '.bs.affix')
+
+      this.$element.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      this.affixed = affix
+      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+      this.$element
+        .removeClass(Affix.RESET)
+        .addClass(affixType)
+        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+    }
+
+    if (affix == 'bottom') {
+      this.$element.offset({
+        top: scrollHeight - height - offsetBottom
+      })
+    }
+  }
+
+
+  // AFFIX PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.affix')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.affix
+
+  $.fn.affix             = Plugin
+  $.fn.affix.Constructor = Affix
+
+
+  // AFFIX NO CONFLICT
+  // =================
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+  // AFFIX DATA-API
+  // ==============
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+      var data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
+
+      Plugin.call($spy, data)
+    })
+  })
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/alert.js b/static/assets/js/bootstrap/alert.js
new file mode 100644
index 0000000000000000000000000000000000000000..e8212caf016d71e3767c9ac7240852f8fd375970
--- /dev/null
+++ b/static/assets/js/bootstrap/alert.js
@@ -0,0 +1,94 @@
+/* ========================================================================
+ * Bootstrap: alert.js v3.3.2
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // ALERT CLASS DEFINITION
+  // ======================
+
+  var dismiss = '[data-dismiss="alert"]'
+  var Alert   = function (el) {
+    $(el).on('click', dismiss, this.close)
+  }
+
+  Alert.VERSION = '3.3.2'
+
+  Alert.TRANSITION_DURATION = 150
+
+  Alert.prototype.close = function (e) {
+    var $this    = $(this)
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = $(selector)
+
+    if (e) e.preventDefault()
+
+    if (!$parent.length) {
+      $parent = $this.closest('.alert')
+    }
+
+    $parent.trigger(e = $.Event('close.bs.alert'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      // detach from parent, fire event then clean up data
+      $parent.detach().trigger('closed.bs.alert').remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent
+        .one('bsTransitionEnd', removeElement)
+        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+      removeElement()
+  }
+
+
+  // ALERT PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.alert')
+
+      if (!data) $this.data('bs.alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.alert
+
+  $.fn.alert             = Plugin
+  $.fn.alert.Constructor = Alert
+
+
+  // ALERT NO CONFLICT
+  // =================
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+  // ALERT DATA-API
+  // ==============
+
+  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/button.js b/static/assets/js/bootstrap/button.js
new file mode 100644
index 0000000000000000000000000000000000000000..4d5690173723cd3f21cc46cb509fe29fbac1cfdf
--- /dev/null
+++ b/static/assets/js/bootstrap/button.js
@@ -0,0 +1,116 @@
+/* ========================================================================
+ * Bootstrap: button.js v3.3.2
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // BUTTON PUBLIC CLASS DEFINITION
+  // ==============================
+
+  var Button = function (element, options) {
+    this.$element  = $(element)
+    this.options   = $.extend({}, Button.DEFAULTS, options)
+    this.isLoading = false
+  }
+
+  Button.VERSION  = '3.3.2'
+
+  Button.DEFAULTS = {
+    loadingText: 'loading...'
+  }
+
+  Button.prototype.setState = function (state) {
+    var d    = 'disabled'
+    var $el  = this.$element
+    var val  = $el.is('input') ? 'val' : 'html'
+    var data = $el.data()
+
+    state = state + 'Text'
+
+    if (data.resetText == null) $el.data('resetText', $el[val]())
+
+    // push to event loop to allow forms to submit
+    setTimeout($.proxy(function () {
+      $el[val](data[state] == null ? this.options[state] : data[state])
+
+      if (state == 'loadingText') {
+        this.isLoading = true
+        $el.addClass(d).attr(d, d)
+      } else if (this.isLoading) {
+        this.isLoading = false
+        $el.removeClass(d).removeAttr(d)
+      }
+    }, this), 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var changed = true
+    var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+    if ($parent.length) {
+      var $input = this.$element.find('input')
+      if ($input.prop('type') == 'radio') {
+        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
+        else $parent.find('.active').removeClass('active')
+      }
+      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
+    } else {
+      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
+    }
+
+    if (changed) this.$element.toggleClass('active')
+  }
+
+
+  // BUTTON PLUGIN DEFINITION
+  // ========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.button')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  var old = $.fn.button
+
+  $.fn.button             = Plugin
+  $.fn.button.Constructor = Button
+
+
+  // BUTTON NO CONFLICT
+  // ==================
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+  // BUTTON DATA-API
+  // ===============
+
+  $(document)
+    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      var $btn = $(e.target)
+      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+      Plugin.call($btn, 'toggle')
+      e.preventDefault()
+    })
+    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
+    })
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/carousel.js b/static/assets/js/bootstrap/carousel.js
new file mode 100644
index 0000000000000000000000000000000000000000..450e1812ee3d1c3936793fba57cf3399bd05fb12
--- /dev/null
+++ b/static/assets/js/bootstrap/carousel.js
@@ -0,0 +1,237 @@
+/* ========================================================================
+ * Bootstrap: carousel.js v3.3.2
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CAROUSEL CLASS DEFINITION
+  // =========================
+
+  var Carousel = function (element, options) {
+    this.$element    = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options     = options
+    this.paused      =
+    this.sliding     =
+    this.interval    =
+    this.$active     =
+    this.$items      = null
+
+    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+
+    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
+      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+  }
+
+  Carousel.VERSION  = '3.3.2'
+
+  Carousel.TRANSITION_DURATION = 600
+
+  Carousel.DEFAULTS = {
+    interval: 5000,
+    pause: 'hover',
+    wrap: true,
+    keyboard: true
+  }
+
+  Carousel.prototype.keydown = function (e) {
+    if (/input|textarea/i.test(e.target.tagName)) return
+    switch (e.which) {
+      case 37: this.prev(); break
+      case 39: this.next(); break
+      default: return
+    }
+
+    e.preventDefault()
+  }
+
+  Carousel.prototype.cycle = function (e) {
+    e || (this.paused = false)
+
+    this.interval && clearInterval(this.interval)
+
+    this.options.interval
+      && !this.paused
+      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+    return this
+  }
+
+  Carousel.prototype.getItemIndex = function (item) {
+    this.$items = item.parent().children('.item')
+    return this.$items.index(item || this.$active)
+  }
+
+  Carousel.prototype.getItemForDirection = function (direction, active) {
+    var activeIndex = this.getItemIndex(active)
+    var willWrap = (direction == 'prev' && activeIndex === 0)
+                || (direction == 'next' && activeIndex == (this.$items.length - 1))
+    if (willWrap && !this.options.wrap) return active
+    var delta = direction == 'prev' ? -1 : 1
+    var itemIndex = (activeIndex + delta) % this.$items.length
+    return this.$items.eq(itemIndex)
+  }
+
+  Carousel.prototype.to = function (pos) {
+    var that        = this
+    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+    if (pos > (this.$items.length - 1) || pos < 0) return
+
+    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+    if (activeIndex == pos) return this.pause().cycle()
+
+    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
+  }
+
+  Carousel.prototype.pause = function (e) {
+    e || (this.paused = true)
+
+    if (this.$element.find('.next, .prev').length && $.support.transition) {
+      this.$element.trigger($.support.transition.end)
+      this.cycle(true)
+    }
+
+    this.interval = clearInterval(this.interval)
+
+    return this
+  }
+
+  Carousel.prototype.next = function () {
+    if (this.sliding) return
+    return this.slide('next')
+  }
+
+  Carousel.prototype.prev = function () {
+    if (this.sliding) return
+    return this.slide('prev')
+  }
+
+  Carousel.prototype.slide = function (type, next) {
+    var $active   = this.$element.find('.item.active')
+    var $next     = next || this.getItemForDirection(type, $active)
+    var isCycling = this.interval
+    var direction = type == 'next' ? 'left' : 'right'
+    var that      = this
+
+    if ($next.hasClass('active')) return (this.sliding = false)
+
+    var relatedTarget = $next[0]
+    var slideEvent = $.Event('slide.bs.carousel', {
+      relatedTarget: relatedTarget,
+      direction: direction
+    })
+    this.$element.trigger(slideEvent)
+    if (slideEvent.isDefaultPrevented()) return
+
+    this.sliding = true
+
+    isCycling && this.pause()
+
+    if (this.$indicators.length) {
+      this.$indicators.find('.active').removeClass('active')
+      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+      $nextIndicator && $nextIndicator.addClass('active')
+    }
+
+    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+    if ($.support.transition && this.$element.hasClass('slide')) {
+      $next.addClass(type)
+      $next[0].offsetWidth // force reflow
+      $active.addClass(direction)
+      $next.addClass(direction)
+      $active
+        .one('bsTransitionEnd', function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () {
+            that.$element.trigger(slidEvent)
+          }, 0)
+        })
+        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+    } else {
+      $active.removeClass('active')
+      $next.addClass('active')
+      this.sliding = false
+      this.$element.trigger(slidEvent)
+    }
+
+    isCycling && this.cycle()
+
+    return this
+  }
+
+
+  // CAROUSEL PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.carousel')
+      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+      var action  = typeof option == 'string' ? option : options.slide
+
+      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  var old = $.fn.carousel
+
+  $.fn.carousel             = Plugin
+  $.fn.carousel.Constructor = Carousel
+
+
+  // CAROUSEL NO CONFLICT
+  // ====================
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+
+  // CAROUSEL DATA-API
+  // =================
+
+  var clickHandler = function (e) {
+    var href
+    var $this   = $(this)
+    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+    if (!$target.hasClass('carousel')) return
+    var options = $.extend({}, $target.data(), $this.data())
+    var slideIndex = $this.attr('data-slide-to')
+    if (slideIndex) options.interval = false
+
+    Plugin.call($target, options)
+
+    if (slideIndex) {
+      $target.data('bs.carousel').to(slideIndex)
+    }
+
+    e.preventDefault()
+  }
+
+  $(document)
+    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+  $(window).on('load', function () {
+    $('[data-ride="carousel"]').each(function () {
+      var $carousel = $(this)
+      Plugin.call($carousel, $carousel.data())
+    })
+  })
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/collapse.js b/static/assets/js/bootstrap/collapse.js
new file mode 100644
index 0000000000000000000000000000000000000000..2bc30e7ba42ff8f1cd50fe759b3bef09fb020db8
--- /dev/null
+++ b/static/assets/js/bootstrap/collapse.js
@@ -0,0 +1,211 @@
+/* ========================================================================
+ * Bootstrap: collapse.js v3.3.2
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // COLLAPSE PUBLIC CLASS DEFINITION
+  // ================================
+
+  var Collapse = function (element, options) {
+    this.$element      = $(element)
+    this.options       = $.extend({}, Collapse.DEFAULTS, options)
+    this.$trigger      = $(this.options.trigger).filter('[href="#' + element.id + '"], [data-target="#' + element.id + '"]')
+    this.transitioning = null
+
+    if (this.options.parent) {
+      this.$parent = this.getParent()
+    } else {
+      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+    }
+
+    if (this.options.toggle) this.toggle()
+  }
+
+  Collapse.VERSION  = '3.3.2'
+
+  Collapse.TRANSITION_DURATION = 350
+
+  Collapse.DEFAULTS = {
+    toggle: true,
+    trigger: '[data-toggle="collapse"]'
+  }
+
+  Collapse.prototype.dimension = function () {
+    var hasWidth = this.$element.hasClass('width')
+    return hasWidth ? 'width' : 'height'
+  }
+
+  Collapse.prototype.show = function () {
+    if (this.transitioning || this.$element.hasClass('in')) return
+
+    var activesData
+    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
+
+    if (actives && actives.length) {
+      activesData = actives.data('bs.collapse')
+      if (activesData && activesData.transitioning) return
+    }
+
+    var startEvent = $.Event('show.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    if (actives && actives.length) {
+      Plugin.call(actives, 'hide')
+      activesData || actives.data('bs.collapse', null)
+    }
+
+    var dimension = this.dimension()
+
+    this.$element
+      .removeClass('collapse')
+      .addClass('collapsing')[dimension](0)
+      .attr('aria-expanded', true)
+
+    this.$trigger
+      .removeClass('collapsed')
+      .attr('aria-expanded', true)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse in')[dimension]('')
+      this.transitioning = 0
+      this.$element
+        .trigger('shown.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+    this.$element
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+  }
+
+  Collapse.prototype.hide = function () {
+    if (this.transitioning || !this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('hide.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var dimension = this.dimension()
+
+    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+    this.$element
+      .addClass('collapsing')
+      .removeClass('collapse in')
+      .attr('aria-expanded', false)
+
+    this.$trigger
+      .addClass('collapsed')
+      .attr('aria-expanded', false)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.transitioning = 0
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse')
+        .trigger('hidden.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    this.$element
+      [dimension](0)
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+  }
+
+  Collapse.prototype.toggle = function () {
+    this[this.$element.hasClass('in') ? 'hide' : 'show']()
+  }
+
+  Collapse.prototype.getParent = function () {
+    return $(this.options.parent)
+      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
+      .each($.proxy(function (i, element) {
+        var $element = $(element)
+        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+      }, this))
+      .end()
+  }
+
+  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+    var isOpen = $element.hasClass('in')
+
+    $element.attr('aria-expanded', isOpen)
+    $trigger
+      .toggleClass('collapsed', !isOpen)
+      .attr('aria-expanded', isOpen)
+  }
+
+  function getTargetFromTrigger($trigger) {
+    var href
+    var target = $trigger.attr('data-target')
+      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+
+    return $(target)
+  }
+
+
+  // COLLAPSE PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.collapse')
+      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data && options.toggle && option == 'show') options.toggle = false
+      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.collapse
+
+  $.fn.collapse             = Plugin
+  $.fn.collapse.Constructor = Collapse
+
+
+  // COLLAPSE NO CONFLICT
+  // ====================
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+  // COLLAPSE DATA-API
+  // =================
+
+  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+    var $this   = $(this)
+
+    if (!$this.attr('data-target')) e.preventDefault()
+
+    var $target = getTargetFromTrigger($this)
+    var data    = $target.data('bs.collapse')
+    var option  = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })
+
+    Plugin.call($target, option)
+  })
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/dropdown.js b/static/assets/js/bootstrap/dropdown.js
new file mode 100644
index 0000000000000000000000000000000000000000..200e1c67b4ffbbc005e7f7319dab3bb2e77e3851
--- /dev/null
+++ b/static/assets/js/bootstrap/dropdown.js
@@ -0,0 +1,161 @@
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.3.2
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // DROPDOWN CLASS DEFINITION
+  // =========================
+
+  var backdrop = '.dropdown-backdrop'
+  var toggle   = '[data-toggle="dropdown"]'
+  var Dropdown = function (element) {
+    $(element).on('click.bs.dropdown', this.toggle)
+  }
+
+  Dropdown.VERSION = '3.3.2'
+
+  Dropdown.prototype.toggle = function (e) {
+    var $this = $(this)
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    clearMenus()
+
+    if (!isActive) {
+      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+        // if mobile we use a backdrop because click events don't delegate
+        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
+      }
+
+      var relatedTarget = { relatedTarget: this }
+      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this
+        .trigger('focus')
+        .attr('aria-expanded', 'true')
+
+      $parent
+        .toggleClass('open')
+        .trigger('shown.bs.dropdown', relatedTarget)
+    }
+
+    return false
+  }
+
+  Dropdown.prototype.keydown = function (e) {
+    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+
+    var $this = $(this)
+
+    e.preventDefault()
+    e.stopPropagation()
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
+      if (e.which == 27) $parent.find(toggle).trigger('focus')
+      return $this.trigger('click')
+    }
+
+    var desc = ' li:not(.divider):visible a'
+    var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
+
+    if (!$items.length) return
+
+    var index = $items.index(e.target)
+
+    if (e.which == 38 && index > 0)                 index--                        // up
+    if (e.which == 40 && index < $items.length - 1) index++                        // down
+    if (!~index)                                      index = 0
+
+    $items.eq(index).trigger('focus')
+  }
+
+  function clearMenus(e) {
+    if (e && e.which === 3) return
+    $(backdrop).remove()
+    $(toggle).each(function () {
+      var $this         = $(this)
+      var $parent       = getParent($this)
+      var relatedTarget = { relatedTarget: this }
+
+      if (!$parent.hasClass('open')) return
+
+      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this.attr('aria-expanded', 'false')
+      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
+    })
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = selector && $(selector)
+
+    return $parent && $parent.length ? $parent : $this.parent()
+  }
+
+
+  // DROPDOWN PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.dropdown')
+
+      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown             = Plugin
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  // DROPDOWN NO CONFLICT
+  // ====================
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  // APPLY TO STANDARD DROPDOWN ELEMENTS
+  // ===================================
+
+  $(document)
+    .on('click.bs.dropdown.data-api', clearMenus)
+    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+    .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown)
+    .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown)
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/modal.js b/static/assets/js/bootstrap/modal.js
new file mode 100644
index 0000000000000000000000000000000000000000..e7704b8fc44baa72a42c6ac10f86cd7055544adc
--- /dev/null
+++ b/static/assets/js/bootstrap/modal.js
@@ -0,0 +1,324 @@
+/* ========================================================================
+ * Bootstrap: modal.js v3.3.2
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // MODAL CLASS DEFINITION
+  // ======================
+
+  var Modal = function (element, options) {
+    this.options        = options
+    this.$body          = $(document.body)
+    this.$element       = $(element)
+    this.$backdrop      =
+    this.isShown        = null
+    this.scrollbarWidth = 0
+
+    if (this.options.remote) {
+      this.$element
+        .find('.modal-content')
+        .load(this.options.remote, $.proxy(function () {
+          this.$element.trigger('loaded.bs.modal')
+        }, this))
+    }
+  }
+
+  Modal.VERSION  = '3.3.2'
+
+  Modal.TRANSITION_DURATION = 300
+  Modal.BACKDROP_TRANSITION_DURATION = 150
+
+  Modal.DEFAULTS = {
+    backdrop: true,
+    keyboard: true,
+    show: true
+  }
+
+  Modal.prototype.toggle = function (_relatedTarget) {
+    return this.isShown ? this.hide() : this.show(_relatedTarget)
+  }
+
+  Modal.prototype.show = function (_relatedTarget) {
+    var that = this
+    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+    this.$element.trigger(e)
+
+    if (this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = true
+
+    this.checkScrollbar()
+    this.setScrollbar()
+    this.$body.addClass('modal-open')
+
+    this.escape()
+    this.resize()
+
+    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+    this.backdrop(function () {
+      var transition = $.support.transition && that.$element.hasClass('fade')
+
+      if (!that.$element.parent().length) {
+        that.$element.appendTo(that.$body) // don't move modals dom position
+      }
+
+      that.$element
+        .show()
+        .scrollTop(0)
+
+      if (that.options.backdrop) that.adjustBackdrop()
+      that.adjustDialog()
+
+      if (transition) {
+        that.$element[0].offsetWidth // force reflow
+      }
+
+      that.$element
+        .addClass('in')
+        .attr('aria-hidden', false)
+
+      that.enforceFocus()
+
+      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+      transition ?
+        that.$element.find('.modal-dialog') // wait for modal to slide in
+          .one('bsTransitionEnd', function () {
+            that.$element.trigger('focus').trigger(e)
+          })
+          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+        that.$element.trigger('focus').trigger(e)
+    })
+  }
+
+  Modal.prototype.hide = function (e) {
+    if (e) e.preventDefault()
+
+    e = $.Event('hide.bs.modal')
+
+    this.$element.trigger(e)
+
+    if (!this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = false
+
+    this.escape()
+    this.resize()
+
+    $(document).off('focusin.bs.modal')
+
+    this.$element
+      .removeClass('in')
+      .attr('aria-hidden', true)
+      .off('click.dismiss.bs.modal')
+
+    $.support.transition && this.$element.hasClass('fade') ?
+      this.$element
+        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+      this.hideModal()
+  }
+
+  Modal.prototype.enforceFocus = function () {
+    $(document)
+      .off('focusin.bs.modal') // guard against infinite focus loop
+      .on('focusin.bs.modal', $.proxy(function (e) {
+        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+          this.$element.trigger('focus')
+        }
+      }, this))
+  }
+
+  Modal.prototype.escape = function () {
+    if (this.isShown && this.options.keyboard) {
+      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+        e.which == 27 && this.hide()
+      }, this))
+    } else if (!this.isShown) {
+      this.$element.off('keydown.dismiss.bs.modal')
+    }
+  }
+
+  Modal.prototype.resize = function () {
+    if (this.isShown) {
+      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+    } else {
+      $(window).off('resize.bs.modal')
+    }
+  }
+
+  Modal.prototype.hideModal = function () {
+    var that = this
+    this.$element.hide()
+    this.backdrop(function () {
+      that.$body.removeClass('modal-open')
+      that.resetAdjustments()
+      that.resetScrollbar()
+      that.$element.trigger('hidden.bs.modal')
+    })
+  }
+
+  Modal.prototype.removeBackdrop = function () {
+    this.$backdrop && this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  Modal.prototype.backdrop = function (callback) {
+    var that = this
+    var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+        .prependTo(this.$element)
+        .on('click.dismiss.bs.modal', $.proxy(function (e) {
+          if (e.target !== e.currentTarget) return
+          this.options.backdrop == 'static'
+            ? this.$element[0].focus.call(this.$element[0])
+            : this.hide.call(this)
+        }, this))
+
+      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      if (!callback) return
+
+      doAnimate ?
+        this.$backdrop
+          .one('bsTransitionEnd', callback)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      var callbackRemove = function () {
+        that.removeBackdrop()
+        callback && callback()
+      }
+      $.support.transition && this.$element.hasClass('fade') ?
+        this.$backdrop
+          .one('bsTransitionEnd', callbackRemove)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callbackRemove()
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+  // these following methods are used to handle overflowing modals
+
+  Modal.prototype.handleUpdate = function () {
+    if (this.options.backdrop) this.adjustBackdrop()
+    this.adjustDialog()
+  }
+
+  Modal.prototype.adjustBackdrop = function () {
+    this.$backdrop
+      .css('height', 0)
+      .css('height', this.$element[0].scrollHeight)
+  }
+
+  Modal.prototype.adjustDialog = function () {
+    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+
+    this.$element.css({
+      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
+    })
+  }
+
+  Modal.prototype.resetAdjustments = function () {
+    this.$element.css({
+      paddingLeft: '',
+      paddingRight: ''
+    })
+  }
+
+  Modal.prototype.checkScrollbar = function () {
+    this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight
+    this.scrollbarWidth = this.measureScrollbar()
+  }
+
+  Modal.prototype.setScrollbar = function () {
+    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
+  }
+
+  Modal.prototype.resetScrollbar = function () {
+    this.$body.css('padding-right', '')
+  }
+
+  Modal.prototype.measureScrollbar = function () { // thx walsh
+    var scrollDiv = document.createElement('div')
+    scrollDiv.className = 'modal-scrollbar-measure'
+    this.$body.append(scrollDiv)
+    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+    this.$body[0].removeChild(scrollDiv)
+    return scrollbarWidth
+  }
+
+
+  // MODAL PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option, _relatedTarget) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.modal')
+      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option](_relatedTarget)
+      else if (options.show) data.show(_relatedTarget)
+    })
+  }
+
+  var old = $.fn.modal
+
+  $.fn.modal             = Plugin
+  $.fn.modal.Constructor = Modal
+
+
+  // MODAL NO CONFLICT
+  // =================
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+  // MODAL DATA-API
+  // ==============
+
+  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this   = $(this)
+    var href    = $this.attr('href')
+    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+    if ($this.is('a')) e.preventDefault()
+
+    $target.one('show.bs.modal', function (showEvent) {
+      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+      $target.one('hidden.bs.modal', function () {
+        $this.is(':visible') && $this.trigger('focus')
+      })
+    })
+    Plugin.call($target, option, this)
+  })
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/popover.js b/static/assets/js/bootstrap/popover.js
new file mode 100644
index 0000000000000000000000000000000000000000..be65b11a1743c29e7d3e50ab0bf1be3ca126210e
--- /dev/null
+++ b/static/assets/js/bootstrap/popover.js
@@ -0,0 +1,113 @@
+/* ========================================================================
+ * Bootstrap: popover.js v3.3.2
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // POPOVER PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+  Popover.VERSION  = '3.3.2'
+
+  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+    placement: 'right',
+    trigger: 'click',
+    content: '',
+    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+  // NOTE: POPOVER EXTENDS tooltip.js
+  // ================================
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+  Popover.prototype.constructor = Popover
+
+  Popover.prototype.getDefaults = function () {
+    return Popover.DEFAULTS
+  }
+
+  Popover.prototype.setContent = function () {
+    var $tip    = this.tip()
+    var title   = this.getTitle()
+    var content = this.getContent()
+
+    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
+      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+    ](content)
+
+    $tip.removeClass('fade top bottom left right in')
+
+    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+    // this manually by checking the contents.
+    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+  }
+
+  Popover.prototype.hasContent = function () {
+    return this.getTitle() || this.getContent()
+  }
+
+  Popover.prototype.getContent = function () {
+    var $e = this.$element
+    var o  = this.options
+
+    return $e.attr('data-content')
+      || (typeof o.content == 'function' ?
+            o.content.call($e[0]) :
+            o.content)
+  }
+
+  Popover.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+  }
+
+  Popover.prototype.tip = function () {
+    if (!this.$tip) this.$tip = $(this.options.template)
+    return this.$tip
+  }
+
+
+  // POPOVER PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.popover')
+      var options = typeof option == 'object' && option
+
+      if (!data && option == 'destroy') return
+      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.popover
+
+  $.fn.popover             = Plugin
+  $.fn.popover.Constructor = Popover
+
+
+  // POPOVER NO CONFLICT
+  // ===================
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/scrollspy.js b/static/assets/js/bootstrap/scrollspy.js
new file mode 100644
index 0000000000000000000000000000000000000000..0987177fd4250bd669a3b566adccd7d5b0ebc9e5
--- /dev/null
+++ b/static/assets/js/bootstrap/scrollspy.js
@@ -0,0 +1,175 @@
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.3.2
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // SCROLLSPY CLASS DEFINITION
+  // ==========================
+
+  function ScrollSpy(element, options) {
+    var process  = $.proxy(this.process, this)
+
+    this.$body          = $('body')
+    this.$scrollElement = $(element).is('body') ? $(window) : $(element)
+    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
+    this.selector       = (this.options.target || '') + ' .nav li > a'
+    this.offsets        = []
+    this.targets        = []
+    this.activeTarget   = null
+    this.scrollHeight   = 0
+
+    this.$scrollElement.on('scroll.bs.scrollspy', process)
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.VERSION  = '3.3.2'
+
+  ScrollSpy.DEFAULTS = {
+    offset: 10
+  }
+
+  ScrollSpy.prototype.getScrollHeight = function () {
+    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+  }
+
+  ScrollSpy.prototype.refresh = function () {
+    var offsetMethod = 'offset'
+    var offsetBase   = 0
+
+    if (!$.isWindow(this.$scrollElement[0])) {
+      offsetMethod = 'position'
+      offsetBase   = this.$scrollElement.scrollTop()
+    }
+
+    this.offsets = []
+    this.targets = []
+    this.scrollHeight = this.getScrollHeight()
+
+    var self     = this
+
+    this.$body
+      .find(this.selector)
+      .map(function () {
+        var $el   = $(this)
+        var href  = $el.data('target') || $el.attr('href')
+        var $href = /^#./.test(href) && $(href)
+
+        return ($href
+          && $href.length
+          && $href.is(':visible')
+          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+      })
+      .sort(function (a, b) { return a[0] - b[0] })
+      .each(function () {
+        self.offsets.push(this[0])
+        self.targets.push(this[1])
+      })
+  }
+
+  ScrollSpy.prototype.process = function () {
+    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
+    var scrollHeight = this.getScrollHeight()
+    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
+    var offsets      = this.offsets
+    var targets      = this.targets
+    var activeTarget = this.activeTarget
+    var i
+
+    if (this.scrollHeight != scrollHeight) {
+      this.refresh()
+    }
+
+    if (scrollTop >= maxScroll) {
+      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+    }
+
+    if (activeTarget && scrollTop < offsets[0]) {
+      this.activeTarget = null
+      return this.clear()
+    }
+
+    for (i = offsets.length; i--;) {
+      activeTarget != targets[i]
+        && scrollTop >= offsets[i]
+        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+        && this.activate(targets[i])
+    }
+  }
+
+  ScrollSpy.prototype.activate = function (target) {
+    this.activeTarget = target
+
+    this.clear()
+
+    var selector = this.selector +
+        '[data-target="' + target + '"],' +
+        this.selector + '[href="' + target + '"]'
+
+    var active = $(selector)
+      .parents('li')
+      .addClass('active')
+
+    if (active.parent('.dropdown-menu').length) {
+      active = active
+        .closest('li.dropdown')
+        .addClass('active')
+    }
+
+    active.trigger('activate.bs.scrollspy')
+  }
+
+  ScrollSpy.prototype.clear = function () {
+    $(this.selector)
+      .parentsUntil(this.options.target, '.active')
+      .removeClass('active')
+  }
+
+
+  // SCROLLSPY PLUGIN DEFINITION
+  // ===========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.scrollspy')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy             = Plugin
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+
+  // SCROLLSPY NO CONFLICT
+  // =====================
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+  // SCROLLSPY DATA-API
+  // ==================
+
+  $(window).on('load.bs.scrollspy.data-api', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      Plugin.call($spy, $spy.data())
+    })
+  })
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/tab.js b/static/assets/js/bootstrap/tab.js
new file mode 100644
index 0000000000000000000000000000000000000000..ddb7fc9c4fe757c57c0f45720d296750bb860689
--- /dev/null
+++ b/static/assets/js/bootstrap/tab.js
@@ -0,0 +1,153 @@
+/* ========================================================================
+ * Bootstrap: tab.js v3.3.2
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TAB CLASS DEFINITION
+  // ====================
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.VERSION = '3.3.2'
+
+  Tab.TRANSITION_DURATION = 150
+
+  Tab.prototype.show = function () {
+    var $this    = this.element
+    var $ul      = $this.closest('ul:not(.dropdown-menu)')
+    var selector = $this.data('target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    if ($this.parent('li').hasClass('active')) return
+
+    var $previous = $ul.find('.active:last a')
+    var hideEvent = $.Event('hide.bs.tab', {
+      relatedTarget: $this[0]
+    })
+    var showEvent = $.Event('show.bs.tab', {
+      relatedTarget: $previous[0]
+    })
+
+    $previous.trigger(hideEvent)
+    $this.trigger(showEvent)
+
+    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+    var $target = $(selector)
+
+    this.activate($this.closest('li'), $ul)
+    this.activate($target, $target.parent(), function () {
+      $previous.trigger({
+        type: 'hidden.bs.tab',
+        relatedTarget: $this[0]
+      })
+      $this.trigger({
+        type: 'shown.bs.tab',
+        relatedTarget: $previous[0]
+      })
+    })
+  }
+
+  Tab.prototype.activate = function (element, container, callback) {
+    var $active    = container.find('> .active')
+    var transition = callback
+      && $.support.transition
+      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
+
+    function next() {
+      $active
+        .removeClass('active')
+        .find('> .dropdown-menu > .active')
+          .removeClass('active')
+        .end()
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', false)
+
+      element
+        .addClass('active')
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', true)
+
+      if (transition) {
+        element[0].offsetWidth // reflow for transition
+        element.addClass('in')
+      } else {
+        element.removeClass('fade')
+      }
+
+      if (element.parent('.dropdown-menu')) {
+        element
+          .closest('li.dropdown')
+            .addClass('active')
+          .end()
+          .find('[data-toggle="tab"]')
+            .attr('aria-expanded', true)
+      }
+
+      callback && callback()
+    }
+
+    $active.length && transition ?
+      $active
+        .one('bsTransitionEnd', next)
+        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+      next()
+
+    $active.removeClass('in')
+  }
+
+
+  // TAB PLUGIN DEFINITION
+  // =====================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.tab')
+
+      if (!data) $this.data('bs.tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tab
+
+  $.fn.tab             = Plugin
+  $.fn.tab.Constructor = Tab
+
+
+  // TAB NO CONFLICT
+  // ===============
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+  // TAB DATA-API
+  // ============
+
+  var clickHandler = function (e) {
+    e.preventDefault()
+    Plugin.call($(this), 'show')
+  }
+
+  $(document)
+    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
+    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/tooltip.js b/static/assets/js/bootstrap/tooltip.js
new file mode 100644
index 0000000000000000000000000000000000000000..1856df5989204e714b2758df80e7af4915fed630
--- /dev/null
+++ b/static/assets/js/bootstrap/tooltip.js
@@ -0,0 +1,472 @@
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.3.2
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TOOLTIP PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Tooltip = function (element, options) {
+    this.type       =
+    this.options    =
+    this.enabled    =
+    this.timeout    =
+    this.hoverState =
+    this.$element   = null
+
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.VERSION  = '3.3.2'
+
+  Tooltip.TRANSITION_DURATION = 150
+
+  Tooltip.DEFAULTS = {
+    animation: true,
+    placement: 'top',
+    selector: false,
+    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
+    trigger: 'hover focus',
+    title: '',
+    delay: 0,
+    html: false,
+    container: false,
+    viewport: {
+      selector: 'body',
+      padding: 0
+    }
+  }
+
+  Tooltip.prototype.init = function (type, element, options) {
+    this.enabled   = true
+    this.type      = type
+    this.$element  = $(element)
+    this.options   = this.getOptions(options)
+    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
+
+    var triggers = this.options.trigger.split(' ')
+
+    for (var i = triggers.length; i--;) {
+      var trigger = triggers[i]
+
+      if (trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (trigger != 'manual') {
+        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
+        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+    }
+
+    this.options.selector ?
+      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+      this.fixTitle()
+  }
+
+  Tooltip.prototype.getDefaults = function () {
+    return Tooltip.DEFAULTS
+  }
+
+  Tooltip.prototype.getOptions = function (options) {
+    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+    if (options.delay && typeof options.delay == 'number') {
+      options.delay = {
+        show: options.delay,
+        hide: options.delay
+      }
+    }
+
+    return options
+  }
+
+  Tooltip.prototype.getDelegateOptions = function () {
+    var options  = {}
+    var defaults = this.getDefaults()
+
+    this._options && $.each(this._options, function (key, value) {
+      if (defaults[key] != value) options[key] = value
+    })
+
+    return options
+  }
+
+  Tooltip.prototype.enter = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (self && self.$tip && self.$tip.is(':visible')) {
+      self.hoverState = 'in'
+      return
+    }
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'in'
+
+    if (!self.options.delay || !self.options.delay.show) return self.show()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'in') self.show()
+    }, self.options.delay.show)
+  }
+
+  Tooltip.prototype.leave = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'out'
+
+    if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'out') self.hide()
+    }, self.options.delay.hide)
+  }
+
+  Tooltip.prototype.show = function () {
+    var e = $.Event('show.bs.' + this.type)
+
+    if (this.hasContent() && this.enabled) {
+      this.$element.trigger(e)
+
+      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
+      if (e.isDefaultPrevented() || !inDom) return
+      var that = this
+
+      var $tip = this.tip()
+
+      var tipId = this.getUID(this.type)
+
+      this.setContent()
+      $tip.attr('id', tipId)
+      this.$element.attr('aria-describedby', tipId)
+
+      if (this.options.animation) $tip.addClass('fade')
+
+      var placement = typeof this.options.placement == 'function' ?
+        this.options.placement.call(this, $tip[0], this.$element[0]) :
+        this.options.placement
+
+      var autoToken = /\s?auto?\s?/i
+      var autoPlace = autoToken.test(placement)
+      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+      $tip
+        .detach()
+        .css({ top: 0, left: 0, display: 'block' })
+        .addClass(placement)
+        .data('bs.' + this.type, this)
+
+      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+      var pos          = this.getPosition()
+      var actualWidth  = $tip[0].offsetWidth
+      var actualHeight = $tip[0].offsetHeight
+
+      if (autoPlace) {
+        var orgPlacement = placement
+        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()
+        var containerDim = this.getPosition($container)
+
+        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :
+                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :
+                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :
+                    placement == 'left'   && pos.left   - actualWidth  < containerDim.left   ? 'right'  :
+                    placement
+
+        $tip
+          .removeClass(orgPlacement)
+          .addClass(placement)
+      }
+
+      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+      this.applyPlacement(calculatedOffset, placement)
+
+      var complete = function () {
+        var prevHoverState = that.hoverState
+        that.$element.trigger('shown.bs.' + that.type)
+        that.hoverState = null
+
+        if (prevHoverState == 'out') that.leave(that)
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        $tip
+          .one('bsTransitionEnd', complete)
+          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+        complete()
+    }
+  }
+
+  Tooltip.prototype.applyPlacement = function (offset, placement) {
+    var $tip   = this.tip()
+    var width  = $tip[0].offsetWidth
+    var height = $tip[0].offsetHeight
+
+    // manually read margins because getBoundingClientRect includes difference
+    var marginTop = parseInt($tip.css('margin-top'), 10)
+    var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+    // we must check for NaN for ie 8/9
+    if (isNaN(marginTop))  marginTop  = 0
+    if (isNaN(marginLeft)) marginLeft = 0
+
+    offset.top  = offset.top  + marginTop
+    offset.left = offset.left + marginLeft
+
+    // $.fn.offset doesn't round pixel values
+    // so we use setOffset directly with our own function B-0
+    $.offset.setOffset($tip[0], $.extend({
+      using: function (props) {
+        $tip.css({
+          top: Math.round(props.top),
+          left: Math.round(props.left)
+        })
+      }
+    }, offset), 0)
+
+    $tip.addClass('in')
+
+    // check to see if placing tip in new offset caused the tip to resize itself
+    var actualWidth  = $tip[0].offsetWidth
+    var actualHeight = $tip[0].offsetHeight
+
+    if (placement == 'top' && actualHeight != height) {
+      offset.top = offset.top + height - actualHeight
+    }
+
+    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+    if (delta.left) offset.left += delta.left
+    else offset.top += delta.top
+
+    var isVertical          = /top|bottom/.test(placement)
+    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+
+    $tip.offset(offset)
+    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+  }
+
+  Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {
+    this.arrow()
+      .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
+      .css(isHorizontal ? 'top' : 'left', '')
+  }
+
+  Tooltip.prototype.setContent = function () {
+    var $tip  = this.tip()
+    var title = this.getTitle()
+
+    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+    $tip.removeClass('fade in top bottom left right')
+  }
+
+  Tooltip.prototype.hide = function (callback) {
+    var that = this
+    var $tip = this.tip()
+    var e    = $.Event('hide.bs.' + this.type)
+
+    function complete() {
+      if (that.hoverState != 'in') $tip.detach()
+      that.$element
+        .removeAttr('aria-describedby')
+        .trigger('hidden.bs.' + that.type)
+      callback && callback()
+    }
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    $tip.removeClass('in')
+
+    $.support.transition && this.$tip.hasClass('fade') ?
+      $tip
+        .one('bsTransitionEnd', complete)
+        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+      complete()
+
+    this.hoverState = null
+
+    return this
+  }
+
+  Tooltip.prototype.fixTitle = function () {
+    var $e = this.$element
+    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
+      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+    }
+  }
+
+  Tooltip.prototype.hasContent = function () {
+    return this.getTitle()
+  }
+
+  Tooltip.prototype.getPosition = function ($element) {
+    $element   = $element || this.$element
+
+    var el     = $element[0]
+    var isBody = el.tagName == 'BODY'
+
+    var elRect    = el.getBoundingClientRect()
+    if (elRect.width == null) {
+      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
+      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
+    }
+    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
+    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
+    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
+
+    return $.extend({}, elRect, scroll, outerDims, elOffset)
+  }
+
+  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+
+  }
+
+  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+    var delta = { top: 0, left: 0 }
+    if (!this.$viewport) return delta
+
+    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+    var viewportDimensions = this.getPosition(this.$viewport)
+
+    if (/right|left/.test(placement)) {
+      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
+      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+      if (topEdgeOffset < viewportDimensions.top) { // top overflow
+        delta.top = viewportDimensions.top - topEdgeOffset
+      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+      }
+    } else {
+      var leftEdgeOffset  = pos.left - viewportPadding
+      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+        delta.left = viewportDimensions.left - leftEdgeOffset
+      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
+        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+      }
+    }
+
+    return delta
+  }
+
+  Tooltip.prototype.getTitle = function () {
+    var title
+    var $e = this.$element
+    var o  = this.options
+
+    title = $e.attr('data-original-title')
+      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+    return title
+  }
+
+  Tooltip.prototype.getUID = function (prefix) {
+    do prefix += ~~(Math.random() * 1000000)
+    while (document.getElementById(prefix))
+    return prefix
+  }
+
+  Tooltip.prototype.tip = function () {
+    return (this.$tip = this.$tip || $(this.options.template))
+  }
+
+  Tooltip.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+  }
+
+  Tooltip.prototype.enable = function () {
+    this.enabled = true
+  }
+
+  Tooltip.prototype.disable = function () {
+    this.enabled = false
+  }
+
+  Tooltip.prototype.toggleEnabled = function () {
+    this.enabled = !this.enabled
+  }
+
+  Tooltip.prototype.toggle = function (e) {
+    var self = this
+    if (e) {
+      self = $(e.currentTarget).data('bs.' + this.type)
+      if (!self) {
+        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+        $(e.currentTarget).data('bs.' + this.type, self)
+      }
+    }
+
+    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+  }
+
+  Tooltip.prototype.destroy = function () {
+    var that = this
+    clearTimeout(this.timeout)
+    this.hide(function () {
+      that.$element.off('.' + that.type).removeData('bs.' + that.type)
+    })
+  }
+
+
+  // TOOLTIP PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.tooltip')
+      var options = typeof option == 'object' && option
+
+      if (!data && option == 'destroy') return
+      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip             = Plugin
+  $.fn.tooltip.Constructor = Tooltip
+
+
+  // TOOLTIP NO CONFLICT
+  // ===================
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(jQuery);
diff --git a/static/assets/js/bootstrap/transition.js b/static/assets/js/bootstrap/transition.js
new file mode 100644
index 0000000000000000000000000000000000000000..ec9ab68244ad0cd5fcd9c2aa53e3c59e6bb092dd
--- /dev/null
+++ b/static/assets/js/bootstrap/transition.js
@@ -0,0 +1,59 @@
+/* ========================================================================
+ * Bootstrap: transition.js v3.3.2
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+  // ============================================================
+
+  function transitionEnd() {
+    var el = document.createElement('bootstrap')
+
+    var transEndEventNames = {
+      WebkitTransition : 'webkitTransitionEnd',
+      MozTransition    : 'transitionend',
+      OTransition      : 'oTransitionEnd otransitionend',
+      transition       : 'transitionend'
+    }
+
+    for (var name in transEndEventNames) {
+      if (el.style[name] !== undefined) {
+        return { end: transEndEventNames[name] }
+      }
+    }
+
+    return false // explicit for ie8 (  ._.)
+  }
+
+  // http://blog.alexmaccaw.com/css-transitions
+  $.fn.emulateTransitionEnd = function (duration) {
+    var called = false
+    var $el = this
+    $(this).one('bsTransitionEnd', function () { called = true })
+    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+    setTimeout(callback, duration)
+    return this
+  }
+
+  $(function () {
+    $.support.transition = transitionEnd()
+
+    if (!$.support.transition) return
+
+    $.event.special.bsTransitionEnd = {
+      bindType: $.support.transition.end,
+      delegateType: $.support.transition.end,
+      handle: function (e) {
+        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+      }
+    }
+  })
+
+}(jQuery);
diff --git a/static/assets/js/jquery.oembed.js b/static/assets/js/jquery.oembed.js
new file mode 100644
index 0000000000000000000000000000000000000000..2a0bcbf15173fc7ec527a0bc9e62e0256aacba49
--- /dev/null
+++ b/static/assets/js/jquery.oembed.js
@@ -0,0 +1,1538 @@
+/*!
+ * jquery oembed plugin
+ *
+ * Copyright (c) 2009 Richard Chamorro
+ * Licensed under the MIT license
+ *
+ * Orignal Author: Richard Chamorro
+ * Forked by Andrew Mee to Provide a slightly diffent kind of embedding experience
+ */
+(function($) {
+    $.fn.oembed = function(url, options, embedAction) {
+
+        settings = $.extend(true, $.fn.oembed.defaults, options);
+        var shortURLList = ["0rz.tw", "1link.in", "1url.com", "2.gp", "2big.at", "2tu.us", "3.ly", "307.to", "4ms.me", "4sq.com", "4url.cc", "6url.com", "7.ly", "a.gg", "a.nf", "aa.cx", "abcurl.net",
+            "ad.vu", "adf.ly", "adjix.com", "afx.cc", "all.fuseurl.com", "alturl.com", "amzn.to", "ar.gy", "arst.ch", "atu.ca", "azc.cc", "b23.ru", "b2l.me", "bacn.me", "bcool.bz", "binged.it",
+            "bit.ly", "bizj.us", "bloat.me", "bravo.ly", "bsa.ly", "budurl.com", "canurl.com", "chilp.it", "chzb.gr", "cl.lk", "cl.ly", "clck.ru", "cli.gs", "cliccami.info",
+            "clickthru.ca", "clop.in", "conta.cc", "cort.as", "cot.ag", "crks.me", "ctvr.us", "cutt.us", "dai.ly", "decenturl.com", "dfl8.me", "digbig.com",
+            "http:\/\/digg\.com\/[^\/]+$", "disq.us", "dld.bz", "dlvr.it", "do.my", "doiop.com", "dopen.us", "easyuri.com", "easyurl.net", "eepurl.com", "eweri.com",
+            "fa.by", "fav.me", "fb.me", "fbshare.me", "ff.im", "fff.to", "fire.to", "firsturl.de", "firsturl.net", "flic.kr", "flq.us", "fly2.ws", "fon.gs", "freak.to",
+            "fuseurl.com", "fuzzy.to", "fwd4.me", "fwib.net", "g.ro.lt", "gizmo.do", "gl.am", "go.9nl.com", "go.ign.com", "go.usa.gov", "goo.gl", "goshrink.com", "gurl.es",
+            "hex.io", "hiderefer.com", "hmm.ph", "href.in", "hsblinks.com", "htxt.it", "huff.to", "hulu.com", "hurl.me", "hurl.ws", "icanhaz.com", "idek.net", "ilix.in", "is.gd",
+            "its.my", "ix.lt", "j.mp", "jijr.com", "kl.am", "klck.me", "korta.nu", "krunchd.com", "l9k.net", "lat.ms", "liip.to", "liltext.com", "linkbee.com", "linkbun.ch",
+            "liurl.cn", "ln-s.net", "ln-s.ru", "lnk.gd", "lnk.ms", "lnkd.in", "lnkurl.com", "lru.jp", "lt.tl", "lurl.no", "macte.ch", "mash.to", "merky.de", "migre.me", "miniurl.com",
+            "minurl.fr", "mke.me", "moby.to", "moourl.com", "mrte.ch", "myloc.me", "myurl.in", "n.pr", "nbc.co", "nblo.gs", "nn.nf", "not.my", "notlong.com", "nsfw.in",
+            "nutshellurl.com", "nxy.in", "nyti.ms", "o-x.fr", "oc1.us", "om.ly", "omf.gd", "omoikane.net", "on.cnn.com", "on.mktw.net", "onforb.es", "orz.se", "ow.ly", "ping.fm",
+            "pli.gs", "pnt.me", "politi.co", "post.ly", "pp.gg", "profile.to", "ptiturl.com", "pub.vitrue.com", "qlnk.net", "qte.me", "qu.tc", "qy.fi", "r.ebay.com", "r.im", "rb6.me", "read.bi",
+            "readthis.ca", "reallytinyurl.com", "redir.ec", "redirects.ca", "redirx.com", "retwt.me", "ri.ms", "rickroll.it", "riz.gd", "rt.nu", "ru.ly", "rubyurl.com", "rurl.org",
+            "rww.tw", "s4c.in", "s7y.us", "safe.mn", "sameurl.com", "sdut.us", "shar.es", "shink.de", "shorl.com", "short.ie", "short.to", "shortlinks.co.uk", "shorturl.com",
+            "shout.to", "show.my", "shrinkify.com", "shrinkr.com", "shrt.fr", "shrt.st", "shrten.com", "shrunkin.com", "simurl.com", "slate.me", "smallr.com", "smsh.me", "smurl.name",
+            "sn.im", "snipr.com", "snipurl.com", "snurl.com", "sp2.ro", "spedr.com", "srnk.net", "srs.li", "starturl.com", "stks.co", "su.pr", "surl.co.uk", "surl.hu", "t.cn", "t.co", "t.lh.com",
+            "ta.gd", "tbd.ly", "tcrn.ch", "tgr.me", "tgr.ph", "tighturl.com", "tiniuri.com", "tiny.cc", "tiny.ly", "tiny.pl", "tinylink.in", "tinyuri.ca", "tinyurl.com", "tk.", "tl.gd",
+            "tmi.me", "tnij.org", "tnw.to", "tny.com", "to.ly", "togoto.us", "totc.us", "toysr.us", "tpm.ly", "tr.im", "tra.kz", "trunc.it", "twhub.com", "twirl.at",
+            "twitclicks.com", "twitterurl.net", "twitterurl.org", "twiturl.de", "twurl.cc", "twurl.nl", "u.mavrev.com", "u.nu", "u76.org", "ub0.cc", "ulu.lu", "updating.me", "ur1.ca",
+            "url.az", "url.co.uk", "url.ie", "url360.me", "url4.eu", "urlborg.com", "urlbrief.com", "urlcover.com", "urlcut.com", "urlenco.de", "urli.nl", "urls.im",
+            "urlshorteningservicefortwitter.com", "urlx.ie", "urlzen.com", "usat.ly", "use.my", "vb.ly", "vevo.ly", "vgn.am", "vl.am", "vm.lc", "w55.de", "wapo.st", "wapurl.co.uk", "wipi.es",
+            "wp.me", "x.vu", "xr.com", "xrl.in", "xrl.us", "xurl.es", "xurl.jp", "y.ahoo.it", "yatuc.com", "ye.pe", "yep.it", "yfrog.com", "yhoo.it", "yiyd.com", "youtu.be", "yuarel.com",
+            "z0p.de", "zi.ma", "zi.mu", "zipmyurl.com", "zud.me", "zurl.ws", "zz.gd", "zzang.kr", "›.ws", "✩.ws", "✿.ws", "❥.ws", "➔.ws", "➞.ws", "➡.ws", "➨.ws", "➯.ws", "➹.ws", "➽.ws"
+        ];
+
+        if ($('#jqoembeddata').length === 0) $('<span id="jqoembeddata"></span>').appendTo('body');
+
+        return this.each(function() {
+            var container = $(this),
+                resourceURL = (url && (!url.indexOf('http://') || !url.indexOf('https://'))) ? url : container.attr("href"),
+                provider;
+
+            if (embedAction) {
+                settings.onEmbed = embedAction;
+            } else if (!settings.onEmbed) {
+                settings.onEmbed = function(oembedData) {
+                    $.fn.oembed.insertCode(this, settings.embedMethod, oembedData);
+                };
+            }
+
+            if (resourceURL !== null && resourceURL !== undefined) {
+                //Check if shorten URL
+                for (var j = 0, l = shortURLList.length; j < l; j++) {
+                    var regExp = new RegExp('://' + shortURLList[j] + '/', "i");
+
+                    if (resourceURL.match(regExp) !== null) {
+                        //AJAX to http://api.longurl.org/v2/expand?url=http://bit.ly/JATvIs&format=json&callback=hhh
+                        var ajaxopts = $.extend({
+                            url: "http://api.longurl.org/v2/expand",
+                            dataType: 'jsonp',
+                            data: {
+                                url: resourceURL,
+                                format: "json"
+                                    //callback: "?"
+                            },
+                            success: function(data) {
+                                //this = $.fn.oembed;
+                                resourceURL = data['long-url'];
+                                provider = $.fn.oembed.getOEmbedProvider(data['long-url']);
+
+                                //remove fallback
+                                if (!!settings.fallback === false) {
+                                    provider = provider.name.toLowerCase() === 'opengraph' ? null : provider;
+                                }
+
+                                if (provider !== null) {
+                                    provider.params = getNormalizedParams(settings[provider.name]) || {};
+                                    provider.maxWidth = settings.maxWidth;
+                                    provider.maxHeight = settings.maxHeight;
+                                    embedCode(container, resourceURL, provider);
+                                } else {
+                                    settings.onProviderNotFound.call(container, resourceURL);
+                                }
+                            },
+                            error: function() {
+                                settings.onError.call(container, resourceURL)
+                            }
+                        }, settings.ajaxOptions || {});
+
+                        $.ajax(ajaxopts);
+
+                        return container;
+                    }
+                }
+                provider = $.fn.oembed.getOEmbedProvider(resourceURL);
+
+                //remove fallback
+                if (!!settings.fallback === false) {
+                    provider = provider.name.toLowerCase() === 'opengraph' ? null : provider;
+                }
+                if (provider !== null) {
+                    provider.params = getNormalizedParams(settings[provider.name]) || {};
+                    provider.maxWidth = settings.maxWidth;
+                    provider.maxHeight = settings.maxHeight;
+                    embedCode(container, resourceURL, provider);
+                } else {
+                    settings.onProviderNotFound.call(container, resourceURL);
+                }
+            }
+            return container;
+        });
+    };
+
+    var settings;
+
+    // Plugin defaults
+    $.fn.oembed.defaults = {
+        fallback: true,
+        maxWidth: null,
+        maxHeight: null,
+        includeHandle: true,
+        embedMethod: 'auto',
+        // "auto", "append", "fill"
+        onProviderNotFound: function() {},
+        beforeEmbed: function() {},
+        afterEmbed: function() {},
+        onEmbed: false,
+        onError: function(a, b, c, d) {
+            console.log('err:', a, b, c, d)
+        },
+        ajaxOptions: {}
+    };
+
+    /* Private functions */
+    function rand(length, current) { //Found on http://stackoverflow.com/questions/1349404/generate-a-string-of-5-random-characters-in-javascript
+        current = current ? current : '';
+        return length ? rand(--length, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".charAt(Math.floor(Math.random() * 60)) + current) : current;
+    }
+
+    function getRequestUrl(provider, externalUrl) {
+        var url = provider.apiendpoint,
+            qs = "",
+            i;
+        url += (url.indexOf("?") <= 0) ? "?" : "&";
+        url = url.replace('#', '%23');
+
+        if (provider.maxWidth !== null && (typeof provider.params.maxwidth === 'undefined' || provider.params.maxwidth === null)) {
+            provider.params.maxwidth = provider.maxWidth;
+        }
+
+        if (provider.maxHeight !== null && (typeof provider.params.maxheight === 'undefined' || provider.params.maxheight === null)) {
+            provider.params.maxheight = provider.maxHeight;
+        }
+
+        for (i in provider.params) {
+            // We don't want them to jack everything up by changing the callback parameter
+            if (i == provider.callbackparameter)
+                continue;
+
+            // allows the options to be set to null, don't send null values to the server as parameters
+            if (provider.params[i] !== null)
+                qs += "&" + escape(i) + "=" + provider.params[i];
+        }
+
+        url += "format=" + provider.format + "&url=" + escape(externalUrl) + qs;
+        if (provider.dataType != 'json')
+            url += "&" + provider.callbackparameter + "=?";
+
+        return url;
+    }
+
+    function success(oembedData, externalUrl, container) {
+        $('#jqoembeddata').data(externalUrl, oembedData.code);
+        settings.beforeEmbed.call(container, oembedData);
+        settings.onEmbed.call(container, oembedData);
+        settings.afterEmbed.call(container, oembedData);
+    }
+
+    function embedCode(container, externalUrl, embedProvider) {
+        if ($('#jqoembeddata').data(externalUrl) != undefined && embedProvider.embedtag.tag != 'iframe') {
+            var oembedData = {
+                code: $('#jqoembeddata').data(externalUrl)
+            };
+            success(oembedData, externalUrl, container);
+        } else if (embedProvider.yql) {
+            var from = embedProvider.yql.from || 'htmlstring';
+            var url = embedProvider.yql.url ? embedProvider.yql.url(externalUrl) : externalUrl;
+            var query = 'SELECT * FROM ' + from + ' WHERE url="' + (url) + '"' + " and " + (/html/.test(from) ? 'xpath' : 'itemPath') + "='" + (embedProvider.yql.xpath || '/') + "'";
+            if (from == 'html')
+                query += " and compat='html5'";
+            var ajaxopts = $.extend({
+                url: "//query.yahooapis.com/v1/public/yql",
+                dataType: 'jsonp',
+                data: {
+                    q: query,
+                    format: "json",
+                    env: 'store://datatables.org/alltableswithkeys',
+                    callback: "?"
+                },
+                success: function(data) {
+                    var result;
+
+                    if (embedProvider.yql.xpath && embedProvider.yql.xpath == '//meta|//title|//link') {
+                        var meta = {};
+
+                        if (data.query == null) {
+                            data.query = {};
+                        }
+                        if (data.query.results == null) {
+                            data.query.results = {
+                                "meta": []
+                            };
+                        }
+                        for (var i = 0, l = data.query.results.meta.length; i < l; i++) {
+                            var name = data.query.results.meta[i].name || data.query.results.meta[i].property || null;
+                            if (name == null) continue;
+                            meta[name.toLowerCase()] = data.query.results.meta[i].content;
+                        }
+                        if (!meta.hasOwnProperty("title") || !meta.hasOwnProperty("og:title")) {
+                            if (data.query.results.title != null) {
+                                meta.title = data.query.results.title;
+                            }
+                        }
+                        if (!meta.hasOwnProperty("og:image") && data.query.results.hasOwnProperty("link")) {
+                            for (var i = 0, l = data.query.results.link.length; i < l; i++) {
+                                if (data.query.results.link[i].hasOwnProperty("rel")) {
+                                    if (data.query.results.link[i].rel == "apple-touch-icon") {
+                                        if (data.query.results.link[i].href.charAt(0) == "/") {
+                                            meta["og:image"] = url.match(/^(([a-z]+:)?(\/\/)?[^\/]+\/).*$/)[1] + data.query.results.link[i].href;
+                                        } else {
+                                            meta["og:image"] = data.query.results.link[i].href;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        result = embedProvider.yql.datareturn(meta);
+                    } else {
+                        result = embedProvider.yql.datareturn ? embedProvider.yql.datareturn(data.query.results) : data.query.results.result;
+                    }
+                    if (result === false) return;
+                    var oembedData = $.extend({}, result);
+                    oembedData.code = result;
+                    success(oembedData, externalUrl, container);
+                },
+                error: settings.onError.call(container, externalUrl, embedProvider)
+            }, settings.ajaxOptions || {});
+            $.ajax(ajaxopts);
+        } else if (embedProvider.templateRegex) {
+            if (embedProvider.embedtag.tag !== '') {
+                var flashvars = embedProvider.embedtag.flashvars || '';
+                var tag = embedProvider.embedtag.tag || 'embed';
+                var width = embedProvider.embedtag.width || 'auto';
+                var height = embedProvider.embedtag.height || 'auto';
+                var src = externalUrl.replace(embedProvider.templateRegex, embedProvider.apiendpoint);
+
+                if (!embedProvider.nocache) {
+                    src += '&jqoemcache=' + rand(5);
+                }
+
+                if (embedProvider.apikey) {
+                    src = src.replace('_APIKEY_', settings.apikeys[embedProvider.name]);
+                }
+
+                var code = $('<' + tag + '/>').attr('src', src).attr('width', width)
+                    .attr('height', height)
+                    .attr('allowfullscreen', embedProvider.embedtag.allowfullscreen || 'true')
+                    .attr('allowscriptaccess', embedProvider.embedtag.allowfullscreen || 'always')
+                    .css('max-height', settings.maxHeight || 'auto')
+                    .css('max-width', settings.maxWidth || 'auto');
+
+                if (tag == 'embed') {
+                    code.attr('type', embedProvider.embedtag.type || "application/x-shockwave-flash")
+                        .attr('flashvars', externalUrl.replace(embedProvider.templateRegex, flashvars));
+                }
+
+                if (tag == 'iframe') {
+                    code.attr('scrolling', embedProvider.embedtag.scrolling || "no")
+                        .attr('frameborder', embedProvider.embedtag.frameborder || "0");
+
+                }
+
+                success({
+                    code: code
+                }, externalUrl, container);
+            } else if (embedProvider.apiendpoint) {
+                //Add APIkey if true
+                if (embedProvider.apikey)
+                    embedProvider.apiendpoint = embedProvider.apiendpoint.replace('_APIKEY_', settings.apikeys[embedProvider.name]);
+
+                ajaxopts = $.extend({
+                    url: externalUrl.replace(embedProvider.templateRegex, embedProvider.apiendpoint),
+                    dataType: 'jsonp',
+                    success: function(data) {
+                        var oembedData = $.extend({}, data);
+                        oembedData.code = embedProvider.templateData(data);
+                        success(oembedData, externalUrl, container);
+                    },
+                    error: settings.onError.call(container, externalUrl, embedProvider)
+                }, settings.ajaxOptions || {});
+                $.ajax(ajaxopts);
+            } else {
+                success({
+                    code: externalUrl.replace(embedProvider.templateRegex, embedProvider.template)
+                }, externalUrl, container);
+            }
+        } else {
+
+            var requestUrl = getRequestUrl(embedProvider, externalUrl);
+            ajaxopts = $.extend({
+                url: requestUrl,
+                dataType: embedProvider.dataType || 'jsonp',
+                success: function(data) {
+                    var oembedData = $.extend({}, data);
+                    switch (oembedData.type) {
+                        case "file": //Deviant Art has this
+                        case "photo":
+                            oembedData.code = $.fn.oembed.getPhotoCode(externalUrl, oembedData);
+                            break;
+                        case "video":
+                        case "rich":
+                            oembedData.code = $.fn.oembed.getRichCode(externalUrl, oembedData);
+                            break;
+                        default:
+                            oembedData.code = $.fn.oembed.getGenericCode(externalUrl, oembedData);
+                            break;
+                    }
+                    success(oembedData, externalUrl, container);
+                },
+                error: settings.onError.call(container, externalUrl, embedProvider)
+            }, settings.ajaxOptions || {});
+            $.ajax(ajaxopts);
+        }
+    }
+
+    function getNormalizedParams(params) {
+        if (params === null) return null;
+        var key, normalizedParams = {};
+        for (key in params) {
+            if (key !== null) normalizedParams[key.toLowerCase()] = params[key];
+        }
+        return normalizedParams;
+    }
+
+    /* Public functions */
+    $.fn.oembed.insertCode = function(container, embedMethod, oembedData) {
+        if (oembedData === null)
+            return;
+
+        if (embedMethod === 'auto' && container.attr('href') !== null) {
+            embedMethod = 'append';
+        } else if (embedMethod == 'auto') {
+            embedMethod = 'replace';
+        }
+
+        switch (embedMethod) {
+            case "replace":
+                container.replaceWith(oembedData.code);
+                break;
+            case "fill":
+                container.html(oembedData.code);
+                break;
+            case "append":
+                container.wrap('<div class="oembedall-container"></div>');
+                var oembedContainer = container.parent();
+                if (settings.includeHandle) {
+                    $('<span class="oembedall-closehide">&darr;</span>').insertBefore(container).click(function() {
+                        var encodedString = encodeURIComponent($(this).text());
+                        $(this).html((encodedString == '%E2%86%91') ? '&darr;' : '&uarr;');
+                        $(this).parent().children().last().toggle();
+                    });
+                }
+                oembedContainer.append('<br/>');
+                try {
+                    oembedData.code.clone().appendTo(oembedContainer);
+                } catch (e) {
+                    oembedContainer.append(oembedData.code);
+                }
+                /* Make videos semi-responsive
+                 * If parent div width less than embeded iframe video then iframe gets shrunk to fit smaller width
+                 * If parent div width greater thans embed iframe use the max widht
+                 * - works on youtubes and vimeo
+                 */
+                if (settings.maxWidth) {
+                    var post_width = oembedContainer.parent().width();
+                    if (post_width < settings.maxWidth) {
+                        var iframe_width_orig = $('iframe', oembedContainer).width();
+                        var iframe_height_orig = $('iframe', oembedContainer).height();
+                        var ratio = iframe_width_orig / post_width;
+                        $('iframe', oembedContainer).width(iframe_width_orig / ratio);
+                        $('iframe', oembedContainer).height(iframe_height_orig / ratio);
+                    } else {
+                        if (settings.maxWidth) {
+                            $('iframe', oembedContainer).width(settings.maxWidth);
+                        }
+                        if (settings.maxHeight) {
+                            $('iframe', oembedContainer).height(settings.maxHeight);
+                        }
+                    }
+                }
+                break;
+        }
+    };
+
+    $.fn.oembed.getPhotoCode = function(url, oembedData) {
+        var code;
+        var alt = oembedData.title ? oembedData.title : '';
+        alt += oembedData.author_name ? ' - ' + oembedData.author_name : '';
+        alt += oembedData.provider_name ? ' - ' + oembedData.provider_name : '';
+
+        if (oembedData.url) {
+            code = '<div><a href="' + url + '" target=\'_blank\'><img src="' + oembedData.url + '" alt="' + alt + '"/></a></div>';
+        } else if (oembedData.thumbnail_url) {
+            var newURL = oembedData.thumbnail_url.replace('_s', '_b');
+            code = '<div><a href="' + url + '" target=\'_blank\'><img src="' + newURL + '" alt="' + alt + '"/></a></div>';
+        } else {
+            code = '<div>Error loading this picture</div>';
+        }
+
+        if (oembedData.html) {
+            code += "<div>" + oembedData.html + "</div>";
+        }
+
+        return code;
+    };
+
+    $.fn.oembed.getRichCode = function(url, oembedData) {
+        return oembedData.html;
+    };
+
+    $.fn.oembed.getGenericCode = function(url, oembedData) {
+        var title = ((oembedData.title) && (oembedData.title !== null)) ? oembedData.title : url;
+        var code = '<a href="' + url + '">' + title + '</a>';
+
+        if (oembedData.html) {
+            code += "<div>" + oembedData.html + "</div>";
+        }
+
+        return code;
+    };
+
+    $.fn.oembed.getOEmbedProvider = function(url) {
+        for (var i = 0; i < $.fn.oembed.providers.length; i++) {
+            for (var j = 0, l = $.fn.oembed.providers[i].urlschemes.length; j < l; j++) {
+                var regExp = new RegExp($.fn.oembed.providers[i].urlschemes[j], "i");
+
+                if (url.match(regExp) !== null)
+                    return $.fn.oembed.providers[i];
+            }
+        }
+        return null;
+    };
+
+    // Constructor Function for OEmbedProvider Class.
+    $.fn.oembed.OEmbedProvider = function(name, type, urlschemesarray, apiendpoint, extraSettings) {
+        this.name = name;
+        this.type = type; // "photo", "video", "link", "rich", null
+        this.urlschemes = urlschemesarray;
+        this.apiendpoint = apiendpoint;
+        this.maxWidth = 500;
+        this.maxHeight = 400;
+        extraSettings = extraSettings || {};
+
+        if (extraSettings.useYQL) {
+
+            if (extraSettings.useYQL == 'xml') {
+                extraSettings.yql = {
+                    xpath: "//oembed/html",
+                    from: 'xml',
+                    apiendpoint: this.apiendpoint,
+                    url: function(externalurl) {
+                        return this.apiendpoint + '?format=xml&url=' + externalurl
+                    },
+                    datareturn: function(results) {
+                        return results.html.replace(/.*\[CDATA\[(.*)\]\]>$/, '$1') || ''
+                    }
+                };
+            } else {
+                extraSettings.yql = {
+                    from: 'json',
+                    apiendpoint: this.apiendpoint,
+                    url: function(externalurl) {
+                        return this.apiendpoint + '?format=json&url=' + externalurl
+                    },
+                    datareturn: function(results) {
+                        if (results.json.type != 'video' && (results.json.url || results.json.thumbnail_url)) {
+                            return '<img src="' + (results.json.url || results.json.thumbnail_url) + '" />';
+                        }
+                        return results.json.html || ''
+                    }
+                };
+            }
+            this.apiendpoint = null;
+        }
+
+
+        for (var property in extraSettings) {
+            this[property] = extraSettings[property];
+        }
+
+        this.format = this.format || 'json';
+        this.callbackparameter = this.callbackparameter || "callback";
+        this.embedtag = this.embedtag || {
+            tag: ""
+        };
+
+
+    };
+
+    /*
+     * Function to update existing providers
+     *
+     * @param  {String}    name             The name of the provider
+     * @param  {String}    type             The type of the provider can be "file", "photo", "video", "rich"
+     * @param  {String}    urlshemesarray   Array of url of the provider
+     * @param  {String}    apiendpoint      The endpoint of the provider
+     * @param  {String}    extraSettings    Extra settings of the provider
+     */
+    $.fn.updateOEmbedProvider = function(name, type, urlschemesarray, apiendpoint, extraSettings) {
+        for (var i = 0; i < $.fn.oembed.providers.length; i++) {
+            if ($.fn.oembed.providers[i].name === name) {
+                if (type !== null) {
+                    $.fn.oembed.providers[i].type = type;
+                }
+                if (urlschemesarray !== null) {
+                    $.fn.oembed.providers[i].urlschemes = urlschemesarray;
+                }
+                if (apiendpoint !== null) {
+                    $.fn.oembed.providers[i].apiendpoint = apiendpoint;
+                }
+                if (extraSettings !== null) {
+                    $.fn.oembed.providers[i].extraSettings = extraSettings;
+                    for (var property in extraSettings) {
+                        if (property !== null && extraSettings[property] !== null) {
+                            $.fn.oembed.providers[i][property] = extraSettings[property];
+                        }
+                    }
+                }
+            }
+        }
+    };
+
+    /* Native & common providers */
+    $.fn.oembed.providers = [
+
+        //Video
+        new $.fn.oembed.OEmbedProvider("youtube", "video", ["youtube\\.com/watch.+v=[\\w-]+&?", "youtu\\.be/[\\w-]+", "youtube.com/embed"], 'http://www.youtube.com/embed/$1?wmode=transparent', {
+            templateRegex: /.*(?:v\=|be\/|embed\/)([\w\-]+)&?.*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '425',
+                height: '349'
+            }
+        }),
+
+        //new $.fn.oembed.OEmbedProvider("youtube", "video", ["youtube\\.com/watch.+v=[\\w-]+&?", "youtu\\.be/[\\w-]+"], 'http://www.youtube.com/oembed', {useYQL:'json'}),
+        //new $.fn.oembed.OEmbedProvider("youtubeiframe", "video", ["youtube.com/embed"],  "$1?wmode=transparent",
+        //  {templateRegex:/(.*)/,embedtag : {tag: 'iframe', width:'425',height: '349'}}),
+        new $.fn.oembed.OEmbedProvider("wistia", "video", ["wistia.com/m/.+", "wistia.com/embed/.+", "wi.st/m/.+", "wi.st/embed/.+"], 'http://fast.wistia.com/oembed', {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("xtranormal", "video", ["xtranormal\\.com/watch/.+"], "http://www.xtranormal.com/xtraplayr/$1/$2", {
+            templateRegex: /.*com\/watch\/([\w\-]+)\/([\w\-]+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '320',
+                height: '269'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("scivee", "video", ["scivee.tv/node/.+"], "http://www.scivee.tv/flash/embedCast.swf?", {
+            templateRegex: /.*tv\/node\/(.+)/,
+            embedtag: {
+                width: '480',
+                height: '400',
+                flashvars: "id=$1&type=3"
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("veoh", "video", ["veoh.com/watch/.+"], "http://www.veoh.com/swf/webplayer/WebPlayer.swf?version=AFrontend.5.7.0.1337&permalinkId=$1&player=videodetailsembedded&videoAutoPlay=0&id=anonymous", {
+            templateRegex: /.*watch\/([^\?]+).*/,
+            embedtag: {
+                width: '410',
+                height: '341'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("gametrailers", "video", ["gametrailers\\.com/video/.+"], "http://media.mtvnservices.com/mgid:moses:video:gametrailers.com:$2", {
+            templateRegex: /.*com\/video\/([\w\-]+)\/([\w\-]+).*/,
+            embedtag: {
+                width: '512',
+                height: '288'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("funnyordie", "video", ["funnyordie\\.com/videos/.+"], "http://player.ordienetworks.com/flash/fodplayer.swf?", {
+            templateRegex: /.*videos\/([^\/]+)\/([^\/]+)?/,
+            embedtag: {
+                width: 512,
+                height: 328,
+                flashvars: "key=$1"
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("colledgehumour", "video", ["collegehumor\\.com/video/.+"], "http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=$1&use_node_id=true&fullscreen=1", {
+            templateRegex: /.*video\/([^\/]+).*/,
+            embedtag: {
+                width: 600,
+                height: 338
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("metacafe", "video", ["metacafe\\.com/watch/.+"], "http://www.metacafe.com/fplayer/$1/$2.swf", {
+            templateRegex: /.*watch\/(\d+)\/(\w+)\/.*/,
+            embedtag: {
+                width: 400,
+                height: 345
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("bambuser", "video", ["bambuser\\.com\/channel\/.*\/broadcast\/.*"], "http://static.bambuser.com/r/player.swf?vid=$1", {
+            templateRegex: /.*bambuser\.com\/channel\/.*\/broadcast\/(\w+).*/,
+            embedtag: {
+                width: 512,
+                height: 339
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("twitvid", "video", ["twitvid\\.com/.+"], "http://www.twitvid.com/embed.php?guid=$1&autoplay=0", {
+            templateRegex: /.*twitvid\.com\/(\w+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("aniboom", "video", ["aniboom\\.com/animation-video/.+"], "http://api.aniboom.com/e/$1", {
+            templateRegex: /.*animation-video\/(\d+).*/,
+            embedtag: {
+                width: 594,
+                height: 334
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("vzaar", "video", ["vzaar\\.com/videos/.+", "vzaar.tv/.+"], "http://view.vzaar.com/$1/player?", {
+            templateRegex: /.*\/(\d+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 576,
+                height: 324
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("snotr", "video", ["snotr\\.com/video/.+"], "http://www.snotr.com/embed/$1", {
+            templateRegex: /.*\/(\d+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 400,
+                height: 330
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("youku", "video", ["v.youku.com/v_show/id_.+"], "http://player.youku.com/player.php/sid/$1/v.swf", {
+            templateRegex: /.*id_(.+)\.html.*/,
+            embedtag: {
+                width: 480,
+                height: 400
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("tudou", "video", ["tudou.com/programs/view/.+\/"], "http://www.tudou.com/v/$1/v.swf", {
+            templateRegex: /.*view\/(.+)\//,
+            embedtag: {
+                width: 480,
+                height: 400
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("embedr", "video", ["embedr\\.com/playlist/.+"], "http://embedr.com/swf/slider/$1/425/520/default/false/std?", {
+            templateRegex: /.*playlist\/([^\/]+).*/,
+            embedtag: {
+                width: 425,
+                height: 520
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("blip", "video", ["blip\\.tv/.+"], "//blip.tv/oembed/"),
+        new $.fn.oembed.OEmbedProvider("minoto-video", "video", ["http://api.minoto-video.com/publishers/.+/videos/.+", "http://dashboard.minoto-video.com/main/video/details/.+", "http://embed.minoto-video.com/.+"], "http://api.minoto-video.com/services/oembed.json", {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("animoto", "video", ["animoto.com/play/.+"], "http://animoto.com/services/oembed"),
+        new $.fn.oembed.OEmbedProvider("hulu", "video", ["hulu\\.com/watch/.*"], "//www.hulu.com/api/oembed.json"),
+        new $.fn.oembed.OEmbedProvider("ustream", "video", ["ustream\\.tv/recorded/.*"], "http://www.ustream.tv/oembed", {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("videojug", "video", ["videojug\\.com/(film|payer|interview).*"], "http://www.videojug.com/oembed.json", {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("sapo", "video", ["videos\\.sapo\\.pt/.*"], "http://videos.sapo.pt/oembed", {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("vodpod", "video", ["vodpod.com/watch/.*"], "http://vodpod.com/oembed.js", {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("vimeo", "video", ["www\.vimeo\.com\/groups\/.*\/videos\/.*", "www\.vimeo\.com\/.*", "vimeo\.com\/groups\/.*\/videos\/.*", "vimeo\.com\/.*"], "//vimeo.com/api/oembed.json"),
+        new $.fn.oembed.OEmbedProvider("dailymotion", "video", ["dailymotion\\.com/.+"], '//www.dailymotion.com/services/oembed'),
+        new $.fn.oembed.OEmbedProvider("5min", "video", ["www\\.5min\\.com/.+"], 'http://api.5min.com/oembed.xml', {
+            useYQL: 'xml'
+        }),
+        new $.fn.oembed.OEmbedProvider("National Film Board of Canada", "video", ["nfb\\.ca/film/.+"], 'http://www.nfb.ca/remote/services/oembed/', {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("qik", "video", ["qik\\.com/\\w+"], 'http://qik.com/api/oembed.json', {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("revision3", "video", ["revision3\\.com"], "http://revision3.com/api/oembed/"),
+        new $.fn.oembed.OEmbedProvider("dotsub", "video", ["dotsub\\.com/view/.+"], "http://dotsub.com/services/oembed", {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("clikthrough", "video", ["clikthrough\\.com/theater/video/\\d+"], "http://clikthrough.com/services/oembed"),
+        new $.fn.oembed.OEmbedProvider("Kinomap", "video", ["kinomap\\.com/.+"], "http://www.kinomap.com/oembed"),
+        new $.fn.oembed.OEmbedProvider("VHX", "video", ["vhx.tv/.+"], "http://vhx.tv/services/oembed.json"),
+        new $.fn.oembed.OEmbedProvider("bambuser", "video", ["bambuser.com/.+"], "http://api.bambuser.com/oembed/iframe.json"),
+        new $.fn.oembed.OEmbedProvider("justin.tv", "video", ["justin.tv/.+"], 'http://api.justin.tv/api/embed/from_url.json', {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("vine", "video", ["vine.co/v/.*"], null, {
+            templateRegex: /https?:\/\/w?w?w?.?vine\.co\/v\/([a-zA-Z0-9]*).*/,
+            template: '<iframe src="https://vine.co/v/$1/embed/postcard" width="600" height="600" allowfullscreen="true" allowscriptaccess="always" scrolling="no" frameborder="0"></iframe>' +
+                '<script async src="//platform.vine.co/static/scripts/embed.js" charset="utf-8"></script>',
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("boxofficebuz", "video", ["boxofficebuz\\.com\\/embed/.+"], "http://boxofficebuz.com/embed/$1/$2", {
+            templateRegex: [/.*boxofficebuz\.com\/embed\/(\w+)\/([\w*\-*]+)/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("clipsyndicate", "video", ["clipsyndicate\\.com/video/play/.+", "clipsyndicate\\.com/embed/iframe\?.+"], "http://eplayer.clipsyndicate.com/embed/iframe?pf_id=1&show_title=0&va_id=$1&windows=1", {
+            templateRegex: [/.*www\.clipsyndicate\.com\/video\/play\/(\w+)\/.*/, /.*eplayer\.clipsyndicate\.com\/embed\/iframe\?.*va_id=(\w+).*.*/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("coub", "video", ["coub\\.com/.+"], "http://www.coub.com/embed/$1?muted=false&autostart=false&originalSize=false&hideTopBar=false&noSiteButtons=false&startWithHD=false", {
+            templateRegex: [/.*coub\.com\/embed\/(\w+)\?*.*/, /.*coub\.com\/view\/(\w+).*/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("discoverychannel", "video", ["snagplayer\\.video\\.dp\\.discovery\\.com/.+"], "http://snagplayer.video.dp.discovery.com/$1/snag-it-player.htm?auto=no", {
+            templateRegex: [/.*snagplayer\.video\.dp\.discovery\/(\w+).*/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("telly", "video", ["telly\\.com/.+"], "http://www.telly.com/embed.php?guid=$1&autoplay=0", {
+            templateRegex: [/.*telly\.com\/embed\.php\?guid=(\w+).*/, /.*telly\.com\/(\w+).*/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("minilogs", "video", ["minilogs\\.com/.+"], "http://www.minilogs.com/e/$1", {
+            templateRegex: [/.*minilogs\.com\/e\/(\w+).*/, /.*minilogs\.com\/(\w+).*/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("viddy", "video", ["viddy\\.com/.+"], "http://www.viddy.com/embed/video/$1", {
+            templateRegex: [/.*viddy\.com\/embed\/video\/(\.*)/, /.*viddy\.com\/video\/(\.*)/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("worldstarhiphop", "video", ["worldstarhiphop\\.com\/embed/.+"], "http://www.worldstarhiphop.com/embed/$1", {
+            templateRegex: /.*worldstarhiphop\.com\/embed\/(\w+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("zapiks", "video", ["zapiks\\.fr\/.+"], "http://www.zapiks.fr/index.php?action=playerIframe&media_id=$1&autoStart=fals", {
+            templateRegex: /.*zapiks\.fr\/index.php\?[\w\=\&]*media_id=(\w+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+
+        //Audio
+        new $.fn.oembed.OEmbedProvider("official.fm", "rich", ["official.fm/.+"], 'http://official.fm/services/oembed', {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("chirbit", "rich", ["chirb.it/.+"], 'http://chirb.it/oembed.json', {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("chirbit", "audio", ["chirb\\.it/.+"], "http://chirb.it/wp/$1", {
+            templateRegex: [/.*chirb\.it\/wp\/(\w+).*/, /.*chirb\.it\/(\w+).*/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("Huffduffer", "rich", ["huffduffer.com/[-.\\w@]+/\\d+"], "http://huffduffer.com/oembed"),
+        new $.fn.oembed.OEmbedProvider("Spotify", "rich", ["open.spotify.com/(track|album|user)/"], "https://embed.spotify.com/oembed/"),
+        new $.fn.oembed.OEmbedProvider("shoudio", "rich", ["shoudio.com/.+", "shoud.io/.+"], "http://shoudio.com/api/oembed"),
+        new $.fn.oembed.OEmbedProvider("mixcloud", "rich", ["mixcloud.com/.+"], 'http://www.mixcloud.com/oembed/', {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("rdio.com", "rich", ["rd.io/.+", "rdio.com"], "http://www.rdio.com/api/oembed/"),
+        new $.fn.oembed.OEmbedProvider("Soundcloud", "rich", ["soundcloud.com/.+", "snd.sc/.+"], "//soundcloud.com/oembed", {
+            format: 'js'
+        }),
+        new $.fn.oembed.OEmbedProvider("bandcamp", "rich", ["bandcamp\\.com/album/.+"], null, {
+            yql: {
+                xpath: "//meta[contains(@content, \\'EmbeddedPlayer\\')]",
+                from: 'html',
+                datareturn: function(results) {
+                    return results.meta ? '<iframe width="400" height="100" src="' + results.meta.content + '" allowtransparency="true" frameborder="0"></iframe>' : false;
+                }
+            }
+        }),
+
+        //Photo
+        new $.fn.oembed.OEmbedProvider("deviantart", "photo", ["deviantart.com/.+", "fav.me/.+", "deviantart.com/.+"], "//backend.deviantart.com/oembed", {
+            format: 'jsonp'
+        }),
+        new $.fn.oembed.OEmbedProvider("skitch", "photo", ["skitch.com/.+"], null, {
+            yql: {
+                xpath: "json",
+                from: 'json',
+                url: function(externalurl) {
+                    return 'http://skitch.com/oembed/?format=json&url=' + externalurl
+                },
+                datareturn: function(data) {
+                    return $.fn.oembed.getPhotoCode(data.json.url, data.json);
+                }
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("mobypicture", "photo", ["mobypicture.com/user/.+/view/.+", "moby.to/.+"], "http://api.mobypicture.com/oEmbed"),
+        new $.fn.oembed.OEmbedProvider("flickr", "photo", ["flickr\\.com/photos/.+"], "//flickr.com/services/oembed", {
+            callbackparameter: 'jsoncallback'
+        }),
+        new $.fn.oembed.OEmbedProvider("photobucket", "photo", ["photobucket\\.com/(albums|groups)/.+"], "http://photobucket.com/oembed/"),
+        new $.fn.oembed.OEmbedProvider("instagram", "photo", ["instagr\\.?am(\\.com)?/.+"], "//api.instagram.com/oembed"),
+        //new $.fn.oembed.OEmbedProvider("yfrog", "photo", ["yfrog\\.(com|ru|com\\.tr|it|fr|co\\.il|co\\.uk|com\\.pl|pl|eu|us)/.+"], "http://www.yfrog.com/api/oembed",{useYQL:"json"}),
+        new $.fn.oembed.OEmbedProvider("SmugMug", "photo", ["smugmug.com/[-.\\w@]+/.+"], "http://api.smugmug.com/services/oembed/"),
+        new $.fn.oembed.OEmbedProvider("dribbble", "photo", ["dribbble.com/shots/.+"], "http://api.dribbble.com/shots/$1?callback=?", {
+            templateRegex: /.*shots\/([\d]+).*/,
+            templateData: function(data) {
+                if (!data.image_teaser_url) {
+                    return false;
+                }
+                return '<img src="' + data.image_teaser_url + '"/>';
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("chart.ly", "photo", ["chart\\.ly/[a-z0-9]{6,8}"], "http://chart.ly/uploads/large_$1.png", {
+            templateRegex: /.*ly\/([^\/]+).*/,
+            embedtag: {
+                tag: 'img'
+            },
+            nocache: 1
+        }),
+        //new $.fn.oembed.OEmbedProvider("stocktwits.com", "photo", ["stocktwits\\.com/message/.+"], "http://charts.stocktwits.com/production/original_$1.png?",
+        //  { templateRegex: /.*message\/([^\/]+).*/, embedtag: { tag: 'img'},nocache:1 }),
+        new $.fn.oembed.OEmbedProvider("circuitlab", "photo", ["circuitlab.com/circuit/.+"], "https://www.circuitlab.com/circuit/$1/screenshot/540x405/", {
+            templateRegex: /.*circuit\/([^\/]+).*/,
+            embedtag: {
+                tag: 'img'
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("23hq", "photo", ["23hq.com/[-.\\w@]+/photo/.+"], "http://www.23hq.com/23/oembed", {
+            useYQL: "json"
+        }),
+        new $.fn.oembed.OEmbedProvider("img.ly", "photo", ["img\\.ly/.+"], "//img.ly/show/thumb/$1", {
+            templateRegex: /.*ly\/([^\/]+).*/,
+            embedtag: {
+                tag: 'img'
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("twitgoo.com", "photo", ["twitgoo\\.com/.+"], "http://twitgoo.com/show/thumb/$1", {
+            templateRegex: /.*com\/([^\/]+).*/,
+            embedtag: {
+                tag: 'img'
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("imgur.com", "photo", ["imgur\\.com/gallery/.+"], "http://imgur.com/$1l.jpg", {
+            templateRegex: /.*gallery\/([^\/]+).*/,
+            embedtag: {
+                tag: 'img'
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("visual.ly", "rich", ["visual\\.ly/.+"], null, {
+            yql: {
+                xpath: "//a[@id=\\'gc_article_graphic_image\\']/img",
+                from: 'htmlstring'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("gravtar", "photo", ["mailto:.+"], null, {
+            templateRegex: /mailto:([^\/]+).*/,
+            template: function(wm, email) {
+                return '<img src="http://gravatar.com/avatar/' + email.md5() + '.jpg" alt="on Gravtar" class="jqoaImg">';
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("achewood", "photo", ["achewood\\.com\\/index.php\\?date=.+"], "http://www.achewood.com/comic.php?date=$1", {
+            templateRegex: /.*achewood\.com\/index.php\?date=(\w+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("fotokritik", "photo", ["fotokritik\\.com/.+"], "http://www.fotokritik.com/embed/$1", {
+            templateRegex: [/.*fotokritik\.com\/embed\/(\w+).*/, /.*fotokritik\.com\/(\w+).*/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("giflike", "photo", ["giflike\\.com/.+"], "http://www.giflike.com/embed/$1", {
+            templateRegex: [/.*giflike\.com\/embed\/(\w+).*/, /.*giflike\.com\/a\/(\w+).*/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+
+        //Rich
+        new $.fn.oembed.OEmbedProvider("twitter", "rich", ["twitter.com/.+"], "https://api.twitter.com/1/statuses/oembed.json"),
+        new $.fn.oembed.OEmbedProvider("gmep", "rich", ["gmep.imeducate.com/.*", "gmep.org/.*"], "http://gmep.org/oembed.json"),
+        new $.fn.oembed.OEmbedProvider("urtak", "rich", ["urtak.com/(u|clr)/.+"], "http://oembed.urtak.com/1/oembed"),
+        new $.fn.oembed.OEmbedProvider("cacoo", "rich", ["cacoo.com/.+"], "http://cacoo.com/oembed.json"),
+        new $.fn.oembed.OEmbedProvider("dailymile", "rich", ["dailymile.com/people/.*/entries/.*"], "http://api.dailymile.com/oembed"),
+        new $.fn.oembed.OEmbedProvider("dipity", "rich", ["dipity.com/timeline/.+"], 'http://www.dipity.com/oembed/timeline/', {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("sketchfab", "rich", ["sketchfab.com/show/.+"], 'http://sketchfab.com/oembed', {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("speakerdeck", "rich", ["speakerdeck.com/.+"], 'http://speakerdeck.com/oembed.json', {
+            useYQL: 'json'
+        }),
+        new $.fn.oembed.OEmbedProvider("popplet", "rich", ["popplet.com/app/.*"], "http://popplet.com/app/Popplet_Alpha.swf?page_id=$1&em=1", {
+            templateRegex: /.*#\/([^\/]+).*/,
+            embedtag: {
+                width: 460,
+                height: 460
+            }
+        }),
+
+        new $.fn.oembed.OEmbedProvider("pearltrees", "rich", ["pearltrees.com/.*"], "http://cdn.pearltrees.com/s/embed/getApp?", {
+            templateRegex: /.*N-f=1_(\d+).*N-p=(\d+).*/,
+            embedtag: {
+                width: 460,
+                height: 460,
+                flashvars: "lang=en_US&amp;embedId=pt-embed-$1-693&amp;treeId=$1&amp;pearlId=$2&amp;treeTitle=Diagrams%2FVisualization&amp;site=www.pearltrees.com%2FF"
+            }
+        }),
+
+        new $.fn.oembed.OEmbedProvider("prezi", "rich", ["prezi.com/.*"], "//prezi.com/bin/preziloader.swf?", {
+            templateRegex: /.*com\/([^\/]+)\/.*/,
+            embedtag: {
+                width: 550,
+                height: 400,
+                flashvars: "prezi_id=$1&amp;lock_to_path=0&amp;color=ffffff&amp;autoplay=no&amp;autohide_ctrls=0"
+            }
+        }),
+
+        new $.fn.oembed.OEmbedProvider("tourwrist", "rich", ["tourwrist.com/tours/.+"], null, {
+            templateRegex: /.*tours.([\d]+).*/,
+            template: function(wm, tourid) {
+                setTimeout(function() {
+                    if (loadEmbeds) loadEmbeds();
+                }, 2000);
+                return "<div id='" + tourid + "' class='tourwrist-tour-embed direct'></div> <script type='text/javascript' src='http://tourwrist.com/tour_embed.js'></script>";
+            }
+        }),
+
+        new $.fn.oembed.OEmbedProvider("meetup", "rich", ["meetup\\.(com|ps)/.+"], "http://api.meetup.com/oembed"),
+        new $.fn.oembed.OEmbedProvider("ebay", "rich", ["ebay\\.*"], "http://togo.ebay.com/togo/togo.swf?2008013100", {
+            templateRegex: /.*\/([^\/]+)\/(\d{10,13}).*/,
+            embedtag: {
+                width: 355,
+                height: 300,
+                flashvars: "base=http://togo.ebay.com/togo/&lang=en-us&mode=normal&itemid=$2&query=$1"
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("wikipedia", "rich", ["wikipedia.org/wiki/.+"], "http://$1.wikipedia.org/w/api.php?action=parse&page=$2&format=json&section=0&callback=?", {
+            templateRegex: /.*\/\/([\w]+).*\/wiki\/([^\/]+).*/,
+            templateData: function(data) {
+                if (!data.parse)
+                    return false;
+                var text = data.parse['text']['*'].replace(/href="\/wiki/g, 'href="http://en.wikipedia.org/wiki');
+                return '<div id="content"><h3><a class="nav-link" href="http://en.wikipedia.org/wiki/' + data.parse['displaytitle'] + '">' + data.parse['displaytitle'] + '</a></h3>' + text + '</div>';
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("imdb", "rich", ["imdb.com/title/.+"], "http://www.imdbapi.com/?i=$1&callback=?", {
+            templateRegex: /.*\/title\/([^\/]+).*/,
+            templateData: function(data) {
+                if (!data.Title)
+                    return false;
+                return '<div id="content"><h3><a class="nav-link" href="http://imdb.com/title/' + data.imdbID + '/">' + data.Title + '</a> (' + data.Year + ')</h3><p>Rating: ' + data.imdbRating + '<br/>Genre: ' + data.Genre + '<br/>Starring: ' + data.Actors + '</p></div>  <div id="view-photo-caption">' + data.Plot + '</div></div>';
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("livejournal", "rich", ["livejournal.com/"], "http://ljpic.seacrow.com/json/$2$4?jsonp=?", {
+            templateRegex: /(http:\/\/(((?!users).)+)\.livejournal\.com|.*users\.livejournal\.com\/([^\/]+)).*/,
+            templateData: function(data) {
+                if (!data.username)
+                    return false;
+                return '<div><img src="' + data.image + '" align="left" style="margin-right: 1em;" /><span class="oembedall-ljuser"><a href="http://' + data.username + '.livejournal.com/profile"><img src="http://www.livejournal.com/img/userinfo.gif" alt="[info]" width="17" height="17" /></a><a href="http://' + data.username + '.livejournal.com/">' + data.username + '</a></span><br />' + data.name + '</div>';
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("circuitbee", "rich", ["circuitbee\\.com/circuit/view/.+"], "http://c.circuitbee.com/build/r/schematic-embed.html?id=$1", {
+            templateRegex: /.*circuit\/view\/(\d+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '500',
+                height: '350'
+            }
+        }),
+
+        new $.fn.oembed.OEmbedProvider("googlecalendar", "rich", ["www.google.com/calendar/embed?.+"], "$1", {
+            templateRegex: /(.*)/,
+            embedtag: {
+                tag: 'iframe',
+                width: '800',
+                height: '600'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("jsfiddle", "rich", ["jsfiddle.net/[^/]+/?"], "http://jsfiddle.net/$1/embedded/result,js,resources,html,css/?", {
+            templateRegex: /.*net\/([^\/]+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '100%',
+                height: '300'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("jsbin", "rich", ["jsbin.com/.+"], "http://jsbin.com/$1/?", {
+            templateRegex: /.*com\/([^\/]+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '100%',
+                height: '300'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("jotform", "rich", ["form.jotform.co/form/.+"], "$1?", {
+            templateRegex: /(.*)/,
+            embedtag: {
+                tag: 'iframe',
+                width: '100%',
+                height: '507'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("reelapp", "rich", ["reelapp\\.com/.+"], "http://www.reelapp.com/$1/embed", {
+            templateRegex: /.*com\/(\S{6}).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '400',
+                height: '338'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("linkedin", "rich", ["linkedin.com/pub/.+"], "https://www.linkedin.com/cws/member/public_profile?public_profile_url=$1&format=inline&isFramed=true", {
+            templateRegex: /(.*)/,
+            embedtag: {
+                tag: 'iframe',
+                width: '368px',
+                height: 'auto'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("timetoast", "rich", ["timetoast.com/timelines/[0-9]+"], "http://www.timetoast.com/flash/TimelineViewer.swf?passedTimelines=$1", {
+            templateRegex: /.*timelines\/([0-9]*)/,
+            embedtag: {
+                width: 550,
+                height: 400
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("pastebin", "rich", ["pastebin\\.com/[\\S]{8}"], "http://pastebin.com/embed_iframe.php?i=$1", {
+            templateRegex: /.*\/(\S{8}).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '100%',
+                height: 'auto'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("mixlr", "rich", ["mixlr.com/.+"], "http://mixlr.com/embed/$1?autoplay=ae", {
+            templateRegex: /.*com\/([^\/]+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '100%',
+                height: 'auto'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("pastie", "rich", ["pastie\\.org/pastes/.+"], null, {
+            yql: {
+                xpath: '//pre[@class="textmate-source"]'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("github", "rich", ["gist.github.com/.+"], "https://github.com/api/oembed"),
+        new $.fn.oembed.OEmbedProvider("github", "rich", ["github.com/[-.\\w@]+/[-.\\w@]+"], "https://api.github.com/repos/$1/$2?callback=?", {
+            templateRegex: /.*\/([^\/]+)\/([^\/]+).*/,
+            templateData: function(data) {
+                if (!data.data.html_url) return false;
+                return '<div class="oembedall-githubrepos"><ul class="oembedall-repo-stats"><li>' + data.data.language + '</li><li class="oembedall-watchers"><a title="Watchers" href="' + data.data.html_url + '/watchers">&#x25c9; ' + data.data.watchers + '</a></li>' + '<li class="oembedall-forks"><a title="Forks" href="' + data.data.html_url + '/network">&#x0265; ' + data.data.forks + '</a></li></ul><h3><a href="' + data.data.html_url + '">' + data.data.name + '</a></h3><div class="oembedall-body"><p class="oembedall-description">' + data.data.description + '</p>' + '<p class="oembedall-updated-at">Last updated: ' + data.data.pushed_at + '</p></div></div>';
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("facebook", "rich", ["facebook.com"], null, {
+            templateRegex: /.*\/([^\/]+)\/([^\/]+).*/,
+            template: function(url) {
+                // adding script directly to DOM to make sure that it is loaded correctly.
+                if (!$.fn.oembed.facebokScriptHasBeenAdded) {
+                    $('<div id="fb-root"></div>').appendTo('body');
+                    var script = document.createElement('script');
+                    script.type = 'text/javascript';
+                    script.text = '(function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0];if (d.getElementById(id)) return;js = d.createElement(s); js.id = id;js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.0";fjs.parentNode.insertBefore(js, fjs);}(document, "script", "facebook-jssdk"));';
+                    document.body.appendChild(script);
+                    $.fn.oembed.facebokScriptHasBeenAdded = true;
+                }
+
+                // returning template with url of facebook post.
+                return '<div class="fb-post" data-href="' + url + '" data-width="520"><div class="fb-xfbml-parse-ignore"><a href="' + url + '"></div></div>';
+
+            }
+        }),
+        /*
+         // Saving old implementation of Facebook in case we will need it as example in the future.
+         new $.fn.oembed.OEmbedProvider("facebook", "rich", ["facebook.com/(people/[^\\/]+/\\d+|[^\\/]+$)"], "https://graph.facebook.com/$2$3/?callback=?"
+         ,{templateRegex:/.*facebook.com\/(people\/[^\/]+\/(\d+).*|([^\/]+$))/,
+         templateData : function(data){ if(!data.id)return false;
+         var out =  '<div class="oembedall-facebook1"><div class="oembedall-facebook2"><a href="http://www.facebook.com/">facebook</a> ';
+         if(data.from) out += '<a href="http://www.facebook.com/'+data.from.id+'">'+data.from.name+'</a>';
+         else if(data.link) out += '<a href="'+data.link+'">'+data.name+'</a>';
+         else if(data.username) out += '<a href="http://www.facebook.com/'+data.username+'">'+data.name+'</a>';
+         else out += '<a href="http://www.facebook.com/'+data.id+'">'+data.name+'</a>';
+         out += '</div><div class="oembedall-facebookBody"><div class="contents">';
+         if(data.picture) out += '<a href="'+data.link+'"><img src="'+data.picture+'"></a>';
+         else out += '<img src="https://graph.facebook.com/'+data.id+'/picture">';
+         if(data.from) out += '<a href="'+data.link+'">'+data.name+'</a>';
+         if(data.founded) out += 'Founded: <strong>'+data.founded+'</strong><br>';
+         if(data.category) out += 'Category: <strong>'+data.category+'</strong><br>';
+         if(data.website) out += 'Website: <strong><a href="'+data.website+'">'+data.website+'</a></strong><br>';
+         if(data.gender) out += 'Gender: <strong>'+data.gender+'</strong><br>';
+         if(data.description) out += data.description + '<br>';
+         out += '</div></div>';
+         return out;
+         }
+         }),
+         */
+        new $.fn.oembed.OEmbedProvider("stackoverflow", "rich", ["stackoverflow.com/questions/[\\d]+"], "http://api.stackoverflow.com/1.1/questions/$1?body=true&jsonp=?", {
+            templateRegex: /.*questions\/([\d]+).*/,
+            templateData: function(data) {
+                if (!data.questions)
+                    return false;
+                var q = data.questions[0];
+                var body = $(q.body).text();
+                var out = '<div class="oembedall-stoqembed"><div class="oembedall-statscontainer"><div class="oembedall-statsarrow"></div><div class="oembedall-stats"><div class="oembedall-vote"><div class="oembedall-votes">' + '<span class="oembedall-vote-count-post"><strong>' + (q.up_vote_count - q.down_vote_count) + '</strong></span><div class="oembedall-viewcount">vote(s)</div></div>' + '</div><div class="oembedall-status"><strong>' + q.answer_count + '</strong>answer</div></div><div class="oembedall-views">' + q.view_count + ' view(s)</div></div>' + '<div class="oembedall-summary"><h3><a class="oembedall-question-hyperlink" href="http://stackoverflow.com/questions/' + q.question_id + '/">' + q.title + '</a></h3>' + '<div class="oembedall-excerpt">' + body.substring(0, 100) + '...</div><div class="oembedall-tags">';
+                for (i in q.tags) {
+                    out += '<a title="" class="oembedall-post-tag" href="http://stackoverflow.com/questions/tagged/' + q.tags[i] + '">' + q.tags[i] + '</a>';
+                }
+
+                out += '</div><div class="oembedall-fr"><div class="oembedall-user-info"><div class="oembedall-user-gravatar32"><a href="http://stackoverflow.com/users/' + q.owner.user_id + '/' + q.owner.display_name + '">' + '<img width="32" height="32" alt="" src="http://www.gravatar.com/avatar/' + q.owner.email_hash + '?s=32&amp;d=identicon&amp;r=PG"></a></div><div class="oembedall-user-details">' + '<a href="http://stackoverflow.com/users/' + q.owner.user_id + '/' + q.owner.display_name + '">' + q.owner.display_name + '</a><br><span title="reputation score" class="oembedall-reputation-score">' + q.owner.reputation + '</span></div></div></div></div></div>';
+                return out;
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("wordpress", "rich", ["wordpress\\.com/.+", "blogs\\.cnn\\.com/.+", "techcrunch\\.com/.+", "wp\\.me/.+"], "http://public-api.wordpress.com/oembed/1.0/?for=jquery-oembed-all"),
+        new $.fn.oembed.OEmbedProvider("screenr", "rich", ["screenr\.com"], "http://www.screenr.com/embed/$1", {
+            templateRegex: /.*\/([^\/]+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '650',
+                height: 396
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("gigpans", "rich", ["gigapan\\.org/[-.\\w@]+/\\d+"], "http://gigapan.org/gigapans/$1/options/nosnapshots/iframe/flash.html", {
+            templateRegex: /.*\/(\d+)\/?.*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '100%',
+                height: 400
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("scribd", "rich", ["scribd\\.com/.+"], "http://www.scribd.com/embeds/$1/content?start_page=1&view_mode=list", {
+            templateRegex: /.*doc\/([^\/]+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '100%',
+                height: 600
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("kickstarter", "rich", ["kickstarter\\.com/projects/.+"], "$1/widget/card.html", {
+            templateRegex: /([^\?]+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: '220',
+                height: 380
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("amazon", "rich", ["amzn.com/B+", "amazon.com.*/(B\\S+)($|\\/.*)"], "http://rcm.amazon.com/e/cm?t=_APIKEY_&o=1&p=8&l=as1&asins=$1&ref=qf_br_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr", {
+            apikey: true,
+            templateRegex: /.*\/(B[0-9A-Z]+)($|\/.*)/,
+            embedtag: {
+                tag: 'iframe',
+                width: '120px',
+                height: '240px'
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("slideshare", "rich", ["slideshare\.net"], "//www.slideshare.net/api/oembed/2", {
+            format: 'jsonp'
+        }),
+        new $.fn.oembed.OEmbedProvider("roomsharejp", "rich", ["roomshare\\.jp/(en/)?post/.*"], "http://roomshare.jp/oembed.json"),
+        new $.fn.oembed.OEmbedProvider("lanyard", "rich", ["lanyrd.com/\\d+/.+"], null, {
+            yql: {
+                xpath: '(//div[@class="primary"])[1]',
+                from: 'htmlstring',
+                datareturn: function(results) {
+                    if (!results.result)
+                        return false;
+                    return '<div class="oembedall-lanyard">' + results.result + '</div>';
+                }
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("asciiartfarts", "rich", ["asciiartfarts.com/\\d+.html"], null, {
+            yql: {
+                xpath: '//pre/font',
+                from: 'htmlstring',
+                datareturn: function(results) {
+                    if (!results.result)
+                        return false;
+                    return '<pre style="background-color:#000;">' + results.result + '</div>';
+                }
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("coveritlive", "rich", ["coveritlive.com/"], null, {
+            templateRegex: /(.*)/,
+            template: '<iframe src="$1" allowtransparency="true" scrolling="no" width="615px" frameborder="0" height="625px"></iframe>'
+        }),
+        new $.fn.oembed.OEmbedProvider("polldaddy", "rich", ["polldaddy.com/"], null, {
+            templateRegex: /(?:https?:\/\/w?w?w?.?polldaddy.com\/poll\/)([0-9]*)\//,
+            template: '<script async type="text/javascript" charset="utf-8" src="http://static.polldaddy.com/p/$1.js"></script>',
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("360io", "rich", ["360\\.io/.+"], "http://360.io/$1", {
+            templateRegex: /.*360\.io\/(\w+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("bubbli", "rich", ["on\\.bubb\\.li/.+"], "http://on.bubb.li/$1", {
+            templateRegex: /.*on\.bubb\.li\/(\w+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("cloudup", "rich", ["cloudup\\.com/.+"], "http://cloudup.com/$1?chromeless", {
+            templateRegex: [/.*cloudup\.com\/(\w+).*/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            }
+        }),
+        new $.fn.oembed.OEmbedProvider("codepen", "rich", ["codepen.io/.+"], "http://codepen.io/$1/embed/$2", {
+            templateRegex: [/.*io\/(\w+)\/pen\/(\w+).*/, /.*io\/(\w+)\/full\/(\w+).*/],
+            embedtag: {
+                tag: 'iframe',
+                width: '100%',
+                height: '300'
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("googleviews", "rich", ["(.*maps\\.google\\.com\\/maps\\?).+(output=svembed).+(cbp=(.*)).*"], "https://maps.google.com/maps?layer=c&panoid=$3&ie=UTF8&source=embed&output=svembed&cbp=$5", {
+            templateRegex: /(.*maps\.google\.com\/maps\?).+(panoid=(\w+)&).*(cbp=(.*)).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("googlemaps", "rich", ["google\\.com\/maps\/place/.+"], "http://maps.google.com/maps?t=m&q=$1&output=embed", {
+            templateRegex: /.*google\.com\/maps\/place\/([\w\+]*)\/.*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("imajize", "rich", ["embed\\.imajize\\.com/.+"], "http://embed.imajize.com/$1", {
+            templateRegex: /.*embed\.imajize\.com\/(.*)/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("mapjam", "rich", ["mapjam\\.com/.+"], "http://www.mapjam.com/$1", {
+            templateRegex: /.*mapjam\.com\/(.*)/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("polar", "rich", ["polarb\\.com/.+"], "http://assets-polarb-com.a.ssl.fastly.net/api/v4/publishers/unknown/embedded_polls/iframe?poll_id=$1", {
+            templateRegex: /.*polarb\.com\/polls\/(\w+).*/,
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+        new $.fn.oembed.OEmbedProvider("ponga", "rich", ["ponga\\.com/.+"], "https://www.ponga.com/embedded?id=$1", {
+            templateRegex: [/.*ponga\.com\/embedded\?id=(\w+).*/, /.*ponga\.com\/(\w+).*/],
+            embedtag: {
+                tag: 'iframe',
+                width: 480,
+                height: 360
+            },
+            nocache: 1
+        }),
+
+        //Use Open Graph Where applicable
+        new $.fn.oembed.OEmbedProvider("opengraph", "rich", [".*"], null, {
+            yql: {
+                xpath: "//meta|//title|//link",
+                from: 'html',
+                datareturn: function(results) {
+                    if (!results['og:title'] && results['title'] && results['description'])
+                        results['og:title'] = results['title'];
+
+                    if (!results['og:title'] && !results['title'])
+                        return false;
+
+                    var code = $('<p/>');
+                    if (results['og:video']) {
+                        var embed = $('<embed src="' + results['og:video'] + '"/>');
+                        embed.attr('type', results['og:video:type'] || "application/x-shockwave-flash")
+                            .css('max-height', settings.maxHeight || 'auto')
+                            .css('max-width', settings.maxWidth || 'auto');
+                        if (results['og:video:width'])
+                            embed.attr('width', results['og:video:width']);
+                        if (results['og:video:height'])
+                            embed.attr('height', results['og:video:height']);
+                        code.append(embed);
+                    } else if (results['og:image']) {
+                        var img = $('<img src="' + results['og:image'] + '">');
+                        img.css('max-height', settings.maxHeight || 'auto').css('max-width', settings.maxWidth || 'auto');
+                        if (results['og:image:width'])
+                            img.attr('width', results['og:image:width']);
+                        if (results['og:image:height'])
+                            img.attr('height', results['og:image:height']);
+                        code.append(img);
+                    }
+
+                    if (results['og:title'])
+                        code.append('<b>' + results['og:title'] + '</b><br/>');
+
+                    if (results['og:description'])
+                        code.append(results['og:description'] + '<br/>');
+                    else if (results['description'])
+                        code.append(results['description'] + '<br/>');
+
+                    return code;
+                }
+            }
+        })
+
+    ];
+})(jQuery);
+//This is needed for gravatar :(
+String.prototype.md5 = function() {
+    var a = function(a, b) {
+        var c = (a & 65535) + (b & 65535);
+        var d = (a >> 16) + (b >> 16) + (c >> 16);
+        return d << 16 | c & 65535
+    };
+    var b = function(a, b) {
+        return a << b | a >>> 32 - b
+    };
+    var c = function(c, d, e, f, g, h) {
+        return a(b(a(a(d, c), a(f, h)), g), e)
+    };
+    var d = function(a, b, d, e, f, g, h) {
+        return c(b & d | ~b & e, a, b, f, g, h)
+    };
+    var e = function(a, b, d, e, f, g, h) {
+        return c(b & e | d & ~e, a, b, f, g, h)
+    };
+    var f = function(a, b, d, e, f, g, h) {
+        return c(b ^ d ^ e, a, b, f, g, h)
+    };
+    var g = function(a, b, d, e, f, g, h) {
+        return c(d ^ (b | ~e), a, b, f, g, h)
+    };
+    var h = function(b) {
+        var c, h, i, j, k, l = b.length;
+        var m = 1732584193;
+        var n = -271733879;
+        var o = -1732584194;
+        var p = 271733878;
+        for (k = 0; k < l; k += 16) {
+            c = m;
+            h = n;
+            i = o;
+            j = p;
+            m = d(m, n, o, p, b[k + 0], 7, -680876936);
+            p = d(p, m, n, o, b[k + 1], 12, -389564586);
+            o = d(o, p, m, n, b[k + 2], 17, 606105819);
+            n = d(n, o, p, m, b[k + 3], 22, -1044525330);
+            m = d(m, n, o, p, b[k + 4], 7, -176418897);
+            p = d(p, m, n, o, b[k + 5], 12, 1200080426);
+            o = d(o, p, m, n, b[k + 6], 17, -1473231341);
+            n = d(n, o, p, m, b[k + 7], 22, -45705983);
+            m = d(m, n, o, p, b[k + 8], 7, 1770035416);
+            p = d(p, m, n, o, b[k + 9], 12, -1958414417);
+            o = d(o, p, m, n, b[k + 10], 17, -42063);
+            n = d(n, o, p, m, b[k + 11], 22, -1990404162);
+            m = d(m, n, o, p, b[k + 12], 7, 1804603682);
+            p = d(p, m, n, o, b[k + 13], 12, -40341101);
+            o = d(o, p, m, n, b[k + 14], 17, -1502002290);
+            n = d(n, o, p, m, b[k + 15], 22, 1236535329);
+            m = e(m, n, o, p, b[k + 1], 5, -165796510);
+            p = e(p, m, n, o, b[k + 6], 9, -1069501632);
+            o = e(o, p, m, n, b[k + 11], 14, 643717713);
+            n = e(n, o, p, m, b[k + 0], 20, -373897302);
+            m = e(m, n, o, p, b[k + 5], 5, -701558691);
+            p = e(p, m, n, o, b[k + 10], 9, 38016083);
+            o = e(o, p, m, n, b[k + 15], 14, -660478335);
+            n = e(n, o, p, m, b[k + 4], 20, -405537848);
+            m = e(m, n, o, p, b[k + 9], 5, 568446438);
+            p = e(p, m, n, o, b[k + 14], 9, -1019803690);
+            o = e(o, p, m, n, b[k + 3], 14, -187363961);
+            n = e(n, o, p, m, b[k + 8], 20, 1163531501);
+            m = e(m, n, o, p, b[k + 13], 5, -1444681467);
+            p = e(p, m, n, o, b[k + 2], 9, -51403784);
+            o = e(o, p, m, n, b[k + 7], 14, 1735328473);
+            n = e(n, o, p, m, b[k + 12], 20, -1926607734);
+            m = f(m, n, o, p, b[k + 5], 4, -378558);
+            p = f(p, m, n, o, b[k + 8], 11, -2022574463);
+            o = f(o, p, m, n, b[k + 11], 16, 1839030562);
+            n = f(n, o, p, m, b[k + 14], 23, -35309556);
+            m = f(m, n, o, p, b[k + 1], 4, -1530992060);
+            p = f(p, m, n, o, b[k + 4], 11, 1272893353);
+            o = f(o, p, m, n, b[k + 7], 16, -155497632);
+            n = f(n, o, p, m, b[k + 10], 23, -1094730640);
+            m = f(m, n, o, p, b[k + 13], 4, 681279174);
+            p = f(p, m, n, o, b[k + 0], 11, -358537222);
+            o = f(o, p, m, n, b[k + 3], 16, -722521979);
+            n = f(n, o, p, m, b[k + 6], 23, 76029189);
+            m = f(m, n, o, p, b[k + 9], 4, -640364487);
+            p = f(p, m, n, o, b[k + 12], 11, -421815835);
+            o = f(o, p, m, n, b[k + 15], 16, 530742520);
+            n = f(n, o, p, m, b[k + 2], 23, -995338651);
+            m = g(m, n, o, p, b[k + 0], 6, -198630844);
+            p = g(p, m, n, o, b[k + 7], 10, 1126891415);
+            o = g(o, p, m, n, b[k + 14], 15, -1416354905);
+            n = g(n, o, p, m, b[k + 5], 21, -57434055);
+            m = g(m, n, o, p, b[k + 12], 6, 1700485571);
+            p = g(p, m, n, o, b[k + 3], 10, -1894986606);
+            o = g(o, p, m, n, b[k + 10], 15, -1051523);
+            n = g(n, o, p, m, b[k + 1], 21, -2054922799);
+            m = g(m, n, o, p, b[k + 8], 6, 1873313359);
+            p = g(p, m, n, o, b[k + 15], 10, -30611744);
+            o = g(o, p, m, n, b[k + 6], 15, -1560198380);
+            n = g(n, o, p, m, b[k + 13], 21, 1309151649);
+            m = g(m, n, o, p, b[k + 4], 6, -145523070);
+            p = g(p, m, n, o, b[k + 11], 10, -1120210379);
+            o = g(o, p, m, n, b[k + 2], 15, 718787259);
+            n = g(n, o, p, m, b[k + 9], 21, -343485551);
+            m = a(m, c);
+            n = a(n, h);
+            o = a(o, i);
+            p = a(p, j)
+        }
+        return [m, n, o, p]
+    };
+    var i = function(a) {
+        var b = "0123456789abcdef",
+            c = "",
+            d, e = a.length * 4;
+        for (d = 0; d < e; d++) {
+            c += b.charAt(a[d >> 2] >> d % 4 * 8 + 4 & 15) + b.charAt(a[d >> 2] >> d % 4 * 8 & 15)
+        }
+        return c
+    };
+    var j = function(a) {
+        var b = (a.length + 8 >> 6) + 1;
+        var c = [],
+            d, e = b * 16,
+            f, g = a.length;
+        for (d = 0; d < e; d++) {
+            c.push(0)
+        }
+        for (f = 0; f < g; f++) {
+            c[f >> 2] |= (a.charCodeAt(f) & 255) << f % 4 * 8
+        }
+        c[f >> 2] |= 128 << f % 4 * 8;
+        c[b * 16 - 2] = g * 8;
+        return c
+    };
+    return i(h(j(this)))
+};
diff --git a/static/assets/stylesheets/_bootstrap-compass.scss b/static/assets/stylesheets/_bootstrap-compass.scss
new file mode 100644
index 0000000000000000000000000000000000000000..8fbc3cda5e3d58d102ab2661543e0769fd21ba5b
--- /dev/null
+++ b/static/assets/stylesheets/_bootstrap-compass.scss
@@ -0,0 +1,9 @@
+@function twbs-font-path($path) {
+  @return font-url($path, true);
+}
+
+@function twbs-image-path($path) {
+  @return image-url($path, true);
+}
+
+$bootstrap-sass-asset-helper: true;
diff --git a/static/assets/stylesheets/_bootstrap-mincer.scss b/static/assets/stylesheets/_bootstrap-mincer.scss
new file mode 100644
index 0000000000000000000000000000000000000000..7ec4657417aae9959960d21046dac9d251ba569e
--- /dev/null
+++ b/static/assets/stylesheets/_bootstrap-mincer.scss
@@ -0,0 +1,19 @@
+// Mincer asset helper functions
+//
+// This must be imported into a .css.ejs.scss file.
+// Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation.
+
+
+@function twbs-font-path($path) {
+  // do something like following
+  // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>"
+  // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>"
+  // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>"
+  @return "<%- asset_path('#{$path}'.replace(/[#?].*$/, '')) + '#{$path}'.replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>";
+}
+
+@function twbs-image-path($file) {
+  @return "<%- asset_path('#{$file}') %>";
+}
+
+$bootstrap-sass-asset-helper: true;
diff --git a/static/assets/stylesheets/_bootstrap-sprockets.scss b/static/assets/stylesheets/_bootstrap-sprockets.scss
new file mode 100644
index 0000000000000000000000000000000000000000..9fffc1eb4b1b9aac66c9329cd6691c33483313c5
--- /dev/null
+++ b/static/assets/stylesheets/_bootstrap-sprockets.scss
@@ -0,0 +1,9 @@
+@function twbs-font-path($path) {
+  @return font-path($path);
+}
+
+@function twbs-image-path($path) {
+  @return image-path($path);
+}
+
+$bootstrap-sass-asset-helper: true;
diff --git a/static/assets/stylesheets/bootstrap.scss b/static/assets/stylesheets/bootstrap.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1b2c7a37581e2907a7fa479f4fab330f2ea64220
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap.scss
@@ -0,0 +1,65 @@
+
+// Fonts
+@import url(http://fonts.googleapis.com/css?family=Montserrat:400,700);
+
+// Custom Utilities
+@import "theme/mixins";
+@import "theme/utilities";
+
+// Core variables and mixins
+@import "bootstrap/variables";
+@import "bootstrap/mixins";
+
+// Reset and dependencies
+@import "bootstrap/normalize";
+@import "bootstrap/print";
+//@import "bootstrap/glyphicons";
+
+// Core CSS
+@import "bootstrap/scaffolding";
+@import "bootstrap/type";
+@import "bootstrap/code";
+@import "bootstrap/grid";
+@import "bootstrap/tables";
+@import "bootstrap/forms";
+@import "bootstrap/buttons";
+
+// Components
+@import "bootstrap/component-animations";
+@import "bootstrap/dropdowns";
+@import "bootstrap/button-groups";
+@import "bootstrap/input-groups";
+@import "bootstrap/navs";
+@import "bootstrap/navbar";
+@import "bootstrap/breadcrumbs";
+@import "bootstrap/pagination";
+@import "bootstrap/pager";
+@import "bootstrap/labels";
+@import "bootstrap/badges";
+@import "bootstrap/jumbotron";
+@import "bootstrap/thumbnails";
+@import "bootstrap/alerts";
+@import "bootstrap/progress-bars";
+@import "bootstrap/media";
+@import "bootstrap/list-group";
+@import "bootstrap/panels";
+@import "bootstrap/responsive-embed";
+@import "bootstrap/wells";
+@import "bootstrap/close";
+
+// Components w/ JavaScript
+@import "bootstrap/modals";
+@import "bootstrap/tooltip";
+@import "bootstrap/popovers";
+@import "bootstrap/carousel";
+
+// Utility classes
+@import "bootstrap/utilities";
+@import "bootstrap/responsive-utilities";
+
+
+
+// Custom Theme
+@import "theme/header";
+@import "theme/main";
+@import "theme/footer";
diff --git a/static/assets/stylesheets/bootstrap/_alerts.scss b/static/assets/stylesheets/bootstrap/_alerts.scss
new file mode 100644
index 0000000000000000000000000000000000000000..372eec974ea3ea4ad72d45b64775e2def8b50acc
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_alerts.scss
@@ -0,0 +1,73 @@
+//
+// Alerts
+// --------------------------------------------------
+
+
+// Base styles
+// -------------------------
+
+.alert {
+  padding: $alert-padding;
+  margin-bottom: $line-height-computed;
+  border: 1px solid transparent;
+  border-radius: $alert-border-radius;
+
+  // Headings for larger alerts
+  h4 {
+    margin-top: 0;
+    // Specified for the h4 to prevent conflicts of changing $headings-color
+    color: inherit;
+  }
+  
+  // Provide class for links that match alerts
+  .alert-link {
+    font-weight: $alert-link-font-weight;
+  }
+
+  // Improve alignment and spacing of inner content
+  > p,
+  > ul {
+    margin-bottom: 0;
+  }
+  
+  > p + p {
+    margin-top: 5px;
+  }
+}
+
+// Dismissible alerts
+//
+// Expand the right padding and account for the close button's positioning.
+
+.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
+.alert-dismissible {
+  padding-right: ($alert-padding + 20);
+
+  // Adjust close link position
+  .close {
+    position: relative;
+    top: -2px;
+    right: -21px;
+    color: inherit;
+  }
+}
+
+// Alternate styles
+//
+// Generate contextual modifier classes for colorizing the alert.
+
+.alert-success {
+  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
+}
+
+.alert-info {
+  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
+}
+
+.alert-warning {
+  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
+}
+
+.alert-danger {
+  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
+}
diff --git a/static/assets/stylesheets/bootstrap/_badges.scss b/static/assets/stylesheets/bootstrap/_badges.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a647592db9dcf9594c74c77e7c8df80e1e54512f
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_badges.scss
@@ -0,0 +1,67 @@
+//
+// Badges
+// --------------------------------------------------
+
+
+// Base class
+.badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: 3px 7px;
+  font-size: $font-size-small;
+  font-weight: $badge-font-weight;
+  color: $badge-color;
+  line-height: $badge-line-height;
+  vertical-align: baseline;
+  white-space: nowrap;
+  text-align: center;
+  background-color: $badge-bg;
+  border-radius: $badge-border-radius;
+
+  // Empty badges collapse automatically (not available in IE8)
+  &:empty {
+    display: none;
+  }
+
+  // Quick fix for badges in buttons
+  .btn & {
+    position: relative;
+    top: -1px;
+  }
+  
+  .btn-xs & {
+    top: 0;
+    padding: 1px 5px;
+  }
+
+  // [converter] extracted a& to a.badge
+
+  // Account for badges in navs
+  .list-group-item.active > &,
+  .nav-pills > .active > a > & {
+    color: $badge-active-color;
+    background-color: $badge-active-bg;
+  }
+  
+  .list-group-item > & {
+    float: right;
+  }
+  
+  .list-group-item > & + & {
+    margin-right: 5px;
+  }
+  
+  .nav-pills > li > a > & {
+    margin-left: 3px;
+  }
+}
+
+// Hover state, but only for links
+a.badge {
+  &:hover,
+  &:focus {
+    color: $badge-link-hover-color;
+    text-decoration: none;
+    cursor: pointer;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_breadcrumbs.scss b/static/assets/stylesheets/bootstrap/_breadcrumbs.scss
new file mode 100644
index 0000000000000000000000000000000000000000..51b676cbe1e64b1a146193ae90a12a319986ba95
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_breadcrumbs.scss
@@ -0,0 +1,26 @@
+//
+// Breadcrumbs
+// --------------------------------------------------
+
+
+.breadcrumb {
+  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;
+  margin-bottom: $line-height-computed;
+  list-style: none;
+  background-color: $breadcrumb-bg;
+  border-radius: $border-radius-base;
+
+  > li {
+    display: inline-block;
+
+    + li:before {
+      content: #{$breadcrumb-separator}\00a0; // Unicode space added since inline-block means non-collapsing white-space
+      padding: 0 5px;
+      color: $breadcrumb-color;
+    }
+  }
+
+  > .active {
+    color: $breadcrumb-active-color;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_button-groups.scss b/static/assets/stylesheets/bootstrap/_button-groups.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a73bc54d344574740480f3f80c68001d500245ca
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_button-groups.scss
@@ -0,0 +1,243 @@
+//
+// Button groups
+// --------------------------------------------------
+
+// Make the div behave like a button
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle; // match .btn alignment given font-size hack above
+  > .btn {
+    position: relative;
+    float: left;
+    // Bring the "active" button to the front
+    &:hover,
+    &:focus,
+    &:active,
+    &.active {
+      z-index: 2;
+    }
+  }
+}
+
+// Prevent double borders when buttons are next to each other
+.btn-group {
+  .btn + .btn,
+  .btn + .btn-group,
+  .btn-group + .btn,
+  .btn-group + .btn-group {
+    margin-left: -1px;
+  }
+}
+
+// Optional: Group multiple button groups together for a toolbar
+.btn-toolbar {
+  margin-left: -5px; // Offset the first child's margin
+  @include clearfix;
+
+  .btn-group,
+  .input-group {
+    float: left;
+  }
+  > .btn,
+  > .btn-group,
+  > .input-group {
+    margin-left: 5px;
+  }
+}
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+
+// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  &:not(:last-child):not(.dropdown-toggle) {
+    @include border-right-radius(0);
+  }
+}
+// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  @include border-left-radius(0);
+}
+
+// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child:not(:last-child) {
+  > .btn:last-child,
+  > .dropdown-toggle {
+    @include border-right-radius(0);
+  }
+}
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  @include border-left-radius(0);
+}
+
+// On active and open, don't show outline
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+
+// Sizing
+//
+// Remix the default button sizing classes into new ones for easier manipulation.
+
+.btn-group-xs > .btn { @extend .btn-xs; }
+.btn-group-sm > .btn { @extend .btn-sm; }
+.btn-group-lg > .btn { @extend .btn-lg; }
+
+
+// Split button dropdowns
+// ----------------------
+
+// Give the line between buttons some depth
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+
+// The clickable button for toggling the menu
+// Remove the gradient and set the same inset shadow as the :active state
+.btn-group.open .dropdown-toggle {
+  @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
+
+  // Show no shadow for `.btn-link` since it has no other button styles.
+  &.btn-link {
+    @include box-shadow(none);
+  }
+}
+
+
+// Reposition the caret
+.btn .caret {
+  margin-left: 0;
+}
+// Carets in other button sizes
+.btn-lg .caret {
+  border-width: $caret-width-large $caret-width-large 0;
+  border-bottom-width: 0;
+}
+// Upside down carets for .dropup
+.dropup .btn-lg .caret {
+  border-width: 0 $caret-width-large $caret-width-large;
+}
+
+
+// Vertical button groups
+// ----------------------
+
+.btn-group-vertical {
+  > .btn,
+  > .btn-group,
+  > .btn-group > .btn {
+    display: block;
+    float: none;
+    width: 100%;
+    max-width: 100%;
+  }
+
+  // Clear floats so dropdown menus can be properly placed
+  > .btn-group {
+    @include clearfix;
+    > .btn {
+      float: none;
+    }
+  }
+
+  > .btn + .btn,
+  > .btn + .btn-group,
+  > .btn-group + .btn,
+  > .btn-group + .btn-group {
+    margin-top: -1px;
+    margin-left: 0;
+  }
+}
+
+.btn-group-vertical > .btn {
+  &:not(:first-child):not(:last-child) {
+    border-radius: 0;
+  }
+  &:first-child:not(:last-child) {
+    border-top-right-radius: $border-radius-base;
+    @include border-bottom-radius(0);
+  }
+  &:last-child:not(:first-child) {
+    border-bottom-left-radius: $border-radius-base;
+    @include border-top-radius(0);
+  }
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) {
+  > .btn:last-child,
+  > .dropdown-toggle {
+    @include border-bottom-radius(0);
+  }
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  @include border-top-radius(0);
+}
+
+
+// Justified button groups
+// ----------------------
+
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+  > .btn,
+  > .btn-group {
+    float: none;
+    display: table-cell;
+    width: 1%;
+  }
+  > .btn-group .btn {
+    width: 100%;
+  }
+
+  > .btn-group .dropdown-menu {
+    left: auto;
+  }
+}
+
+
+// Checkbox and radio options
+//
+// In order to support the browser's form validation feedback, powered by the
+// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
+// `display: none;` or `visibility: hidden;` as that also hides the popover.
+// Simply visually hiding the inputs via `opacity` would leave them clickable in
+// certain cases which is prevented by using `clip` and `pointer-events`.
+// This way, we ensure a DOM element is visible to position the popover from.
+//
+// See https://github.com/twbs/bootstrap/pull/12794 and
+// https://github.com/twbs/bootstrap/pull/14559 for more information.
+
+[data-toggle="buttons"] {
+  > .btn,
+  > .btn-group > .btn {
+    input[type="radio"],
+    input[type="checkbox"] {
+      position: absolute;
+      clip: rect(0,0,0,0);
+      pointer-events: none;
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_buttons.scss b/static/assets/stylesheets/bootstrap/_buttons.scss
new file mode 100644
index 0000000000000000000000000000000000000000..7f0db45881528b0f232fc5de006289af42cbcce7
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_buttons.scss
@@ -0,0 +1,160 @@
+//
+// Buttons
+// --------------------------------------------------
+
+
+// Base styles
+// --------------------------------------------------
+
+.btn {
+  display: inline-block;
+  margin-bottom: 0; // For input.btn
+  font-weight: $btn-font-weight;
+  text-align: center;
+  vertical-align: middle;
+  touch-action: manipulation;
+  cursor: pointer;
+  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+  border: 1px solid transparent;
+  white-space: nowrap;
+  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $border-radius-base);
+  @include user-select(none);
+
+  &,
+  &:active,
+  &.active {
+    &:focus,
+    &.focus {
+      @include tab-focus;
+    }
+  }
+
+  &:hover,
+  &:focus,
+  &.focus {
+    color: $btn-default-color;
+    text-decoration: none;
+  }
+
+  &:active,
+  &.active {
+    outline: 0;
+    background-image: none;
+    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
+  }
+
+  &.disabled,
+  &[disabled],
+  fieldset[disabled] & {
+    cursor: $cursor-disabled;
+    pointer-events: none; // Future-proof disabling of clicks
+    @include opacity(.65);
+    @include box-shadow(none);
+  }
+}
+
+
+// Alternate buttons
+// --------------------------------------------------
+
+.btn-default {
+  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);
+}
+.btn-primary {
+  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);
+}
+// Success appears as green
+.btn-success {
+  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);
+}
+// Info appears as blue-green
+.btn-info {
+  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);
+}
+// Warning appears as orange
+.btn-warning {
+  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);
+}
+// Danger and error appear as red
+.btn-danger {
+  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);
+}
+
+
+// Link buttons
+// -------------------------
+
+// Make a button look and behave like a link
+.btn-link {
+  color: $link-color;
+  font-weight: normal;
+  border-radius: 0;
+
+  &,
+  &:active,
+  &.active,
+  &[disabled],
+  fieldset[disabled] & {
+    background-color: transparent;
+    @include box-shadow(none);
+  }
+  &,
+  &:hover,
+  &:focus,
+  &:active {
+    border-color: transparent;
+  }
+  &:hover,
+  &:focus {
+    color: $link-hover-color;
+    text-decoration: $link-hover-decoration;
+    background-color: transparent;
+  }
+  &[disabled],
+  fieldset[disabled] & {
+    &:hover,
+    &:focus {
+      color: $btn-link-disabled-color;
+      text-decoration: none;
+    }
+  }
+}
+
+
+// Button Sizes
+// --------------------------------------------------
+
+.btn-lg {
+  // line-height: ensure even-numbered height of button next to large input
+  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
+}
+.btn-sm {
+  // line-height: ensure proper height of button next to small input
+  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
+}
+.btn-xs {
+  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $border-radius-small);
+}
+
+
+// Block button
+// --------------------------------------------------
+
+.btn-block {
+  display: block;
+  width: 100%;
+}
+
+// Vertically space out multiple block buttons
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+// Specificity overrides
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+  &.btn-block {
+    width: 100%;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_carousel.scss b/static/assets/stylesheets/bootstrap/_carousel.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f91d7ee3033f1a806b2322d3a0fe157ec0f656ab
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_carousel.scss
@@ -0,0 +1,269 @@
+//
+// Carousel
+// --------------------------------------------------
+
+
+// Wrapper for the slide container and indicators
+.carousel {
+  position: relative;
+}
+
+.carousel-inner {
+  position: relative;
+  overflow: hidden;
+  width: 100%;
+
+  > .item {
+    display: none;
+    position: relative;
+    @include transition(.6s ease-in-out left);
+
+    // Account for jankitude on images
+    > img,
+    > a > img {
+      @include img-responsive;
+      line-height: 1;
+    }
+
+    // WebKit CSS3 transforms for supported devices
+    @media all and (transform-3d), (-webkit-transform-3d) {
+      @include transition-transform(0.6s ease-in-out);
+      @include backface-visibility(hidden);
+      @include perspective(1000);
+
+      &.next,
+      &.active.right {
+        @include translate3d(100%, 0, 0);
+        left: 0;
+      }
+      &.prev,
+      &.active.left {
+        @include translate3d(-100%, 0, 0);
+        left: 0;
+      }
+      &.next.left,
+      &.prev.right,
+      &.active {
+        @include translate3d(0, 0, 0);
+        left: 0;
+      }
+    }
+  }
+
+  > .active,
+  > .next,
+  > .prev {
+    display: block;
+  }
+
+  > .active {
+    left: 0;
+  }
+
+  > .next,
+  > .prev {
+    position: absolute;
+    top: 0;
+    width: 100%;
+  }
+
+  > .next {
+    left: 100%;
+  }
+  > .prev {
+    left: -100%;
+  }
+  > .next.left,
+  > .prev.right {
+    left: 0;
+  }
+
+  > .active.left {
+    left: -100%;
+  }
+  > .active.right {
+    left: 100%;
+  }
+
+}
+
+// Left/right controls for nav
+// ---------------------------
+
+.carousel-control {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  width: $carousel-control-width;
+  @include opacity($carousel-control-opacity);
+  font-size: $carousel-control-font-size;
+  color: $carousel-control-color;
+  text-align: center;
+  text-shadow: $carousel-text-shadow;
+  // We can't have this transition here because WebKit cancels the carousel
+  // animation if you trip this while in the middle of another animation.
+
+  // Set gradients for backgrounds
+  &.left {
+    @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));
+  }
+  &.right {
+    left: auto;
+    right: 0;
+    @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));
+  }
+
+  // Hover/focus state
+  &:hover,
+  &:focus {
+    outline: 0;
+    color: $carousel-control-color;
+    text-decoration: none;
+    @include opacity(.9);
+  }
+
+  // Toggles
+  .icon-prev,
+  .icon-next,
+  .glyphicon-chevron-left,
+  .glyphicon-chevron-right {
+    position: absolute;
+    top: 50%;
+    z-index: 5;
+    display: inline-block;
+  }
+  .icon-prev,
+  .glyphicon-chevron-left {
+    left: 50%;
+    margin-left: -10px;
+  }
+  .icon-next,
+  .glyphicon-chevron-right {
+    right: 50%;
+    margin-right: -10px;
+  }
+  .icon-prev,
+  .icon-next {
+    width:  20px;
+    height: 20px;
+    margin-top: -10px;
+    line-height: 1;
+    font-family: serif;
+  }
+
+
+  .icon-prev {
+    &:before {
+      content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
+    }
+  }
+  .icon-next {
+    &:before {
+      content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
+    }
+  }
+}
+
+// Optional indicator pips
+//
+// Add an unordered list with the following class and add a list item for each
+// slide your carousel holds.
+
+.carousel-indicators {
+  position: absolute;
+  bottom: 10px;
+  left: 50%;
+  z-index: 15;
+  width: 60%;
+  margin-left: -30%;
+  padding-left: 0;
+  list-style: none;
+  text-align: center;
+
+  li {
+    display: inline-block;
+    width:  10px;
+    height: 10px;
+    margin: 1px;
+    text-indent: -999px;
+    border: 1px solid $carousel-indicator-border-color;
+    border-radius: 10px;
+    cursor: pointer;
+
+    // IE8-9 hack for event handling
+    //
+    // Internet Explorer 8-9 does not support clicks on elements without a set
+    // `background-color`. We cannot use `filter` since that's not viewed as a
+    // background color by the browser. Thus, a hack is needed.
+    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
+    //
+    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
+    // set alpha transparency for the best results possible.
+    background-color: #000 \9; // IE8
+    background-color: rgba(0,0,0,0); // IE9
+  }
+  .active {
+    margin: 0;
+    width:  12px;
+    height: 12px;
+    background-color: $carousel-indicator-active-bg;
+  }
+}
+
+// Optional captions
+// -----------------------------
+// Hidden by default for smaller viewports
+.carousel-caption {
+  position: absolute;
+  left: 15%;
+  right: 15%;
+  bottom: 20px;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: $carousel-caption-color;
+  text-align: center;
+  text-shadow: $carousel-text-shadow;
+  & .btn {
+    text-shadow: none; // No shadow for button elements in carousel-caption
+  }
+}
+
+
+// Scale up controls for tablets and up
+@media screen and (min-width: $screen-sm-min) {
+
+  // Scale up the controls a smidge
+  .carousel-control {
+    .glyphicon-chevron-left,
+    .glyphicon-chevron-right,
+    .icon-prev,
+    .icon-next {
+      width: 30px;
+      height: 30px;
+      margin-top: -15px;
+      font-size: 30px;
+    }
+    .glyphicon-chevron-left,
+    .icon-prev {
+      margin-left: -15px;
+    }
+    .glyphicon-chevron-right,
+    .icon-next {
+      margin-right: -15px;
+    }
+  }
+
+  // Show and left align the captions
+  .carousel-caption {
+    left: 20%;
+    right: 20%;
+    padding-bottom: 30px;
+  }
+
+  // Move up the indicators
+  .carousel-indicators {
+    bottom: 20px;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_close.scss b/static/assets/stylesheets/bootstrap/_close.scss
new file mode 100644
index 0000000000000000000000000000000000000000..3b74d8a973c2be2a1c5ae3002a5935de577dda30
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_close.scss
@@ -0,0 +1,36 @@
+//
+// Close icons
+// --------------------------------------------------
+
+
+.close {
+  float: right;
+  font-size: ($font-size-base * 1.5);
+  font-weight: $close-font-weight;
+  line-height: 1;
+  color: $close-color;
+  text-shadow: $close-text-shadow;
+  @include opacity(.2);
+
+  &:hover,
+  &:focus {
+    color: $close-color;
+    text-decoration: none;
+    cursor: pointer;
+    @include opacity(.5);
+  }
+
+  // [converter] extracted button& to button.close
+}
+
+// Additional properties for button version
+// iOS requires the button element instead of an anchor tag.
+// If you want the anchor version, it requires `href="#"`.
+// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
diff --git a/static/assets/stylesheets/bootstrap/_code.scss b/static/assets/stylesheets/bootstrap/_code.scss
new file mode 100644
index 0000000000000000000000000000000000000000..caa5f06304c8e575b3fabdfdc7639af6d4053cd2
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_code.scss
@@ -0,0 +1,69 @@
+//
+// Code (inline and block)
+// --------------------------------------------------
+
+
+// Inline and block code styles
+code,
+kbd,
+pre,
+samp {
+  font-family: $font-family-monospace;
+}
+
+// Inline code
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: $code-color;
+  background-color: $code-bg;
+  border-radius: $border-radius-base;
+}
+
+// User input typically entered via keyboard
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: $kbd-color;
+  background-color: $kbd-bg;
+  border-radius: $border-radius-small;
+  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
+
+  kbd {
+    padding: 0;
+    font-size: 100%;
+    font-weight: bold;
+    box-shadow: none;
+  }
+}
+
+// Blocks of code
+pre {
+  display: block;
+  padding: (($line-height-computed - 1) / 2);
+  margin: 0 0 ($line-height-computed / 2);
+  font-size: ($font-size-base - 1); // 14px to 13px
+  line-height: $line-height-base;
+  word-break: break-all;
+  word-wrap: break-word;
+  color: $pre-color;
+  background-color: $pre-bg;
+  border: 1px solid $pre-border-color;
+  border-radius: $border-radius-base;
+
+  // Account for some code outputs that place code tags in pre tags
+  code {
+    padding: 0;
+    font-size: inherit;
+    color: inherit;
+    white-space: pre-wrap;
+    background-color: transparent;
+    border-radius: 0;
+  }
+}
+
+// Enable scrollable blocks of code
+.pre-scrollable {
+  max-height: $pre-scrollable-max-height;
+  overflow-y: scroll;
+}
diff --git a/static/assets/stylesheets/bootstrap/_component-animations.scss b/static/assets/stylesheets/bootstrap/_component-animations.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1f76b8c0dfad482ac3c3de88f4f01d31a7f24334
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_component-animations.scss
@@ -0,0 +1,38 @@
+//
+// Component animations
+// --------------------------------------------------
+
+// Heads up!
+//
+// We don't use the `.opacity()` mixin here since it causes a bug with text
+// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
+
+.fade {
+  opacity: 0;
+  @include transition(opacity .15s linear);
+  &.in {
+    opacity: 1;
+  }
+}
+
+.collapse {
+  display: none;
+  visibility: hidden;
+
+  &.in      { display: block; visibility: visible; }
+  // [converter] extracted tr&.in to tr.collapse.in
+  // [converter] extracted tbody&.in to tbody.collapse.in
+}
+
+tr.collapse.in    { display: table-row; }
+
+tbody.collapse.in { display: table-row-group; }
+
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  @include transition-property(height, visibility);
+  @include transition-duration(.35s);
+  @include transition-timing-function(ease);
+}
diff --git a/static/assets/stylesheets/bootstrap/_dropdowns.scss b/static/assets/stylesheets/bootstrap/_dropdowns.scss
new file mode 100644
index 0000000000000000000000000000000000000000..b8120b8e70ae48b23e75a601cf561af821496d55
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_dropdowns.scss
@@ -0,0 +1,214 @@
+//
+// Dropdown menus
+// --------------------------------------------------
+
+
+// Dropdown arrow/caret
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top:   $caret-width-base solid;
+  border-right: $caret-width-base solid transparent;
+  border-left:  $caret-width-base solid transparent;
+}
+
+// The dropdown wrapper (div)
+.dropup,
+.dropdown {
+  position: relative;
+}
+
+// Prevent the focus on the dropdown toggle when closing dropdowns
+.dropdown-toggle:focus {
+  outline: 0;
+}
+
+// The dropdown menu (ul)
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: $zindex-dropdown;
+  display: none; // none by default, but block on "open" of the menu
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0; // override default ul
+  list-style: none;
+  font-size: $font-size-base;
+  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
+  background-color: $dropdown-bg;
+  border: 1px solid $dropdown-fallback-border; // IE8 fallback
+  border: 1px solid $dropdown-border;
+  border-radius: $border-radius-base;
+  @include box-shadow(0 6px 12px rgba(0,0,0,.175));
+  background-clip: padding-box;
+
+  // Aligns the dropdown menu to right
+  //
+  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
+  &.pull-right {
+    right: 0;
+    left: auto;
+  }
+
+  // Dividers (basically an hr) within the dropdown
+  .divider {
+    @include nav-divider($dropdown-divider-bg);
+  }
+
+  // Links within the dropdown menu
+  > li > a {
+    display: block;
+    padding: 3px 20px;
+    clear: both;
+    font-weight: normal;
+    line-height: $line-height-base;
+    color: $dropdown-link-color;
+    white-space: nowrap; // prevent links from randomly breaking onto new lines
+  }
+}
+
+// Hover/Focus state
+.dropdown-menu > li > a {
+  &:hover,
+  &:focus {
+    text-decoration: none;
+    color: $dropdown-link-hover-color;
+    background-color: $dropdown-link-hover-bg;
+  }
+}
+
+// Active state
+.dropdown-menu > .active > a {
+  &,
+  &:hover,
+  &:focus {
+    color: $dropdown-link-active-color;
+    text-decoration: none;
+    outline: 0;
+    background-color: $dropdown-link-active-bg;
+  }
+}
+
+// Disabled state
+//
+// Gray out text and ensure the hover/focus state remains gray
+
+.dropdown-menu > .disabled > a {
+  &,
+  &:hover,
+  &:focus {
+    color: $dropdown-link-disabled-color;
+  }
+
+  // Nuke hover/focus effects
+  &:hover,
+  &:focus {
+    text-decoration: none;
+    background-color: transparent;
+    background-image: none; // Remove CSS gradient
+    @include reset-filter;
+    cursor: $cursor-disabled;
+  }
+}
+
+// Open state for the dropdown
+.open {
+  // Show the menu
+  > .dropdown-menu {
+    display: block;
+  }
+
+  // Remove the outline when :focus is triggered
+  > a {
+    outline: 0;
+  }
+}
+
+// Menu positioning
+//
+// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
+// menu with the parent.
+.dropdown-menu-right {
+  left: auto; // Reset the default from `.dropdown-menu`
+  right: 0;
+}
+// With v3, we enabled auto-flipping if you have a dropdown within a right
+// aligned nav component. To enable the undoing of that, we provide an override
+// to restore the default dropdown menu alignment.
+//
+// This is only for left-aligning a dropdown menu within a `.navbar-right` or
+// `.pull-right` nav component.
+.dropdown-menu-left {
+  left: 0;
+  right: auto;
+}
+
+// Dropdown section headers
+.dropdown-header {
+  display: block;
+  padding: 3px 20px;
+  font-size: $font-size-small;
+  line-height: $line-height-base;
+  color: $dropdown-header-color;
+  white-space: nowrap; // as with > li > a
+}
+
+// Backdrop to catch body clicks on mobile, etc.
+.dropdown-backdrop {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  top: 0;
+  z-index: ($zindex-dropdown - 10);
+}
+
+// Right aligned dropdowns
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+// Allow for dropdowns to go bottom up (aka, dropup-menu)
+//
+// Just add .dropup after the standard .dropdown class and you're set, bro.
+// TODO: abstract this so that the navbar fixed styles are not placed here?
+
+.dropup,
+.navbar-fixed-bottom .dropdown {
+  // Reverse the caret
+  .caret {
+    border-top: 0;
+    border-bottom: $caret-width-base solid;
+    content: "";
+  }
+  // Different positioning for bottom up menu
+  .dropdown-menu {
+    top: auto;
+    bottom: 100%;
+    margin-bottom: 2px;
+  }
+}
+
+
+// Component alignment
+//
+// Reiterate per navbar.less and the modified component alignment there.
+
+@media (min-width: $grid-float-breakpoint) {
+  .navbar-right {
+    .dropdown-menu {
+      right: 0; left: auto;
+    }
+    // Necessary for overrides of the default right aligned menu.
+    // Will remove come v4 in all likelihood.
+    .dropdown-menu-left {
+      left: 0; right: auto;
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_forms.scss b/static/assets/stylesheets/bootstrap/_forms.scss
new file mode 100644
index 0000000000000000000000000000000000000000..72d130b74a2610f8ae545fcf144a6fc0edea1a02
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_forms.scss
@@ -0,0 +1,570 @@
+//
+// Forms
+// --------------------------------------------------
+
+
+// Normalize non-controls
+//
+// Restyle and baseline non-control form elements.
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,
+  // so we reset that to ensure it behaves more like a standard block element.
+  // See https://github.com/twbs/bootstrap/issues/12359.
+  min-width: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: $line-height-computed;
+  font-size: ($font-size-base * 1.5);
+  line-height: inherit;
+  color: $legend-color;
+  border: 0;
+  border-bottom: 1px solid $legend-border-color;
+}
+
+label {
+  display: inline-block;
+  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)
+  margin-bottom: 5px;
+  font-weight: bold;
+}
+
+
+// Normalize form controls
+//
+// While most of our form styles require extra classes, some basic normalization
+// is required to ensure optimum display with or without those classes to better
+// address browser inconsistencies.
+
+// Override content-box in Normalize (* isn't specific enough)
+input[type="search"] {
+  @include box-sizing(border-box);
+}
+
+// Position radios and checkboxes better
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9; // IE8-9
+  line-height: normal;
+}
+
+// Set the height of file controls to match text inputs
+input[type="file"] {
+  display: block;
+}
+
+// Make range inputs behave like textual form controls
+input[type="range"] {
+  display: block;
+  width: 100%;
+}
+
+// Make multiple select elements height not fixed
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+// Focus for file, radio, and checkbox
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  @include tab-focus;
+}
+
+// Adjust output element
+output {
+  display: block;
+  padding-top: ($padding-base-vertical + 1);
+  font-size: $font-size-base;
+  line-height: $line-height-base;
+  color: $input-color;
+}
+
+
+// Common form controls
+//
+// Shared size and type resets for form controls. Apply `.form-control` to any
+// of the following form controls:
+//
+// select
+// textarea
+// input[type="text"]
+// input[type="password"]
+// input[type="datetime"]
+// input[type="datetime-local"]
+// input[type="date"]
+// input[type="month"]
+// input[type="time"]
+// input[type="week"]
+// input[type="number"]
+// input[type="email"]
+// input[type="url"]
+// input[type="search"]
+// input[type="tel"]
+// input[type="color"]
+
+.form-control {
+  display: block;
+  width: 100%;
+  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
+  padding: $padding-base-vertical $padding-base-horizontal;
+  font-size: $font-size-base;
+  line-height: $line-height-base;
+  color: $input-color;
+  background-color: $input-bg;
+  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+  border: 1px solid $input-border;
+  border-radius: $input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.
+  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
+  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
+
+  // Customize the `:focus` state to imitate native WebKit styles.
+  @include form-control-focus;
+
+  // Placeholder
+  @include placeholder;
+
+  // Disabled and read-only inputs
+  //
+  // HTML5 says that controls under a fieldset > legend:first-child won't be
+  // disabled if the fieldset is disabled. Due to implementation difficulty, we
+  // don't honor that edge case; we style them as disabled anyway.
+  &[disabled],
+  &[readonly],
+  fieldset[disabled] & {
+    cursor: $cursor-disabled;
+    background-color: $input-bg-disabled;
+    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655
+  }
+
+  // [converter] extracted textarea& to textarea.form-control
+}
+
+// Reset height for `textarea`s
+textarea.form-control {
+  height: auto;
+}
+
+
+// Search inputs in iOS
+//
+// This overrides the extra rounded corners on search inputs in iOS so that our
+// `.form-control` class can properly style them. Note that this cannot simply
+// be added to `.form-control` as it's not specific enough. For details, see
+// https://github.com/twbs/bootstrap/issues/11586.
+
+input[type="search"] {
+  -webkit-appearance: none;
+}
+
+
+// Special styles for iOS temporal inputs
+//
+// In Mobile Safari, setting `display: block` on temporal inputs causes the
+// text within the input to become vertically misaligned. As a workaround, we
+// set a pixel line-height that matches the given height of the input, but only
+// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848
+
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  input[type="date"],
+  input[type="time"],
+  input[type="datetime-local"],
+  input[type="month"] {
+    line-height: $input-height-base;
+
+    &.input-sm,
+    .input-group-sm & {
+      line-height: $input-height-small;
+    }
+
+    &.input-lg,
+    .input-group-lg & {
+      line-height: $input-height-large;
+    }
+  }
+}
+
+
+// Form groups
+//
+// Designed to help with the organization and spacing of vertical forms. For
+// horizontal forms, use the predefined grid classes.
+
+.form-group {
+  margin-bottom: 15px;
+}
+
+
+// Checkboxes and radios
+//
+// Indent the labels to position radios/checkboxes as hanging controls.
+
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+
+  label {
+    min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text
+    padding-left: 20px;
+    margin-bottom: 0;
+    font-weight: normal;
+    cursor: pointer;
+  }
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-left: -20px;
+  margin-top: 4px \9;
+}
+
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
+}
+
+// Radios and checkboxes on same line
+.radio-inline,
+.checkbox-inline {
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  vertical-align: middle;
+  font-weight: normal;
+  cursor: pointer;
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px; // space out consecutive inline controls
+}
+
+// Apply same disabled cursor tweak as for inputs
+// Some special care is needed because <label>s don't inherit their parent's `cursor`.
+//
+// Note: Neither radios nor checkboxes can be readonly.
+input[type="radio"],
+input[type="checkbox"] {
+  &[disabled],
+  &.disabled,
+  fieldset[disabled] & {
+    cursor: $cursor-disabled;
+  }
+}
+// These classes are used directly on <label>s
+.radio-inline,
+.checkbox-inline {
+  &.disabled,
+  fieldset[disabled] & {
+    cursor: $cursor-disabled;
+  }
+}
+// These classes are used on elements with <label> descendants
+.radio,
+.checkbox {
+  &.disabled,
+  fieldset[disabled] & {
+    label {
+      cursor: $cursor-disabled;
+    }
+  }
+}
+
+
+// Static form control text
+//
+// Apply class to a `p` element to make any string of text align with labels in
+// a horizontal form layout.
+
+.form-control-static {
+  // Size it appropriately next to real form controls
+  padding-top: ($padding-base-vertical + 1);
+  padding-bottom: ($padding-base-vertical + 1);
+  // Remove default margin from `p`
+  margin-bottom: 0;
+
+  &.input-lg,
+  &.input-sm {
+    padding-left: 0;
+    padding-right: 0;
+  }
+}
+
+
+// Form control sizing
+//
+// Build on `.form-control` with modifier classes to decrease or increase the
+// height and font-size of form controls.
+//
+// The `.form-group-* form-control` variations are sadly duplicated to avoid the
+// issue documented in https://github.com/twbs/bootstrap/issues/15074.
+
+@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);
+.form-group-sm {
+
+  @include input-size('.form-control', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);
+
+  .form-control-static {
+    height: $input-height-small;
+    padding: $padding-small-vertical $padding-small-horizontal;
+    font-size: $font-size-small;
+    line-height: $line-height-small;
+  }
+}
+
+@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);
+.form-group-lg {
+
+  @include input-size('.form-control', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);
+
+  .form-control-static {
+    height: $input-height-large;
+    padding: $padding-large-vertical $padding-large-horizontal;
+    font-size: $font-size-large;
+    line-height: $line-height-large;
+  }
+}
+
+
+// Form control feedback states
+//
+// Apply contextual and semantic states to individual form controls.
+
+.has-feedback {
+  // Enable absolute positioning
+  position: relative;
+
+  // Ensure icons don't overlap text
+  .form-control {
+    padding-right: ($input-height-base * 1.25);
+  }
+}
+// Feedback icon (requires .glyphicon classes)
+.form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2; // Ensure icon is above input groups
+  display: block;
+  width: $input-height-base;
+  height: $input-height-base;
+  line-height: $input-height-base;
+  text-align: center;
+  pointer-events: none;
+}
+.input-lg + .form-control-feedback {
+  width: $input-height-large;
+  height: $input-height-large;
+  line-height: $input-height-large;
+}
+.input-sm + .form-control-feedback {
+  width: $input-height-small;
+  height: $input-height-small;
+  line-height: $input-height-small;
+}
+
+// Feedback states
+.has-success {
+  @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);
+}
+.has-warning {
+  @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);
+}
+.has-error {
+  @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);
+}
+
+// Reposition feedback icon if input has visible label above
+.has-feedback label {
+
+  & ~ .form-control-feedback {
+     top: ($line-height-computed + 5); // Height of the `label` and its margin
+  }
+  &.sr-only ~ .form-control-feedback {
+     top: 0;
+  }
+}
+
+
+// Help text
+//
+// Apply to any element you wish to create light text for placement immediately
+// below a form control. Use for general help, formatting, or instructional text.
+
+.help-block {
+  display: block; // account for any element using help-block
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: lighten($text-color, 25%); // lighten the text some for contrast
+}
+
+
+// Inline forms
+//
+// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
+// forms begin stacked on extra small (mobile) devices and then go inline when
+// viewports reach <768px.
+//
+// Requires wrapping inputs and labels with `.form-group` for proper display of
+// default HTML form controls and our custom form controls (e.g., input groups).
+//
+// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
+
+// [converter] extracted from `.form-inline` for libsass compatibility
+@mixin form-inline {
+
+  // Kick in the inline
+  @media (min-width: $screen-sm-min) {
+    // Inline-block all the things for "inline"
+    .form-group {
+      display: inline-block;
+      margin-bottom: 0;
+      vertical-align: middle;
+    }
+
+    // In navbar-form, allow folks to *not* use `.form-group`
+    .form-control {
+      display: inline-block;
+      width: auto; // Prevent labels from stacking above inputs in `.form-group`
+      vertical-align: middle;
+    }
+
+    // Make static controls behave like regular ones
+    .form-control-static {
+      display: inline-block;
+    }
+
+    .input-group {
+      display: inline-table;
+      vertical-align: middle;
+
+      .input-group-addon,
+      .input-group-btn,
+      .form-control {
+        width: auto;
+      }
+    }
+
+    // Input groups need that 100% width though
+    .input-group > .form-control {
+      width: 100%;
+    }
+
+    .control-label {
+      margin-bottom: 0;
+      vertical-align: middle;
+    }
+
+    // Remove default margin on radios/checkboxes that were used for stacking, and
+    // then undo the floating of radios and checkboxes to match.
+    .radio,
+    .checkbox {
+      display: inline-block;
+      margin-top: 0;
+      margin-bottom: 0;
+      vertical-align: middle;
+
+      label {
+        padding-left: 0;
+      }
+    }
+    .radio input[type="radio"],
+    .checkbox input[type="checkbox"] {
+      position: relative;
+      margin-left: 0;
+    }
+
+    // Re-override the feedback icon.
+    .has-feedback .form-control-feedback {
+      top: 0;
+    }
+  }
+}
+// [converter] extracted as `@mixin form-inline` for libsass compatibility
+.form-inline {
+  @include form-inline;
+}
+
+
+
+// Horizontal forms
+//
+// Horizontal forms are built on grid classes and allow you to create forms with
+// labels on the left and inputs on the right.
+
+.form-horizontal {
+
+  // Consistent vertical alignment of radios and checkboxes
+  //
+  // Labels also get some reset styles, but that is scoped to a media query below.
+  .radio,
+  .checkbox,
+  .radio-inline,
+  .checkbox-inline {
+    margin-top: 0;
+    margin-bottom: 0;
+    padding-top: ($padding-base-vertical + 1); // Default padding plus a border
+  }
+  // Account for padding we're adding to ensure the alignment and of help text
+  // and other content below items
+  .radio,
+  .checkbox {
+    min-height: ($line-height-computed + ($padding-base-vertical + 1));
+  }
+
+  // Make form groups behave like rows
+  .form-group {
+    @include make-row;
+  }
+
+  // Reset spacing and right align labels, but scope to media queries so that
+  // labels on narrow viewports stack the same as a default form example.
+  @media (min-width: $screen-sm-min) {
+    .control-label {
+      text-align: right;
+      margin-bottom: 0;
+      padding-top: ($padding-base-vertical + 1); // Default padding plus a border
+    }
+  }
+
+  // Validation states
+  //
+  // Reposition the icon because it's now within a grid column and columns have
+  // `position: relative;` on them. Also accounts for the grid gutter padding.
+  .has-feedback .form-control-feedback {
+    right: ($grid-gutter-width / 2);
+  }
+
+  // Form group sizes
+  //
+  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the
+  // inputs and labels within a `.form-group`.
+  .form-group-lg {
+    @media (min-width: $screen-sm-min) {
+      .control-label {
+        padding-top: (($padding-large-vertical * $line-height-large) + 1);
+      }
+    }
+  }
+  .form-group-sm {
+    @media (min-width: $screen-sm-min) {
+      .control-label {
+        padding-top: ($padding-small-vertical + 1);
+      }
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_glyphicons.scss b/static/assets/stylesheets/bootstrap/_glyphicons.scss
new file mode 100644
index 0000000000000000000000000000000000000000..844adb05f3f270af0fd6b3c6908c4bf9f918fa35
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_glyphicons.scss
@@ -0,0 +1,301 @@
+//
+// Glyphicons for Bootstrap
+//
+// Since icons are fonts, they can be placed anywhere text is placed and are
+// thus automatically sized to match the surrounding child. To use, create an
+// inline element with the appropriate classes, like so:
+//
+// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
+
+// Import the fonts
+@font-face {
+  font-family: 'Glyphicons Halflings';
+  src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));
+  src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),
+       url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),
+       url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),
+       url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),
+       url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');
+}
+
+// Catchall baseclass
+.glyphicon {
+  position: relative;
+  top: 1px;
+  display: inline-block;
+  font-family: 'Glyphicons Halflings';
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+// Individual icons
+.glyphicon-asterisk               { &:before { content: "\2a"; } }
+.glyphicon-plus                   { &:before { content: "\2b"; } }
+.glyphicon-euro,
+.glyphicon-eur                    { &:before { content: "\20ac"; } }
+.glyphicon-minus                  { &:before { content: "\2212"; } }
+.glyphicon-cloud                  { &:before { content: "\2601"; } }
+.glyphicon-envelope               { &:before { content: "\2709"; } }
+.glyphicon-pencil                 { &:before { content: "\270f"; } }
+.glyphicon-glass                  { &:before { content: "\e001"; } }
+.glyphicon-music                  { &:before { content: "\e002"; } }
+.glyphicon-search                 { &:before { content: "\e003"; } }
+.glyphicon-heart                  { &:before { content: "\e005"; } }
+.glyphicon-star                   { &:before { content: "\e006"; } }
+.glyphicon-star-empty             { &:before { content: "\e007"; } }
+.glyphicon-user                   { &:before { content: "\e008"; } }
+.glyphicon-film                   { &:before { content: "\e009"; } }
+.glyphicon-th-large               { &:before { content: "\e010"; } }
+.glyphicon-th                     { &:before { content: "\e011"; } }
+.glyphicon-th-list                { &:before { content: "\e012"; } }
+.glyphicon-ok                     { &:before { content: "\e013"; } }
+.glyphicon-remove                 { &:before { content: "\e014"; } }
+.glyphicon-zoom-in                { &:before { content: "\e015"; } }
+.glyphicon-zoom-out               { &:before { content: "\e016"; } }
+.glyphicon-off                    { &:before { content: "\e017"; } }
+.glyphicon-signal                 { &:before { content: "\e018"; } }
+.glyphicon-cog                    { &:before { content: "\e019"; } }
+.glyphicon-trash                  { &:before { content: "\e020"; } }
+.glyphicon-home                   { &:before { content: "\e021"; } }
+.glyphicon-file                   { &:before { content: "\e022"; } }
+.glyphicon-time                   { &:before { content: "\e023"; } }
+.glyphicon-road                   { &:before { content: "\e024"; } }
+.glyphicon-download-alt           { &:before { content: "\e025"; } }
+.glyphicon-download               { &:before { content: "\e026"; } }
+.glyphicon-upload                 { &:before { content: "\e027"; } }
+.glyphicon-inbox                  { &:before { content: "\e028"; } }
+.glyphicon-play-circle            { &:before { content: "\e029"; } }
+.glyphicon-repeat                 { &:before { content: "\e030"; } }
+.glyphicon-refresh                { &:before { content: "\e031"; } }
+.glyphicon-list-alt               { &:before { content: "\e032"; } }
+.glyphicon-lock                   { &:before { content: "\e033"; } }
+.glyphicon-flag                   { &:before { content: "\e034"; } }
+.glyphicon-headphones             { &:before { content: "\e035"; } }
+.glyphicon-volume-off             { &:before { content: "\e036"; } }
+.glyphicon-volume-down            { &:before { content: "\e037"; } }
+.glyphicon-volume-up              { &:before { content: "\e038"; } }
+.glyphicon-qrcode                 { &:before { content: "\e039"; } }
+.glyphicon-barcode                { &:before { content: "\e040"; } }
+.glyphicon-tag                    { &:before { content: "\e041"; } }
+.glyphicon-tags                   { &:before { content: "\e042"; } }
+.glyphicon-book                   { &:before { content: "\e043"; } }
+.glyphicon-bookmark               { &:before { content: "\e044"; } }
+.glyphicon-print                  { &:before { content: "\e045"; } }
+.glyphicon-camera                 { &:before { content: "\e046"; } }
+.glyphicon-font                   { &:before { content: "\e047"; } }
+.glyphicon-bold                   { &:before { content: "\e048"; } }
+.glyphicon-italic                 { &:before { content: "\e049"; } }
+.glyphicon-text-height            { &:before { content: "\e050"; } }
+.glyphicon-text-width             { &:before { content: "\e051"; } }
+.glyphicon-align-left             { &:before { content: "\e052"; } }
+.glyphicon-align-center           { &:before { content: "\e053"; } }
+.glyphicon-align-right            { &:before { content: "\e054"; } }
+.glyphicon-align-justify          { &:before { content: "\e055"; } }
+.glyphicon-list                   { &:before { content: "\e056"; } }
+.glyphicon-indent-left            { &:before { content: "\e057"; } }
+.glyphicon-indent-right           { &:before { content: "\e058"; } }
+.glyphicon-facetime-video         { &:before { content: "\e059"; } }
+.glyphicon-picture                { &:before { content: "\e060"; } }
+.glyphicon-map-marker             { &:before { content: "\e062"; } }
+.glyphicon-adjust                 { &:before { content: "\e063"; } }
+.glyphicon-tint                   { &:before { content: "\e064"; } }
+.glyphicon-edit                   { &:before { content: "\e065"; } }
+.glyphicon-share                  { &:before { content: "\e066"; } }
+.glyphicon-check                  { &:before { content: "\e067"; } }
+.glyphicon-move                   { &:before { content: "\e068"; } }
+.glyphicon-step-backward          { &:before { content: "\e069"; } }
+.glyphicon-fast-backward          { &:before { content: "\e070"; } }
+.glyphicon-backward               { &:before { content: "\e071"; } }
+.glyphicon-play                   { &:before { content: "\e072"; } }
+.glyphicon-pause                  { &:before { content: "\e073"; } }
+.glyphicon-stop                   { &:before { content: "\e074"; } }
+.glyphicon-forward                { &:before { content: "\e075"; } }
+.glyphicon-fast-forward           { &:before { content: "\e076"; } }
+.glyphicon-step-forward           { &:before { content: "\e077"; } }
+.glyphicon-eject                  { &:before { content: "\e078"; } }
+.glyphicon-chevron-left           { &:before { content: "\e079"; } }
+.glyphicon-chevron-right          { &:before { content: "\e080"; } }
+.glyphicon-plus-sign              { &:before { content: "\e081"; } }
+.glyphicon-minus-sign             { &:before { content: "\e082"; } }
+.glyphicon-remove-sign            { &:before { content: "\e083"; } }
+.glyphicon-ok-sign                { &:before { content: "\e084"; } }
+.glyphicon-question-sign          { &:before { content: "\e085"; } }
+.glyphicon-info-sign              { &:before { content: "\e086"; } }
+.glyphicon-screenshot             { &:before { content: "\e087"; } }
+.glyphicon-remove-circle          { &:before { content: "\e088"; } }
+.glyphicon-ok-circle              { &:before { content: "\e089"; } }
+.glyphicon-ban-circle             { &:before { content: "\e090"; } }
+.glyphicon-arrow-left             { &:before { content: "\e091"; } }
+.glyphicon-arrow-right            { &:before { content: "\e092"; } }
+.glyphicon-arrow-up               { &:before { content: "\e093"; } }
+.glyphicon-arrow-down             { &:before { content: "\e094"; } }
+.glyphicon-share-alt              { &:before { content: "\e095"; } }
+.glyphicon-resize-full            { &:before { content: "\e096"; } }
+.glyphicon-resize-small           { &:before { content: "\e097"; } }
+.glyphicon-exclamation-sign       { &:before { content: "\e101"; } }
+.glyphicon-gift                   { &:before { content: "\e102"; } }
+.glyphicon-leaf                   { &:before { content: "\e103"; } }
+.glyphicon-fire                   { &:before { content: "\e104"; } }
+.glyphicon-eye-open               { &:before { content: "\e105"; } }
+.glyphicon-eye-close              { &:before { content: "\e106"; } }
+.glyphicon-warning-sign           { &:before { content: "\e107"; } }
+.glyphicon-plane                  { &:before { content: "\e108"; } }
+.glyphicon-calendar               { &:before { content: "\e109"; } }
+.glyphicon-random                 { &:before { content: "\e110"; } }
+.glyphicon-comment                { &:before { content: "\e111"; } }
+.glyphicon-magnet                 { &:before { content: "\e112"; } }
+.glyphicon-chevron-up             { &:before { content: "\e113"; } }
+.glyphicon-chevron-down           { &:before { content: "\e114"; } }
+.glyphicon-retweet                { &:before { content: "\e115"; } }
+.glyphicon-shopping-cart          { &:before { content: "\e116"; } }
+.glyphicon-folder-close           { &:before { content: "\e117"; } }
+.glyphicon-folder-open            { &:before { content: "\e118"; } }
+.glyphicon-resize-vertical        { &:before { content: "\e119"; } }
+.glyphicon-resize-horizontal      { &:before { content: "\e120"; } }
+.glyphicon-hdd                    { &:before { content: "\e121"; } }
+.glyphicon-bullhorn               { &:before { content: "\e122"; } }
+.glyphicon-bell                   { &:before { content: "\e123"; } }
+.glyphicon-certificate            { &:before { content: "\e124"; } }
+.glyphicon-thumbs-up              { &:before { content: "\e125"; } }
+.glyphicon-thumbs-down            { &:before { content: "\e126"; } }
+.glyphicon-hand-right             { &:before { content: "\e127"; } }
+.glyphicon-hand-left              { &:before { content: "\e128"; } }
+.glyphicon-hand-up                { &:before { content: "\e129"; } }
+.glyphicon-hand-down              { &:before { content: "\e130"; } }
+.glyphicon-circle-arrow-right     { &:before { content: "\e131"; } }
+.glyphicon-circle-arrow-left      { &:before { content: "\e132"; } }
+.glyphicon-circle-arrow-up        { &:before { content: "\e133"; } }
+.glyphicon-circle-arrow-down      { &:before { content: "\e134"; } }
+.glyphicon-globe                  { &:before { content: "\e135"; } }
+.glyphicon-wrench                 { &:before { content: "\e136"; } }
+.glyphicon-tasks                  { &:before { content: "\e137"; } }
+.glyphicon-filter                 { &:before { content: "\e138"; } }
+.glyphicon-briefcase              { &:before { content: "\e139"; } }
+.glyphicon-fullscreen             { &:before { content: "\e140"; } }
+.glyphicon-dashboard              { &:before { content: "\e141"; } }
+.glyphicon-paperclip              { &:before { content: "\e142"; } }
+.glyphicon-heart-empty            { &:before { content: "\e143"; } }
+.glyphicon-link                   { &:before { content: "\e144"; } }
+.glyphicon-phone                  { &:before { content: "\e145"; } }
+.glyphicon-pushpin                { &:before { content: "\e146"; } }
+.glyphicon-usd                    { &:before { content: "\e148"; } }
+.glyphicon-gbp                    { &:before { content: "\e149"; } }
+.glyphicon-sort                   { &:before { content: "\e150"; } }
+.glyphicon-sort-by-alphabet       { &:before { content: "\e151"; } }
+.glyphicon-sort-by-alphabet-alt   { &:before { content: "\e152"; } }
+.glyphicon-sort-by-order          { &:before { content: "\e153"; } }
+.glyphicon-sort-by-order-alt      { &:before { content: "\e154"; } }
+.glyphicon-sort-by-attributes     { &:before { content: "\e155"; } }
+.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
+.glyphicon-unchecked              { &:before { content: "\e157"; } }
+.glyphicon-expand                 { &:before { content: "\e158"; } }
+.glyphicon-collapse-down          { &:before { content: "\e159"; } }
+.glyphicon-collapse-up            { &:before { content: "\e160"; } }
+.glyphicon-log-in                 { &:before { content: "\e161"; } }
+.glyphicon-flash                  { &:before { content: "\e162"; } }
+.glyphicon-log-out                { &:before { content: "\e163"; } }
+.glyphicon-new-window             { &:before { content: "\e164"; } }
+.glyphicon-record                 { &:before { content: "\e165"; } }
+.glyphicon-save                   { &:before { content: "\e166"; } }
+.glyphicon-open                   { &:before { content: "\e167"; } }
+.glyphicon-saved                  { &:before { content: "\e168"; } }
+.glyphicon-import                 { &:before { content: "\e169"; } }
+.glyphicon-export                 { &:before { content: "\e170"; } }
+.glyphicon-send                   { &:before { content: "\e171"; } }
+.glyphicon-floppy-disk            { &:before { content: "\e172"; } }
+.glyphicon-floppy-saved           { &:before { content: "\e173"; } }
+.glyphicon-floppy-remove          { &:before { content: "\e174"; } }
+.glyphicon-floppy-save            { &:before { content: "\e175"; } }
+.glyphicon-floppy-open            { &:before { content: "\e176"; } }
+.glyphicon-credit-card            { &:before { content: "\e177"; } }
+.glyphicon-transfer               { &:before { content: "\e178"; } }
+.glyphicon-cutlery                { &:before { content: "\e179"; } }
+.glyphicon-header                 { &:before { content: "\e180"; } }
+.glyphicon-compressed             { &:before { content: "\e181"; } }
+.glyphicon-earphone               { &:before { content: "\e182"; } }
+.glyphicon-phone-alt              { &:before { content: "\e183"; } }
+.glyphicon-tower                  { &:before { content: "\e184"; } }
+.glyphicon-stats                  { &:before { content: "\e185"; } }
+.glyphicon-sd-video               { &:before { content: "\e186"; } }
+.glyphicon-hd-video               { &:before { content: "\e187"; } }
+.glyphicon-subtitles              { &:before { content: "\e188"; } }
+.glyphicon-sound-stereo           { &:before { content: "\e189"; } }
+.glyphicon-sound-dolby            { &:before { content: "\e190"; } }
+.glyphicon-sound-5-1              { &:before { content: "\e191"; } }
+.glyphicon-sound-6-1              { &:before { content: "\e192"; } }
+.glyphicon-sound-7-1              { &:before { content: "\e193"; } }
+.glyphicon-copyright-mark         { &:before { content: "\e194"; } }
+.glyphicon-registration-mark      { &:before { content: "\e195"; } }
+.glyphicon-cloud-download         { &:before { content: "\e197"; } }
+.glyphicon-cloud-upload           { &:before { content: "\e198"; } }
+.glyphicon-tree-conifer           { &:before { content: "\e199"; } }
+.glyphicon-tree-deciduous         { &:before { content: "\e200"; } }
+.glyphicon-cd                     { &:before { content: "\e201"; } }
+.glyphicon-save-file              { &:before { content: "\e202"; } }
+.glyphicon-open-file              { &:before { content: "\e203"; } }
+.glyphicon-level-up               { &:before { content: "\e204"; } }
+.glyphicon-copy                   { &:before { content: "\e205"; } }
+.glyphicon-paste                  { &:before { content: "\e206"; } }
+// The following 2 Glyphicons are omitted for the time being because
+// they currently use Unicode codepoints that are outside the
+// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle
+// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.
+// Notably, the bug affects some older versions of the Android Browser.
+// More info: https://github.com/twbs/bootstrap/issues/10106
+// .glyphicon-door                   { &:before { content: "\1f6aa"; } }
+// .glyphicon-key                    { &:before { content: "\1f511"; } }
+.glyphicon-alert                  { &:before { content: "\e209"; } }
+.glyphicon-equalizer              { &:before { content: "\e210"; } }
+.glyphicon-king                   { &:before { content: "\e211"; } }
+.glyphicon-queen                  { &:before { content: "\e212"; } }
+.glyphicon-pawn                   { &:before { content: "\e213"; } }
+.glyphicon-bishop                 { &:before { content: "\e214"; } }
+.glyphicon-knight                 { &:before { content: "\e215"; } }
+.glyphicon-baby-formula           { &:before { content: "\e216"; } }
+.glyphicon-tent                   { &:before { content: "\26fa"; } }
+.glyphicon-blackboard             { &:before { content: "\e218"; } }
+.glyphicon-bed                    { &:before { content: "\e219"; } }
+.glyphicon-apple                  { &:before { content: "\f8ff"; } }
+.glyphicon-erase                  { &:before { content: "\e221"; } }
+.glyphicon-hourglass              { &:before { content: "\231b"; } }
+.glyphicon-lamp                   { &:before { content: "\e223"; } }
+.glyphicon-duplicate              { &:before { content: "\e224"; } }
+.glyphicon-piggy-bank             { &:before { content: "\e225"; } }
+.glyphicon-scissors               { &:before { content: "\e226"; } }
+.glyphicon-bitcoin                { &:before { content: "\e227"; } }
+.glyphicon-yen                    { &:before { content: "\00a5"; } }
+.glyphicon-ruble                  { &:before { content: "\20bd"; } }
+.glyphicon-scale                  { &:before { content: "\e230"; } }
+.glyphicon-ice-lolly              { &:before { content: "\e231"; } }
+.glyphicon-ice-lolly-tasted       { &:before { content: "\e232"; } }
+.glyphicon-education              { &:before { content: "\e233"; } }
+.glyphicon-option-horizontal      { &:before { content: "\e234"; } }
+.glyphicon-option-vertical        { &:before { content: "\e235"; } }
+.glyphicon-menu-hamburger         { &:before { content: "\e236"; } }
+.glyphicon-modal-window           { &:before { content: "\e237"; } }
+.glyphicon-oil                    { &:before { content: "\e238"; } }
+.glyphicon-grain                  { &:before { content: "\e239"; } }
+.glyphicon-sunglasses             { &:before { content: "\e240"; } }
+.glyphicon-text-size              { &:before { content: "\e241"; } }
+.glyphicon-text-color             { &:before { content: "\e242"; } }
+.glyphicon-text-background        { &:before { content: "\e243"; } }
+.glyphicon-object-align-top       { &:before { content: "\e244"; } }
+.glyphicon-object-align-bottom    { &:before { content: "\e245"; } }
+.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } }
+.glyphicon-object-align-left      { &:before { content: "\e247"; } }
+.glyphicon-object-align-vertical  { &:before { content: "\e248"; } }
+.glyphicon-object-align-right     { &:before { content: "\e249"; } }
+.glyphicon-triangle-right         { &:before { content: "\e250"; } }
+.glyphicon-triangle-left          { &:before { content: "\e251"; } }
+.glyphicon-triangle-bottom        { &:before { content: "\e252"; } }
+.glyphicon-triangle-top           { &:before { content: "\e253"; } }
+.glyphicon-console                { &:before { content: "\e254"; } }
+.glyphicon-superscript            { &:before { content: "\e255"; } }
+.glyphicon-subscript              { &:before { content: "\e256"; } }
+.glyphicon-menu-left              { &:before { content: "\e257"; } }
+.glyphicon-menu-right             { &:before { content: "\e258"; } }
+.glyphicon-menu-down              { &:before { content: "\e259"; } }
+.glyphicon-menu-up                { &:before { content: "\e260"; } }
\ No newline at end of file
diff --git a/static/assets/stylesheets/bootstrap/_grid.scss b/static/assets/stylesheets/bootstrap/_grid.scss
new file mode 100644
index 0000000000000000000000000000000000000000..b15ca27bb546898d56f9f13a8c600c593b7f824e
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_grid.scss
@@ -0,0 +1,84 @@
+//
+// Grid system
+// --------------------------------------------------
+
+
+// Container widths
+//
+// Set the container width, and override it for fixed navbars in media queries.
+
+.container {
+  @include container-fixed;
+
+  @media (min-width: $screen-sm-min) {
+    width: $container-sm;
+  }
+  @media (min-width: $screen-md-min) {
+    width: $container-md;
+  }
+  @media (min-width: $screen-lg-min) {
+    width: $container-lg;
+  }
+}
+
+
+// Fluid container
+//
+// Utilizes the mixin meant for fixed width containers, but without any defined
+// width for fluid, full width layouts.
+
+.container-fluid {
+  @include container-fixed;
+}
+
+
+// Row
+//
+// Rows contain and clear the floats of your columns.
+
+.row {
+  @include make-row;
+}
+
+
+// Columns
+//
+// Common styles for small and large grid columns
+
+@include make-grid-columns;
+
+
+// Extra small grid
+//
+// Columns, offsets, pushes, and pulls for extra small devices like
+// smartphones.
+
+@include make-grid(xs);
+
+
+// Small grid
+//
+// Columns, offsets, pushes, and pulls for the small device range, from phones
+// to tablets.
+
+@media (min-width: $screen-sm-min) {
+  @include make-grid(sm);
+}
+
+
+// Medium grid
+//
+// Columns, offsets, pushes, and pulls for the desktop device range.
+
+@media (min-width: $screen-md-min) {
+  @include make-grid(md);
+}
+
+
+// Large grid
+//
+// Columns, offsets, pushes, and pulls for the large desktop device range.
+
+@media (min-width: $screen-lg-min) {
+  @include make-grid(lg);
+}
diff --git a/static/assets/stylesheets/bootstrap/_input-groups.scss b/static/assets/stylesheets/bootstrap/_input-groups.scss
new file mode 100644
index 0000000000000000000000000000000000000000..ae0e921bf7a57162d0577aef80a290dbdf843472
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_input-groups.scss
@@ -0,0 +1,166 @@
+//
+// Input groups
+// --------------------------------------------------
+
+// Base styles
+// -------------------------
+.input-group {
+  position: relative; // For dropdowns
+  display: table;
+  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
+
+  // Undo padding and float of grid classes
+  &[class*="col-"] {
+    float: none;
+    padding-left: 0;
+    padding-right: 0;
+  }
+
+  .form-control {
+    // Ensure that the input is always above the *appended* addon button for
+    // proper border colors.
+    position: relative;
+    z-index: 2;
+
+    // IE9 fubars the placeholder attribute in text inputs and the arrows on
+    // select elements in input groups. To fix it, we float the input. Details:
+    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
+    float: left;
+
+    width: 100%;
+    margin-bottom: 0;
+  }
+}
+
+// Sizing options
+//
+// Remix the default form control sizing classes into new ones for easier
+// manipulation.
+
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+  @extend .input-lg;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  @extend .input-sm;
+}
+
+
+// Display as table-cell
+// -------------------------
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: table-cell;
+
+  &:not(:first-child):not(:last-child) {
+    border-radius: 0;
+  }
+}
+// Addon and addon wrapper for buttons
+.input-group-addon,
+.input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle; // Match the inputs
+}
+
+// Text input groups
+// -------------------------
+.input-group-addon {
+  padding: $padding-base-vertical $padding-base-horizontal;
+  font-size: $font-size-base;
+  font-weight: normal;
+  line-height: 1;
+  color: $input-color;
+  text-align: center;
+  background-color: $input-group-addon-bg;
+  border: 1px solid $input-group-addon-border-color;
+  border-radius: $border-radius-base;
+
+  // Sizing
+  &.input-sm {
+    padding: $padding-small-vertical $padding-small-horizontal;
+    font-size: $font-size-small;
+    border-radius: $border-radius-small;
+  }
+  &.input-lg {
+    padding: $padding-large-vertical $padding-large-horizontal;
+    font-size: $font-size-large;
+    border-radius: $border-radius-large;
+  }
+
+  // Nuke default margins from checkboxes and radios to vertically center within.
+  input[type="radio"],
+  input[type="checkbox"] {
+    margin-top: 0;
+  }
+}
+
+// Reset rounded corners
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  @include border-right-radius(0);
+}
+.input-group-addon:first-child {
+  border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  @include border-left-radius(0);
+}
+.input-group-addon:last-child {
+  border-left: 0;
+}
+
+// Button input groups
+// -------------------------
+.input-group-btn {
+  position: relative;
+  // Jankily prevent input button groups from wrapping with `white-space` and
+  // `font-size` in combination with `inline-block` on buttons.
+  font-size: 0;
+  white-space: nowrap;
+
+  // Negative margin for spacing, position for bringing hovered/focused/actived
+  // element above the siblings.
+  > .btn {
+    position: relative;
+    + .btn {
+      margin-left: -1px;
+    }
+    // Bring the "active" button to the front
+    &:hover,
+    &:focus,
+    &:active {
+      z-index: 2;
+    }
+  }
+
+  // Negative margin to only have a 1px border between the two
+  &:first-child {
+    > .btn,
+    > .btn-group {
+      margin-right: -1px;
+    }
+  }
+  &:last-child {
+    > .btn,
+    > .btn-group {
+      margin-left: -1px;
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_jumbotron.scss b/static/assets/stylesheets/bootstrap/_jumbotron.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e326b327627542e6b00c1b472d26319d2dd1eae4
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_jumbotron.scss
@@ -0,0 +1,50 @@
+//
+// Jumbotron
+// --------------------------------------------------
+
+
+.jumbotron {
+  padding: $jumbotron-padding ($jumbotron-padding / 2);
+  margin-bottom: $jumbotron-padding;
+  color: $jumbotron-color;
+  background-color: $jumbotron-bg;
+
+  h1,
+  .h1 {
+    color: $jumbotron-heading-color;
+  }
+  
+  p {
+    margin-bottom: ($jumbotron-padding / 2);
+    font-size: $jumbotron-font-size;
+    font-weight: 200;
+  }
+
+  > hr {
+    border-top-color: darken($jumbotron-bg, 10%);
+  }
+
+  .container &,
+  .container-fluid & {
+    border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container
+  }
+
+  .container {
+    max-width: 100%;
+  }
+
+  @media screen and (min-width: $screen-sm-min) {
+    padding: ($jumbotron-padding * 1.6) 0;
+
+    .container &,
+    .container-fluid & {
+      padding-left:  ($jumbotron-padding * 2);
+      padding-right: ($jumbotron-padding * 2);
+    }
+
+    h1,
+    .h1 {
+      font-size: ($font-size-base * 4.5);
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_labels.scss b/static/assets/stylesheets/bootstrap/_labels.scss
new file mode 100644
index 0000000000000000000000000000000000000000..42ed6ea123273dc395095e96801d2dbefc4e53cb
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_labels.scss
@@ -0,0 +1,66 @@
+//
+// Labels
+// --------------------------------------------------
+
+.label {
+  display: inline;
+  padding: .2em .6em .3em;
+  font-size: 75%;
+  font-weight: bold;
+  line-height: 1;
+  color: $label-color;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: .25em;
+
+  // [converter] extracted a& to a.label
+
+  // Empty labels collapse automatically (not available in IE8)
+  &:empty {
+    display: none;
+  }
+
+  // Quick fix for labels in buttons
+  .btn & {
+    position: relative;
+    top: -1px;
+  }
+}
+
+// Add hover effects, but only for links
+a.label {
+  &:hover,
+  &:focus {
+    color: $label-link-hover-color;
+    text-decoration: none;
+    cursor: pointer;
+  }
+}
+
+// Colors
+// Contextual variations (linked labels get darker on :hover)
+
+.label-default {
+  @include label-variant($label-default-bg);
+}
+
+.label-primary {
+  @include label-variant($label-primary-bg);
+}
+
+.label-success {
+  @include label-variant($label-success-bg);
+}
+
+.label-info {
+  @include label-variant($label-info-bg);
+}
+
+.label-warning {
+  @include label-variant($label-warning-bg);
+}
+
+.label-danger {
+  @include label-variant($label-danger-bg);
+}
diff --git a/static/assets/stylesheets/bootstrap/_list-group.scss b/static/assets/stylesheets/bootstrap/_list-group.scss
new file mode 100644
index 0000000000000000000000000000000000000000..26b23ff871ea5299b623683dcc543911d401d349
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_list-group.scss
@@ -0,0 +1,124 @@
+//
+// List groups
+// --------------------------------------------------
+
+
+// Base class
+//
+// Easily usable on <ul>, <ol>, or <div>.
+
+.list-group {
+  // No need to set list-style: none; since .list-group-item is block level
+  margin-bottom: 20px;
+  padding-left: 0; // reset padding because ul and ol
+}
+
+
+// Individual list items
+//
+// Use on `li`s or `div`s within the `.list-group` parent.
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  // Place the border on the list items and negative margin up for better styling
+  margin-bottom: -1px;
+  background-color: $list-group-bg;
+  border: 1px solid $list-group-border;
+
+  // Round the first and last items
+  &:first-child {
+    @include border-top-radius($list-group-border-radius);
+  }
+  &:last-child {
+    margin-bottom: 0;
+    @include border-bottom-radius($list-group-border-radius);
+  }
+}
+
+
+// Linked list items
+//
+// Use anchor elements instead of `li`s or `div`s to create linked list items.
+// Includes an extra `.active` modifier class for showing selected items.
+
+a.list-group-item {
+  color: $list-group-link-color;
+
+  .list-group-item-heading {
+    color: $list-group-link-heading-color;
+  }
+
+  // Hover state
+  &:hover,
+  &:focus {
+    text-decoration: none;
+    color: $list-group-link-hover-color;
+    background-color: $list-group-hover-bg;
+  }
+}
+
+.list-group-item {
+  // Disabled state
+  &.disabled,
+  &.disabled:hover,
+  &.disabled:focus {
+    background-color: $list-group-disabled-bg;
+    color: $list-group-disabled-color;
+    cursor: $cursor-disabled;
+
+    // Force color to inherit for custom content
+    .list-group-item-heading {
+      color: inherit;
+    }
+    .list-group-item-text {
+      color: $list-group-disabled-text-color;
+    }
+  }
+
+  // Active class on item itself, not parent
+  &.active,
+  &.active:hover,
+  &.active:focus {
+    z-index: 2; // Place active items above their siblings for proper border styling
+    color: $list-group-active-color;
+    background-color: $list-group-active-bg;
+    border-color: $list-group-active-border;
+
+    // Force color to inherit for custom content
+    .list-group-item-heading,
+    .list-group-item-heading > small,
+    .list-group-item-heading > .small {
+      color: inherit;
+    }
+    .list-group-item-text {
+      color: $list-group-active-text-color;
+    }
+  }
+}
+
+
+// Contextual variants
+//
+// Add modifier classes to change text and background color on individual items.
+// Organizationally, this must come after the `:hover` states.
+
+@include list-group-item-variant(success, $state-success-bg, $state-success-text);
+@include list-group-item-variant(info, $state-info-bg, $state-info-text);
+@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);
+@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);
+
+
+// Custom content options
+//
+// Extra classes for creating well-formatted content within `.list-group-item`s.
+
+.list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3;
+}
diff --git a/static/assets/stylesheets/bootstrap/_media.scss b/static/assets/stylesheets/bootstrap/_media.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a6bf78192469c48166b7ddcd494ba2cbec376233
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_media.scss
@@ -0,0 +1,61 @@
+.media {
+  // Proper spacing between instances of .media
+  margin-top: 15px;
+
+  &:first-child {
+    margin-top: 0;
+  }
+}
+
+.media,
+.media-body {
+  zoom: 1;
+  overflow: hidden;
+}
+
+.media-body {
+  width: 10000px;
+}
+
+.media-object {
+  display: block;
+}
+
+.media-right,
+.media > .pull-right {
+  padding-left: 10px;
+}
+
+.media-left,
+.media > .pull-left {
+  padding-right: 10px;
+}
+
+.media-left,
+.media-right,
+.media-body {
+  display: table-cell;
+  vertical-align: top;
+}
+
+.media-middle {
+  vertical-align: middle;
+}
+
+.media-bottom {
+  vertical-align: bottom;
+}
+
+// Reset margins on headings for tighter default spacing
+.media-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+
+// Media list variation
+//
+// Undo default ul/ol styles
+.media-list {
+  padding-left: 0;
+  list-style: none;
+}
diff --git a/static/assets/stylesheets/bootstrap/_mixins.scss b/static/assets/stylesheets/bootstrap/_mixins.scss
new file mode 100644
index 0000000000000000000000000000000000000000..b565f013a40718bb4821571af657cb6ce683c7d9
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_mixins.scss
@@ -0,0 +1,39 @@
+// Mixins
+// --------------------------------------------------
+
+// Utilities
+@import "mixins/hide-text";
+@import "mixins/opacity";
+@import "mixins/image";
+@import "mixins/labels";
+@import "mixins/reset-filter";
+@import "mixins/resize";
+@import "mixins/responsive-visibility";
+@import "mixins/size";
+@import "mixins/tab-focus";
+@import "mixins/text-emphasis";
+@import "mixins/text-overflow";
+@import "mixins/vendor-prefixes";
+
+// Components
+@import "mixins/alerts";
+@import "mixins/buttons";
+@import "mixins/panels";
+@import "mixins/pagination";
+@import "mixins/list-group";
+@import "mixins/nav-divider";
+@import "mixins/forms";
+@import "mixins/progress-bar";
+@import "mixins/table-row";
+
+// Skins
+@import "mixins/background-variant";
+@import "mixins/border-radius";
+@import "mixins/gradients";
+
+// Layout
+@import "mixins/clearfix";
+@import "mixins/center-block";
+@import "mixins/nav-vertical-align";
+@import "mixins/grid-framework";
+@import "mixins/grid";
diff --git a/static/assets/stylesheets/bootstrap/_modals.scss b/static/assets/stylesheets/bootstrap/_modals.scss
new file mode 100644
index 0000000000000000000000000000000000000000..2fd097caec73a3f572d1f678554b2212177dd5a0
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_modals.scss
@@ -0,0 +1,148 @@
+//
+// Modals
+// --------------------------------------------------
+
+// .modal-open      - body class for killing the scroll
+// .modal           - container to scroll within
+// .modal-dialog    - positioning shell for the actual modal
+// .modal-content   - actual modal w/ bg and corners and shit
+
+// Kill the scroll on the body
+.modal-open {
+  overflow: hidden;
+}
+
+// Container that the modal scrolls within
+.modal {
+  display: none;
+  overflow: hidden;
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: $zindex-modal;
+  -webkit-overflow-scrolling: touch;
+
+  // Prevent Chrome on Windows from adding a focus outline. For details, see
+  // https://github.com/twbs/bootstrap/pull/10951.
+  outline: 0;
+
+  // When fading in the modal, animate it to slide down
+  &.fade .modal-dialog {
+    @include translate(0, -25%);
+    @include transition-transform(0.3s ease-out);
+  }
+  &.in .modal-dialog { @include translate(0, 0) }
+}
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+// Shell div to position the modal with bottom padding
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px;
+}
+
+// Actual modal
+.modal-content {
+  position: relative;
+  background-color: $modal-content-bg;
+  border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
+  border: 1px solid $modal-content-border-color;
+  border-radius: $border-radius-large;
+  @include box-shadow(0 3px 9px rgba(0,0,0,.5));
+  background-clip: padding-box;
+  // Remove focus outline from opened modal
+  outline: 0;
+}
+
+// Modal background
+.modal-backdrop {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  background-color: $modal-backdrop-bg;
+  // Fade for backdrop
+  &.fade { @include opacity(0); }
+  &.in { @include opacity($modal-backdrop-opacity); }
+}
+
+// Modal header
+// Top section of the modal w/ title and dismiss
+.modal-header {
+  padding: $modal-title-padding;
+  border-bottom: 1px solid $modal-header-border-color;
+  min-height: ($modal-title-padding + $modal-title-line-height);
+}
+// Close icon
+.modal-header .close {
+  margin-top: -2px;
+}
+
+// Title text within header
+.modal-title {
+  margin: 0;
+  line-height: $modal-title-line-height;
+}
+
+// Modal body
+// Where all modal content resides (sibling of .modal-header and .modal-footer)
+.modal-body {
+  position: relative;
+  padding: $modal-inner-padding;
+}
+
+// Footer (for actions)
+.modal-footer {
+  padding: $modal-inner-padding;
+  text-align: right; // right align buttons
+  border-top: 1px solid $modal-footer-border-color;
+  @include clearfix; // clear it in case folks use .pull-* classes on buttons
+
+  // Properly space out buttons
+  .btn + .btn {
+    margin-left: 5px;
+    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
+  }
+  // but override that for button groups
+  .btn-group .btn + .btn {
+    margin-left: -1px;
+  }
+  // and override it for block buttons as well
+  .btn-block + .btn-block {
+    margin-left: 0;
+  }
+}
+
+// Measure scrollbar width for padding body during modal show/hide
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+
+// Scale up the modal
+@media (min-width: $screen-sm-min) {
+  // Automatically set modal's width for larger viewports
+  .modal-dialog {
+    width: $modal-md;
+    margin: 30px auto;
+  }
+  .modal-content {
+    @include box-shadow(0 5px 15px rgba(0,0,0,.5));
+  }
+
+  // Modal sizes
+  .modal-sm { width: $modal-sm; }
+}
+
+@media (min-width: $screen-md-min) {
+  .modal-lg { width: $modal-lg; }
+}
diff --git a/static/assets/stylesheets/bootstrap/_navbar.scss b/static/assets/stylesheets/bootstrap/_navbar.scss
new file mode 100644
index 0000000000000000000000000000000000000000..ed36a9933ec882f8dd6eda6eac4605444f2686ba
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_navbar.scss
@@ -0,0 +1,663 @@
+//
+// Navbars
+// --------------------------------------------------
+
+
+// Wrapper and base class
+//
+// Provide a static navbar from which we expand to create full-width, fixed, and
+// other navbar variations.
+
+.navbar {
+  position: relative;
+  min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
+  margin-bottom: $navbar-margin-bottom;
+  border: 1px solid transparent;
+
+  // Prevent floats from breaking the navbar
+  @include clearfix;
+
+  @media (min-width: $grid-float-breakpoint) {
+    border-radius: $navbar-border-radius;
+  }
+}
+
+
+// Navbar heading
+//
+// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
+// styling of responsive aspects.
+
+.navbar-header {
+  @include clearfix;
+
+  @media (min-width: $grid-float-breakpoint) {
+    float: left;
+  }
+}
+
+
+// Navbar collapse (body)
+//
+// Group your navbar content into this for easy collapsing and expanding across
+// various device sizes. By default, this content is collapsed when <768px, but
+// will expand past that for a horizontal display.
+//
+// To start (on mobile devices) the navbar links, forms, and buttons are stacked
+// vertically and include a `max-height` to overflow in case you have too much
+// content for the user's viewport.
+
+.navbar-collapse {
+  overflow-x: visible;
+  padding-right: $navbar-padding-horizontal;
+  padding-left:  $navbar-padding-horizontal;
+  border-top: 1px solid transparent;
+  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
+  @include clearfix;
+  -webkit-overflow-scrolling: touch;
+
+  &.in {
+    overflow-y: auto;
+  }
+
+  @media (min-width: $grid-float-breakpoint) {
+    width: auto;
+    border-top: 0;
+    box-shadow: none;
+
+    &.collapse {
+      display: block !important;
+      visibility: visible !important;
+      height: auto !important;
+      padding-bottom: 0; // Override default setting
+      overflow: visible !important;
+    }
+
+    &.in {
+      overflow-y: visible;
+    }
+
+    // Undo the collapse side padding for navbars with containers to ensure
+    // alignment of right-aligned contents.
+    .navbar-fixed-top &,
+    .navbar-static-top &,
+    .navbar-fixed-bottom & {
+      padding-left: 0;
+      padding-right: 0;
+    }
+  }
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  .navbar-collapse {
+    max-height: $navbar-collapse-max-height;
+
+    @media (max-device-width: $screen-xs-min) and (orientation: landscape) {
+      max-height: 200px;
+    }
+  }
+}
+
+
+// Both navbar header and collapse
+//
+// When a container is present, change the behavior of the header and collapse.
+
+.container,
+.container-fluid {
+  > .navbar-header,
+  > .navbar-collapse {
+    margin-right: -$navbar-padding-horizontal;
+    margin-left:  -$navbar-padding-horizontal;
+
+    @media (min-width: $grid-float-breakpoint) {
+      margin-right: 0;
+      margin-left:  0;
+    }
+  }
+}
+
+
+//
+// Navbar alignment options
+//
+// Display the navbar across the entirety of the page or fixed it to the top or
+// bottom of the page.
+
+// Static top (unfixed, but 100% wide) navbar
+.navbar-static-top {
+  z-index: $zindex-navbar;
+  border-width: 0 0 1px;
+
+  @media (min-width: $grid-float-breakpoint) {
+    border-radius: 0;
+  }
+}
+
+// Fix the top/bottom navbars when screen real estate supports it
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: $zindex-navbar-fixed;
+
+  // Undo the rounded corners
+  @media (min-width: $grid-float-breakpoint) {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+  margin-bottom: 0; // override .navbar defaults
+  border-width: 1px 0 0;
+}
+
+
+// Brand/project name
+
+.navbar-brand {
+  float: left;
+  padding: $navbar-padding-vertical $navbar-padding-horizontal;
+  font-size: $font-size-large;
+  line-height: $line-height-computed;
+  height: $navbar-height;
+
+  &:hover,
+  &:focus {
+    text-decoration: none;
+  }
+
+  > img {
+    display: block;
+  }
+
+  @media (min-width: $grid-float-breakpoint) {
+    .navbar > .container &,
+    .navbar > .container-fluid & {
+      margin-left: -$navbar-padding-horizontal;
+    }
+  }
+}
+
+
+// Navbar toggle
+//
+// Custom button for toggling the `.navbar-collapse`, powered by the collapse
+// JavaScript plugin.
+
+.navbar-toggle {
+  position: relative;
+  float: right;
+  margin-right: $navbar-padding-horizontal;
+  padding: 9px 10px;
+  @include navbar-vertical-align(34px);
+  background-color: transparent;
+  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+  border: 1px solid transparent;
+  border-radius: $border-radius-base;
+
+  // We remove the `outline` here, but later compensate by attaching `:hover`
+  // styles to `:focus`.
+  &:focus {
+    outline: 0;
+  }
+
+  // Bars
+  .icon-bar {
+    display: block;
+    width: 22px;
+    height: 2px;
+    border-radius: 1px;
+  }
+  .icon-bar + .icon-bar {
+    margin-top: 4px;
+  }
+
+  @media (min-width: $grid-float-breakpoint) {
+    display: none;
+  }
+}
+
+
+// Navbar nav links
+//
+// Builds on top of the `.nav` components with its own modifier class to make
+// the nav the full height of the horizontal nav (above 768px).
+
+.navbar-nav {
+  margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
+
+  > li > a {
+    padding-top:    10px;
+    padding-bottom: 10px;
+    line-height: $line-height-computed;
+  }
+
+  @media (max-width: $grid-float-breakpoint-max) {
+    // Dropdowns get custom display when collapsed
+    .open .dropdown-menu {
+      position: static;
+      float: none;
+      width: auto;
+      margin-top: 0;
+      background-color: transparent;
+      border: 0;
+      box-shadow: none;
+      > li > a,
+      .dropdown-header {
+        padding: 5px 15px 5px 25px;
+      }
+      > li > a {
+        line-height: $line-height-computed;
+        &:hover,
+        &:focus {
+          background-image: none;
+        }
+      }
+    }
+  }
+
+  // Uncollapse the nav
+  @media (min-width: $grid-float-breakpoint) {
+    float: left;
+    margin: 0;
+
+    > li {
+      float: left;
+      > a {
+        padding-top:    $navbar-padding-vertical;
+        padding-bottom: $navbar-padding-vertical;
+      }
+    }
+  }
+}
+
+
+// Navbar form
+//
+// Extension of the `.form-inline` with some extra flavor for optimum display in
+// our navbars.
+
+.navbar-form {
+  margin-left: -$navbar-padding-horizontal;
+  margin-right: -$navbar-padding-horizontal;
+  padding: 10px $navbar-padding-horizontal;
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+  $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+  @include box-shadow($shadow);
+
+  // Mixin behavior for optimum display
+  @include form-inline;
+
+  .form-group {
+    @media (max-width: $grid-float-breakpoint-max) {
+      margin-bottom: 5px;
+
+      &:last-child {
+        margin-bottom: 0;
+      }
+    }
+  }
+
+  // Vertically center in expanded, horizontal navbar
+  @include navbar-vertical-align($input-height-base);
+
+  // Undo 100% width for pull classes
+  @media (min-width: $grid-float-breakpoint) {
+    width: auto;
+    border: 0;
+    margin-left: 0;
+    margin-right: 0;
+    padding-top: 0;
+    padding-bottom: 0;
+    @include box-shadow(none);
+  }
+}
+
+
+// Dropdown menus
+
+// Menu position and menu carets
+.navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  @include border-top-radius(0);
+}
+// Menu position and menu caret support for dropups via extra dropup class
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+  margin-bottom: 0;
+  @include border-top-radius($navbar-border-radius);
+  @include border-bottom-radius(0);
+}
+
+
+// Buttons in navbars
+//
+// Vertically center a button within a navbar (when *not* in a form).
+
+.navbar-btn {
+  @include navbar-vertical-align($input-height-base);
+
+  &.btn-sm {
+    @include navbar-vertical-align($input-height-small);
+  }
+  &.btn-xs {
+    @include navbar-vertical-align(22);
+  }
+}
+
+
+// Text in navbars
+//
+// Add a class to make any element properly align itself vertically within the navbars.
+
+.navbar-text {
+  @include navbar-vertical-align($line-height-computed);
+
+  @media (min-width: $grid-float-breakpoint) {
+    float: left;
+    margin-left: $navbar-padding-horizontal;
+    margin-right: $navbar-padding-horizontal;
+  }
+}
+
+
+// Component alignment
+//
+// Repurpose the pull utilities as their own navbar utilities to avoid specificity
+// issues with parents and chaining. Only do this when the navbar is uncollapsed
+// though so that navbar contents properly stack and align in mobile.
+//
+// Declared after the navbar components to ensure more specificity on the margins.
+
+@media (min-width: $grid-float-breakpoint) {
+  .navbar-left {
+    float: left !important;
+  }
+  .navbar-right {
+    float: right !important;
+  margin-right: -$navbar-padding-horizontal;
+
+    ~ .navbar-right {
+      margin-right: 0;
+    }
+  }
+}
+
+
+// Alternate navbars
+// --------------------------------------------------
+
+// Default navbar
+.navbar-default {
+  background-color: $navbar-default-bg;
+  border-color: $navbar-default-border;
+
+  .navbar-brand {
+    color: $navbar-default-brand-color;
+    &:hover,
+    &:focus {
+      color: $navbar-default-brand-hover-color;
+      background-color: $navbar-default-brand-hover-bg;
+    }
+  }
+
+  .navbar-text {
+    color: $navbar-default-color;
+  }
+
+  .navbar-nav {
+    > li > a {
+      color: $navbar-default-link-color;
+
+      &:hover,
+      &:focus {
+        color: $navbar-default-link-hover-color;
+        background-color: $navbar-default-link-hover-bg;
+      }
+    }
+    > .active > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $navbar-default-link-active-color;
+        background-color: $navbar-default-link-active-bg;
+      }
+    }
+    > .disabled > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $navbar-default-link-disabled-color;
+        background-color: $navbar-default-link-disabled-bg;
+      }
+    }
+  }
+
+  .navbar-toggle {
+    border-color: $navbar-default-toggle-border-color;
+    &:hover,
+    &:focus {
+      background-color: $navbar-default-toggle-hover-bg;
+    }
+    .icon-bar {
+      background-color: $navbar-default-toggle-icon-bar-bg;
+    }
+  }
+
+  .navbar-collapse,
+  .navbar-form {
+    border-color: $navbar-default-border;
+  }
+
+  // Dropdown menu items
+  .navbar-nav {
+    // Remove background color from open dropdown
+    > .open > a {
+      &,
+      &:hover,
+      &:focus {
+        background-color: $navbar-default-link-active-bg;
+        color: $navbar-default-link-active-color;
+      }
+    }
+
+    @media (max-width: $grid-float-breakpoint-max) {
+      // Dropdowns get custom display when collapsed
+      .open .dropdown-menu {
+        > li > a {
+          color: $navbar-default-link-color;
+          &:hover,
+          &:focus {
+            color: $navbar-default-link-hover-color;
+            background-color: $navbar-default-link-hover-bg;
+          }
+        }
+        > .active > a {
+          &,
+          &:hover,
+          &:focus {
+            color: $navbar-default-link-active-color;
+            background-color: $navbar-default-link-active-bg;
+          }
+        }
+        > .disabled > a {
+          &,
+          &:hover,
+          &:focus {
+            color: $navbar-default-link-disabled-color;
+            background-color: $navbar-default-link-disabled-bg;
+          }
+        }
+      }
+    }
+  }
+
+
+  // Links in navbars
+  //
+  // Add a class to ensure links outside the navbar nav are colored correctly.
+
+  .navbar-link {
+    color: $navbar-default-link-color;
+    &:hover {
+      color: $navbar-default-link-hover-color;
+    }
+  }
+
+  .btn-link {
+    color: $navbar-default-link-color;
+    &:hover,
+    &:focus {
+      color: $navbar-default-link-hover-color;
+    }
+    &[disabled],
+    fieldset[disabled] & {
+      &:hover,
+      &:focus {
+        color: $navbar-default-link-disabled-color;
+      }
+    }
+  }
+}
+
+// Inverse navbar
+
+.navbar-inverse {
+  background-color: $navbar-inverse-bg;
+  border-color: $navbar-inverse-border;
+
+  .navbar-brand {
+    color: $navbar-inverse-brand-color;
+    &:hover,
+    &:focus {
+      color: $navbar-inverse-brand-hover-color;
+      background-color: $navbar-inverse-brand-hover-bg;
+    }
+  }
+
+  .navbar-text {
+    color: $navbar-inverse-color;
+  }
+
+  .navbar-nav {
+    > li > a {
+      color: $navbar-inverse-link-color;
+
+      &:hover,
+      &:focus {
+        color: $navbar-inverse-link-hover-color;
+        background-color: $navbar-inverse-link-hover-bg;
+      }
+    }
+    > .active > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $navbar-inverse-link-active-color;
+        background-color: $navbar-inverse-link-active-bg;
+      }
+    }
+    > .disabled > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $navbar-inverse-link-disabled-color;
+        background-color: $navbar-inverse-link-disabled-bg;
+      }
+    }
+  }
+
+  // Darken the responsive nav toggle
+  .navbar-toggle {
+    border-color: $navbar-inverse-toggle-border-color;
+    &:hover,
+    &:focus {
+      background-color: $navbar-inverse-toggle-hover-bg;
+    }
+    .icon-bar {
+      background-color: $navbar-inverse-toggle-icon-bar-bg;
+    }
+  }
+
+  .navbar-collapse,
+  .navbar-form {
+    border-color: darken($navbar-inverse-bg, 7%);
+  }
+
+  // Dropdowns
+  .navbar-nav {
+    > .open > a {
+      &,
+      &:hover,
+      &:focus {
+        background-color: $navbar-inverse-link-active-bg;
+        color: $navbar-inverse-link-active-color;
+      }
+    }
+
+    @media (max-width: $grid-float-breakpoint-max) {
+      // Dropdowns get custom display
+      .open .dropdown-menu {
+        > .dropdown-header {
+          border-color: $navbar-inverse-border;
+        }
+        .divider {
+          background-color: $navbar-inverse-border;
+        }
+        > li > a {
+          color: $navbar-inverse-link-color;
+          &:hover,
+          &:focus {
+            color: $navbar-inverse-link-hover-color;
+            background-color: $navbar-inverse-link-hover-bg;
+          }
+        }
+        > .active > a {
+          &,
+          &:hover,
+          &:focus {
+            color: $navbar-inverse-link-active-color;
+            background-color: $navbar-inverse-link-active-bg;
+          }
+        }
+        > .disabled > a {
+          &,
+          &:hover,
+          &:focus {
+            color: $navbar-inverse-link-disabled-color;
+            background-color: $navbar-inverse-link-disabled-bg;
+          }
+        }
+      }
+    }
+  }
+
+  .navbar-link {
+    color: $navbar-inverse-link-color;
+    &:hover {
+      color: $navbar-inverse-link-hover-color;
+    }
+  }
+
+  .btn-link {
+    color: $navbar-inverse-link-color;
+    &:hover,
+    &:focus {
+      color: $navbar-inverse-link-hover-color;
+    }
+    &[disabled],
+    fieldset[disabled] & {
+      &:hover,
+      &:focus {
+        color: $navbar-inverse-link-disabled-color;
+      }
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_navs.scss b/static/assets/stylesheets/bootstrap/_navs.scss
new file mode 100644
index 0000000000000000000000000000000000000000..ce0b9178b0a804e4f42fdf175af5421ed54dd84d
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_navs.scss
@@ -0,0 +1,244 @@
+//
+// Navs
+// --------------------------------------------------
+
+
+// Base class
+// --------------------------------------------------
+
+.nav {
+  margin-bottom: 0;
+  padding-left: 0; // Override default ul/ol
+  list-style: none;
+  @include clearfix;
+
+  > li {
+    position: relative;
+    display: block;
+
+    > a {
+      position: relative;
+      display: block;
+      padding: $nav-link-padding;
+      &:hover,
+      &:focus {
+        text-decoration: none;
+        background-color: $nav-link-hover-bg;
+      }
+    }
+
+    // Disabled state sets text to gray and nukes hover/tab effects
+    &.disabled > a {
+      color: $nav-disabled-link-color;
+
+      &:hover,
+      &:focus {
+        color: $nav-disabled-link-hover-color;
+        text-decoration: none;
+        background-color: transparent;
+        cursor: $cursor-disabled;
+      }
+    }
+  }
+
+  // Open dropdowns
+  .open > a {
+    &,
+    &:hover,
+    &:focus {
+      background-color: $nav-link-hover-bg;
+      border-color: $link-color;
+    }
+  }
+
+  // Nav dividers (deprecated with v3.0.1)
+  //
+  // This should have been removed in v3 with the dropping of `.nav-list`, but
+  // we missed it. We don't currently support this anywhere, but in the interest
+  // of maintaining backward compatibility in case you use it, it's deprecated.
+  .nav-divider {
+    @include nav-divider;
+  }
+
+  // Prevent IE8 from misplacing imgs
+  //
+  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
+  > li > a > img {
+    max-width: none;
+  }
+}
+
+
+// Tabs
+// -------------------------
+
+// Give the tabs something to sit on
+.nav-tabs {
+  border-bottom: 1px solid $nav-tabs-border-color;
+  > li {
+    float: left;
+    // Make the list-items overlay the bottom border
+    margin-bottom: -1px;
+
+    // Actual tabs (as links)
+    > a {
+      margin-right: 2px;
+      line-height: $line-height-base;
+      border: 1px solid transparent;
+      border-radius: $border-radius-base $border-radius-base 0 0;
+      &:hover {
+        border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;
+      }
+    }
+
+    // Active state, and its :hover to override normal :hover
+    &.active > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $nav-tabs-active-link-hover-color;
+        background-color: $nav-tabs-active-link-hover-bg;
+        border: 1px solid $nav-tabs-active-link-hover-border-color;
+        border-bottom-color: transparent;
+        cursor: default;
+      }
+    }
+  }
+  // pulling this in mainly for less shorthand
+  &.nav-justified {
+    @extend .nav-justified;
+    @extend .nav-tabs-justified;
+  }
+}
+
+
+// Pills
+// -------------------------
+.nav-pills {
+  > li {
+    float: left;
+
+    // Links rendered as pills
+    > a {
+      border-radius: $nav-pills-border-radius;
+    }
+    + li {
+      margin-left: 2px;
+    }
+
+    // Active state
+    &.active > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $nav-pills-active-link-hover-color;
+        background-color: $nav-pills-active-link-hover-bg;
+      }
+    }
+  }
+}
+
+
+// Stacked pills
+.nav-stacked {
+  > li {
+    float: none;
+    + li {
+      margin-top: 2px;
+      margin-left: 0; // no need for this gap between nav items
+    }
+  }
+}
+
+
+// Nav variations
+// --------------------------------------------------
+
+// Justified nav links
+// -------------------------
+
+.nav-justified {
+  width: 100%;
+
+  > li {
+    float: none;
+    > a {
+      text-align: center;
+      margin-bottom: 5px;
+    }
+  }
+
+  > .dropdown .dropdown-menu {
+    top: auto;
+    left: auto;
+  }
+
+  @media (min-width: $screen-sm-min) {
+    > li {
+      display: table-cell;
+      width: 1%;
+      > a {
+        margin-bottom: 0;
+      }
+    }
+  }
+}
+
+// Move borders to anchors instead of bottom of list
+//
+// Mixin for adding on top the shared `.nav-justified` styles for our tabs
+.nav-tabs-justified {
+  border-bottom: 0;
+
+  > li > a {
+    // Override margin from .nav-tabs
+    margin-right: 0;
+    border-radius: $border-radius-base;
+  }
+
+  > .active > a,
+  > .active > a:hover,
+  > .active > a:focus {
+    border: 1px solid $nav-tabs-justified-link-border-color;
+  }
+
+  @media (min-width: $screen-sm-min) {
+    > li > a {
+      border-bottom: 1px solid $nav-tabs-justified-link-border-color;
+      border-radius: $border-radius-base $border-radius-base 0 0;
+    }
+    > .active > a,
+    > .active > a:hover,
+    > .active > a:focus {
+      border-bottom-color: $nav-tabs-justified-active-link-border-color;
+    }
+  }
+}
+
+
+// Tabbable tabs
+// -------------------------
+
+// Hide tabbable panes to start, show them when `.active`
+.tab-content {
+  > .tab-pane {
+    display: none;
+    visibility: hidden;
+  }
+  > .active {
+    display: block;
+    visibility: visible;
+  }
+}
+
+
+// Dropdowns
+// -------------------------
+
+// Specific dropdowns
+.nav-tabs .dropdown-menu {
+  // make dropdown border overlap tab border
+  margin-top: -1px;
+  // Remove the top rounded corners here since there is a hard edge above the menu
+  @include border-top-radius(0);
+}
diff --git a/static/assets/stylesheets/bootstrap/_normalize.scss b/static/assets/stylesheets/bootstrap/_normalize.scss
new file mode 100644
index 0000000000000000000000000000000000000000..62a085a4841a536094f22943c9557240e2d8c19d
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_normalize.scss
@@ -0,0 +1,427 @@
+/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
+
+//
+// 1. Set default font family to sans-serif.
+// 2. Prevent iOS text size adjust after orientation change, without disabling
+//    user zoom.
+//
+
+html {
+  font-family: sans-serif; // 1
+  -ms-text-size-adjust: 100%; // 2
+  -webkit-text-size-adjust: 100%; // 2
+}
+
+//
+// Remove default margin.
+//
+
+body {
+  margin: 0;
+}
+
+// HTML5 display definitions
+// ==========================================================================
+
+//
+// Correct `block` display not defined for any HTML5 element in IE 8/9.
+// Correct `block` display not defined for `details` or `summary` in IE 10/11
+// and Firefox.
+// Correct `block` display not defined for `main` in IE 11.
+//
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+  display: block;
+}
+
+//
+// 1. Correct `inline-block` display not defined in IE 8/9.
+// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+//
+
+audio,
+canvas,
+progress,
+video {
+  display: inline-block; // 1
+  vertical-align: baseline; // 2
+}
+
+//
+// Prevent modern browsers from displaying `audio` without controls.
+// Remove excess height in iOS 5 devices.
+//
+
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+
+//
+// Address `[hidden]` styling not present in IE 8/9/10.
+// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
+//
+
+[hidden],
+template {
+  display: none;
+}
+
+// Links
+// ==========================================================================
+
+//
+// Remove the gray background color from active links in IE 10.
+//
+
+a {
+  background-color: transparent;
+}
+
+//
+// Improve readability when focused and also mouse hovered in all browsers.
+//
+
+a:active,
+a:hover {
+  outline: 0;
+}
+
+// Text-level semantics
+// ==========================================================================
+
+//
+// Address styling not present in IE 8/9/10/11, Safari, and Chrome.
+//
+
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+
+//
+// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+//
+
+b,
+strong {
+  font-weight: bold;
+}
+
+//
+// Address styling not present in Safari and Chrome.
+//
+
+dfn {
+  font-style: italic;
+}
+
+//
+// Address variable `h1` font-size and margin within `section` and `article`
+// contexts in Firefox 4+, Safari, and Chrome.
+//
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+//
+// Address styling not present in IE 8/9.
+//
+
+mark {
+  background: #ff0;
+  color: #000;
+}
+
+//
+// Address inconsistent and variable font size in all browsers.
+//
+
+small {
+  font-size: 80%;
+}
+
+//
+// Prevent `sub` and `sup` affecting `line-height` in all browsers.
+//
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+// Embedded content
+// ==========================================================================
+
+//
+// Remove border when inside `a` element in IE 8/9/10.
+//
+
+img {
+  border: 0;
+}
+
+//
+// Correct overflow not hidden in IE 9/10/11.
+//
+
+svg:not(:root) {
+  overflow: hidden;
+}
+
+// Grouping content
+// ==========================================================================
+
+//
+// Address margin not present in IE 8/9 and Safari.
+//
+
+figure {
+  margin: 1em 40px;
+}
+
+//
+// Address differences between Firefox and other browsers.
+//
+
+hr {
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  height: 0;
+}
+
+//
+// Contain overflow in all browsers.
+//
+
+pre {
+  overflow: auto;
+}
+
+//
+// Address odd `em`-unit font size rendering in all browsers.
+//
+
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+// Forms
+// ==========================================================================
+
+//
+// Known limitation: by default, Chrome and Safari on OS X allow very limited
+// styling of `select`, unless a `border` property is set.
+//
+
+//
+// 1. Correct color not being inherited.
+//    Known issue: affects color of disabled elements.
+// 2. Correct font properties not being inherited.
+// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+//
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  color: inherit; // 1
+  font: inherit; // 2
+  margin: 0; // 3
+}
+
+//
+// Address `overflow` set to `hidden` in IE 8/9/10/11.
+//
+
+button {
+  overflow: visible;
+}
+
+//
+// Address inconsistent `text-transform` inheritance for `button` and `select`.
+// All other form control elements do not inherit `text-transform` values.
+// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+// Correct `select` style inheritance in Firefox.
+//
+
+button,
+select {
+  text-transform: none;
+}
+
+//
+// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+//    and `video` controls.
+// 2. Correct inability to style clickable `input` types in iOS.
+// 3. Improve usability and consistency of cursor style between image-type
+//    `input` and others.
+//
+
+button,
+html input[type="button"], // 1
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button; // 2
+  cursor: pointer; // 3
+}
+
+//
+// Re-set default cursor for disabled elements.
+//
+
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+
+//
+// Remove inner padding and border in Firefox 4+.
+//
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  border: 0;
+  padding: 0;
+}
+
+//
+// Address Firefox 4+ setting `line-height` on `input` using `!important` in
+// the UA stylesheet.
+//
+
+input {
+  line-height: normal;
+}
+
+//
+// It's recommended that you don't attempt to style these elements.
+// Firefox's implementation doesn't respect box-sizing, padding, or width.
+//
+// 1. Address box sizing set to `content-box` in IE 8/9/10.
+// 2. Remove excess padding in IE 8/9/10.
+//
+
+input[type="checkbox"],
+input[type="radio"] {
+  box-sizing: border-box; // 1
+  padding: 0; // 2
+}
+
+//
+// Fix the cursor style for Chrome's increment/decrement buttons. For certain
+// `font-size` values of the `input`, it causes the cursor style of the
+// decrement button to change from `default` to `text`.
+//
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+//
+// 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+// 2. Address `box-sizing` set to `border-box` in Safari and Chrome
+//    (include `-moz` to future-proof).
+//
+
+input[type="search"] {
+  -webkit-appearance: textfield; // 1
+  -moz-box-sizing: content-box;
+  -webkit-box-sizing: content-box; // 2
+  box-sizing: content-box;
+}
+
+//
+// Remove inner padding and search cancel button in Safari and Chrome on OS X.
+// Safari (but not Chrome) clips the cancel button when the search input has
+// padding (and `textfield` appearance).
+//
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+//
+// Define consistent border, margin, and padding.
+//
+
+fieldset {
+  border: 1px solid #c0c0c0;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em;
+}
+
+//
+// 1. Correct `color` not being inherited in IE 8/9/10/11.
+// 2. Remove padding so people aren't caught out if they zero out fieldsets.
+//
+
+legend {
+  border: 0; // 1
+  padding: 0; // 2
+}
+
+//
+// Remove default vertical scrollbar in IE 8/9/10/11.
+//
+
+textarea {
+  overflow: auto;
+}
+
+//
+// Don't inherit the `font-weight` (applied by a rule above).
+// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+//
+
+optgroup {
+  font-weight: bold;
+}
+
+// Tables
+// ==========================================================================
+
+//
+// Remove most spacing between table cells.
+//
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+td,
+th {
+  padding: 0;
+}
diff --git a/static/assets/stylesheets/bootstrap/_pager.scss b/static/assets/stylesheets/bootstrap/_pager.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c2342174ff3713003e0417b18271ef3e609475c7
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_pager.scss
@@ -0,0 +1,54 @@
+//
+// Pager pagination
+// --------------------------------------------------
+
+
+.pager {
+  padding-left: 0;
+  margin: $line-height-computed 0;
+  list-style: none;
+  text-align: center;
+  @include clearfix;
+  li {
+    display: inline;
+    > a,
+    > span {
+      display: inline-block;
+      padding: 5px 14px;
+      background-color: $pager-bg;
+      border: 1px solid $pager-border;
+      border-radius: $pager-border-radius;
+    }
+
+    > a:hover,
+    > a:focus {
+      text-decoration: none;
+      background-color: $pager-hover-bg;
+    }
+  }
+
+  .next {
+    > a,
+    > span {
+      float: right;
+    }
+  }
+
+  .previous {
+    > a,
+    > span {
+      float: left;
+    }
+  }
+
+  .disabled {
+    > a,
+    > a:hover,
+    > a:focus,
+    > span {
+      color: $pager-disabled-color;
+      background-color: $pager-bg;
+      cursor: $cursor-disabled;
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_pagination.scss b/static/assets/stylesheets/bootstrap/_pagination.scss
new file mode 100644
index 0000000000000000000000000000000000000000..323ec727767a2833513c459e08cfed62748f3ffe
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_pagination.scss
@@ -0,0 +1,88 @@
+//
+// Pagination (multiple pages)
+// --------------------------------------------------
+.pagination {
+  display: inline-block;
+  padding-left: 0;
+  margin: $line-height-computed 0;
+  border-radius: $border-radius-base;
+
+  > li {
+    display: inline; // Remove list-style and block-level defaults
+    > a,
+    > span {
+      position: relative;
+      float: left; // Collapse white-space
+      padding: $padding-base-vertical $padding-base-horizontal;
+      line-height: $line-height-base;
+      text-decoration: none;
+      color: $pagination-color;
+      background-color: $pagination-bg;
+      border: 1px solid $pagination-border;
+      margin-left: -1px;
+    }
+    &:first-child {
+      > a,
+      > span {
+        margin-left: 0;
+        @include border-left-radius($border-radius-base);
+      }
+    }
+    &:last-child {
+      > a,
+      > span {
+        @include border-right-radius($border-radius-base);
+      }
+    }
+  }
+
+  > li > a,
+  > li > span {
+    &:hover,
+    &:focus {
+      color: $pagination-hover-color;
+      background-color: $pagination-hover-bg;
+      border-color: $pagination-hover-border;
+    }
+  }
+
+  > .active > a,
+  > .active > span {
+    &,
+    &:hover,
+    &:focus {
+      z-index: 2;
+      color: $pagination-active-color;
+      background-color: $pagination-active-bg;
+      border-color: $pagination-active-border;
+      cursor: default;
+    }
+  }
+
+  > .disabled {
+    > span,
+    > span:hover,
+    > span:focus,
+    > a,
+    > a:hover,
+    > a:focus {
+      color: $pagination-disabled-color;
+      background-color: $pagination-disabled-bg;
+      border-color: $pagination-disabled-border;
+      cursor: $cursor-disabled;
+    }
+  }
+}
+
+// Sizing
+// --------------------------------------------------
+
+// Large
+.pagination-lg {
+  @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $border-radius-large);
+}
+
+// Small
+.pagination-sm {
+  @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $border-radius-small);
+}
diff --git a/static/assets/stylesheets/bootstrap/_panels.scss b/static/assets/stylesheets/bootstrap/_panels.scss
new file mode 100644
index 0000000000000000000000000000000000000000..84847b47b71e0e11765006138a0939a02b26ee08
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_panels.scss
@@ -0,0 +1,265 @@
+//
+// Panels
+// --------------------------------------------------
+
+
+// Base class
+.panel {
+  margin-bottom: $line-height-computed;
+  background-color: $panel-bg;
+  border: 1px solid transparent;
+  border-radius: $panel-border-radius;
+  @include box-shadow(0 1px 1px rgba(0,0,0,.05));
+}
+
+// Panel contents
+.panel-body {
+  padding: $panel-body-padding;
+  @include clearfix;
+}
+
+// Optional heading
+.panel-heading {
+  padding: $panel-heading-padding;
+  border-bottom: 1px solid transparent;
+  @include border-top-radius(($panel-border-radius - 1));
+
+  > .dropdown .dropdown-toggle {
+    color: inherit;
+  }
+}
+
+// Within heading, strip any `h*` tag of its default margins for spacing.
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: ceil(($font-size-base * 1.125));
+  color: inherit;
+
+  > a,
+  > small,
+  > .small,
+  > small > a,
+  > .small > a {
+    color: inherit;
+  }
+}
+
+// Optional footer (stays gray in every modifier class)
+.panel-footer {
+  padding: $panel-footer-padding;
+  background-color: $panel-footer-bg;
+  border-top: 1px solid $panel-inner-border;
+  @include border-bottom-radius(($panel-border-radius - 1));
+}
+
+
+// List groups in panels
+//
+// By default, space out list group content from panel headings to account for
+// any kind of custom content between the two.
+
+.panel {
+  > .list-group,
+  > .panel-collapse > .list-group {
+    margin-bottom: 0;
+
+    .list-group-item {
+      border-width: 1px 0;
+      border-radius: 0;
+    }
+
+    // Add border top radius for first one
+    &:first-child {
+      .list-group-item:first-child {
+        border-top: 0;
+        @include border-top-radius(($panel-border-radius - 1));
+      }
+    }
+    // Add border bottom radius for last one
+    &:last-child {
+      .list-group-item:last-child {
+        border-bottom: 0;
+        @include border-bottom-radius(($panel-border-radius - 1));
+      }
+    }
+  }
+}
+// Collapse space between when there's no additional content.
+.panel-heading + .list-group {
+  .list-group-item:first-child {
+    border-top-width: 0;
+  }
+}
+.list-group + .panel-footer {
+  border-top-width: 0;
+}
+
+// Tables in panels
+//
+// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
+// watch it go full width.
+
+.panel {
+  > .table,
+  > .table-responsive > .table,
+  > .panel-collapse > .table {
+    margin-bottom: 0;
+
+    caption {
+      padding-left: $panel-body-padding;
+      padding-right: $panel-body-padding;
+    }
+  }
+  // Add border top radius for first one
+  > .table:first-child,
+  > .table-responsive:first-child > .table:first-child {
+    @include border-top-radius(($panel-border-radius - 1));
+
+    > thead:first-child,
+    > tbody:first-child {
+      > tr:first-child {
+        border-top-left-radius: ($panel-border-radius - 1);
+        border-top-right-radius: ($panel-border-radius - 1);
+
+        td:first-child,
+        th:first-child {
+          border-top-left-radius: ($panel-border-radius - 1);
+        }
+        td:last-child,
+        th:last-child {
+          border-top-right-radius: ($panel-border-radius - 1);
+        }
+      }
+    }
+  }
+  // Add border bottom radius for last one
+  > .table:last-child,
+  > .table-responsive:last-child > .table:last-child {
+    @include border-bottom-radius(($panel-border-radius - 1));
+
+    > tbody:last-child,
+    > tfoot:last-child {
+      > tr:last-child {
+        border-bottom-left-radius: ($panel-border-radius - 1);
+        border-bottom-right-radius: ($panel-border-radius - 1);
+
+        td:first-child,
+        th:first-child {
+          border-bottom-left-radius: ($panel-border-radius - 1);
+        }
+        td:last-child,
+        th:last-child {
+          border-bottom-right-radius: ($panel-border-radius - 1);
+        }
+      }
+    }
+  }
+  > .panel-body + .table,
+  > .panel-body + .table-responsive,
+  > .table + .panel-body,
+  > .table-responsive + .panel-body {
+    border-top: 1px solid $table-border-color;
+  }
+  > .table > tbody:first-child > tr:first-child th,
+  > .table > tbody:first-child > tr:first-child td {
+    border-top: 0;
+  }
+  > .table-bordered,
+  > .table-responsive > .table-bordered {
+    border: 0;
+    > thead,
+    > tbody,
+    > tfoot {
+      > tr {
+        > th:first-child,
+        > td:first-child {
+          border-left: 0;
+        }
+        > th:last-child,
+        > td:last-child {
+          border-right: 0;
+        }
+      }
+    }
+    > thead,
+    > tbody {
+      > tr:first-child {
+        > td,
+        > th {
+          border-bottom: 0;
+        }
+      }
+    }
+    > tbody,
+    > tfoot {
+      > tr:last-child {
+        > td,
+        > th {
+          border-bottom: 0;
+        }
+      }
+    }
+  }
+  > .table-responsive {
+    border: 0;
+    margin-bottom: 0;
+  }
+}
+
+
+// Collapsable panels (aka, accordion)
+//
+// Wrap a series of panels in `.panel-group` to turn them into an accordion with
+// the help of our collapse JavaScript plugin.
+
+.panel-group {
+  margin-bottom: $line-height-computed;
+
+  // Tighten up margin so it's only between panels
+  .panel {
+    margin-bottom: 0;
+    border-radius: $panel-border-radius;
+
+    + .panel {
+      margin-top: 5px;
+    }
+  }
+
+  .panel-heading {
+    border-bottom: 0;
+
+    + .panel-collapse > .panel-body,
+    + .panel-collapse > .list-group {
+      border-top: 1px solid $panel-inner-border;
+    }
+  }
+
+  .panel-footer {
+    border-top: 0;
+    + .panel-collapse .panel-body {
+      border-bottom: 1px solid $panel-inner-border;
+    }
+  }
+}
+
+
+// Contextual variations
+.panel-default {
+  @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);
+}
+.panel-primary {
+  @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);
+}
+.panel-success {
+  @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);
+}
+.panel-info {
+  @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);
+}
+.panel-warning {
+  @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);
+}
+.panel-danger {
+  @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);
+}
diff --git a/static/assets/stylesheets/bootstrap/_popovers.scss b/static/assets/stylesheets/bootstrap/_popovers.scss
new file mode 100644
index 0000000000000000000000000000000000000000..699c7b8da46855c72952387e48e102086cd236df
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_popovers.scss
@@ -0,0 +1,135 @@
+//
+// Popovers
+// --------------------------------------------------
+
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: $zindex-popover;
+  display: none;
+  max-width: $popover-max-width;
+  padding: 1px;
+  // Reset font and text properties given new insertion method
+  font-family: $font-family-base;
+  font-size: $font-size-base;
+  font-weight: normal;
+  line-height: $line-height-base;
+  text-align: left;
+  background-color: $popover-bg;
+  background-clip: padding-box;
+  border: 1px solid $popover-fallback-border-color;
+  border: 1px solid $popover-border-color;
+  border-radius: $border-radius-large;
+  @include box-shadow(0 5px 10px rgba(0,0,0,.2));
+
+  // Overrides for proper insertion
+  white-space: normal;
+
+  // Offset the popover to account for the popover arrow
+  &.top     { margin-top: -$popover-arrow-width; }
+  &.right   { margin-left: $popover-arrow-width; }
+  &.bottom  { margin-top: $popover-arrow-width; }
+  &.left    { margin-left: -$popover-arrow-width; }
+}
+
+.popover-title {
+  margin: 0; // reset heading margin
+  padding: 8px 14px;
+  font-size: $font-size-base;
+  background-color: $popover-title-bg;
+  border-bottom: 1px solid darken($popover-title-bg, 5%);
+  border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;
+}
+
+.popover-content {
+  padding: 9px 14px;
+}
+
+// Arrows
+//
+// .arrow is outer, .arrow:after is inner
+
+.popover > .arrow {
+  &,
+  &:after {
+    position: absolute;
+    display: block;
+    width: 0;
+    height: 0;
+    border-color: transparent;
+    border-style: solid;
+  }
+}
+.popover > .arrow {
+  border-width: $popover-arrow-outer-width;
+}
+.popover > .arrow:after {
+  border-width: $popover-arrow-width;
+  content: "";
+}
+
+.popover {
+  &.top > .arrow {
+    left: 50%;
+    margin-left: -$popover-arrow-outer-width;
+    border-bottom-width: 0;
+    border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+    border-top-color: $popover-arrow-outer-color;
+    bottom: -$popover-arrow-outer-width;
+    &:after {
+      content: " ";
+      bottom: 1px;
+      margin-left: -$popover-arrow-width;
+      border-bottom-width: 0;
+      border-top-color: $popover-arrow-color;
+    }
+  }
+  &.right > .arrow {
+    top: 50%;
+    left: -$popover-arrow-outer-width;
+    margin-top: -$popover-arrow-outer-width;
+    border-left-width: 0;
+    border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+    border-right-color: $popover-arrow-outer-color;
+    &:after {
+      content: " ";
+      left: 1px;
+      bottom: -$popover-arrow-width;
+      border-left-width: 0;
+      border-right-color: $popover-arrow-color;
+    }
+  }
+  &.bottom > .arrow {
+    left: 50%;
+    margin-left: -$popover-arrow-outer-width;
+    border-top-width: 0;
+    border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+    border-bottom-color: $popover-arrow-outer-color;
+    top: -$popover-arrow-outer-width;
+    &:after {
+      content: " ";
+      top: 1px;
+      margin-left: -$popover-arrow-width;
+      border-top-width: 0;
+      border-bottom-color: $popover-arrow-color;
+    }
+  }
+
+  &.left > .arrow {
+    top: 50%;
+    right: -$popover-arrow-outer-width;
+    margin-top: -$popover-arrow-outer-width;
+    border-right-width: 0;
+    border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+    border-left-color: $popover-arrow-outer-color;
+    &:after {
+      content: " ";
+      right: 1px;
+      border-right-width: 0;
+      border-left-color: $popover-arrow-color;
+      bottom: -$popover-arrow-width;
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_print.scss b/static/assets/stylesheets/bootstrap/_print.scss
new file mode 100644
index 0000000000000000000000000000000000000000..94ca58f12a93ea0b3fb378b73eec63d8c9ee7372
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_print.scss
@@ -0,0 +1,107 @@
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+
+// ==========================================================================
+// Print styles.
+// Inlined to avoid the additional HTTP request: h5bp.com/r
+// ==========================================================================
+
+@media print {
+    *,
+    *:before,
+    *:after {
+        background: transparent !important;
+        color: #000 !important; // Black prints faster: h5bp.com/s
+        box-shadow: none !important;
+        text-shadow: none !important;
+    }
+
+    a,
+    a:visited {
+        text-decoration: underline;
+    }
+
+    a[href]:after {
+        content: " (" attr(href) ")";
+    }
+
+    abbr[title]:after {
+        content: " (" attr(title) ")";
+    }
+
+    // Don't show links that are fragment identifiers,
+    // or use the `javascript:` pseudo protocol
+    a[href^="#"]:after,
+    a[href^="javascript:"]:after {
+        content: "";
+    }
+
+    pre,
+    blockquote {
+        border: 1px solid #999;
+        page-break-inside: avoid;
+    }
+
+    thead {
+        display: table-header-group; // h5bp.com/t
+    }
+
+    tr,
+    img {
+        page-break-inside: avoid;
+    }
+
+    img {
+        max-width: 100% !important;
+    }
+
+    p,
+    h2,
+    h3 {
+        orphans: 3;
+        widows: 3;
+    }
+
+    h2,
+    h3 {
+        page-break-after: avoid;
+    }
+
+    // Bootstrap specific changes start
+    //
+    // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245
+    // Once fixed, we can just straight up remove this.
+    select {
+        background: #fff !important;
+    }
+
+    // Bootstrap components
+    .navbar {
+        display: none;
+    }
+    .btn,
+    .dropup > .btn {
+        > .caret {
+            border-top-color: #000 !important;
+        }
+    }
+    .label {
+        border: 1px solid #000;
+    }
+
+    .table {
+        border-collapse: collapse !important;
+
+        td,
+        th {
+            background-color: #fff !important;
+        }
+    }
+    .table-bordered {
+        th,
+        td {
+            border: 1px solid #ddd !important;
+        }
+    }
+
+    // Bootstrap specific changes end
+}
diff --git a/static/assets/stylesheets/bootstrap/_progress-bars.scss b/static/assets/stylesheets/bootstrap/_progress-bars.scss
new file mode 100644
index 0000000000000000000000000000000000000000..343df6323c59464cf8088d9c136ace5c29637758
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_progress-bars.scss
@@ -0,0 +1,87 @@
+//
+// Progress bars
+// --------------------------------------------------
+
+
+// Bar animations
+// -------------------------
+
+// WebKit
+@-webkit-keyframes progress-bar-stripes {
+  from  { background-position: 40px 0; }
+  to    { background-position: 0 0; }
+}
+
+// Spec and IE10+
+@keyframes progress-bar-stripes {
+  from  { background-position: 40px 0; }
+  to    { background-position: 0 0; }
+}
+
+
+// Bar itself
+// -------------------------
+
+// Outer container
+.progress {
+  overflow: hidden;
+  height: $line-height-computed;
+  margin-bottom: $line-height-computed;
+  background-color: $progress-bg;
+  border-radius: $progress-border-radius;
+  @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
+}
+
+// Bar of progress
+.progress-bar {
+  float: left;
+  width: 0%;
+  height: 100%;
+  font-size: $font-size-small;
+  line-height: $line-height-computed;
+  color: $progress-bar-color;
+  text-align: center;
+  background-color: $progress-bar-bg;
+  @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
+  @include transition(width .6s ease);
+}
+
+// Striped bars
+//
+// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the
+// `.progress-bar-striped` class, which you just add to an existing
+// `.progress-bar`.
+.progress-striped .progress-bar,
+.progress-bar-striped {
+  @include gradient-striped;
+  background-size: 40px 40px;
+}
+
+// Call animation for the active one
+//
+// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the
+// `.progress-bar.active` approach.
+.progress.active .progress-bar,
+.progress-bar.active {
+  @include animation(progress-bar-stripes 2s linear infinite);
+}
+
+
+// Variations
+// -------------------------
+
+.progress-bar-success {
+  @include progress-bar-variant($progress-bar-success-bg);
+}
+
+.progress-bar-info {
+  @include progress-bar-variant($progress-bar-info-bg);
+}
+
+.progress-bar-warning {
+  @include progress-bar-variant($progress-bar-warning-bg);
+}
+
+.progress-bar-danger {
+  @include progress-bar-variant($progress-bar-danger-bg);
+}
diff --git a/static/assets/stylesheets/bootstrap/_responsive-embed.scss b/static/assets/stylesheets/bootstrap/_responsive-embed.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c1fa8f8488b269e432e23442ea73aae348bddc02
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_responsive-embed.scss
@@ -0,0 +1,35 @@
+// Embeds responsive
+//
+// Credit: Nicolas Gallagher and SUIT CSS.
+
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
+
+  .embed-responsive-item,
+  iframe,
+  embed,
+  object,
+  video {
+    position: absolute;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    height: 100%;
+    width: 100%;
+    border: 0;
+  }
+
+  // Modifier class for 16:9 aspect ratio
+  &.embed-responsive-16by9 {
+    padding-bottom: 56.25%;
+  }
+
+  // Modifier class for 4:3 aspect ratio
+  &.embed-responsive-4by3 {
+    padding-bottom: 75%;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_responsive-utilities.scss b/static/assets/stylesheets/bootstrap/_responsive-utilities.scss
new file mode 100644
index 0000000000000000000000000000000000000000..8d02aaa39c7e10322b571a6e0203240435a57219
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_responsive-utilities.scss
@@ -0,0 +1,177 @@
+//
+// Responsive: Utility classes
+// --------------------------------------------------
+
+
+// IE10 in Windows (Phone) 8
+//
+// Support for responsive views via media queries is kind of borked in IE10, for
+// Surface/desktop in split view and for Windows Phone 8. This particular fix
+// must be accompanied by a snippet of JavaScript to sniff the user agent and
+// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
+// our Getting Started page for more information on this bug.
+//
+// For more information, see the following:
+//
+// Issue: https://github.com/twbs/bootstrap/issues/10497
+// Docs: http://getbootstrap.com/getting-started/#support-ie10-width
+// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/
+// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
+
+@-ms-viewport {
+  width: device-width;
+}
+
+
+// Visibility utilities
+// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
+
+@include responsive-invisibility('.visible-xs');
+@include responsive-invisibility('.visible-sm');
+@include responsive-invisibility('.visible-md');
+@include responsive-invisibility('.visible-lg');
+
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important;
+}
+
+@media (max-width: $screen-xs-max) {
+  @include responsive-visibility('.visible-xs');
+}
+.visible-xs-block {
+  @media (max-width: $screen-xs-max) {
+    display: block !important;
+  }
+}
+.visible-xs-inline {
+  @media (max-width: $screen-xs-max) {
+    display: inline !important;
+  }
+}
+.visible-xs-inline-block {
+  @media (max-width: $screen-xs-max) {
+    display: inline-block !important;
+  }
+}
+
+@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+  @include responsive-visibility('.visible-sm');
+}
+.visible-sm-block {
+  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+    display: block !important;
+  }
+}
+.visible-sm-inline {
+  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+    display: inline !important;
+  }
+}
+.visible-sm-inline-block {
+  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+    display: inline-block !important;
+  }
+}
+
+@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+  @include responsive-visibility('.visible-md');
+}
+.visible-md-block {
+  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+    display: block !important;
+  }
+}
+.visible-md-inline {
+  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+    display: inline !important;
+  }
+}
+.visible-md-inline-block {
+  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+    display: inline-block !important;
+  }
+}
+
+@media (min-width: $screen-lg-min) {
+  @include responsive-visibility('.visible-lg');
+}
+.visible-lg-block {
+  @media (min-width: $screen-lg-min) {
+    display: block !important;
+  }
+}
+.visible-lg-inline {
+  @media (min-width: $screen-lg-min) {
+    display: inline !important;
+  }
+}
+.visible-lg-inline-block {
+  @media (min-width: $screen-lg-min) {
+    display: inline-block !important;
+  }
+}
+
+@media (max-width: $screen-xs-max) {
+  @include responsive-invisibility('.hidden-xs');
+}
+
+@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+  @include responsive-invisibility('.hidden-sm');
+}
+
+@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+  @include responsive-invisibility('.hidden-md');
+}
+
+@media (min-width: $screen-lg-min) {
+  @include responsive-invisibility('.hidden-lg');
+}
+
+
+// Print utilities
+//
+// Media queries are placed on the inside to be mixin-friendly.
+
+// Note: Deprecated .visible-print as of v3.2.0
+
+@include responsive-invisibility('.visible-print');
+
+@media print {
+  @include responsive-visibility('.visible-print');
+}
+.visible-print-block {
+  display: none !important;
+
+  @media print {
+    display: block !important;
+  }
+}
+.visible-print-inline {
+  display: none !important;
+
+  @media print {
+    display: inline !important;
+  }
+}
+.visible-print-inline-block {
+  display: none !important;
+
+  @media print {
+    display: inline-block !important;
+  }
+}
+
+@media print {
+  @include responsive-invisibility('.hidden-print');
+}
diff --git a/static/assets/stylesheets/bootstrap/_scaffolding.scss b/static/assets/stylesheets/bootstrap/_scaffolding.scss
new file mode 100644
index 0000000000000000000000000000000000000000..626e5ebae92b9bd2d60b9a4cf56289cc64455cc1
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_scaffolding.scss
@@ -0,0 +1,150 @@
+//
+// Scaffolding
+// --------------------------------------------------
+
+
+// Reset the box-sizing
+//
+// Heads up! This reset may cause conflicts with some third-party widgets.
+// For recommendations on resolving such conflicts, see
+// http://getbootstrap.com/getting-started/#third-box-sizing
+* {
+  @include box-sizing(border-box);
+}
+*:before,
+*:after {
+  @include box-sizing(border-box);
+}
+
+
+// Body reset
+
+html {
+  font-size: 10px;
+  -webkit-tap-highlight-color: rgba(0,0,0,0);
+}
+
+body {
+  font-family: $font-family-base;
+  font-size: $font-size-base;
+  line-height: $line-height-base;
+  color: $text-color;
+  background-color: $body-bg;
+}
+
+// Reset fonts for relevant elements
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+
+// Links
+
+a {
+  color: $link-color;
+  text-decoration: none;
+
+  &:hover,
+  &:focus {
+    color: $link-hover-color;
+    text-decoration: $link-hover-decoration;
+  }
+
+  &:focus {
+    @include tab-focus;
+  }
+}
+
+
+// Figures
+//
+// We reset this here because previously Normalize had no `figure` margins. This
+// ensures we don't break anyone's use of the element.
+
+figure {
+  margin: 0;
+}
+
+
+// Images
+
+img {
+  vertical-align: middle;
+}
+
+// Responsive images (ensure images don't scale beyond their parents)
+.img-responsive {
+  @include img-responsive;
+}
+
+// Rounded corners
+.img-rounded {
+  border-radius: $border-radius-large;
+}
+
+// Image thumbnails
+//
+// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
+.img-thumbnail {
+  padding: $thumbnail-padding;
+  line-height: $line-height-base;
+  background-color: $thumbnail-bg;
+  border: 1px solid $thumbnail-border;
+  border-radius: $thumbnail-border-radius;
+  @include transition(all .2s ease-in-out);
+
+  // Keep them at most 100% wide
+  @include img-responsive(inline-block);
+}
+
+// Perfect circle
+.img-circle {
+  border-radius: 50%; // set radius in percents
+}
+
+
+// Horizontal rules
+
+hr {
+  margin-top:    $line-height-computed;
+  margin-bottom: $line-height-computed;
+  border: 0;
+  border-top: 1px solid $hr-border;
+}
+
+
+// Only display content to screen readers
+//
+// See: http://a11yproject.com/posts/how-to-hide-content/
+
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0,0,0,0);
+  border: 0;
+}
+
+// Use in conjunction with .sr-only to only display content when it's focused.
+// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
+// Credit: HTML5 Boilerplate
+
+.sr-only-focusable {
+  &:active,
+  &:focus {
+    position: static;
+    width: auto;
+    height: auto;
+    margin: 0;
+    overflow: visible;
+    clip: auto;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_tables.scss b/static/assets/stylesheets/bootstrap/_tables.scss
new file mode 100644
index 0000000000000000000000000000000000000000..affcc58c0b0f80388f291c73451da8e38c8f9280
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_tables.scss
@@ -0,0 +1,234 @@
+//
+// Tables
+// --------------------------------------------------
+
+
+table {
+  background-color: $table-bg;
+}
+caption {
+  padding-top: $table-cell-padding;
+  padding-bottom: $table-cell-padding;
+  color: $text-muted;
+  text-align: left;
+}
+th {
+  text-align: left;
+}
+
+
+// Baseline styles
+
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: $line-height-computed;
+  // Cells
+  > thead,
+  > tbody,
+  > tfoot {
+    > tr {
+      > th,
+      > td {
+        padding: $table-cell-padding;
+        line-height: $line-height-base;
+        vertical-align: top;
+        border-top: 1px solid $table-border-color;
+      }
+    }
+  }
+  // Bottom align for column headings
+  > thead > tr > th {
+    vertical-align: bottom;
+    border-bottom: 2px solid $table-border-color;
+  }
+  // Remove top border from thead by default
+  > caption + thead,
+  > colgroup + thead,
+  > thead:first-child {
+    > tr:first-child {
+      > th,
+      > td {
+        border-top: 0;
+      }
+    }
+  }
+  // Account for multiple tbody instances
+  > tbody + tbody {
+    border-top: 2px solid $table-border-color;
+  }
+
+  // Nesting
+  .table {
+    background-color: $body-bg;
+  }
+}
+
+
+// Condensed table w/ half padding
+
+.table-condensed {
+  > thead,
+  > tbody,
+  > tfoot {
+    > tr {
+      > th,
+      > td {
+        padding: $table-condensed-cell-padding;
+      }
+    }
+  }
+}
+
+
+// Bordered version
+//
+// Add borders all around the table and between all the columns.
+
+.table-bordered {
+  border: 1px solid $table-border-color;
+  > thead,
+  > tbody,
+  > tfoot {
+    > tr {
+      > th,
+      > td {
+        border: 1px solid $table-border-color;
+      }
+    }
+  }
+  > thead > tr {
+    > th,
+    > td {
+      border-bottom-width: 2px;
+    }
+  }
+}
+
+
+// Zebra-striping
+//
+// Default zebra-stripe styles (alternating gray and transparent backgrounds)
+
+.table-striped {
+  > tbody > tr:nth-of-type(odd) {
+    background-color: $table-bg-accent;
+  }
+}
+
+
+// Hover effect
+//
+// Placed here since it has to come after the potential zebra striping
+
+.table-hover {
+  > tbody > tr:hover {
+    background-color: $table-bg-hover;
+  }
+}
+
+
+// Table cell sizing
+//
+// Reset default table behavior
+
+table col[class*="col-"] {
+  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
+  float: none;
+  display: table-column;
+}
+table {
+  td,
+  th {
+    &[class*="col-"] {
+      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
+      float: none;
+      display: table-cell;
+    }
+  }
+}
+
+
+// Table backgrounds
+//
+// Exact selectors below required to override `.table-striped` and prevent
+// inheritance to nested tables.
+
+// Generate the contextual variants
+@include table-row-variant('active', $table-bg-active);
+@include table-row-variant('success', $state-success-bg);
+@include table-row-variant('info', $state-info-bg);
+@include table-row-variant('warning', $state-warning-bg);
+@include table-row-variant('danger', $state-danger-bg);
+
+
+// Responsive tables
+//
+// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
+// by enabling horizontal scrolling. Only applies <768px. Everything above that
+// will display normally.
+
+.table-responsive {
+  overflow-x: auto;
+  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)
+
+  @media screen and (max-width: $screen-xs-max) {
+    width: 100%;
+    margin-bottom: ($line-height-computed * 0.75);
+    overflow-y: hidden;
+    -ms-overflow-style: -ms-autohiding-scrollbar;
+    border: 1px solid $table-border-color;
+
+    // Tighten up spacing
+    > .table {
+      margin-bottom: 0;
+
+      // Ensure the content doesn't wrap
+      > thead,
+      > tbody,
+      > tfoot {
+        > tr {
+          > th,
+          > td {
+            white-space: nowrap;
+          }
+        }
+      }
+    }
+
+    // Special overrides for the bordered tables
+    > .table-bordered {
+      border: 0;
+
+      // Nuke the appropriate borders so that the parent can handle them
+      > thead,
+      > tbody,
+      > tfoot {
+        > tr {
+          > th:first-child,
+          > td:first-child {
+            border-left: 0;
+          }
+          > th:last-child,
+          > td:last-child {
+            border-right: 0;
+          }
+        }
+      }
+
+      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
+      // chances are there will be only one `tr` in a `thead` and that would
+      // remove the border altogether.
+      > tbody,
+      > tfoot {
+        > tr:last-child {
+          > th,
+          > td {
+            border-bottom: 0;
+          }
+        }
+      }
+
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_theme.scss b/static/assets/stylesheets/bootstrap/_theme.scss
new file mode 100644
index 0000000000000000000000000000000000000000..ed106a4fa8acf429bc8b5e4e833c41546ed7d3d7
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_theme.scss
@@ -0,0 +1,273 @@
+
+//
+// Load core variables and mixins
+// --------------------------------------------------
+
+@import "variables";
+@import "mixins";
+
+
+//
+// Buttons
+// --------------------------------------------------
+
+// Common styles
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0,0,0,.2);
+  $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
+  @include box-shadow($shadow);
+
+  // Reset the shadow
+  &:active,
+  &.active {
+    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
+  }
+
+  .badge {
+    text-shadow: none;
+  }
+}
+
+// Mixin for generating new styles
+@mixin btn-styles($btn-color: #555) {
+  @include gradient-vertical($start-color: $btn-color, $end-color: darken($btn-color, 12%));
+  @include reset-filter; // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620
+  background-repeat: repeat-x;
+  border-color: darken($btn-color, 14%);
+
+  &:hover,
+  &:focus  {
+    background-color: darken($btn-color, 12%);
+    background-position: 0 -15px;
+  }
+
+  &:active,
+  &.active {
+    background-color: darken($btn-color, 12%);
+    border-color: darken($btn-color, 14%);
+  }
+
+  &.disabled,
+  &:disabled,
+  &[disabled] {
+    background-color: darken($btn-color, 12%);
+    background-image: none;
+  }
+}
+
+// Common styles
+.btn {
+  // Remove the gradient for the pressed/active state
+  &:active,
+  &.active {
+    background-image: none;
+  }
+}
+
+// Apply the mixin to the buttons
+.btn-default { @include btn-styles($btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
+.btn-primary { @include btn-styles($btn-primary-bg); }
+.btn-success { @include btn-styles($btn-success-bg); }
+.btn-info    { @include btn-styles($btn-info-bg); }
+.btn-warning { @include btn-styles($btn-warning-bg); }
+.btn-danger  { @include btn-styles($btn-danger-bg); }
+
+
+//
+// Images
+// --------------------------------------------------
+
+.thumbnail,
+.img-thumbnail {
+  @include box-shadow(0 1px 2px rgba(0,0,0,.075));
+}
+
+
+//
+// Dropdowns
+// --------------------------------------------------
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  @include gradient-vertical($start-color: $dropdown-link-hover-bg, $end-color: darken($dropdown-link-hover-bg, 5%));
+  background-color: darken($dropdown-link-hover-bg, 5%);
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  @include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
+  background-color: darken($dropdown-link-active-bg, 5%);
+}
+
+
+//
+// Navbar
+// --------------------------------------------------
+
+// Default navbar
+.navbar-default {
+  @include gradient-vertical($start-color: lighten($navbar-default-bg, 10%), $end-color: $navbar-default-bg);
+  @include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
+  border-radius: $navbar-border-radius;
+  $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
+  @include box-shadow($shadow);
+
+  .navbar-nav > .open > a,
+  .navbar-nav > .active > a {
+    @include gradient-vertical($start-color: darken($navbar-default-link-active-bg, 5%), $end-color: darken($navbar-default-link-active-bg, 2%));
+    @include box-shadow(inset 0 3px 9px rgba(0,0,0,.075));
+  }
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255,255,255,.25);
+}
+
+// Inverted navbar
+.navbar-inverse {
+  @include gradient-vertical($start-color: lighten($navbar-inverse-bg, 10%), $end-color: $navbar-inverse-bg);
+  @include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257
+
+  .navbar-nav > .open > a,
+  .navbar-nav > .active > a {
+    @include gradient-vertical($start-color: $navbar-inverse-link-active-bg, $end-color: lighten($navbar-inverse-link-active-bg, 2.5%));
+    @include box-shadow(inset 0 3px 9px rgba(0,0,0,.25));
+  }
+
+  .navbar-brand,
+  .navbar-nav > li > a {
+    text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+  }
+}
+
+// Undo rounded corners in static and fixed navbars
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+
+// Fix active state of dropdown items in collapsed mode
+@media (max-width: $grid-float-breakpoint-max) {
+  .navbar .navbar-nav .open .dropdown-menu > .active > a {
+    &,
+    &:hover,
+    &:focus {
+      color: #fff;
+      @include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
+    }
+  }
+}
+
+
+//
+// Alerts
+// --------------------------------------------------
+
+// Common styles
+.alert {
+  text-shadow: 0 1px 0 rgba(255,255,255,.2);
+  $shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
+  @include box-shadow($shadow);
+}
+
+// Mixin for generating new styles
+@mixin alert-styles($color) {
+  @include gradient-vertical($start-color: $color, $end-color: darken($color, 7.5%));
+  border-color: darken($color, 15%);
+}
+
+// Apply the mixin to the alerts
+.alert-success    { @include alert-styles($alert-success-bg); }
+.alert-info       { @include alert-styles($alert-info-bg); }
+.alert-warning    { @include alert-styles($alert-warning-bg); }
+.alert-danger     { @include alert-styles($alert-danger-bg); }
+
+
+//
+// Progress bars
+// --------------------------------------------------
+
+// Give the progress background some depth
+.progress {
+  @include gradient-vertical($start-color: darken($progress-bg, 4%), $end-color: $progress-bg)
+}
+
+// Mixin for generating new styles
+@mixin progress-bar-styles($color) {
+  @include gradient-vertical($start-color: $color, $end-color: darken($color, 10%));
+}
+
+// Apply the mixin to the progress bars
+.progress-bar            { @include progress-bar-styles($progress-bar-bg); }
+.progress-bar-success    { @include progress-bar-styles($progress-bar-success-bg); }
+.progress-bar-info       { @include progress-bar-styles($progress-bar-info-bg); }
+.progress-bar-warning    { @include progress-bar-styles($progress-bar-warning-bg); }
+.progress-bar-danger     { @include progress-bar-styles($progress-bar-danger-bg); }
+
+// Reset the striped class because our mixins don't do multiple gradients and
+// the above custom styles override the new `.progress-bar-striped` in v3.2.0.
+.progress-bar-striped {
+  @include gradient-striped;
+}
+
+
+//
+// List groups
+// --------------------------------------------------
+
+.list-group {
+  border-radius: $border-radius-base;
+  @include box-shadow(0 1px 2px rgba(0,0,0,.075));
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 darken($list-group-active-bg, 10%);
+  @include gradient-vertical($start-color: $list-group-active-bg, $end-color: darken($list-group-active-bg, 7.5%));
+  border-color: darken($list-group-active-border, 7.5%);
+
+  .badge {
+    text-shadow: none;
+  }
+}
+
+
+//
+// Panels
+// --------------------------------------------------
+
+// Common styles
+.panel {
+  @include box-shadow(0 1px 2px rgba(0,0,0,.05));
+}
+
+// Mixin for generating new styles
+@mixin panel-heading-styles($color) {
+  @include gradient-vertical($start-color: $color, $end-color: darken($color, 5%));
+}
+
+// Apply the mixin to the panel headings only
+.panel-default > .panel-heading   { @include panel-heading-styles($panel-default-heading-bg); }
+.panel-primary > .panel-heading   { @include panel-heading-styles($panel-primary-heading-bg); }
+.panel-success > .panel-heading   { @include panel-heading-styles($panel-success-heading-bg); }
+.panel-info > .panel-heading      { @include panel-heading-styles($panel-info-heading-bg); }
+.panel-warning > .panel-heading   { @include panel-heading-styles($panel-warning-heading-bg); }
+.panel-danger > .panel-heading    { @include panel-heading-styles($panel-danger-heading-bg); }
+
+
+//
+// Wells
+// --------------------------------------------------
+
+.well {
+  @include gradient-vertical($start-color: darken($well-bg, 5%), $end-color: $well-bg);
+  border-color: darken($well-bg, 10%);
+  $shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
+  @include box-shadow($shadow);
+}
diff --git a/static/assets/stylesheets/bootstrap/_thumbnails.scss b/static/assets/stylesheets/bootstrap/_thumbnails.scss
new file mode 100644
index 0000000000000000000000000000000000000000..da0e1e76cf01131006ae0c188d81d3f1470ad197
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_thumbnails.scss
@@ -0,0 +1,38 @@
+//
+// Thumbnails
+// --------------------------------------------------
+
+
+// Mixin and adjust the regular image class
+.thumbnail {
+  display: block;
+  padding: $thumbnail-padding;
+  margin-bottom: $line-height-computed;
+  line-height: $line-height-base;
+  background-color: $thumbnail-bg;
+  border: 1px solid $thumbnail-border;
+  border-radius: $thumbnail-border-radius;
+  @include transition(border .2s ease-in-out);
+
+  > img,
+  a > img {
+    @include img-responsive;
+    margin-left: auto;
+    margin-right: auto;
+  }
+
+  // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active
+
+  // Image captions
+  .caption {
+    padding: $thumbnail-caption-padding;
+    color: $thumbnail-caption-color;
+  }
+}
+
+// Add a hover state for linked versions only
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: $link-color;
+}
diff --git a/static/assets/stylesheets/bootstrap/_tooltip.scss b/static/assets/stylesheets/bootstrap/_tooltip.scss
new file mode 100644
index 0000000000000000000000000000000000000000..6004f59828e27b2588edcdb03b89831dbc8951ee
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_tooltip.scss
@@ -0,0 +1,103 @@
+//
+// Tooltips
+// --------------------------------------------------
+
+
+// Base class
+.tooltip {
+  position: absolute;
+  z-index: $zindex-tooltip;
+  display: block;
+  visibility: visible;
+  // Reset font and text properties given new insertion method
+  font-family: $font-family-base;
+  font-size: $font-size-small;
+  font-weight: normal;
+  line-height: 1.4;
+  @include opacity(0);
+
+  &.in     { @include opacity($tooltip-opacity); }
+  &.top    { margin-top:  -3px; padding: $tooltip-arrow-width 0; }
+  &.right  { margin-left:  3px; padding: 0 $tooltip-arrow-width; }
+  &.bottom { margin-top:   3px; padding: $tooltip-arrow-width 0; }
+  &.left   { margin-left: -3px; padding: 0 $tooltip-arrow-width; }
+}
+
+// Wrapper for the tooltip content
+.tooltip-inner {
+  max-width: $tooltip-max-width;
+  padding: 3px 8px;
+  color: $tooltip-color;
+  text-align: center;
+  text-decoration: none;
+  background-color: $tooltip-bg;
+  border-radius: $border-radius-base;
+}
+
+// Arrows
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1
+.tooltip {
+  &.top .tooltip-arrow {
+    bottom: 0;
+    left: 50%;
+    margin-left: -$tooltip-arrow-width;
+    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
+    border-top-color: $tooltip-arrow-color;
+  }
+  &.top-left .tooltip-arrow {
+    bottom: 0;
+    right: $tooltip-arrow-width;
+    margin-bottom: -$tooltip-arrow-width;
+    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
+    border-top-color: $tooltip-arrow-color;
+  }
+  &.top-right .tooltip-arrow {
+    bottom: 0;
+    left: $tooltip-arrow-width;
+    margin-bottom: -$tooltip-arrow-width;
+    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
+    border-top-color: $tooltip-arrow-color;
+  }
+  &.right .tooltip-arrow {
+    top: 50%;
+    left: 0;
+    margin-top: -$tooltip-arrow-width;
+    border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;
+    border-right-color: $tooltip-arrow-color;
+  }
+  &.left .tooltip-arrow {
+    top: 50%;
+    right: 0;
+    margin-top: -$tooltip-arrow-width;
+    border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;
+    border-left-color: $tooltip-arrow-color;
+  }
+  &.bottom .tooltip-arrow {
+    top: 0;
+    left: 50%;
+    margin-left: -$tooltip-arrow-width;
+    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
+    border-bottom-color: $tooltip-arrow-color;
+  }
+  &.bottom-left .tooltip-arrow {
+    top: 0;
+    right: $tooltip-arrow-width;
+    margin-top: -$tooltip-arrow-width;
+    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
+    border-bottom-color: $tooltip-arrow-color;
+  }
+  &.bottom-right .tooltip-arrow {
+    top: 0;
+    left: $tooltip-arrow-width;
+    margin-top: -$tooltip-arrow-width;
+    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
+    border-bottom-color: $tooltip-arrow-color;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/_type.scss b/static/assets/stylesheets/bootstrap/_type.scss
new file mode 100644
index 0000000000000000000000000000000000000000..62d685cf6165b3eff69937cf707db86d86ef2d40
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_type.scss
@@ -0,0 +1,298 @@
+//
+// Typography
+// --------------------------------------------------
+
+
+// Headings
+// -------------------------
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+  font-family: $headings-font-family;
+  font-weight: $headings-font-weight;
+  line-height: $headings-line-height;
+  color: $headings-color;
+
+  small,
+  .small {
+    font-weight: normal;
+    line-height: 1;
+    color: $headings-small-color;
+  }
+}
+
+h1, .h1,
+h2, .h2,
+h3, .h3 {
+  margin-top: $line-height-computed;
+  margin-bottom: ($line-height-computed / 2);
+
+  small,
+  .small {
+    font-size: 65%;
+  }
+}
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+  margin-top: ($line-height-computed / 2);
+  margin-bottom: ($line-height-computed / 2);
+
+  small,
+  .small {
+    font-size: 75%;
+  }
+}
+
+h1, .h1 { font-size: $font-size-h1; }
+h2, .h2 { font-size: $font-size-h2; }
+h3, .h3 { font-size: $font-size-h3; }
+h4, .h4 { font-size: $font-size-h4; }
+h5, .h5 { font-size: $font-size-h5; }
+h6, .h6 { font-size: $font-size-h6; }
+
+
+// Body text
+// -------------------------
+
+p {
+  margin: 0 0 ($line-height-computed / 2);
+}
+
+.lead {
+  margin-bottom: $line-height-computed;
+  font-size: floor(($font-size-base * 1.15));
+  font-weight: 300;
+  line-height: 1.4;
+
+  @media (min-width: $screen-sm-min) {
+    font-size: ($font-size-base * 1.5);
+  }
+}
+
+
+// Emphasis & misc
+// -------------------------
+
+// Ex: (12px small font / 14px base font) * 100% = about 85%
+small,
+.small {
+  font-size: floor((100% * $font-size-small / $font-size-base));
+}
+
+mark,
+.mark {
+  background-color: $state-warning-bg;
+  padding: .2em;
+}
+
+// Alignment
+.text-left           { text-align: left; }
+.text-right          { text-align: right; }
+.text-center         { text-align: center; }
+.text-justify        { text-align: justify; }
+.text-nowrap         { white-space: nowrap; }
+
+// Transformation
+.text-lowercase      { text-transform: lowercase; }
+.text-uppercase      { text-transform: uppercase; }
+.text-capitalize     { text-transform: capitalize; }
+
+// Contextual colors
+.text-muted {
+  color: $text-muted;
+}
+
+@include text-emphasis-variant('.text-primary', $brand-primary);
+
+@include text-emphasis-variant('.text-success', $state-success-text);
+
+@include text-emphasis-variant('.text-info', $state-info-text);
+
+@include text-emphasis-variant('.text-warning', $state-warning-text);
+
+@include text-emphasis-variant('.text-danger', $state-danger-text);
+
+// Contextual backgrounds
+// For now we'll leave these alongside the text classes until v4 when we can
+// safely shift things around (per SemVer rules).
+.bg-primary {
+  // Given the contrast here, this is the only class to have its color inverted
+  // automatically.
+  color: #fff;
+}
+@include bg-variant('.bg-primary', $brand-primary);
+
+@include bg-variant('.bg-success', $state-success-bg);
+
+@include bg-variant('.bg-info', $state-info-bg);
+
+@include bg-variant('.bg-warning', $state-warning-bg);
+
+@include bg-variant('.bg-danger', $state-danger-bg);
+
+
+// Page header
+// -------------------------
+
+.page-header {
+  padding-bottom: (($line-height-computed / 2) - 1);
+  margin: ($line-height-computed * 2) 0 $line-height-computed;
+  border-bottom: 1px solid $page-header-border-color;
+}
+
+
+// Lists
+// -------------------------
+
+// Unordered and Ordered lists
+ul,
+ol {
+  margin-top: 0;
+  margin-bottom: ($line-height-computed / 2);
+  ul,
+  ol {
+    margin-bottom: 0;
+  }
+}
+
+// List options
+
+// [converter] extracted from `.list-unstyled` for libsass compatibility
+@mixin list-unstyled {
+  padding-left: 0;
+  list-style: none;
+}
+// [converter] extracted as `@mixin list-unstyled` for libsass compatibility
+.list-unstyled {
+  @include list-unstyled;
+}
+
+
+// Inline turns list items into inline-block
+.list-inline {
+  @include list-unstyled;
+  margin-left: -5px;
+
+  > li {
+    display: inline-block;
+    padding-left: 5px;
+    padding-right: 5px;
+  }
+}
+
+// Description Lists
+dl {
+  margin-top: 0; // Remove browser default
+  margin-bottom: $line-height-computed;
+}
+dt,
+dd {
+  line-height: $line-height-base;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 0; // Undo browser default
+}
+
+// Horizontal description lists
+//
+// Defaults to being stacked without any of the below styles applied, until the
+// grid breakpoint is reached (default of ~768px).
+
+.dl-horizontal {
+  dd {
+    @include clearfix; // Clear the floated `dt` if an empty `dd` is present
+  }
+
+  @media (min-width: $grid-float-breakpoint) {
+    dt {
+      float: left;
+      width: ($dl-horizontal-offset - 20);
+      clear: left;
+      text-align: right;
+      @include text-overflow;
+    }
+    dd {
+      margin-left: $dl-horizontal-offset;
+    }
+  }
+}
+
+
+// Misc
+// -------------------------
+
+// Abbreviations and acronyms
+abbr[title],
+// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted $abbr-border-color;
+}
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+// Blockquotes
+blockquote {
+  padding: ($line-height-computed / 2) $line-height-computed;
+  margin: 0 0 $line-height-computed;
+  font-size: $blockquote-font-size;
+  border-left: 5px solid $blockquote-border-color;
+
+  p,
+  ul,
+  ol {
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+
+  // Note: Deprecated small and .small as of v3.1.0
+  // Context: https://github.com/twbs/bootstrap/issues/11660
+  footer,
+  small,
+  .small {
+    display: block;
+    font-size: 80%; // back to default font-size
+    line-height: $line-height-base;
+    color: $blockquote-small-color;
+
+    &:before {
+      content: '\2014 \00A0'; // em dash, nbsp
+    }
+  }
+}
+
+// Opposite alignment of blockquote
+//
+// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.
+.blockquote-reverse,
+blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid $blockquote-border-color;
+  border-left: 0;
+  text-align: right;
+
+  // Account for citation
+  footer,
+  small,
+  .small {
+    &:before { content: ''; }
+    &:after {
+      content: '\00A0 \2014'; // nbsp, em dash
+    }
+  }
+}
+
+// Addresses
+address {
+  margin-bottom: $line-height-computed;
+  font-style: normal;
+  line-height: $line-height-base;
+}
diff --git a/static/assets/stylesheets/bootstrap/_utilities.scss b/static/assets/stylesheets/bootstrap/_utilities.scss
new file mode 100644
index 0000000000000000000000000000000000000000..386c524099e967383d18de02caa0617a19201bef
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_utilities.scss
@@ -0,0 +1,56 @@
+//
+// Utility classes
+// --------------------------------------------------
+
+
+// Floats
+// -------------------------
+
+.clearfix {
+  @include clearfix;
+}
+.center-block {
+  @include center-block;
+}
+.pull-right {
+  float: right !important;
+}
+.pull-left {
+  float: left !important;
+}
+
+
+// Toggling content
+// -------------------------
+
+// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
+.hide {
+  display: none !important;
+}
+.show {
+  display: block !important;
+}
+.invisible {
+  visibility: hidden;
+}
+.text-hide {
+  @include text-hide;
+}
+
+
+// Hide from screenreaders and browsers
+//
+// Credit: HTML5 Boilerplate
+
+.hidden {
+  display: none !important;
+  visibility: hidden !important;
+}
+
+
+// For Affix plugin
+// -------------------------
+
+.affix {
+  position: fixed;
+}
diff --git a/static/assets/stylesheets/bootstrap/_variables.scss b/static/assets/stylesheets/bootstrap/_variables.scss
new file mode 100644
index 0000000000000000000000000000000000000000..ae79effb76a5b2c92d1d5e73095b5e01ad53843f
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_variables.scss
@@ -0,0 +1,862 @@
+$bootstrap-sass-asset-helper: false !default;
+//
+// Variables
+// --------------------------------------------------
+
+
+//== Colors
+//
+//## Gray and brand colors for use across Bootstrap.
+
+$gray-base:              #000 !default;
+$gray-darker:            lighten($gray-base, 13.5%) !default; // #222
+$gray-dark:              lighten($gray-base, 20%) !default;   // #333
+$gray:                   lighten($gray-base, 33.5%) !default; // #555
+$gray-light:             lighten($gray-base, 46.7%) !default; // #777
+$gray-lighter:           lighten($gray-base, 93.5%) !default; // #eee
+
+$brand-primary:         $green !default; // #337ab7
+$brand-success:         #5cb85c !default;
+$brand-info:            #5bc0de !default;
+$brand-warning:         #f0ad4e !default;
+$brand-danger:          #d9534f !default;
+
+
+//== Scaffolding
+//
+//## Settings for some of the most global styles.
+
+//** Background color for `<body>`.
+$body-bg:               #fff !default;
+//** Global text color on `<body>`.
+$text-color:            $gray-dark !default;
+
+//** Global textual link color.
+$link-color:            $brand-primary !default;
+//** Link hover color set via `darken()` function.
+$link-hover-color:      darken($link-color, 15%) !default;
+//** Link hover decoration.
+$link-hover-decoration: underline !default;
+
+
+//== Typography
+//
+//## Font, line-height, and color for body text, headings, and more.
+
+$font-family-sans-serif:  "Montserrat", "Helvetica Neue", Helvetica, Arial, sans-serif !default;
+$font-family-serif:       Georgia, "Times New Roman", Times, serif !default;
+//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
+$font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace !default;
+$font-family-base:        $font-family-sans-serif !default;
+
+$font-size-base:          14px !default;
+$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px
+
+$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px
+$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px
+$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px
+$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-h5:            $font-size-base !default;
+$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+$line-height-base:        1.8 !default; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px
+
+//** By default, this inherits from the `<body>`.
+$headings-font-family:    inherit !default;
+$headings-font-weight:    500 !default;
+$headings-line-height:    1.1 !default;
+$headings-color:          inherit !default;
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+
+// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
+// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
+$icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/") !default;
+
+//** File name for all font files.
+$icon-font-name:          "glyphicons-halflings-regular" !default;
+//** Element ID within SVG icon file.
+$icon-font-svg-id:        "glyphicons_halflingsregular" !default;
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+$padding-base-vertical:     6px !default;
+$padding-base-horizontal:   12px !default;
+
+$padding-large-vertical:    10px !default;
+$padding-large-horizontal:  16px !default;
+
+$padding-small-vertical:    5px !default;
+$padding-small-horizontal:  10px !default;
+
+$padding-xs-vertical:       1px !default;
+$padding-xs-horizontal:     5px !default;
+
+$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome
+$line-height-small:         1.5 !default;
+
+$border-radius-base:        4px !default;
+$border-radius-large:       6px !default;
+$border-radius-small:       3px !default;
+
+//** Global color for active items (e.g., navs or dropdowns).
+$component-active-color:    #fff !default;
+//** Global background color for active items (e.g., navs or dropdowns).
+$component-active-bg:       $brand-primary !default;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+$caret-width-base:          4px !default;
+//** Carets increase slightly in size for larger components.
+$caret-width-large:         5px !default;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for `<th>`s and `<td>`s.
+$table-cell-padding:            8px !default;
+//** Padding for cells in `.table-condensed`.
+$table-condensed-cell-padding:  5px !default;
+
+//** Default background color used for all tables.
+$table-bg:                      transparent !default;
+//** Background color used for `.table-striped`.
+$table-bg-accent:               #f9f9f9 !default;
+//** Background color used for `.table-hover`.
+$table-bg-hover:                #f5f5f5 !default;
+$table-bg-active:               $table-bg-hover !default;
+
+//** Border color for table and cell borders.
+$table-border-color:            #ddd !default;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+$btn-font-weight:                normal !default;
+
+$btn-default-color:              #333 !default;
+$btn-default-bg:                 #fff !default;
+$btn-default-border:             #ccc !default;
+
+$btn-primary-color:              #fff !default;
+$btn-primary-bg:                 $brand-primary !default;
+$btn-primary-border:             darken($btn-primary-bg, 5%) !default;
+
+$btn-success-color:              #fff !default;
+$btn-success-bg:                 $brand-success !default;
+$btn-success-border:             darken($btn-success-bg, 5%) !default;
+
+$btn-info-color:                 #fff !default;
+$btn-info-bg:                    $brand-info !default;
+$btn-info-border:                darken($btn-info-bg, 5%) !default;
+
+$btn-warning-color:              #fff !default;
+$btn-warning-bg:                 $brand-warning !default;
+$btn-warning-border:             darken($btn-warning-bg, 5%) !default;
+
+$btn-danger-color:               #fff !default;
+$btn-danger-bg:                  $brand-danger !default;
+$btn-danger-border:              darken($btn-danger-bg, 5%) !default;
+
+$btn-link-disabled-color:        $gray-light !default;
+
+
+//== Forms
+//
+//##
+
+//** `<input>` background color
+$input-bg:                       #fff !default;
+//** `<input disabled>` background color
+$input-bg-disabled:              $gray-lighter !default;
+
+//** Text color for `<input>`s
+$input-color:                    $gray !default;
+//** `<input>` border color
+$input-border:                   #ccc !default;
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
+$input-border-radius:            $border-radius-base !default;
+//** Large `.form-control` border radius
+$input-border-radius-large:      $border-radius-large !default;
+//** Small `.form-control` border radius
+$input-border-radius-small:      $border-radius-small !default;
+
+//** Border color for inputs on focus
+$input-border-focus:             #66afe9 !default;
+
+//** Placeholder text color
+$input-color-placeholder:        #999 !default;
+
+//** Default `.form-control` height
+$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
+//** Large `.form-control` height
+$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
+//** Small `.form-control` height
+$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
+
+$legend-color:                   $gray-dark !default;
+$legend-border-color:            #e5e5e5 !default;
+
+//** Background color for textual input addons
+$input-group-addon-bg:           $gray-lighter !default;
+//** Border color for textual input addons
+$input-group-addon-border-color: $input-border !default;
+
+//** Disabled cursor for form controls and buttons.
+$cursor-disabled:                not-allowed !default;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+$dropdown-bg:                    #fff !default;
+//** Dropdown menu `border-color`.
+$dropdown-border:                rgba(0,0,0,.15) !default;
+//** Dropdown menu `border-color` **for IE8**.
+$dropdown-fallback-border:       #ccc !default;
+//** Divider color for between dropdown items.
+$dropdown-divider-bg:            #e5e5e5 !default;
+
+//** Dropdown link text color.
+$dropdown-link-color:            $gray-dark !default;
+//** Hover color for dropdown links.
+$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;
+//** Hover background for dropdown links.
+$dropdown-link-hover-bg:         #f5f5f5 !default;
+
+//** Active dropdown menu item text color.
+$dropdown-link-active-color:     $component-active-color !default;
+//** Active dropdown menu item background color.
+$dropdown-link-active-bg:        $component-active-bg !default;
+
+//** Disabled dropdown menu item background color.
+$dropdown-link-disabled-color:   $gray-light !default;
+
+//** Text color for headers within dropdown menus.
+$dropdown-header-color:          $gray-light !default;
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+$dropdown-caret-color:           #000 !default;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+$zindex-navbar:            1000 !default;
+$zindex-dropdown:          1000 !default;
+$zindex-popover:           1060 !default;
+$zindex-tooltip:           1070 !default;
+$zindex-navbar-fixed:      1030 !default;
+$zindex-modal:             1040 !default;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+$screen-xs:                  480px !default;
+//** Deprecated `$screen-xs-min` as of v3.2.0
+$screen-xs-min:              $screen-xs !default;
+//** Deprecated `$screen-phone` as of v3.0.1
+$screen-phone:               $screen-xs-min !default;
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+$screen-sm:                  768px !default;
+$screen-sm-min:              $screen-sm !default;
+//** Deprecated `$screen-tablet` as of v3.0.1
+$screen-tablet:              $screen-sm-min !default;
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+$screen-md:                  992px !default;
+$screen-md-min:              $screen-md !default;
+//** Deprecated `$screen-desktop` as of v3.0.1
+$screen-desktop:             $screen-md-min !default;
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+$screen-lg:                  1200px !default;
+$screen-lg-min:              $screen-lg !default;
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+$screen-lg-desktop:          $screen-lg-min !default;
+
+// So media queries don't overlap when required, provide a maximum
+$screen-xs-max:              ($screen-sm-min - 1) !default;
+$screen-sm-max:              ($screen-md-min - 1) !default;
+$screen-md-max:              ($screen-lg-min - 1) !default;
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+$grid-columns:              12 !default;
+//** Padding between columns. Gets divided in half for the left and right.
+$grid-gutter-width:         30px !default;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+$grid-float-breakpoint:     $screen-sm-min !default;
+//** Point at which the navbar begins collapsing.
+$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+$container-tablet:             (720px + $grid-gutter-width) !default;
+//** For `$screen-sm-min` and up.
+$container-sm:                 $container-tablet !default;
+
+// Medium screen / desktop
+$container-desktop:            (940px + $grid-gutter-width) !default;
+//** For `$screen-md-min` and up.
+$container-md:                 $container-desktop !default;
+
+// Large screen / wide desktop
+$container-large-desktop:      (1140px + $grid-gutter-width) !default;
+//** For `$screen-lg-min` and up.
+$container-lg:                 $container-large-desktop !default;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+$navbar-height:                    50px !default;
+$navbar-margin-bottom:             $line-height-computed !default;
+$navbar-border-radius:             $border-radius-base !default;
+$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;
+$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;
+$navbar-collapse-max-height:       340px !default;
+
+$navbar-default-color:             #777 !default;
+$navbar-default-bg:                #f8f8f8 !default;
+$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;
+
+// Navbar links
+$navbar-default-link-color:                #777 !default;
+$navbar-default-link-hover-color:          #333 !default;
+$navbar-default-link-hover-bg:             transparent !default;
+$navbar-default-link-active-color:         #555 !default;
+$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;
+$navbar-default-link-disabled-color:       #ccc !default;
+$navbar-default-link-disabled-bg:          transparent !default;
+
+// Navbar brand label
+$navbar-default-brand-color:               $navbar-default-link-color !default;
+$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;
+$navbar-default-brand-hover-bg:            transparent !default;
+
+// Navbar toggle
+$navbar-default-toggle-hover-bg:           #ddd !default;
+$navbar-default-toggle-icon-bar-bg:        #888 !default;
+$navbar-default-toggle-border-color:       #ddd !default;
+
+
+// Inverted navbar
+// Reset inverted navbar basics
+$navbar-inverse-color:                      lighten($gray-light, 15%) !default;
+$navbar-inverse-bg:                         #222 !default;
+$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;
+
+// Inverted navbar links
+$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;
+$navbar-inverse-link-hover-color:           #fff !default;
+$navbar-inverse-link-hover-bg:              transparent !default;
+$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;
+$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;
+$navbar-inverse-link-disabled-color:        #444 !default;
+$navbar-inverse-link-disabled-bg:           transparent !default;
+
+// Inverted navbar brand label
+$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;
+$navbar-inverse-brand-hover-color:          #fff !default;
+$navbar-inverse-brand-hover-bg:             transparent !default;
+
+// Inverted navbar toggle
+$navbar-inverse-toggle-hover-bg:            #333 !default;
+$navbar-inverse-toggle-icon-bar-bg:         #fff !default;
+$navbar-inverse-toggle-border-color:        #333 !default;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+$nav-link-padding:                          10px 15px !default;
+$nav-link-hover-bg:                         $gray-lighter !default;
+
+$nav-disabled-link-color:                   $gray-light !default;
+$nav-disabled-link-hover-color:             $gray-light !default;
+
+//== Tabs
+$nav-tabs-border-color:                     #ddd !default;
+
+$nav-tabs-link-hover-border-color:          $gray-lighter !default;
+
+$nav-tabs-active-link-hover-bg:             $body-bg !default;
+$nav-tabs-active-link-hover-color:          $gray !default;
+$nav-tabs-active-link-hover-border-color:   #ddd !default;
+
+$nav-tabs-justified-link-border-color:            #ddd !default;
+$nav-tabs-justified-active-link-border-color:     $body-bg !default;
+
+//== Pills
+$nav-pills-border-radius:                   $border-radius-base !default;
+$nav-pills-active-link-hover-bg:            $component-active-bg !default;
+$nav-pills-active-link-hover-color:         $component-active-color !default;
+
+
+//== Pagination
+//
+//##
+
+$pagination-color:                     $link-color !default;
+$pagination-bg:                        #fff !default;
+$pagination-border:                    #ddd !default;
+
+$pagination-hover-color:               $link-hover-color !default;
+$pagination-hover-bg:                  $gray-lighter !default;
+$pagination-hover-border:              #ddd !default;
+
+$pagination-active-color:              #fff !default;
+$pagination-active-bg:                 $brand-primary !default;
+$pagination-active-border:             $brand-primary !default;
+
+$pagination-disabled-color:            $gray-light !default;
+$pagination-disabled-bg:               #fff !default;
+$pagination-disabled-border:           #ddd !default;
+
+
+//== Pager
+//
+//##
+
+$pager-bg:                             $pagination-bg !default;
+$pager-border:                         $pagination-border !default;
+$pager-border-radius:                  15px !default;
+
+$pager-hover-bg:                       $pagination-hover-bg !default;
+
+$pager-active-bg:                      $pagination-active-bg !default;
+$pager-active-color:                   $pagination-active-color !default;
+
+$pager-disabled-color:                 $pagination-disabled-color !default;
+
+
+//== Jumbotron
+//
+//##
+
+$jumbotron-padding:              30px !default;
+$jumbotron-color:                inherit !default;
+$jumbotron-bg:                   $gray-lighter !default;
+$jumbotron-heading-color:        inherit !default;
+$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+$state-success-text:             #3c763d !default;
+$state-success-bg:               #dff0d8 !default;
+$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;
+
+$state-info-text:                #31708f !default;
+$state-info-bg:                  #d9edf7 !default;
+$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;
+
+$state-warning-text:             #8a6d3b !default;
+$state-warning-bg:               #fcf8e3 !default;
+$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;
+
+$state-danger-text:              #a94442 !default;
+$state-danger-bg:                #f2dede !default;
+$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+$tooltip-max-width:           200px !default;
+//** Tooltip text color
+$tooltip-color:               #fff !default;
+//** Tooltip background color
+$tooltip-bg:                  #000 !default;
+$tooltip-opacity:             .9 !default;
+
+//** Tooltip arrow width
+$tooltip-arrow-width:         5px !default;
+//** Tooltip arrow color
+$tooltip-arrow-color:         $tooltip-bg !default;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+$popover-bg:                          #fff !default;
+//** Popover maximum width
+$popover-max-width:                   276px !default;
+//** Popover border color
+$popover-border-color:                rgba(0,0,0,.2) !default;
+//** Popover fallback border color
+$popover-fallback-border-color:       #ccc !default;
+
+//** Popover title background color
+$popover-title-bg:                    darken($popover-bg, 3%) !default;
+
+//** Popover arrow width
+$popover-arrow-width:                 10px !default;
+//** Popover arrow color
+$popover-arrow-color:                 $popover-bg !default;
+
+//** Popover outer arrow width
+$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
+//** Popover outer arrow color
+$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;
+//** Popover outer arrow fallback color
+$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+$label-default-bg:            $gray-light !default;
+//** Primary label background color
+$label-primary-bg:            $brand-primary !default;
+//** Success label background color
+$label-success-bg:            $brand-success !default;
+//** Info label background color
+$label-info-bg:               $brand-info !default;
+//** Warning label background color
+$label-warning-bg:            $brand-warning !default;
+//** Danger label background color
+$label-danger-bg:             $brand-danger !default;
+
+//** Default label text color
+$label-color:                 #fff !default;
+//** Default text color of a linked label
+$label-link-hover-color:      #fff !default;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+$modal-inner-padding:         15px !default;
+
+//** Padding applied to the modal title
+$modal-title-padding:         15px !default;
+//** Modal title line-height
+$modal-title-line-height:     $line-height-base !default;
+
+//** Background color of modal content area
+$modal-content-bg:                             #fff !default;
+//** Modal content border color
+$modal-content-border-color:                   rgba(0,0,0,.2) !default;
+//** Modal content border color **for IE8**
+$modal-content-fallback-border-color:          #999 !default;
+
+//** Modal backdrop background color
+$modal-backdrop-bg:           #000 !default;
+//** Modal backdrop opacity
+$modal-backdrop-opacity:      .5 !default;
+//** Modal header border color
+$modal-header-border-color:   #e5e5e5 !default;
+//** Modal footer border color
+$modal-footer-border-color:   $modal-header-border-color !default;
+
+$modal-lg:                    900px !default;
+$modal-md:                    600px !default;
+$modal-sm:                    300px !default;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+$alert-padding:               15px !default;
+$alert-border-radius:         $border-radius-base !default;
+$alert-link-font-weight:      bold !default;
+
+$alert-success-bg:            $state-success-bg !default;
+$alert-success-text:          $state-success-text !default;
+$alert-success-border:        $state-success-border !default;
+
+$alert-info-bg:               $state-info-bg !default;
+$alert-info-text:             $state-info-text !default;
+$alert-info-border:           $state-info-border !default;
+
+$alert-warning-bg:            $state-warning-bg !default;
+$alert-warning-text:          $state-warning-text !default;
+$alert-warning-border:        $state-warning-border !default;
+
+$alert-danger-bg:             $state-danger-bg !default;
+$alert-danger-text:           $state-danger-text !default;
+$alert-danger-border:         $state-danger-border !default;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+$progress-bg:                 #f5f5f5 !default;
+//** Progress bar text color
+$progress-bar-color:          #fff !default;
+//** Variable for setting rounded corners on progress bar.
+$progress-border-radius:      $border-radius-base !default;
+
+//** Default progress bar color
+$progress-bar-bg:             $brand-primary !default;
+//** Success progress bar color
+$progress-bar-success-bg:     $brand-success !default;
+//** Warning progress bar color
+$progress-bar-warning-bg:     $brand-warning !default;
+//** Danger progress bar color
+$progress-bar-danger-bg:      $brand-danger !default;
+//** Info progress bar color
+$progress-bar-info-bg:        $brand-info !default;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+$list-group-bg:                 #fff !default;
+//** `.list-group-item` border color
+$list-group-border:             #ddd !default;
+//** List group border radius
+$list-group-border-radius:      $border-radius-base !default;
+
+//** Background color of single list items on hover
+$list-group-hover-bg:           #f5f5f5 !default;
+//** Text color of active list items
+$list-group-active-color:       $component-active-color !default;
+//** Background color of active list items
+$list-group-active-bg:          $component-active-bg !default;
+//** Border color of active list elements
+$list-group-active-border:      $list-group-active-bg !default;
+//** Text color for content within active list items
+$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
+
+//** Text color of disabled list items
+$list-group-disabled-color:      $gray-light !default;
+//** Background color of disabled list items
+$list-group-disabled-bg:         $gray-lighter !default;
+//** Text color for content within disabled list items
+$list-group-disabled-text-color: $list-group-disabled-color !default;
+
+$list-group-link-color:         #555 !default;
+$list-group-link-hover-color:   $list-group-link-color !default;
+$list-group-link-heading-color: #333 !default;
+
+
+//== Panels
+//
+//##
+
+$panel-bg:                    #fff !default;
+$panel-body-padding:          15px !default;
+$panel-heading-padding:       10px 15px !default;
+$panel-footer-padding:        $panel-heading-padding !default;
+$panel-border-radius:         $border-radius-base !default;
+
+//** Border color for elements within panels
+$panel-inner-border:          #ddd !default;
+$panel-footer-bg:             #f5f5f5 !default;
+
+$panel-default-text:          $gray-dark !default;
+$panel-default-border:        #ddd !default;
+$panel-default-heading-bg:    #f5f5f5 !default;
+
+$panel-primary-text:          #fff !default;
+$panel-primary-border:        $brand-primary !default;
+$panel-primary-heading-bg:    $brand-primary !default;
+
+$panel-success-text:          $state-success-text !default;
+$panel-success-border:        $state-success-border !default;
+$panel-success-heading-bg:    $state-success-bg !default;
+
+$panel-info-text:             $state-info-text !default;
+$panel-info-border:           $state-info-border !default;
+$panel-info-heading-bg:       $state-info-bg !default;
+
+$panel-warning-text:          $state-warning-text !default;
+$panel-warning-border:        $state-warning-border !default;
+$panel-warning-heading-bg:    $state-warning-bg !default;
+
+$panel-danger-text:           $state-danger-text !default;
+$panel-danger-border:         $state-danger-border !default;
+$panel-danger-heading-bg:     $state-danger-bg !default;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+$thumbnail-padding:           4px !default;
+//** Thumbnail background color
+$thumbnail-bg:                $body-bg !default;
+//** Thumbnail border color
+$thumbnail-border:            #ddd !default;
+//** Thumbnail border radius
+$thumbnail-border-radius:     $border-radius-base !default;
+
+//** Custom text color for thumbnail captions
+$thumbnail-caption-color:     $text-color !default;
+//** Padding around the thumbnail caption
+$thumbnail-caption-padding:   9px !default;
+
+
+//== Wells
+//
+//##
+
+$well-bg:                     #f5f5f5 !default;
+$well-border:                 darken($well-bg, 7%) !default;
+
+
+//== Badges
+//
+//##
+
+$badge-color:                 #fff !default;
+//** Linked badge text color on hover
+$badge-link-hover-color:      #fff !default;
+$badge-bg:                    $gray-light !default;
+
+//** Badge text color in active nav link
+$badge-active-color:          $link-color !default;
+//** Badge background color in active nav link
+$badge-active-bg:             #fff !default;
+
+$badge-font-weight:           bold !default;
+$badge-line-height:           1 !default;
+$badge-border-radius:         10px !default;
+
+
+//== Breadcrumbs
+//
+//##
+
+$breadcrumb-padding-vertical:   8px !default;
+$breadcrumb-padding-horizontal: 15px !default;
+//** Breadcrumb background color
+$breadcrumb-bg:                 #f5f5f5 !default;
+//** Breadcrumb text color
+$breadcrumb-color:              #ccc !default;
+//** Text color of current page in the breadcrumb
+$breadcrumb-active-color:       $gray-light !default;
+//** Textual separator for between breadcrumb elements
+$breadcrumb-separator:          "/" !default;
+
+
+//== Carousel
+//
+//##
+
+$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;
+
+$carousel-control-color:                      #fff !default;
+$carousel-control-width:                      15% !default;
+$carousel-control-opacity:                    .5 !default;
+$carousel-control-font-size:                  20px !default;
+
+$carousel-indicator-active-bg:                #fff !default;
+$carousel-indicator-border-color:             #fff !default;
+
+$carousel-caption-color:                      #fff !default;
+
+
+//== Close
+//
+//##
+
+$close-font-weight:           bold !default;
+$close-color:                 #000 !default;
+$close-text-shadow:           0 1px 0 #fff !default;
+
+
+//== Code
+//
+//##
+
+$code-color:                  #c7254e !default;
+$code-bg:                     #f9f2f4 !default;
+
+$kbd-color:                   #fff !default;
+$kbd-bg:                      #333 !default;
+
+$pre-bg:                      #f5f5f5 !default;
+$pre-color:                   $gray-dark !default;
+$pre-border-color:            #ccc !default;
+$pre-scrollable-max-height:   340px !default;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+$component-offset-horizontal: 180px !default;
+//** Text muted color
+$text-muted:                  $gray-light !default;
+//** Abbreviations and acronyms border color
+$abbr-border-color:           $gray-light !default;
+//** Headings small color
+$headings-small-color:        $gray-light !default;
+//** Blockquote small color
+$blockquote-small-color:      $gray-light !default;
+//** Blockquote font size
+$blockquote-font-size:        ($font-size-base * 1.25) !default;
+//** Blockquote border color
+$blockquote-border-color:     $gray-lighter !default;
+//** Page header border color
+$page-header-border-color:    $gray-lighter !default;
+//** Width of horizontal description list titles
+$dl-horizontal-offset:        $component-offset-horizontal !default;
+//** Horizontal line color.
+$hr-border:                   $gray-lighter !default;
diff --git a/static/assets/stylesheets/bootstrap/_wells.scss b/static/assets/stylesheets/bootstrap/_wells.scss
new file mode 100644
index 0000000000000000000000000000000000000000..b8657118a661cfb1f6119f7dccb169db06e4cd04
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/_wells.scss
@@ -0,0 +1,29 @@
+//
+// Wells
+// --------------------------------------------------
+
+
+// Base class
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: $well-bg;
+  border: 1px solid $well-border;
+  border-radius: $border-radius-base;
+  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
+  blockquote {
+    border-color: #ddd;
+    border-color: rgba(0,0,0,.15);
+  }
+}
+
+// Sizes
+.well-lg {
+  padding: 24px;
+  border-radius: $border-radius-large;
+}
+.well-sm {
+  padding: 9px;
+  border-radius: $border-radius-small;
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_alerts.scss b/static/assets/stylesheets/bootstrap/mixins/_alerts.scss
new file mode 100644
index 0000000000000000000000000000000000000000..3faf0b5a507d799af422ac2b65f20ef155781830
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_alerts.scss
@@ -0,0 +1,14 @@
+// Alerts
+
+@mixin alert-variant($background, $border, $text-color) {
+  background-color: $background;
+  border-color: $border;
+  color: $text-color;
+
+  hr {
+    border-top-color: darken($border, 5%);
+  }
+  .alert-link {
+    color: darken($text-color, 10%);
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_background-variant.scss b/static/assets/stylesheets/bootstrap/mixins/_background-variant.scss
new file mode 100644
index 0000000000000000000000000000000000000000..4993bd2b80126aa0523cd506f649d033ba1d07dd
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_background-variant.scss
@@ -0,0 +1,11 @@
+// Contextual backgrounds
+
+// [converter] $parent hack
+@mixin bg-variant($parent, $color) {
+  #{$parent} {
+    background-color: $color;
+  }
+  a#{$parent}:hover {
+    background-color: darken($color, 10%);
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_border-radius.scss b/static/assets/stylesheets/bootstrap/mixins/_border-radius.scss
new file mode 100644
index 0000000000000000000000000000000000000000..ce1949987508574a8d31b1d688096ce8925ed051
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_border-radius.scss
@@ -0,0 +1,18 @@
+// Single side border-radius
+
+@mixin border-top-radius($radius) {
+  border-top-right-radius: $radius;
+   border-top-left-radius: $radius;
+}
+@mixin border-right-radius($radius) {
+  border-bottom-right-radius: $radius;
+     border-top-right-radius: $radius;
+}
+@mixin border-bottom-radius($radius) {
+  border-bottom-right-radius: $radius;
+   border-bottom-left-radius: $radius;
+}
+@mixin border-left-radius($radius) {
+  border-bottom-left-radius: $radius;
+     border-top-left-radius: $radius;
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_buttons.scss b/static/assets/stylesheets/bootstrap/mixins/_buttons.scss
new file mode 100644
index 0000000000000000000000000000000000000000..74a4ffc5608fb359ec15d9c4f7263c2ef50b20b5
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_buttons.scss
@@ -0,0 +1,52 @@
+// Button variants
+//
+// Easily pump out default styles, as well as :hover, :focus, :active,
+// and disabled options for all buttons
+
+@mixin button-variant($color, $background, $border) {
+  color: $color;
+  background-color: $background;
+  border-color: $border;
+
+  &:hover,
+  &:focus,
+  &.focus,
+  &:active,
+  &.active,
+  .open > &.dropdown-toggle {
+    color: $color;
+    background-color: darken($background, 10%);
+        border-color: darken($border, 12%);
+  }
+  &:active,
+  &.active,
+  .open > &.dropdown-toggle {
+    background-image: none;
+  }
+  &.disabled,
+  &[disabled],
+  fieldset[disabled] & {
+    &,
+    &:hover,
+    &:focus,
+    &.focus,
+    &:active,
+    &.active {
+      background-color: $background;
+          border-color: $border;
+    }
+  }
+
+  .badge {
+    color: $background;
+    background-color: $color;
+  }
+}
+
+// Button sizes
+@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
+  padding: $padding-vertical $padding-horizontal;
+  font-size: $font-size;
+  line-height: $line-height;
+  border-radius: $border-radius;
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_center-block.scss b/static/assets/stylesheets/bootstrap/mixins/_center-block.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e06fb5e276e471ac4bd574068254808089695afd
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_center-block.scss
@@ -0,0 +1,7 @@
+// Center-align a block level element
+
+@mixin center-block() {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_clearfix.scss b/static/assets/stylesheets/bootstrap/mixins/_clearfix.scss
new file mode 100644
index 0000000000000000000000000000000000000000..dc3e2ab426edf4d5ae1f27d5c767ff396f359243
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_clearfix.scss
@@ -0,0 +1,22 @@
+// Clearfix
+//
+// For modern browsers
+// 1. The space content is one way to avoid an Opera bug when the
+//    contenteditable attribute is included anywhere else in the document.
+//    Otherwise it causes space to appear at the top and bottom of elements
+//    that are clearfixed.
+// 2. The use of `table` rather than `block` is only necessary if using
+//    `:before` to contain the top-margins of child elements.
+//
+// Source: http://nicolasgallagher.com/micro-clearfix-hack/
+
+@mixin clearfix() {
+  &:before,
+  &:after {
+    content: " "; // 1
+    display: table; // 2
+  }
+  &:after {
+    clear: both;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_forms.scss b/static/assets/stylesheets/bootstrap/mixins/_forms.scss
new file mode 100644
index 0000000000000000000000000000000000000000..277aa5f8e1872166a784a188a36d90ab4ba6a3bc
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_forms.scss
@@ -0,0 +1,88 @@
+// Form validation states
+//
+// Used in forms.less to generate the form validation CSS for warnings, errors,
+// and successes.
+
+@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {
+  // Color the label and help text
+  .help-block,
+  .control-label,
+  .radio,
+  .checkbox,
+  .radio-inline,
+  .checkbox-inline,
+  &.radio label,
+  &.checkbox label,
+  &.radio-inline label,
+  &.checkbox-inline label  {
+    color: $text-color;
+  }
+  // Set the border and box shadow on specific inputs to match
+  .form-control {
+    border-color: $border-color;
+    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
+    &:focus {
+      border-color: darken($border-color, 10%);
+      $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);
+      @include box-shadow($shadow);
+    }
+  }
+  // Set validation states also for addons
+  .input-group-addon {
+    color: $text-color;
+    border-color: $border-color;
+    background-color: $background-color;
+  }
+  // Optional feedback icon
+  .form-control-feedback {
+    color: $text-color;
+  }
+}
+
+
+// Form control focus state
+//
+// Generate a customized focus state and for any input with the specified color,
+// which defaults to the `$input-border-focus` variable.
+//
+// We highly encourage you to not customize the default value, but instead use
+// this to tweak colors on an as-needed basis. This aesthetic change is based on
+// WebKit's default styles, but applicable to a wider range of browsers. Its
+// usability and accessibility should be taken into account with any change.
+//
+// Example usage: change the default blue border and shadow to white for better
+// contrast against a dark gray background.
+@mixin form-control-focus($color: $input-border-focus) {
+  $color-rgba: rgba(red($color), green($color), blue($color), .6);
+  &:focus {
+    border-color: $color;
+    outline: 0;
+    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);
+  }
+}
+
+// Form control sizing
+//
+// Relative text size, padding, and border-radii changes for form controls. For
+// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
+// element gets special love because it's special, and that's a fact!
+// [converter] $parent hack
+@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
+  #{$parent} {
+    height: $input-height;
+    padding: $padding-vertical $padding-horizontal;
+    font-size: $font-size;
+    line-height: $line-height;
+    border-radius: $border-radius;
+  }
+
+  select#{$parent} {
+    height: $input-height;
+    line-height: $input-height;
+  }
+
+  textarea#{$parent},
+  select[multiple]#{$parent} {
+    height: auto;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_gradients.scss b/static/assets/stylesheets/bootstrap/mixins/_gradients.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a8939f5ae6411aa9f9dabce969e1a20760eb0ef2
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_gradients.scss
@@ -0,0 +1,58 @@
+// Gradients
+
+
+
+// Horizontal gradient, from left to right
+//
+// Creates two color stops, start and end, by specifying a color and position for each color stop.
+// Color stops are not available in IE9 and below.
+@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
+  background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+
+  background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12
+  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down
+}
+
+// Vertical gradient, from top to bottom
+//
+// Creates two color stops, start and end, by specifying a color and position for each color stop.
+// Color stops are not available in IE9 and below.
+@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
+  background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Safari 5.1-6, Chrome 10+
+  background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Opera 12
+  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down
+}
+
+@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
+  background-repeat: repeat-x;
+  background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+
+  background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12
+  background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+}
+@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
+  background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
+  background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
+  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
+  background-repeat: no-repeat;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback
+}
+@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
+  background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);
+  background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);
+  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
+  background-repeat: no-repeat;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback
+}
+@mixin gradient-radial($inner-color: #555, $outer-color: #333) {
+  background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);
+  background-image: radial-gradient(circle, $inner-color, $outer-color);
+  background-repeat: no-repeat;
+}
+@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {
+  background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
+  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_grid-framework.scss b/static/assets/stylesheets/bootstrap/mixins/_grid-framework.scss
new file mode 100644
index 0000000000000000000000000000000000000000..fb28cb47d68c1b241b8ac8e63cf58a04e3f19402
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_grid-framework.scss
@@ -0,0 +1,81 @@
+// Framework grid generation
+//
+// Used only by Bootstrap to generate the correct number of grid classes given
+// any value of `$grid-columns`.
+
+// [converter] This is defined recursively in LESS, but Sass supports real loops
+@mixin make-grid-columns($i: 1, $list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}") {
+  @for $i from (1 + 1) through $grid-columns {
+    $list: "#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
+  }
+  #{$list} {
+    position: relative;
+    // Prevent columns from collapsing when empty
+    min-height: 1px;
+    // Inner gutter via padding
+    padding-left:  ($grid-gutter-width / 2);
+    padding-right: ($grid-gutter-width / 2);
+  }
+}
+
+
+// [converter] This is defined recursively in LESS, but Sass supports real loops
+@mixin float-grid-columns($class, $i: 1, $list: ".col-#{$class}-#{$i}") {
+  @for $i from (1 + 1) through $grid-columns {
+    $list: "#{$list}, .col-#{$class}-#{$i}";
+  }
+  #{$list} {
+    float: left;
+  }
+}
+
+
+@mixin calc-grid-column($index, $class, $type) {
+  @if ($type == width) and ($index > 0) {
+    .col-#{$class}-#{$index} {
+      width: percentage(($index / $grid-columns));
+    }
+  }
+  @if ($type == push) and ($index > 0) {
+    .col-#{$class}-push-#{$index} {
+      left: percentage(($index / $grid-columns));
+    }
+  }
+  @if ($type == push) and ($index == 0) {
+    .col-#{$class}-push-0 {
+      left: auto;
+    }
+  }
+  @if ($type == pull) and ($index > 0) {
+    .col-#{$class}-pull-#{$index} {
+      right: percentage(($index / $grid-columns));
+    }
+  }
+  @if ($type == pull) and ($index == 0) {
+    .col-#{$class}-pull-0 {
+      right: auto;
+    }
+  }
+  @if ($type == offset) {
+    .col-#{$class}-offset-#{$index} {
+      margin-left: percentage(($index / $grid-columns));
+    }
+  }
+}
+
+// [converter] This is defined recursively in LESS, but Sass supports real loops
+@mixin loop-grid-columns($columns, $class, $type) {
+  @for $i from 0 through $columns {
+    @include calc-grid-column($i, $class, $type);
+  }
+}
+
+
+// Create grid for specific class
+@mixin make-grid($class) {
+  @include float-grid-columns($class);
+  @include loop-grid-columns($grid-columns, $class, width);
+  @include loop-grid-columns($grid-columns, $class, pull);
+  @include loop-grid-columns($grid-columns, $class, push);
+  @include loop-grid-columns($grid-columns, $class, offset);
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_grid.scss b/static/assets/stylesheets/bootstrap/mixins/_grid.scss
new file mode 100644
index 0000000000000000000000000000000000000000..ae164338a4be1d535fc789b083b59121c136a8b7
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_grid.scss
@@ -0,0 +1,122 @@
+// Grid system
+//
+// Generate semantic grid columns with these mixins.
+
+// Centered container element
+@mixin container-fixed($gutter: $grid-gutter-width) {
+  margin-right: auto;
+  margin-left: auto;
+  padding-left:  ($gutter / 2);
+  padding-right: ($gutter / 2);
+  @include clearfix;
+}
+
+// Creates a wrapper for a series of columns
+@mixin make-row($gutter: $grid-gutter-width) {
+  margin-left:  ($gutter / -2);
+  margin-right: ($gutter / -2);
+  @include clearfix;
+}
+
+// Generate the extra small columns
+@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {
+  position: relative;
+  float: left;
+  width: percentage(($columns / $grid-columns));
+  min-height: 1px;
+  padding-left:  ($gutter / 2);
+  padding-right: ($gutter / 2);
+}
+@mixin make-xs-column-offset($columns) {
+  margin-left: percentage(($columns / $grid-columns));
+}
+@mixin make-xs-column-push($columns) {
+  left: percentage(($columns / $grid-columns));
+}
+@mixin make-xs-column-pull($columns) {
+  right: percentage(($columns / $grid-columns));
+}
+
+// Generate the small columns
+@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {
+  position: relative;
+  min-height: 1px;
+  padding-left:  ($gutter / 2);
+  padding-right: ($gutter / 2);
+
+  @media (min-width: $screen-sm-min) {
+    float: left;
+    width: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-sm-column-offset($columns) {
+  @media (min-width: $screen-sm-min) {
+    margin-left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-sm-column-push($columns) {
+  @media (min-width: $screen-sm-min) {
+    left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-sm-column-pull($columns) {
+  @media (min-width: $screen-sm-min) {
+    right: percentage(($columns / $grid-columns));
+  }
+}
+
+// Generate the medium columns
+@mixin make-md-column($columns, $gutter: $grid-gutter-width) {
+  position: relative;
+  min-height: 1px;
+  padding-left:  ($gutter / 2);
+  padding-right: ($gutter / 2);
+
+  @media (min-width: $screen-md-min) {
+    float: left;
+    width: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-md-column-offset($columns) {
+  @media (min-width: $screen-md-min) {
+    margin-left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-md-column-push($columns) {
+  @media (min-width: $screen-md-min) {
+    left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-md-column-pull($columns) {
+  @media (min-width: $screen-md-min) {
+    right: percentage(($columns / $grid-columns));
+  }
+}
+
+// Generate the large columns
+@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {
+  position: relative;
+  min-height: 1px;
+  padding-left:  ($gutter / 2);
+  padding-right: ($gutter / 2);
+
+  @media (min-width: $screen-lg-min) {
+    float: left;
+    width: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-lg-column-offset($columns) {
+  @media (min-width: $screen-lg-min) {
+    margin-left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-lg-column-push($columns) {
+  @media (min-width: $screen-lg-min) {
+    left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-lg-column-pull($columns) {
+  @media (min-width: $screen-lg-min) {
+    right: percentage(($columns / $grid-columns));
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_hide-text.scss b/static/assets/stylesheets/bootstrap/mixins/_hide-text.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c59d73612845af223fb0feb2529212ae60d60bd3
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_hide-text.scss
@@ -0,0 +1,21 @@
+// CSS image replacement
+//
+// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for
+// mixins being reused as classes with the same name, this doesn't hold up. As
+// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
+//
+// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
+
+// Deprecated as of v3.0.1 (will be removed in v4)
+@mixin hide-text() {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+// New mixin to use as of v3.0.1
+@mixin text-hide() {
+  @include hide-text;
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_image.scss b/static/assets/stylesheets/bootstrap/mixins/_image.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5cad773a9f61be449c982c4da64dc1d92f594dda
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_image.scss
@@ -0,0 +1,33 @@
+// Image Mixins
+// - Responsive image
+// - Retina image
+
+
+// Responsive image
+//
+// Keep images from scaling beyond the width of their parents.
+@mixin img-responsive($display: block) {
+  display: $display;
+  max-width: 100%; // Part 1: Set a maximum relative to the parent
+  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
+}
+
+
+// Retina image
+//
+// Short retina mixin for setting background-image and -size. Note that the
+// spelling of `min--moz-device-pixel-ratio` is intentional.
+@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
+  // background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-1x}"), "#{$file-1x}"));
+
+  @media
+  only screen and (-webkit-min-device-pixel-ratio: 2),
+  only screen and (   min--moz-device-pixel-ratio: 2),
+  only screen and (     -o-min-device-pixel-ratio: 2/1),
+  only screen and (        min-device-pixel-ratio: 2),
+  only screen and (                min-resolution: 192dpi),
+  only screen and (                min-resolution: 2dppx) {
+    // background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-2x}"), "#{$file-2x}"));
+    background-size: $width-1x $height-1x;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_labels.scss b/static/assets/stylesheets/bootstrap/mixins/_labels.scss
new file mode 100644
index 0000000000000000000000000000000000000000..eda6dfd29ea1709380b27748ef5d082fed20903a
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_labels.scss
@@ -0,0 +1,12 @@
+// Labels
+
+@mixin label-variant($color) {
+  background-color: $color;
+
+  &[href] {
+    &:hover,
+    &:focus {
+      background-color: darken($color, 10%);
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_list-group.scss b/static/assets/stylesheets/bootstrap/mixins/_list-group.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5f05e7ba233ed21a681474fd20ef79db8fd769b3
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_list-group.scss
@@ -0,0 +1,31 @@
+// List Groups
+
+@mixin list-group-item-variant($state, $background, $color) {
+  .list-group-item-#{$state} {
+    color: $color;
+    background-color: $background;
+
+    // [converter] extracted a& to a.list-group-item-#{$state}
+  }
+
+  a.list-group-item-#{$state} {
+    color: $color;
+
+    .list-group-item-heading {
+      color: inherit;
+    }
+
+    &:hover,
+    &:focus {
+      color: $color;
+      background-color: darken($background, 5%);
+    }
+    &.active,
+    &.active:hover,
+    &.active:focus {
+      color: #fff;
+      background-color: $color;
+      border-color: $color;
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_nav-divider.scss b/static/assets/stylesheets/bootstrap/mixins/_nav-divider.scss
new file mode 100644
index 0000000000000000000000000000000000000000..2e6da02a4748b00cf67c21cc1735c26373e9c4c8
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_nav-divider.scss
@@ -0,0 +1,10 @@
+// Horizontal dividers
+//
+// Dividers (basically an hr) within dropdowns and nav lists
+
+@mixin nav-divider($color: #e5e5e5) {
+  height: 1px;
+  margin: (($line-height-computed / 2) - 1) 0;
+  overflow: hidden;
+  background-color: $color;
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss b/static/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c8fbf1a7d67d35140c5de3b192fd917775ac8c18
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss
@@ -0,0 +1,9 @@
+// Navbar vertical align
+//
+// Vertically center elements in the navbar.
+// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
+
+@mixin navbar-vertical-align($element-height) {
+  margin-top: (($navbar-height - $element-height) / 2);
+  margin-bottom: (($navbar-height - $element-height) / 2);
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_opacity.scss b/static/assets/stylesheets/bootstrap/mixins/_opacity.scss
new file mode 100644
index 0000000000000000000000000000000000000000..88e9a576abd795a9d0734542ff7e58e44a08d9a3
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_opacity.scss
@@ -0,0 +1,8 @@
+// Opacity
+
+@mixin opacity($opacity) {
+  opacity: $opacity;
+  // IE8 filter
+  $opacity-ie: ($opacity * 100);
+  filter: alpha(opacity=$opacity-ie);
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_pagination.scss b/static/assets/stylesheets/bootstrap/mixins/_pagination.scss
new file mode 100644
index 0000000000000000000000000000000000000000..43fff6863d25c721e902761f760f20b2cf07cfb5
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_pagination.scss
@@ -0,0 +1,23 @@
+// Pagination
+
+@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $border-radius) {
+  > li {
+    > a,
+    > span {
+      padding: $padding-vertical $padding-horizontal;
+      font-size: $font-size;
+    }
+    &:first-child {
+      > a,
+      > span {
+        @include border-left-radius($border-radius);
+      }
+    }
+    &:last-child {
+      > a,
+      > span {
+        @include border-right-radius($border-radius);
+      }
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_panels.scss b/static/assets/stylesheets/bootstrap/mixins/_panels.scss
new file mode 100644
index 0000000000000000000000000000000000000000..3ff31ae51ee0827d9a4dd3e14ff3fd18f90572fb
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_panels.scss
@@ -0,0 +1,24 @@
+// Panels
+
+@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {
+  border-color: $border;
+
+  & > .panel-heading {
+    color: $heading-text-color;
+    background-color: $heading-bg-color;
+    border-color: $heading-border;
+
+    + .panel-collapse > .panel-body {
+      border-top-color: $border;
+    }
+    .badge {
+      color: $heading-bg-color;
+      background-color: $heading-text-color;
+    }
+  }
+  & > .panel-footer {
+    + .panel-collapse > .panel-body {
+      border-bottom-color: $border;
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_progress-bar.scss b/static/assets/stylesheets/bootstrap/mixins/_progress-bar.scss
new file mode 100644
index 0000000000000000000000000000000000000000..90a62afc2d6b33de932ff21247b9ef7eec258cf6
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_progress-bar.scss
@@ -0,0 +1,10 @@
+// Progress bars
+
+@mixin progress-bar-variant($color) {
+  background-color: $color;
+
+  // Deprecated parent class requirement as of v3.2.0
+  .progress-striped & {
+    @include gradient-striped;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_reset-filter.scss b/static/assets/stylesheets/bootstrap/mixins/_reset-filter.scss
new file mode 100644
index 0000000000000000000000000000000000000000..bf73051200ec53b4fca0fcb50eaa8bf7b7c16d23
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_reset-filter.scss
@@ -0,0 +1,8 @@
+// Reset filters for IE
+//
+// When you need to remove a gradient background, do not forget to use this to reset
+// the IE filter for IE9 and below.
+
+@mixin reset-filter() {
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_resize.scss b/static/assets/stylesheets/bootstrap/mixins/_resize.scss
new file mode 100644
index 0000000000000000000000000000000000000000..83fa6379179cba67dbd3b3fb1b1d167380f361d4
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_resize.scss
@@ -0,0 +1,6 @@
+// Resize anything
+
+@mixin resizable($direction) {
+  resize: $direction; // Options: horizontal, vertical, both
+  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss b/static/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss
new file mode 100644
index 0000000000000000000000000000000000000000..9867db013d75ecedef2b77947f8ac3143bd8b68d
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss
@@ -0,0 +1,21 @@
+// Responsive utilities
+
+//
+// More easily include all the states for responsive-utilities.less.
+// [converter] $parent hack
+@mixin responsive-visibility($parent) {
+  #{$parent} {
+    display: block !important;
+  }
+  table#{$parent}  { display: table; }
+  tr#{$parent}     { display: table-row !important; }
+  th#{$parent},
+  td#{$parent}     { display: table-cell !important; }
+}
+
+// [converter] $parent hack
+@mixin responsive-invisibility($parent) {
+  #{$parent} {
+    display: none !important;
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_size.scss b/static/assets/stylesheets/bootstrap/mixins/_size.scss
new file mode 100644
index 0000000000000000000000000000000000000000..abbe2463ce8d7c315f8a2368f9301603315a35db
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_size.scss
@@ -0,0 +1,10 @@
+// Sizing shortcuts
+
+@mixin size($width, $height) {
+  width: $width;
+  height: $height;
+}
+
+@mixin square($size) {
+  @include size($size, $size);
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_tab-focus.scss b/static/assets/stylesheets/bootstrap/mixins/_tab-focus.scss
new file mode 100644
index 0000000000000000000000000000000000000000..7df0ae7ca114611e90c2f1c6d2bfcf55bc6792ec
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_tab-focus.scss
@@ -0,0 +1,9 @@
+// WebKit-style focus
+
+@mixin tab-focus() {
+  // Default
+  outline: thin dotted;
+  // WebKit
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_table-row.scss b/static/assets/stylesheets/bootstrap/mixins/_table-row.scss
new file mode 100644
index 0000000000000000000000000000000000000000..136795081eb992d71b7a72dae19795bf71135316
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_table-row.scss
@@ -0,0 +1,28 @@
+// Tables
+
+@mixin table-row-variant($state, $background) {
+  // Exact selectors below required to override `.table-striped` and prevent
+  // inheritance to nested tables.
+  .table > thead > tr,
+  .table > tbody > tr,
+  .table > tfoot > tr {
+    > td.#{$state},
+    > th.#{$state},
+    &.#{$state} > td,
+    &.#{$state} > th {
+      background-color: $background;
+    }
+  }
+
+  // Hover states for `.table-hover`
+  // Note: this is not available for cells or rows within `thead` or `tfoot`.
+  .table-hover > tbody > tr {
+    > td.#{$state}:hover,
+    > th.#{$state}:hover,
+    &.#{$state}:hover > td,
+    &:hover > .#{$state},
+    &.#{$state}:hover > th {
+      background-color: darken($background, 5%);
+    }
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss b/static/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1101e03662877d1734501d05918a4c4ace8137f6
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss
@@ -0,0 +1,11 @@
+// Typography
+
+// [converter] $parent hack
+@mixin text-emphasis-variant($parent, $color) {
+  #{$parent} {
+    color: $color;
+  }
+  a#{$parent}:hover {
+    color: darken($color, 10%);
+  }
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_text-overflow.scss b/static/assets/stylesheets/bootstrap/mixins/_text-overflow.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1593b25ea5c7b570188f99bbeda5f36b0d57e5eb
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_text-overflow.scss
@@ -0,0 +1,8 @@
+// Text overflow
+// Requires inline-block or block for proper styling
+
+@mixin text-overflow() {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
diff --git a/static/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss b/static/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss
new file mode 100644
index 0000000000000000000000000000000000000000..df4c1ec878e18c47f15e3e4a63e66d52a9349ba4
--- /dev/null
+++ b/static/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss
@@ -0,0 +1,222 @@
+// Vendor Prefixes
+//
+// All vendor mixins are deprecated as of v3.2.0 due to the introduction of
+// Autoprefixer in our Gruntfile. They will be removed in v4.
+
+// - Animations
+// - Backface visibility
+// - Box shadow
+// - Box sizing
+// - Content columns
+// - Hyphens
+// - Placeholder text
+// - Transformations
+// - Transitions
+// - User Select
+
+
+// Animations
+@mixin animation($animation) {
+  -webkit-animation: $animation;
+       -o-animation: $animation;
+          animation: $animation;
+}
+@mixin animation-name($name) {
+  -webkit-animation-name: $name;
+          animation-name: $name;
+}
+@mixin animation-duration($duration) {
+  -webkit-animation-duration: $duration;
+          animation-duration: $duration;
+}
+@mixin animation-timing-function($timing-function) {
+  -webkit-animation-timing-function: $timing-function;
+          animation-timing-function: $timing-function;
+}
+@mixin animation-delay($delay) {
+  -webkit-animation-delay: $delay;
+          animation-delay: $delay;
+}
+@mixin animation-iteration-count($iteration-count) {
+  -webkit-animation-iteration-count: $iteration-count;
+          animation-iteration-count: $iteration-count;
+}
+@mixin animation-direction($direction) {
+  -webkit-animation-direction: $direction;
+          animation-direction: $direction;
+}
+@mixin animation-fill-mode($fill-mode) {
+  -webkit-animation-fill-mode: $fill-mode;
+          animation-fill-mode: $fill-mode;
+}
+
+// Backface visibility
+// Prevent browsers from flickering when using CSS 3D transforms.
+// Default value is `visible`, but can be changed to `hidden`
+
+@mixin backface-visibility($visibility){
+  -webkit-backface-visibility: $visibility;
+     -moz-backface-visibility: $visibility;
+          backface-visibility: $visibility;
+}
+
+// Drop shadows
+//
+// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
+// supported browsers that have box shadow capabilities now support it.
+
+@mixin box-shadow($shadow...) {
+  -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1
+          box-shadow: $shadow;
+}
+
+// Box sizing
+@mixin box-sizing($boxmodel) {
+  -webkit-box-sizing: $boxmodel;
+     -moz-box-sizing: $boxmodel;
+          box-sizing: $boxmodel;
+}
+
+// CSS3 Content Columns
+@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {
+  -webkit-column-count: $column-count;
+     -moz-column-count: $column-count;
+          column-count: $column-count;
+  -webkit-column-gap: $column-gap;
+     -moz-column-gap: $column-gap;
+          column-gap: $column-gap;
+}
+
+// Optional hyphenation
+@mixin hyphens($mode: auto) {
+  word-wrap: break-word;
+  -webkit-hyphens: $mode;
+     -moz-hyphens: $mode;
+      -ms-hyphens: $mode; // IE10+
+       -o-hyphens: $mode;
+          hyphens: $mode;
+}
+
+// Placeholder text
+@mixin placeholder($color: $input-color-placeholder) {
+  // Firefox
+  &::-moz-placeholder {
+    color: $color;
+    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526
+  }
+  &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+
+  &::-webkit-input-placeholder  { color: $color; } // Safari and Chrome
+}
+
+// Transformations
+@mixin scale($ratio...) {
+  -webkit-transform: scale($ratio);
+      -ms-transform: scale($ratio); // IE9 only
+       -o-transform: scale($ratio);
+          transform: scale($ratio);
+}
+
+@mixin scaleX($ratio) {
+  -webkit-transform: scaleX($ratio);
+      -ms-transform: scaleX($ratio); // IE9 only
+       -o-transform: scaleX($ratio);
+          transform: scaleX($ratio);
+}
+@mixin scaleY($ratio) {
+  -webkit-transform: scaleY($ratio);
+      -ms-transform: scaleY($ratio); // IE9 only
+       -o-transform: scaleY($ratio);
+          transform: scaleY($ratio);
+}
+@mixin skew($x, $y) {
+  -webkit-transform: skewX($x) skewY($y);
+      -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
+       -o-transform: skewX($x) skewY($y);
+          transform: skewX($x) skewY($y);
+}
+@mixin translate($x, $y) {
+  -webkit-transform: translate($x, $y);
+      -ms-transform: translate($x, $y); // IE9 only
+       -o-transform: translate($x, $y);
+          transform: translate($x, $y);
+}
+@mixin translate3d($x, $y, $z) {
+  -webkit-transform: translate3d($x, $y, $z);
+          transform: translate3d($x, $y, $z);
+}
+@mixin rotate($degrees) {
+  -webkit-transform: rotate($degrees);
+      -ms-transform: rotate($degrees); // IE9 only
+       -o-transform: rotate($degrees);
+          transform: rotate($degrees);
+}
+@mixin rotateX($degrees) {
+  -webkit-transform: rotateX($degrees);
+      -ms-transform: rotateX($degrees); // IE9 only
+       -o-transform: rotateX($degrees);
+          transform: rotateX($degrees);
+}
+@mixin rotateY($degrees) {
+  -webkit-transform: rotateY($degrees);
+      -ms-transform: rotateY($degrees); // IE9 only
+       -o-transform: rotateY($degrees);
+          transform: rotateY($degrees);
+}
+@mixin perspective($perspective) {
+  -webkit-perspective: $perspective;
+     -moz-perspective: $perspective;
+          perspective: $perspective;
+}
+@mixin perspective-origin($perspective) {
+  -webkit-perspective-origin: $perspective;
+     -moz-perspective-origin: $perspective;
+          perspective-origin: $perspective;
+}
+@mixin transform-origin($origin) {
+  -webkit-transform-origin: $origin;
+     -moz-transform-origin: $origin;
+      -ms-transform-origin: $origin; // IE9 only
+          transform-origin: $origin;
+}
+
+
+// Transitions
+
+@mixin transition($transition...) {
+  -webkit-transition: $transition;
+       -o-transition: $transition;
+          transition: $transition;
+}
+@mixin transition-property($transition-property...) {
+  -webkit-transition-property: $transition-property;
+          transition-property: $transition-property;
+}
+@mixin transition-delay($transition-delay) {
+  -webkit-transition-delay: $transition-delay;
+          transition-delay: $transition-delay;
+}
+@mixin transition-duration($transition-duration...) {
+  -webkit-transition-duration: $transition-duration;
+          transition-duration: $transition-duration;
+}
+@mixin transition-timing-function($timing-function) {
+  -webkit-transition-timing-function: $timing-function;
+          transition-timing-function: $timing-function;
+}
+@mixin transition-transform($transition...) {
+  -webkit-transition: -webkit-transform $transition;
+     -moz-transition: -moz-transform $transition;
+       -o-transition: -o-transform $transition;
+          transition: transform $transition;
+}
+
+
+// User select
+// For selecting text on the page
+
+@mixin user-select($select) {
+  -webkit-user-select: $select;
+     -moz-user-select: $select;
+      -ms-user-select: $select; // IE10+
+          user-select: $select;
+}
diff --git a/static/assets/stylesheets/theme/_footer.scss b/static/assets/stylesheets/theme/_footer.scss
new file mode 100644
index 0000000000000000000000000000000000000000..3bb892ff84d5c7b18c655ff7dadca407a94489cc
--- /dev/null
+++ b/static/assets/stylesheets/theme/_footer.scss
@@ -0,0 +1,52 @@
+footer {
+    background-image: url(../images/footer-bg.jpg);
+    background-size: cover;
+    background-position: center bottom;
+    background-repeat: no-repeat;
+    background-color: $white;
+    padding: 100px 0 50px;
+    @media (max-width: $screen-sm-max) {
+        padding-top: 50px;
+        .container {
+            padding-top: 40px;
+        }
+    }
+    @media (min-width: $screen-md-max) {
+        padding-top: 200px;
+        .container {
+            padding-bottom: 100px;
+        }
+    }
+    nav {
+        a {
+            color: darken($white, 20%);
+            text-transform: uppercase;
+            font-size: 12px;
+        }
+    }
+    p.copyright {
+        color: #8b7193;
+        font-size: 12px;
+        text-align: right;
+    }
+    .social-facebook, .social-twitter, .social-youtube, .social-share {
+        display: block;
+        width: 36px;
+        height: 35px;
+        background-repeat: no-repeat;
+        float: left;
+        margin-right: 10px;
+    }
+    .social-facebook {
+        background-image: url(../images/icon-facebook.png);
+    }
+    .social-twitter {
+        background-image: url(../images/icon-twitter.png);
+    }
+    .social-youtube {
+        background-image: url(../images/icon-youtube.png);
+    }
+    .social-share {
+        background-image: url(../images/icon-share.png);
+    }
+}
diff --git a/static/assets/stylesheets/theme/_header.scss b/static/assets/stylesheets/theme/_header.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e86ee7fe7a4a58feb385fad277123fe6183695dc
--- /dev/null
+++ b/static/assets/stylesheets/theme/_header.scss
@@ -0,0 +1,85 @@
+html {
+    text-rendering: optimizeLegibility;
+    -webkit-font-smoothing: antialiased;
+}
+header {
+    .homepage & {
+        background-image: url(../images/header-bg.jpg);
+        background-size: cover;
+        background-repeat: no-repeat;
+        background-position: bottom center;
+        padding-bottom: 50px;
+    }
+    @include gradient-directional($bg-gradient-light, $bg-gradient-dark, -45deg);
+    padding-bottom: 2px;
+    nav {
+        padding-top: 20px;
+        ul.navbar-nav {
+            margin-top: 40px;
+            text-transform: uppercase;
+            text-align: center;
+            li {
+                position: relative;
+                a {
+                    color: $white;
+                }
+                ul.dropdown-menu {
+                    background-color: rgba(0, 0, 0, 0.8);
+                    .homepage & {
+                        background-color: rgba(0, 0, 0, 0.5);
+                    }
+                    border: 0;
+                    border-top: 5px solid $blue;
+                    border-radius: 0;
+                    padding: 0;
+                    margin-top: 10px;
+                    left: -55px;
+                    li {
+                        text-transform: none;
+                        a {
+                            padding: 20px;
+                            @include transition;
+                            &:hover {
+                                color: $white;
+                                background-color: rgba(0, 0, 0, 0.4);
+                            }
+                        }
+                    }
+                    &:after {
+                        @include triangle-up($blue);
+                        left: 50%;
+                        margin-left: -10px;
+                    }
+                }
+            }
+        }
+    }
+    section {
+        color: $white;
+        margin-top: 50px;
+        h1 {
+            font-size: 6rem;
+            font-weight: bold;
+            margin-bottom: 20px;
+        }
+        p {
+            font-size: 2.5rem;
+            line-height: 1.4em;
+        }
+        @media (max-width: $screen-xs-max) {
+            h1 {
+                font-size: 4.5rem;
+                font-weight: bold;
+                margin-bottom: 20px;
+            }
+            p {
+                font-size: 2.2rem;
+                line-height: 1.4em;
+            }
+        }
+    }
+    .header-divider {
+        text-align: center;
+        margin-bottom: -75px;
+    }
+}
diff --git a/static/assets/stylesheets/theme/_main.scss b/static/assets/stylesheets/theme/_main.scss
new file mode 100644
index 0000000000000000000000000000000000000000..fb35bff67c2b77888454de784113b61cd735d243
--- /dev/null
+++ b/static/assets/stylesheets/theme/_main.scss
@@ -0,0 +1,271 @@
+main.main {
+    p {
+        color: $gray;
+    }
+    .line-divider-left {
+        padding-left: 3em;
+    }
+    .well {
+        background-color: $blue;
+        background-image: url(../images/well-bg-tl.png), url(../images/well-bg-br.png);
+        background-position: left top, right bottom;
+        background-repeat: no-repeat;
+        color: $white !important;
+        border: 0px;
+        margin-bottom: 0px;
+        h1 {
+            font-size: 5rem;
+            font-weight: 700;
+        }
+        p {
+            font-size: 2.4rem;
+            color: $white !important;
+        }
+    }
+    .subsection-header {
+        margin-bottom: 20px;
+        h2 {
+            color: $white;
+            display: block;
+            height: 79px;
+            width: 100%;
+            background-size: 100%;
+            padding: 28px;
+            font-size: 21px;
+            margin-bottom: 30px;
+        }
+    }
+    section.first {
+        background-color: $white;
+        background-image: url(../images/section-first-divider.png);
+        background-repeat: no-repeat;
+        background-size: 100%;
+        background-position: bottom center;
+        padding: 50px 0 125px;
+        .first-col, .second-col {
+            //margin-top:15px;
+            h2 {
+                font-size: 22px;
+                font-weight: 700;
+                color: $black !important;
+            }
+            p {
+                //              font-size: 13px;
+                text-align: justify;
+                font-weight: 400;
+            }
+            span {
+                width: 100%;
+                display: block;
+                font-size: 5em;
+                text-align: right;
+                @media (max-width: $screen-xs-max) {
+                    font-size: 4em;
+                    margin-top: 20px;
+                    margin-left: 0px;
+                }
+                color: $blue;
+                margin-top: 12px;
+                margin-left: 4px;
+            }
+            .row:hover {
+                background-color: rgba($blue, .05);
+                @include box-shadow(0px 0px 5px lighten($blue, 50%));
+            }
+        }
+        .third-col {
+            h1 {
+                margin-top: -20px;
+                @media (max-width: $screen-md-max) {
+                    margin-top: 30px;
+                }
+            }
+            p {
+                font-size: 1.5em;
+            }
+        }
+    }
+    section.second {
+        background-image: url(../images/section-second-divider.png);
+        background-repeat: no-repeat;
+        background-size: 100%;
+        background-position: bottom center;
+        padding: 20px 0 75px;
+        .community {
+            p {
+                font-size: 1.5em;
+            }
+        }
+        .latest-news {
+            h2 {
+                background-image: url(../images/heading-latest_news.jpg);
+            }
+            .latest-news-item {
+                border-bottom: 1px solid darken($white, 20%);
+                padding-bottom: 10px;
+                margin-bottom: 20px;
+                h3 {
+                    font-size: 18px;
+                }
+                p {
+                    font-size: 14px;
+                }
+                p.date {
+                    color: $green;
+                    font-size: 12px;
+                }
+            }
+            .latest-news-item:last-of-type {
+                margin-bottom: 35px;
+                border-bottom: 0px;
+            }
+        }
+        .featured-articles {
+            h2 {
+                background-image: url(../images/heading-featured.jpg);
+            }
+            .featured-articles-item {
+                background-image: url(../images/open-iot-bg.jpg);
+                background-size: cover;
+                background-repeat: no-repeat;
+                color: $white;
+                text-align: center;
+                margin-bottom: 30px;
+                h3 {
+                    font-size: 18px;
+                    color: $white;
+                    padding: 40px 0;
+                    margin: 0;
+                }
+                // p {
+                //     background-color: $blue;
+                //     padding: 10px 0;
+                //     font-size: 1em;
+                //     color: white;
+                //     line-height: 1.2;
+                //     position: relative;
+                //     &:after {
+                //         @include triangle-bottomright($blue);
+                //     }
+                // }
+            }
+        }
+        .upcoming-events {
+            h2 {
+                background-image: url(../images/heading-upcoming_events.jpg);
+            }
+            .upcoming-events-item {
+                text-align: center;
+                color: $white;
+                margin-bottom: 30px;
+                h3 {
+                    background-image: url(../images/upcoming-events-bg.png);
+                    background-size: 100%;
+                    padding: 40px 0;
+                    font-size: 18px;
+                    font-weight: bold;
+                    margin: 0;
+                    span.date {
+                        font-weight: normal;
+                        font-size: 14px;
+                    }
+                }
+                h3:hover {
+                    background: url(../images/upcoming-events-bg_hover.png);
+                    background-size: 100%;
+                }
+                p {
+                    background-color: $blue;
+                    padding: 10px 0;
+                    font-size: 14px;
+                    line-height: 1.2;
+                    position: relative;
+                    color: $white;
+                    &:after {
+                        @include triangle-bottomright($blue);
+                    }
+                }
+            }
+        }
+    }
+    section.third {
+        background-color: $white;
+        .logos {
+            text-align: center;
+        }
+        .btn {
+            margin-top: 2em;
+        }
+        .working-group {
+            p {
+                font-size: 1.5em;
+            }
+        }
+    }
+    /* Item box: Layout item */
+    
+    .itembox {
+        margin-bottom: 20px;
+        padding: 0px 20px;
+        //text-align: center;
+        position: relative;
+        cursor: pointer;
+        p {
+            color: $gray !important;
+        }
+        a.readmore:link, a.readmore:visited {
+            display: block;
+            position: absolute;
+            bottom: 0;
+            background: $blue;
+            color: #fff;
+            text-align: center;
+            padding: 8px 20px;
+            margin-bottom: 10px;
+        }
+        a.readmore:hover {
+            background: $purple;
+        }
+    }
+    .itembox:hover {
+        background: lighten($gray, 80%);
+    }
+    .project-list {
+        /* Project list: community.html */
+        
+        .loading {
+            min-height: 400px;
+            text-align: center;
+            font-size: 2em;
+            color: $purple;
+        }
+        .itembox {
+            h3, p {
+                padding: 0 10px;
+            }
+            .logo {
+                padding: 15px;
+                max-width: 80%;
+            }
+            h3 {
+                font-size: 21px;
+            }
+            p {
+                font-size: 15px;
+                padding-bottom: 50px;
+                color: $purple;
+            }
+        }
+    }
+    // getting started page
+    .videos {
+        h2 {
+            background-image: url(../images/heading-upcoming_events.jpg);
+        }
+    }
+    .presentations {
+        h2 {
+            background-image: url(../images/heading-upcoming_events.jpg);
+        }
+    }
+}
diff --git a/static/assets/stylesheets/theme/_mixins.scss b/static/assets/stylesheets/theme/_mixins.scss
new file mode 100644
index 0000000000000000000000000000000000000000..93d6eeb08dc442616e6ff91462b963e417edfd41
--- /dev/null
+++ b/static/assets/stylesheets/theme/_mixins.scss
@@ -0,0 +1,33 @@
+
+
+
+@mixin triangle-bottomright($color){
+	width: 0;
+	height: 0;
+	border-bottom: 20px solid $color;
+	border-left: 20px solid transparent;
+	content: " ";
+	display: table;
+	right:1px;
+	top:-20px;
+	position:absolute;
+}
+
+@mixin triangle-up($color) {
+	width: 0;
+	height: 0;
+	border-left: 10px solid transparent;
+	border-right: 10px solid transparent;
+	border-bottom: 10px solid $color;
+	content: " ";
+	display: table;
+	top:-10px;
+	position:absolute;
+}
+
+
+@mixin transition{
+	-webkit-transition: all 300ms ease-out;
+	-moz-transition: all 300ms ease-out;
+	transition: all 300ms ease-out;
+}
\ No newline at end of file
diff --git a/static/assets/stylesheets/theme/_utilities.scss b/static/assets/stylesheets/theme/_utilities.scss
new file mode 100644
index 0000000000000000000000000000000000000000..6ce02cd6fb5d55066633329168d8fb90fe7b489f
--- /dev/null
+++ b/static/assets/stylesheets/theme/_utilities.scss
@@ -0,0 +1,61 @@
+
+
+// Colours variables
+$green:#6eb553;
+$blue:#3085cb;
+$white:#f5f5f5;
+$black:#403c40;
+$purple:#551f62;
+$gray:#58595b;
+
+$bg-gradient-dark:#141421;
+$bg-gradient-light:#4d2258;
+
+
+// navbar
+$navbar-default-color: $white !default;
+$navbar-default-link-color: $white !default;
+$navbar-default-link-hover-color: $white !default;
+$navbar-default-bg: rgba(255, 255, 255, 0) !default;
+$navbar-default-border: none !default;
+
+// Text Colours
+.green{color:$green;}
+.blue{color:$blue;}
+.white{color:$white;}
+.black{color:$black;}
+.purple{color:$purple;}
+
+
+// Floats
+.right{float:right;}
+.left{float:left;}
+
+a.btn{
+	text-transform: uppercase;
+	padding:10px 40px;
+	font-size: 12px;
+}
+a.btn.btn-primary{
+	background-color:transparent;
+	border-color:$blue;
+	color:$black;
+	@include transition;
+	&:hover{
+		background-color:$blue;
+		color:$white;
+	}
+}
+
+.line-divider-left{
+//	border-left:1px solid darken($white, 20%);
+}
+
+.line-divider-right{
+	border-right:1px solid darken($white, 20%);
+}
+
+
+.align-center{
+	text-align:center;
+}
\ No newline at end of file
diff --git a/static/community.html b/static/community.html
new file mode 100755
index 0000000000000000000000000000000000000000..0f213bad8a4f6cb542eabf4e0a4c934973fe5326
--- /dev/null
+++ b/static/community.html
@@ -0,0 +1,283 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>iot.eclipse.org &mdash; Community</title>
+  <meta name="description" content="iot.eclipse.org is about getting IoT developers involved in what is happening in the different Eclipse projects">
+  <meta name="author" content="Eclipse.org">
+  <link rel="author" href="humans.txt" />
+
+  <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+  <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+  <!-- Le styles -->
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+</head>
+
+<body>
+
+  <header>
+
+    <nav class="navbar">
+      <div class="container">
+        <div class="row">
+          <div class="col-sm-2">
+            <a href="/"><img src="assets/images/iot-logo.png">
+            </a>
+          </div>
+          <div class="col-sm-10">
+            <ul class="list-inline right menu">
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+                <ul class="dropdown-menu">
+                  <li><a href="/standards">Standards</a>
+                  </li>
+                  <li><a href="/frameworks">Services &amp; Frameworks</a>
+                  </li>
+                  <li><a href="/projects">All the projects</a>
+                  </li>
+                </ul>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </nav>
+  </header>
+
+
+  <!-- Place this tag after the last +1 button tag. -->
+  <script type="text/javascript">
+  (function() {
+    var po = document.createElement('script');
+    po.type = 'text/javascript';
+    po.async = true;
+    po.src = 'https://apis.google.com/js/plusone.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(po, s);
+  })();
+  </script>
+
+  <div class="container">
+
+    <div class="well">
+      <div class="page-header">
+        <h1>
+          Community <small>Join the Eclipse and IoT developer
+            community!</small>
+        </h1>
+      </div>
+
+      <div>
+        <p class="lead">The IoT Working Group not only works on establishing reference Open Source IoT architecture, but also works together with key industry partners and Open Source communities to build a creative and welcoming IoT developer community.</p>
+      </div>
+    </div>
+
+    <div class="row-fluid">
+
+      <div class="span6" id="news">
+        <h2 class="section-title"><i class="icon-bullhorn"></i> | Community News</h2>
+        <ul class="news-list">
+          <li>
+            <span class="date">11 <br/>Dec &apos;14 </span>
+            <span class="text">Announcing the Open IoT challenge<br/>
+              <a href="http://blog.benjamin-cabe.com/2014/12/11/announcing-the-open-iot-challenge" class="readmore">Read more</a>
+            </span>
+          </li>
+          <li>
+            <span class="date">6 <br/>Nov &apos;14 </span>
+            <span class="text">Open IoT hangout #12 - Espruino<br/>
+              <a href="https://plus.google.com/events/cpmqs167f2r6igimkkvbmhmi21k" class="readmore">Read more</a>
+            </span>
+          </li>
+          <li>
+            <span class="date">16 <br/>Oct &apos;14 </span>
+            <span class="text">Open IoT hangout #11 - IPSO SmartObjects<br/>
+              <a href="https://plus.google.com/events/co9h2jlhtr75o9s7ujdlpmj77dc" class="readmore">Read more</a>
+            </span>
+          </li>
+          <li>
+            <span class="date">11 <br/>Sep &apos;14 </span>
+            <span class="text">Open IoT hangout #10 - MQTTLens<br/>
+              <a href="https://plus.google.com/events/cqd050aaqu1d4efmvdjek9ghp44" class="readmore">Read more</a>
+            </span>
+          </li>
+
+        </ul>
+      </div>
+
+      <div class="span6">
+        <h2 class="section-title grey-title"><i class="icon-film"></i> | Videos</h2>
+        <div class="grey-box">
+          <iframe width="100%" height="315" src="http://www.youtube.com/embed/videoseries?list=PL0D6A9FF9237853DF&amp;hl=fr_FR" frameborder="0" allowfullscreen></iframe>
+        </div>
+      </div>
+    </div>
+
+    <div class="row-fluid">
+
+      <div class="span6" id="events">
+        <h2 class="section-title"><i class="icon-calendar"></i> | Events</h2>
+        <div class="event-list">
+          <div class="row-fluid">
+            <div class="span4 itembox">
+              <h3>Embedded World</h3>
+              <p class="date">Feb 24-26, 2015</p>
+              <p class="location">Nuremberg, Germany</p>
+              <a href="http://www.embedded-world.eu/" class="readmore">Read more <i class="icon-chevron-right"></i></a>
+            </div>
+            <div class="span4 itembox">
+              <h3>EclipseCon 2015</h3>
+              <p class="date">Mar 9-12, 2015</p>
+              <p class="location">Burlingame, CA</p>
+              <a href="http://www.eclipsecon.org/na2015" class="readmore">Read more <i class="icon-chevron-right"></i></a>
+            </div>
+            <div class="span4 itembox">
+              <h3>Eclipse Day Dresden</h3>
+              <p class="date">Mar 18, 2015</p>
+              <p class="location">Dresden, Germany</p>
+              <a href="http://iotday.dd-eclipse.de/" class="readmore">Read more <i class="icon-chevron-right"></i></a>
+            </div>
+          </div>
+          <div class="row-fluid">
+            <div class="span4 itembox">
+              <h3>IoT Conference - Spring</h3>
+              <p class="date">Mar 23-26, 2015</p>
+              <p class="location">Munich, Germany</p>
+              <a href="http://iotcon.de/2015se/" class="readmore">Read more <i class="icon-chevron-right"></i></a>
+            </div>
+            <div class="span4 itembox">
+              <h3>IoT DevCon</h3>
+              <p class="date">May 6-7, 2015</p>
+              <p class="location">Santa Clara, CA</p>
+              <a href="http://www.iot-devcon.com/" class="readmore">Read more <i class="icon-chevron-right"></i></a>
+            </div>
+            <div class="span4 itembox">
+              <h3>IoT World</h3>
+              <p class="date">May 12-13, 2015</p>
+              <p class="location">San Francisco, CA</p>
+              <a href="http://iotworldevent.com/" class="readmore">Read more <i class="icon-chevron-right"></i></a>
+            </div>
+          </div>
+          <div class="row-fluid">
+            <div class="span4 itembox">
+              <h3>O'Reilly SOLID</h3>
+              <p class="date">June 23-25, 2015</p>
+              <p class="location">San Francisco, CA</p>
+              <a href="http://solidcon.com/solid2015" class="readmore">Read more <i class="icon-chevron-right"></i></a>
+            </div>
+            <div class="span4 itembox">
+              <h3>EclipseCon France</h3>
+              <p class="date">June 24-26, 2015</p>
+              <p class="location">Toulouse, France</p>
+              <a href="https://www.eclipsecon.org/france2014/" class="readmore">Read more <i class="icon-chevron-right"></i></a>
+            </div>
+            <div class="span4 itembox">
+              <h3>Industry of Things</h3>
+              <p class="date">Sept 21-22, 2015</p>
+              <p class="location">Berlin, Germany</p>
+              <a href="http://www.industryofthingsworld.com/en/" class="readmore">Read more <i class="icon-chevron-right"></i></a>
+            </div>
+          </div>
+          <!--           <div class="row-fluid">          
+          </div> -->
+        </div>
+      </div>
+
+      <div class="span6">
+        <h2 class="section-title grey-title"><i class="icon-facetime-video"></i> | Presentations</h2>
+
+        <div class="grey-box">
+          <iframe src="http://www.slideshare.net/slideshow/embed_code/32704902?rel=0" width="100%" height="450" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>
+          <div style="margin-bottom:5px"> <strong> </strong> </div>
+          <br/>
+        </div>
+      </div>
+
+    </div>
+
+    <div class="project-list row-fluid" id="projects">
+      <h2 class="section-title"><i class="icon-folder-open"></i> | Projects</h2>
+      <div class="loading" id="update-project">
+      </div>
+    </div>
+
+    <hr/>
+    <footer>
+      <ul class="nav nav-pills">
+        <li><a href="index.html">Home</a>
+        </li>
+        <li><a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a>
+        </li>
+        <li><a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a>
+        </li>
+        <li><a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a>
+        </li>
+        <li><a href="http://www.eclipse.org/legal/" target="_blank">Legal</a>
+        </li>
+        <li><a href="contact.html" data-toggle="modal" data-target="#contact-modal">Contact Us</a>
+        </li>
+        <li class="pull-right">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</li>
+      </ul>
+    </footer>
+
+    <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;">
+    </div>
+
+  </div>
+  <!-- /container -->
+
+
+
+  <!-- JS is at the end of the document so the pages load faster -->
+  <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
+  <!-- Include all compiled plugins (below), or include individual files as needed -->
+  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
+
+  <script src="js/community.min.js"></script>
+
+</body>
+
+</html>
diff --git a/static/contact.html b/static/contact.html
new file mode 100644
index 0000000000000000000000000000000000000000..cb906f77c45288b5ce98350418dde98a45d4e472
--- /dev/null
+++ b/static/contact.html
@@ -0,0 +1,12 @@
+
+<div class="modal-header">
+	<button type="button" class="close" data-dismiss="modal"
+		aria-hidden="true">×</button>
+	<h3 id="contact-label">Contact us</h3>
+</div>
+<div class="modal-body">
+	<h4><a href="https://dev.eclipse.org/mailman/listinfo/iot-wg" target="_blank">IoT Industry Working Group mailing-list</a></h4>
+	<p>Follow the general and technical discussions &amp; get involved</p>
+
+
+</div>
diff --git a/static/css/bootstrap/bootstrap-responsive.css b/static/css/bootstrap/bootstrap-responsive.css
new file mode 100644
index 0000000000000000000000000000000000000000..f74087bfc7b601d54ec9f36b2f083a59b21a8f55
--- /dev/null
+++ b/static/css/bootstrap/bootstrap-responsive.css
@@ -0,0 +1,1619 @@
+/*!
+ * Bootstrap Responsive v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+.visible-phone {
+  display: none !important;
+}
+
+.visible-tablet {
+  display: none !important;
+}
+
+.hidden-desktop {
+  display: none !important;
+}
+
+.visible-desktop {
+  display: inherit !important;
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+}
+
+@media (max-width: 767px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+}
+
+html {
+  text-rendering: optimizeLegibility;
+}
+
+body.index {
+  background: url('../img/bg_index.png') top repeat-x #dee8ef;
+}
+
+#catchline {
+  font-weight: 300;
+  color: #eff4f7;
+}
+
+#catchline h2 {
+  font-size: 50px;
+  color: #eff4f7;
+  text-align: left;
+}
+
+a:hover {
+  text-decoration: none;
+}
+
+/*.btn:hover, */
+.navbar a {
+  border-bottom: none;
+}
+
+h2 {
+  margin-bottom: 20px;
+  font-family: Lekton, Arial, sans-serif;
+  font-size: 38px;
+  font-weight: normal;
+  color: #26102b;
+  text-shadow: 0px 1px 1px #8487b8;
+  border-bottom: 2px dotted #26102b;
+}
+
+.home-box .lead {
+  margin-top: -10px;
+  font-size: 20px;
+  color: #8487b8;
+}
+
+.lead li {
+  line-height: inherit;
+}
+
+.home-box.span4 {
+  width: 350px;
+  padding-right: 10px;
+  padding-left: 10px;
+  margin-bottom: 330px;
+  border-radius: 10px;
+}
+
+.home-box.span4 h2 a {
+  color: #26102b;
+}
+
+.home-box:hover {
+  background: rgba(255, 255, 255, 0.3);
+}
+
+.loaded {
+  height: 335px !important;
+  margin-bottom: 10px !important;
+  opacity: 1 !important;
+}
+
+.home-box h2 {
+  font-size: 38px;
+  text-shadow: 0px 1px 1px #8487b8;
+}
+
+body.index h2 {
+  border: none;
+}
+
+.home-box i {
+  display: block;
+  width: 120px;
+  height: 70px;
+  padding-top: 45px;
+  margin: auto;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  font-size: 75px;
+  color: #4b7d38;
+  text-align: center;
+  text-shadow: none;
+  background: #FFF;
+  border-radius: 94px;
+}
+
+.brand {
+  width: 100px;
+  text-indent: -1000em;
+  background: url('../img/m2m_eclipse_logo.png') 0 7px no-repeat;
+}
+
+.navbar .brand {
+  margin-left: -40px;
+}
+
+.row {
+  margin-bottom: 30px;
+}
+
+.carousel-caption {
+  background: rgba(22, 23, 28, 0.4);
+}
+
+div.page-header {
+  padding-bottom: 9px;
+  margin: 0 0 30px;
+  border-bottom: 1px dashed #EEE;
+}
+
+div.page-header h1 {
+  margin-top: 0;
+  color: #26102b;
+}
+
+div.page-header h1 small {
+  display: block;
+  font-weight: 300;
+  color: #783388;
+}
+
+.container ul li {
+  margin-left: .7em;
+}
+
+.well {
+  margin-bottom: 50px;
+  margin-left: -20px;
+  background-color: white;
+  border: 1px solid #bcd1de;
+  -webkit-border-radius: 7px;
+     -moz-border-radius: 7px;
+          border-radius: 7px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.15);
+}
+
+@media (max-width: 979px) {
+  .well {
+    margin-left: 0;
+  }
+}
+
+p + h2 {
+  margin-top: 50px;
+}
+
+h3 {
+  text-indent: 0.3em;
+}
+
+#wg-members td,
+#sc-members td {
+  text-align: center;
+}
+
+.home-box i {
+  display: block;
+  width: 120px;
+  height: 70px;
+  padding-top: 45px;
+  margin-top: 20px;
+  margin-right: 10px;
+  margin-bottom: -80px;
+  font-size: 75px;
+  color: #0088cc;
+  text-align: center;
+  text-shadow: none;
+  background: rgba(255, 255, 255, 0.8);
+  border-radius: 94px;
+}
+
+.home-box .lead {
+  width: 245px;
+  margin-top: -10px;
+  font-size: 20px;
+  color: #8487b8;
+}
+
+#java-launch {
+  background: url('/images/_home/javalaunch_background.jpg');
+}
+
+#iotchallenge-launch {
+  background: url('/images/_home/iotchallenge_background.jpg') center top;
+}
+
+.home_featured img {
+  opacity: 0.9;
+}
+
+.home_featured img:hover {
+  opacity: 1.0;
+}
+
+hr {
+  margin-top: 50px;
+  margin-bottom: 5px;
+}
+
+footer ul li.pull-right {
+  margin-top: 8px;
+}
+
+/* Heading: Layout item */
+.section-title {
+  position: relative;
+  padding: 6px 12px 8px 12px;
+  padding-left: 55px;
+  font-family: Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 28px;
+  font-weight: lighter;
+  color: #fff;
+  background: url('../../images/layout/section-heading-end.gif') #7c2c90 top right no-repeat;
+  border-bottom: 0 none;
+}
+
+.section-title i {
+  position: absolute;
+  top: 8px;
+  left: 16px;
+}
+
+.section-title.grey-title {
+  margin-bottom: 0;
+  background: url('../../images/layout/section-heading-grey-end.gif') #acb5bb top right no-repeat;
+  border-bottom: 1px solid #ccc;
+}
+
+/* Grey container: Layout item */
+.grey-box {
+  padding: 20px;
+  margin-bottom: 60px;
+  background: #ced8de;
+}
+
+/* Item box: Layout item */
+.itembox {
+  position: relative;
+  margin-bottom: 20px;
+  text-align: center;
+  cursor: pointer;
+  background: #fff;
+}
+
+.itembox h3 {
+  color: #7c2c90;
+}
+
+.itembox h3,
+.itembox p {
+  padding: 0 10px;
+}
+
+.itembox p {
+  font-weight: lighter;
+}
+
+.itembox a.readmore:link,
+.itembox a.readmore:visited {
+  position: absolute;
+  bottom: 0;
+  display: block;
+  width: 100%;
+  padding: 8px 0;
+  clear: both;
+  color: #fff;
+  text-align: center;
+  background: #bd95c7;
+}
+
+.itembox a.readmore:hover {
+  background: #7c2c90;
+}
+
+.itembox:hover {
+  background: #f6f6f6;
+}
+
+/* Project list: community.html */
+.project-list .itembox h3,
+.project-list .itembox p {
+  padding: 0 10px;
+}
+
+.project-list .itembox .logo {
+  max-width: 80%;
+  padding: 15px;
+}
+
+.project-list .itembox h3 {
+  font-size: 21px;
+}
+
+.project-list .itembox p {
+  padding-bottom: 50px;
+  font-size: 15px;
+  color: #7c2c90;
+}
+
+/* Event list: community.html */
+.event-list .itembox h3 {
+  padding-top: 10px;
+  margin-top: 0;
+  margin-bottom: 4px;
+  font-size: 15px;
+  line-height: 16px;
+}
+
+.event-list .itembox .location {
+  padding-bottom: 40px;
+  margin-bottom: 10px;
+}
+
+.event-list .itembox .date,
+.event-list .itembox .location {
+  font-size: 13px;
+  font-weight: normal;
+}
+
+/* News list: community.html */
+ul.news-list {
+  padding: 0;
+  margin: 0 0 80px 0;
+  color: #161726;
+  list-style: none;
+}
+
+ul.news-list li {
+  min-height: 40px;
+  padding: 8px;
+  margin-bottom: 20px;
+  margin-left: 0 !important;
+  background: #fff;
+  *zoom: 1;
+}
+
+ul.news-list li:before,
+ul.news-list li:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+ul.news-list li:after {
+  clear: both;
+}
+
+ul.news-list li span.date {
+  position: absolute;
+  display: block;
+  padding-right: 20px;
+  padding-left: 10px;
+  margin-right: 10px;
+  font-size: 13px;
+  text-align: center;
+  border-right: 1px solid #ccc;
+}
+
+ul.news-list li span.date::first-line {
+  font-size: 18px;
+}
+
+ul.news-list li span.text {
+  display: block;
+  padding-left: 95px;
+}
+
+ul.news-list li:hover {
+  cursor: pointer;
+  background: #f6f6f6;
+}
+
+/* Webinars list: community.html */
+
+/* copied from news-list since our LESS compiler version does not support 'extend' :-( */
+
+ul.webinars-list {
+  padding: 0;
+  margin: 0 0 0 0;
+  color: #161726;
+  list-style: none;
+}
+
+ul.webinars-list li {
+  min-height: 165px !important;
+  padding: 8px;
+  margin-bottom: 20px;
+  background: #fff;
+  *zoom: 1;
+}
+
+ul.webinars-list li:before,
+ul.webinars-list li:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+ul.webinars-list li:after {
+  clear: both;
+}
+
+@media (min-width: 1200px) {
+  ul.webinars-list li {
+    min-height: 140px !important;
+  }
+}
+
+@media (max-width: 979px) and (min-width: 768px) {
+  ul.webinars-list li {
+    min-height: 240px !important;
+  }
+}
+
+@media (max-width: 767px) {
+  ul.webinars-list li {
+    min-height: 0 !important;
+  }
+}
+
+ul.webinars-list li span.date {
+  position: absolute;
+  display: block;
+  padding-right: 20px;
+  padding-left: 10px;
+  margin-right: 10px;
+  font-size: 13px;
+  text-align: center;
+  border-right: 1px solid #ccc;
+}
+
+ul.webinars-list li span.date::first-line {
+  font-size: 18px;
+}
+
+ul.webinars-list li span.text {
+  display: block;
+  padding-left: 95px;
+}
+
+ul.webinars-list li:hover {
+  cursor: pointer;
+  background: #f6f6f6;
+}
+
+ul.webinars-list li.past {
+  background: repeating-linear-gradient(45deg, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2) 10px, rgba(0, 0, 0, 0.3) 10px, rgba(0, 0, 0, 0.3) 20px);
+  opacity: 0.6;
+}
+
+/* Member information: ecosystem.html */
+
+.members-info .mb-logo {
+  padding-bottom: 22px;
+}
+
+.members-info .mb-info {
+  background: url('../../images/layout/members-info-top-left.gif') top left no-repeat;
+}
+
+.members-info .mb-info .mb-info-container {
+  padding: 25px 22px;
+  margin-left: 25px;
+  background: #fff;
+}
+
+.members-info .mb-info .mb-info-container p {
+  font-size: 18px;
+  font-weight: lighter;
+  line-height: 24px;
+  color: #333450;
+}
+
+.members-info .mb-info .mb-info-container h4 {
+  margin-top: 0;
+  font-size: 23px;
+  color: #7c2c90;
+}
+
+.members-info ul.mb-links {
+  height: 38px;
+  padding: 0;
+  margin: 0;
+  margin-left: 25px;
+  overflow: hidden;
+}
+
+.members-info ul.mb-links a {
+  display: block;
+  padding: 8px 0;
+}
+
+.members-info ul.mb-links a:link,
+.members-info ul.mb-links a:visited {
+  color: #fff;
+}
+
+.members-info ul.mb-links li {
+  display: block;
+  float: left;
+  width: 50%;
+  height: 36px;
+  padding: 0;
+  margin: 0;
+  text-align: center;
+  list-style-type: none;
+  background: url('../../images/layout/members-info-link-sep-b.gif') left #12131d no-repeat;
+}
+
+.members-info ul.mb-links li a:hover {
+  background: -moz-linear-gradient(left, rgba(125, 126, 125, 0.01) 0%, #7a2da3 100%);
+  /* FF3.6+ */
+
+  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(125, 126, 125, 0.01)), color-stop(100%, #7a2da3));
+  /* Chrome,Safari4+ */
+
+  background: -webkit-linear-gradient(left, rgba(125, 126, 125, 0.01) 0%, #7a2da3 100%);
+  /* Chrome10+,Safari5.1+ */
+
+  background: -o-linear-gradient(left, rgba(125, 126, 125, 0.01) 0%, #7a2da3 100%);
+  /* Opera 11.10+ */
+
+  background: -ms-linear-gradient(left, rgba(125, 126, 125, 0.01) 0%, #7a2da3 100%);
+  /* IE10+ */
+
+  background: linear-gradient(to right, rgba(125, 126, 125, 0.01) 0%, #7a2da3 100%);
+  /* W3C */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#037d7e7d', endColorstr='#7a2da3', GradientType=1);
+  /* IE6-9 */
+
+}
+
+.members-info ul.mb-links li.read-more {
+  background: url('../../images/layout/members-info-link-sep-a.gif') right #bd95c7 no-repeat;
+}
+
+.members-info ul.mb-links li.read-more a:hover {
+  background: -moz-linear-gradient(left, #7a2da3 0%, rgba(125, 126, 125, 0.01) 100%);
+  /* FF3.6+ */
+
+  background: -webkit-gradient(linear, left top, right top, color-stop(0%, #7a2da3), color-stop(100%, rgba(125, 126, 125, 0.01)));
+  /* Chrome,Safari4+ */
+
+  background: -webkit-linear-gradient(left, #7a2da3 0%, rgba(125, 126, 125, 0.01) 100%);
+  /* Chrome10+,Safari5.1+ */
+
+  background: -o-linear-gradient(left, #7a2da3 0%, rgba(125, 126, 125, 0.01) 100%);
+  /* Opera 11.10+ */
+
+  background: -ms-linear-gradient(left, #7a2da3 0%, rgba(125, 126, 125, 0.01) 100%);
+  /* IE10+ */
+
+  background: linear-gradient(to right, #7a2da3 0%, rgba(125, 126, 125, 0.01) 100%);
+  /* W3C */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7a2da3', endColorstr='#037d7e7d', GradientType=1);
+  /* IE6-9 */
+
+}
+
+/* Landscape phone to portrait tablet */
+
+@media (max-width: 767px) {
+  .project-list .itembox p {
+    font-size: 13px;
+  }
+}
+
+@media (min-width: 1200px) {
+  .row {
+    margin-left: -30px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    margin-left: 30px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1170px;
+  }
+  .span12 {
+    width: 1170px;
+  }
+  .span11 {
+    width: 1070px;
+  }
+  .span10 {
+    width: 970px;
+  }
+  .span9 {
+    width: 870px;
+  }
+  .span8 {
+    width: 770px;
+  }
+  .span7 {
+    width: 670px;
+  }
+  .span6 {
+    width: 570px;
+  }
+  .span5 {
+    width: 470px;
+  }
+  .span4 {
+    width: 370px;
+  }
+  .span3 {
+    width: 270px;
+  }
+  .span2 {
+    width: 170px;
+  }
+  .span1 {
+    width: 70px;
+  }
+  .offset12 {
+    margin-left: 1230px;
+  }
+  .offset11 {
+    margin-left: 1130px;
+  }
+  .offset10 {
+    margin-left: 1030px;
+  }
+  .offset9 {
+    margin-left: 930px;
+  }
+  .offset8 {
+    margin-left: 830px;
+  }
+  .offset7 {
+    margin-left: 730px;
+  }
+  .offset6 {
+    margin-left: 630px;
+  }
+  .offset5 {
+    margin-left: 530px;
+  }
+  .offset4 {
+    margin-left: 430px;
+  }
+  .offset3 {
+    margin-left: 330px;
+  }
+  .offset2 {
+    margin-left: 230px;
+  }
+  .offset1 {
+    margin-left: 130px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.564102564102564%;
+    *margin-left: 2.5109110747408616%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.45299145299145%;
+    *width: 91.39979996362975%;
+  }
+  .row-fluid .span10 {
+    width: 82.90598290598291%;
+    *width: 82.8527914166212%;
+  }
+  .row-fluid .span9 {
+    width: 74.35897435897436%;
+    *width: 74.30578286961266%;
+  }
+  .row-fluid .span8 {
+    width: 65.81196581196582%;
+    *width: 65.75877432260411%;
+  }
+  .row-fluid .span7 {
+    width: 57.26495726495726%;
+    *width: 57.21176577559556%;
+  }
+  .row-fluid .span6 {
+    width: 48.717948717948715%;
+    *width: 48.664757228587014%;
+  }
+  .row-fluid .span5 {
+    width: 40.17094017094017%;
+    *width: 40.11774868157847%;
+  }
+  .row-fluid .span4 {
+    width: 31.623931623931625%;
+    *width: 31.570740134569924%;
+  }
+  .row-fluid .span3 {
+    width: 23.076923076923077%;
+    *width: 23.023731587561375%;
+  }
+  .row-fluid .span2 {
+    width: 14.52991452991453%;
+    *width: 14.476723040552828%;
+  }
+  .row-fluid .span1 {
+    width: 5.982905982905983%;
+    *width: 5.929714493544281%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.12820512820512%;
+    *margin-left: 105.02182214948171%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.56410256410257%;
+    *margin-left: 102.45771958537915%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.58119658119658%;
+    *margin-left: 96.47481360247316%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.01709401709402%;
+    *margin-left: 93.91071103837061%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.03418803418803%;
+    *margin-left: 87.92780505546462%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.47008547008548%;
+    *margin-left: 85.36370249136206%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.48717948717949%;
+    *margin-left: 79.38079650845607%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 76.92307692307693%;
+    *margin-left: 76.81669394435352%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 70.94017094017094%;
+    *margin-left: 70.83378796144753%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.37606837606839%;
+    *margin-left: 68.26968539734497%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.393162393162385%;
+    *margin-left: 62.28677941443899%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.82905982905982%;
+    *margin-left: 59.72267685033642%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 53.84615384615384%;
+    *margin-left: 53.739770867430444%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.28205128205128%;
+    *margin-left: 51.175668303327875%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.299145299145295%;
+    *margin-left: 45.1927623204219%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.73504273504273%;
+    *margin-left: 42.62865975631933%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 36.75213675213675%;
+    *margin-left: 36.645753773413354%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.18803418803419%;
+    *margin-left: 34.081651209310785%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.205128205128204%;
+    *margin-left: 28.0987452264048%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.641025641025642%;
+    *margin-left: 25.53464266230224%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.65811965811966%;
+    *margin-left: 19.551736679396257%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.094017094017094%;
+    *margin-left: 16.98763411529369%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.11111111111111%;
+    *margin-left: 11.004728132387708%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.547008547008547%;
+    *margin-left: 8.440625568285142%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 30px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 1156px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 1056px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 956px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 856px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 756px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 656px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 556px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 456px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 356px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 256px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 156px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 56px;
+  }
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -20px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    margin-left: 20px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 724px;
+  }
+  .span12 {
+    width: 724px;
+  }
+  .span11 {
+    width: 662px;
+  }
+  .span10 {
+    width: 600px;
+  }
+  .span9 {
+    width: 538px;
+  }
+  .span8 {
+    width: 476px;
+  }
+  .span7 {
+    width: 414px;
+  }
+  .span6 {
+    width: 352px;
+  }
+  .span5 {
+    width: 290px;
+  }
+  .span4 {
+    width: 228px;
+  }
+  .span3 {
+    width: 166px;
+  }
+  .span2 {
+    width: 104px;
+  }
+  .span1 {
+    width: 42px;
+  }
+  .offset12 {
+    margin-left: 764px;
+  }
+  .offset11 {
+    margin-left: 702px;
+  }
+  .offset10 {
+    margin-left: 640px;
+  }
+  .offset9 {
+    margin-left: 578px;
+  }
+  .offset8 {
+    margin-left: 516px;
+  }
+  .offset7 {
+    margin-left: 454px;
+  }
+  .offset6 {
+    margin-left: 392px;
+  }
+  .offset5 {
+    margin-left: 330px;
+  }
+  .offset4 {
+    margin-left: 268px;
+  }
+  .offset3 {
+    margin-left: 206px;
+  }
+  .offset2 {
+    margin-left: 144px;
+  }
+  .offset1 {
+    margin-left: 82px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.7624309392265194%;
+    *margin-left: 2.709239449864817%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.43646408839778%;
+    *width: 91.38327259903608%;
+  }
+  .row-fluid .span10 {
+    width: 82.87292817679558%;
+    *width: 82.81973668743387%;
+  }
+  .row-fluid .span9 {
+    width: 74.30939226519337%;
+    *width: 74.25620077583166%;
+  }
+  .row-fluid .span8 {
+    width: 65.74585635359117%;
+    *width: 65.69266486422946%;
+  }
+  .row-fluid .span7 {
+    width: 57.18232044198895%;
+    *width: 57.12912895262725%;
+  }
+  .row-fluid .span6 {
+    width: 48.61878453038674%;
+    *width: 48.56559304102504%;
+  }
+  .row-fluid .span5 {
+    width: 40.05524861878453%;
+    *width: 40.00205712942283%;
+  }
+  .row-fluid .span4 {
+    width: 31.491712707182323%;
+    *width: 31.43852121782062%;
+  }
+  .row-fluid .span3 {
+    width: 22.92817679558011%;
+    *width: 22.87498530621841%;
+  }
+  .row-fluid .span2 {
+    width: 14.3646408839779%;
+    *width: 14.311449394616199%;
+  }
+  .row-fluid .span1 {
+    width: 5.801104972375691%;
+    *width: 5.747913483013988%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.52486187845304%;
+    *margin-left: 105.41847889972962%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.76243093922652%;
+    *margin-left: 102.6560479605031%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.96132596685082%;
+    *margin-left: 96.8549429881274%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.1988950276243%;
+    *margin-left: 94.09251204890089%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.39779005524862%;
+    *margin-left: 88.2914070765252%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.6353591160221%;
+    *margin-left: 85.52897613729868%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.8342541436464%;
+    *margin-left: 79.72787116492299%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 77.07182320441989%;
+    *margin-left: 76.96544022569647%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 71.2707182320442%;
+    *margin-left: 71.16433525332079%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.50828729281768%;
+    *margin-left: 68.40190431409427%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.70718232044199%;
+    *margin-left: 62.600799341718584%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.94475138121547%;
+    *margin-left: 59.838368402492065%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 54.14364640883978%;
+    *margin-left: 54.037263430116376%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.38121546961326%;
+    *margin-left: 51.27483249088986%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.58011049723757%;
+    *margin-left: 45.47372751851417%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.81767955801105%;
+    *margin-left: 42.71129657928765%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 37.01657458563536%;
+    *margin-left: 36.91019160691196%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.25414364640884%;
+    *margin-left: 34.14776066768544%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.45303867403315%;
+    *margin-left: 28.346655695309746%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.69060773480663%;
+    *margin-left: 25.584224756083227%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.88950276243094%;
+    *margin-left: 19.783119783707537%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.12707182320442%;
+    *margin-left: 17.02068884448102%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.32596685082873%;
+    *margin-left: 11.219583872105325%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.56353591160221%;
+    *margin-left: 8.457152932878806%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 20px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 710px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 648px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 586px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 524px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 462px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 400px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 338px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 276px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 214px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 152px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 90px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 28px;
+  }
+}
+
+@media (max-width: 767px) {
+  body {
+    padding-right: 20px;
+    padding-left: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    margin-right: -20px;
+    margin-left: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    width: auto;
+    clear: none;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0;
+  }
+  [class*="span"],
+  .row-fluid [class*="span"] {
+    display: block;
+    float: none;
+    width: auto;
+    margin-left: 0;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+  .modal {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    left: 20px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade.in {
+    top: auto;
+  }
+}
+
+@media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 20px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-group > label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+  .modal {
+    top: 10px;
+    right: 10px;
+    left: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+
+@media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 20px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 20px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding-right: 5px;
+    padding-left: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+    margin-right: 10px;
+    margin-left: 10px;
+  }
+  .navbar .brand {
+    padding-right: 10px;
+    padding-left: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 10px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #eff4f7;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: #c4c6dd;
+    -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+            border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+            border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .dropdown-menu a:hover {
+    background-color: #0d0d16;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover {
+    background-color: #111111;
+  }
+  .nav-collapse.in .btn-group {
+    padding: 0;
+    margin-top: 5px;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    display: block;
+    float: none;
+    max-width: none;
+    padding: 0;
+    margin: 0 15px;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+            border-radius: 0;
+    -webkit-box-shadow: none;
+       -moz-box-shadow: none;
+            box-shadow: none;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 10px 15px;
+    margin: 10px 0;
+    border-top: 1px solid #0d0d16;
+    border-bottom: 1px solid #0d0d16;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    height: 0;
+    overflow: hidden;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+}
+
+@media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}
diff --git a/static/css/bootstrap/bootstrap-responsive.min.css b/static/css/bootstrap/bootstrap-responsive.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..8f1c432086d9f345a5e937b7f7c8b9162620e2fd
--- /dev/null
+++ b/static/css/bootstrap/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}html{text-rendering:optimizeLegibility}body.index{background:url('../img/bg_index.png') top repeat-x #dee8ef}#catchline{font-weight:300;color:#eff4f7}#catchline h2{font-size:50px;color:#eff4f7;text-align:left}a:hover{text-decoration:none}.navbar a{border-bottom:0}h2{margin-bottom:20px;font-family:Lekton,Arial,sans-serif;font-size:38px;font-weight:normal;color:#26102b;text-shadow:0 1px 1px #8487b8;border-bottom:2px dotted #26102b}.home-box .lead{margin-top:-10px;font-size:20px;color:#8487b8}.lead li{line-height:inherit}.home-box.span4{width:350px;padding-right:10px;padding-left:10px;margin-bottom:330px;border-radius:10px}.home-box.span4 h2 a{color:#26102b}.home-box:hover{background:rgba(255,255,255,0.3)}.loaded{height:335px!important;margin-bottom:10px!important;opacity:1!important}.home-box h2{font-size:38px;text-shadow:0 1px 1px #8487b8}body.index h2{border:0}.home-box i{display:block;width:120px;height:70px;padding-top:45px;margin:auto;margin-top:20px;margin-bottom:20px;font-size:75px;color:#4b7d38;text-align:center;text-shadow:none;background:#FFF;border-radius:94px}.brand{width:100px;text-indent:-1000em;background:url('../img/m2m_eclipse_logo.png') 0 7px no-repeat}.navbar .brand{margin-left:-40px}.row{margin-bottom:30px}.carousel-caption{background:rgba(22,23,28,0.4)}div.page-header{padding-bottom:9px;margin:0 0 30px;border-bottom:1px dashed #EEE}div.page-header h1{margin-top:0;color:#26102b}div.page-header h1 small{display:block;font-weight:300;color:#783388}.container ul li{margin-left:.7em}.well{margin-bottom:50px;margin-left:-20px;background-color:white;border:1px solid #bcd1de;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.15)}@media(max-width:979px){.well{margin-left:0}}p+h2{margin-top:50px}h3{text-indent:.3em}#wg-members td,#sc-members td{text-align:center}.home-box i{display:block;width:120px;height:70px;padding-top:45px;margin-top:20px;margin-right:10px;margin-bottom:-80px;font-size:75px;color:#08c;text-align:center;text-shadow:none;background:rgba(255,255,255,0.8);border-radius:94px}.home-box .lead{width:245px;margin-top:-10px;font-size:20px;color:#8487b8}#java-launch{background:url('/images/_home/javalaunch_background.jpg')}#iotchallenge-launch{background:url('/images/_home/iotchallenge_background.jpg') center top}.home_featured img{opacity:.9}.home_featured img:hover{opacity:1.0}hr{margin-top:50px;margin-bottom:5px}footer ul li.pull-right{margin-top:8px}.section-title{position:relative;padding:6px 12px 8px 12px;padding-left:55px;font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:28px;font-weight:lighter;color:#fff;background:url('../../images/layout/section-heading-end.gif') #7c2c90 top right no-repeat;border-bottom:0 none}.section-title i{position:absolute;top:8px;left:16px}.section-title.grey-title{margin-bottom:0;background:url('../../images/layout/section-heading-grey-end.gif') #acb5bb top right no-repeat;border-bottom:1px solid #ccc}.grey-box{padding:20px;margin-bottom:60px;background:#ced8de}.itembox{position:relative;margin-bottom:20px;text-align:center;cursor:pointer;background:#fff}.itembox h3{color:#7c2c90}.itembox h3,.itembox p{padding:0 10px}.itembox p{font-weight:lighter}.itembox a.readmore:link,.itembox a.readmore:visited{position:absolute;bottom:0;display:block;width:100%;padding:8px 0;clear:both;color:#fff;text-align:center;background:#bd95c7}.itembox a.readmore:hover{background:#7c2c90}.itembox:hover{background:#f6f6f6}.project-list .itembox h3,.project-list .itembox p{padding:0 10px}.project-list .itembox .logo{max-width:80%;padding:15px}.project-list .itembox h3{font-size:21px}.project-list .itembox p{padding-bottom:50px;font-size:15px;color:#7c2c90}.event-list .itembox h3{padding-top:10px;margin-top:0;margin-bottom:4px;font-size:15px;line-height:16px}.event-list .itembox .location{padding-bottom:40px;margin-bottom:10px}.event-list .itembox .date,.event-list .itembox .location{font-size:13px;font-weight:normal}ul.news-list{padding:0;margin:0 0 80px 0;color:#161726;list-style:none}ul.news-list li{min-height:40px;padding:8px;margin-bottom:20px;margin-left:0!important;background:#fff;*zoom:1}ul.news-list li:before,ul.news-list li:after{display:table;line-height:0;content:""}ul.news-list li:after{clear:both}ul.news-list li span.date{position:absolute;display:block;padding-right:20px;padding-left:10px;margin-right:10px;font-size:13px;text-align:center;border-right:1px solid #ccc}ul.news-list li span.date::first-line {font-size:18px}ul.news-list li span.text{display:block;padding-left:95px}ul.news-list li:hover{cursor:pointer;background:#f6f6f6}ul.webinars-list{padding:0;margin:0;color:#161726;list-style:none}ul.webinars-list li{min-height:165px!important;padding:8px;margin-bottom:20px;background:#fff;*zoom:1}ul.webinars-list li:before,ul.webinars-list li:after{display:table;line-height:0;content:""}ul.webinars-list li:after{clear:both}@media(min-width:1200px){ul.webinars-list li{min-height:140px!important}}@media(max-width:979px) and (min-width:768px){ul.webinars-list li{min-height:240px!important}}@media(max-width:767px){ul.webinars-list li{min-height:0!important}}ul.webinars-list li span.date{position:absolute;display:block;padding-right:20px;padding-left:10px;margin-right:10px;font-size:13px;text-align:center;border-right:1px solid #ccc}ul.webinars-list li span.date::first-line {font-size:18px}ul.webinars-list li span.text{display:block;padding-left:95px}ul.webinars-list li:hover{cursor:pointer;background:#f6f6f6}ul.webinars-list li.past{background:repeating-linear-gradient(45deg,rgba(0,0,0,0.2),rgba(0,0,0,0.2) 10px,rgba(0,0,0,0.3) 10px,rgba(0,0,0,0.3) 20px);opacity:.6}.members-info .mb-logo{padding-bottom:22px}.members-info .mb-info{background:url('../../images/layout/members-info-top-left.gif') top left no-repeat}.members-info .mb-info .mb-info-container{padding:25px 22px;margin-left:25px;background:#fff}.members-info .mb-info .mb-info-container p{font-size:18px;font-weight:lighter;line-height:24px;color:#333450}.members-info .mb-info .mb-info-container h4{margin-top:0;font-size:23px;color:#7c2c90}.members-info ul.mb-links{height:38px;padding:0;margin:0;margin-left:25px;overflow:hidden}.members-info ul.mb-links a{display:block;padding:8px 0}.members-info ul.mb-links a:link,.members-info ul.mb-links a:visited{color:#fff}.members-info ul.mb-links li{display:block;float:left;width:50%;height:36px;padding:0;margin:0;text-align:center;list-style-type:none;background:url('../../images/layout/members-info-link-sep-b.gif') left #12131d no-repeat}.members-info ul.mb-links li a:hover{background:-moz-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:-webkit-gradient(linear,left top,right top,color-stop(0%,rgba(125,126,125,0.01)),color-stop(100%,#7a2da3));background:-webkit-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:-o-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:-ms-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:linear-gradient(to right,rgba(125,126,125,0.01) 0,#7a2da3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#037d7e7d',endColorstr='#7a2da3',GradientType=1)}.members-info ul.mb-links li.read-more{background:url('../../images/layout/members-info-link-sep-a.gif') right #bd95c7 no-repeat}.members-info ul.mb-links li.read-more a:hover{background:-moz-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:-webkit-gradient(linear,left top,right top,color-stop(0%,#7a2da3),color-stop(100%,rgba(125,126,125,0.01)));background:-webkit-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:-o-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:-ms-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:linear-gradient(to right,#7a2da3 0,rgba(125,126,125,0.01) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7a2da3',endColorstr='#037d7e7d',GradientType=1)}@media(max-width:767px){.project-list .itembox p{font-size:13px}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:auto;margin-left:0}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade.in{top:auto}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:5px;padding-left:5px}.navbar .container{width:auto;padding:0;margin-right:10px;margin-left:10px}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#eff4f7;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#c4c6dd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#0d0d16}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #0d0d16;border-bottom:1px solid #0d0d16;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/static/css/bootstrap/bootstrap.css b/static/css/bootstrap/bootstrap.css
new file mode 100644
index 0000000000000000000000000000000000000000..cb3680702aaa0c863c9802c49380cc75298ab083
--- /dev/null
+++ b/static/css/bootstrap/bootstrap.css
@@ -0,0 +1,6025 @@
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+
+audio:not([controls]) {
+  display: none;
+}
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+a:hover,
+a:active {
+  outline: 0;
+}
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+img {
+  height: auto;
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+
+#map_canvas img {
+  max-width: none;
+}
+
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+body {
+  margin: 0;
+  font-family: Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 20px;
+  color: #161726;
+  background: #dee8ef;
+}
+
+a {
+  color: #4b7d38;
+  text-decoration: none;
+}
+
+a:hover {
+  color: #6bb151;
+  text-decoration: underline;
+}
+
+.img-rounded {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.img-polaroid {
+  padding: 4px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+
+.img-circle {
+  -webkit-border-radius: 500px;
+     -moz-border-radius: 500px;
+          border-radius: 500px;
+}
+
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+
+.row:before,
+.row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row:after {
+  clear: both;
+}
+
+[class*="span"] {
+  float: left;
+  margin-left: 20px;
+}
+
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.span12 {
+  width: 940px;
+}
+
+.span11 {
+  width: 860px;
+}
+
+.span10 {
+  width: 780px;
+}
+
+.span9 {
+  width: 700px;
+}
+
+.span8 {
+  width: 620px;
+}
+
+.span7 {
+  width: 540px;
+}
+
+.span6 {
+  width: 460px;
+}
+
+.span5 {
+  width: 380px;
+}
+
+.span4 {
+  width: 300px;
+}
+
+.span3 {
+  width: 220px;
+}
+
+.span2 {
+  width: 140px;
+}
+
+.span1 {
+  width: 60px;
+}
+
+.offset12 {
+  margin-left: 980px;
+}
+
+.offset11 {
+  margin-left: 900px;
+}
+
+.offset10 {
+  margin-left: 820px;
+}
+
+.offset9 {
+  margin-left: 740px;
+}
+
+.offset8 {
+  margin-left: 660px;
+}
+
+.offset7 {
+  margin-left: 580px;
+}
+
+.offset6 {
+  margin-left: 500px;
+}
+
+.offset5 {
+  margin-left: 420px;
+}
+
+.offset4 {
+  margin-left: 340px;
+}
+
+.offset3 {
+  margin-left: 260px;
+}
+
+.offset2 {
+  margin-left: 180px;
+}
+
+.offset1 {
+  margin-left: 100px;
+}
+
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row-fluid:after {
+  clear: both;
+}
+
+.row-fluid [class*="span"] {
+  display: block;
+  float: left;
+  width: 100%;
+  min-height: 30px;
+  margin-left: 2.127659574468085%;
+  *margin-left: 2.074468085106383%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+
+.row-fluid .span12 {
+  width: 100%;
+  *width: 99.94680851063829%;
+}
+
+.row-fluid .span11 {
+  width: 91.48936170212765%;
+  *width: 91.43617021276594%;
+}
+
+.row-fluid .span10 {
+  width: 82.97872340425532%;
+  *width: 82.92553191489361%;
+}
+
+.row-fluid .span9 {
+  width: 74.46808510638297%;
+  *width: 74.41489361702126%;
+}
+
+.row-fluid .span8 {
+  width: 65.95744680851064%;
+  *width: 65.90425531914893%;
+}
+
+.row-fluid .span7 {
+  width: 57.44680851063829%;
+  *width: 57.39361702127659%;
+}
+
+.row-fluid .span6 {
+  width: 48.93617021276595%;
+  *width: 48.88297872340425%;
+}
+
+.row-fluid .span5 {
+  width: 40.42553191489362%;
+  *width: 40.37234042553192%;
+}
+
+.row-fluid .span4 {
+  width: 31.914893617021278%;
+  *width: 31.861702127659576%;
+}
+
+.row-fluid .span3 {
+  width: 23.404255319148934%;
+  *width: 23.351063829787233%;
+}
+
+.row-fluid .span2 {
+  width: 14.893617021276595%;
+  *width: 14.840425531914894%;
+}
+
+.row-fluid .span1 {
+  width: 6.382978723404255%;
+  *width: 6.329787234042553%;
+}
+
+.row-fluid .offset12 {
+  margin-left: 104.25531914893617%;
+  *margin-left: 104.14893617021275%;
+}
+
+.row-fluid .offset12:first-child {
+  margin-left: 102.12765957446808%;
+  *margin-left: 102.02127659574467%;
+}
+
+.row-fluid .offset11 {
+  margin-left: 95.74468085106382%;
+  *margin-left: 95.6382978723404%;
+}
+
+.row-fluid .offset11:first-child {
+  margin-left: 93.61702127659574%;
+  *margin-left: 93.51063829787232%;
+}
+
+.row-fluid .offset10 {
+  margin-left: 87.23404255319149%;
+  *margin-left: 87.12765957446807%;
+}
+
+.row-fluid .offset10:first-child {
+  margin-left: 85.1063829787234%;
+  *margin-left: 84.99999999999999%;
+}
+
+.row-fluid .offset9 {
+  margin-left: 78.72340425531914%;
+  *margin-left: 78.61702127659572%;
+}
+
+.row-fluid .offset9:first-child {
+  margin-left: 76.59574468085106%;
+  *margin-left: 76.48936170212764%;
+}
+
+.row-fluid .offset8 {
+  margin-left: 70.2127659574468%;
+  *margin-left: 70.10638297872339%;
+}
+
+.row-fluid .offset8:first-child {
+  margin-left: 68.08510638297872%;
+  *margin-left: 67.9787234042553%;
+}
+
+.row-fluid .offset7 {
+  margin-left: 61.70212765957446%;
+  *margin-left: 61.59574468085106%;
+}
+
+.row-fluid .offset7:first-child {
+  margin-left: 59.574468085106375%;
+  *margin-left: 59.46808510638297%;
+}
+
+.row-fluid .offset6 {
+  margin-left: 53.191489361702125%;
+  *margin-left: 53.085106382978715%;
+}
+
+.row-fluid .offset6:first-child {
+  margin-left: 51.063829787234035%;
+  *margin-left: 50.95744680851063%;
+}
+
+.row-fluid .offset5 {
+  margin-left: 44.68085106382979%;
+  *margin-left: 44.57446808510638%;
+}
+
+.row-fluid .offset5:first-child {
+  margin-left: 42.5531914893617%;
+  *margin-left: 42.4468085106383%;
+}
+
+.row-fluid .offset4 {
+  margin-left: 36.170212765957444%;
+  *margin-left: 36.06382978723405%;
+}
+
+.row-fluid .offset4:first-child {
+  margin-left: 34.04255319148936%;
+  *margin-left: 33.93617021276596%;
+}
+
+.row-fluid .offset3 {
+  margin-left: 27.659574468085104%;
+  *margin-left: 27.5531914893617%;
+}
+
+.row-fluid .offset3:first-child {
+  margin-left: 25.53191489361702%;
+  *margin-left: 25.425531914893618%;
+}
+
+.row-fluid .offset2 {
+  margin-left: 19.148936170212764%;
+  *margin-left: 19.04255319148936%;
+}
+
+.row-fluid .offset2:first-child {
+  margin-left: 17.02127659574468%;
+  *margin-left: 16.914893617021278%;
+}
+
+.row-fluid .offset1 {
+  margin-left: 10.638297872340425%;
+  *margin-left: 10.53191489361702%;
+}
+
+.row-fluid .offset1:first-child {
+  margin-left: 8.51063829787234%;
+  *margin-left: 8.404255319148938%;
+}
+
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
+
+.container {
+  padding-top: 80px;
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+
+.container:before,
+.container:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container:after {
+  clear: both;
+}
+
+.container-fluid {
+  padding-right: 20px;
+  padding-left: 20px;
+  *zoom: 1;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container-fluid:after {
+  clear: both;
+}
+
+p {
+  margin: 0 0 10px;
+}
+
+.lead {
+  margin-bottom: 20px;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: 24px;
+}
+
+small {
+  font-size: 85%;
+}
+
+strong {
+  font-weight: bold;
+}
+
+em {
+  font-style: italic;
+}
+
+cite {
+  font-style: normal;
+}
+
+.muted {
+  color: #999999;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 10px 0;
+  font-family: inherit;
+  font-weight: bold;
+  line-height: 1;
+  color: inherit;
+  text-rendering: optimizelegibility;
+}
+
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  line-height: 1;
+  color: #999999;
+}
+
+h1 {
+  font-size: 36px;
+  line-height: 40px;
+}
+
+h2 {
+  font-size: 30px;
+  line-height: 40px;
+}
+
+h3 {
+  font-size: 24px;
+  line-height: 40px;
+}
+
+h4 {
+  font-size: 18px;
+  line-height: 20px;
+}
+
+h5 {
+  font-size: 14px;
+  line-height: 20px;
+}
+
+h6 {
+  font-size: 12px;
+  line-height: 20px;
+}
+
+h1 small {
+  font-size: 24px;
+}
+
+h2 small {
+  font-size: 18px;
+}
+
+h3 small {
+  font-size: 14px;
+}
+
+h4 small {
+  font-size: 14px;
+}
+
+.page-header {
+  padding-bottom: 9px;
+  margin: 20px 0 30px;
+  border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 10px 25px;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+
+li {
+  line-height: 20px;
+}
+
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+
+dl {
+  margin-bottom: 20px;
+}
+
+dt,
+dd {
+  line-height: 20px;
+}
+
+dt {
+  font-weight: bold;
+}
+
+dd {
+  margin-left: 10px;
+}
+
+.dl-horizontal dt {
+  float: left;
+  width: 120px;
+  overflow: hidden;
+  clear: left;
+  text-align: right;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.dl-horizontal dd {
+  margin-left: 130px;
+}
+
+hr {
+  margin: 20px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+
+abbr[title] {
+  cursor: help;
+  border-bottom: 1px dotted #999999;
+}
+
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 20px;
+  border-left: 5px solid #eeeeee;
+}
+
+blockquote p {
+  margin-bottom: 0;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 25px;
+}
+
+blockquote small {
+  display: block;
+  line-height: 20px;
+  color: #999999;
+}
+
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+
+blockquote.pull-right {
+  float: right;
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+}
+
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+
+blockquote.pull-right small:before {
+  content: '';
+}
+
+blockquote.pull-right small:after {
+  content: '\00A0 \2014';
+}
+
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+address {
+  display: block;
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 20px;
+}
+
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+code {
+  padding: 2px 4px;
+  color: #d14;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 20px;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+pre.prettyprint {
+  margin-bottom: 20px;
+}
+
+pre code {
+  padding: 0;
+  color: inherit;
+  background-color: transparent;
+  border: 0;
+}
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+
+form {
+  margin: 0 0 20px;
+}
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: 40px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+
+legend small {
+  font-size: 15px;
+  color: #999999;
+}
+
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+}
+
+input,
+button,
+select,
+textarea {
+  font-family: Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+label {
+  display: block;
+  margin-bottom: 5px;
+}
+
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  display: inline-block;
+  height: 20px;
+  padding: 4px 6px;
+  margin-bottom: 9px;
+  font-size: 14px;
+  line-height: 20px;
+  color: #555555;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+input,
+textarea {
+  width: 210px;
+}
+
+textarea {
+  height: auto;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+          transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="datetime"]:focus,
+input[type="datetime-local"]:focus,
+input[type="date"]:focus,
+input[type="month"]:focus,
+input[type="time"]:focus,
+input[type="week"]:focus,
+input[type="number"]:focus,
+input[type="email"]:focus,
+input[type="url"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="color"]:focus,
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  *margin-top: 0;
+  line-height: normal;
+  cursor: pointer;
+}
+
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+  width: auto;
+}
+
+select,
+input[type="file"] {
+  height: 30px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 30px;
+}
+
+select {
+  width: 220px;
+  background-color: #ffffff;
+  border: 1px solid #bbb;
+}
+
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.uneditable-input,
+.uneditable-textarea {
+  color: #999999;
+  cursor: not-allowed;
+  background-color: #fcfcfc;
+  border-color: #cccccc;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+}
+
+.uneditable-input {
+  overflow: hidden;
+  white-space: nowrap;
+}
+
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+  color: #999999;
+}
+
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+  color: #999999;
+}
+
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+  color: #999999;
+}
+
+.radio,
+.checkbox {
+  min-height: 18px;
+  padding-left: 18px;
+}
+
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -18px;
+}
+
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+
+.input-mini {
+  width: 60px;
+}
+
+.input-small {
+  width: 90px;
+}
+
+.input-medium {
+  width: 150px;
+}
+
+.input-large {
+  width: 210px;
+}
+
+.input-xlarge {
+  width: 270px;
+}
+
+.input-xxlarge {
+  width: 530px;
+}
+
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+  display: inline-block;
+}
+
+input,
+textarea,
+.uneditable-input {
+  margin-left: 0;
+}
+
+.controls-row [class*="span"] + [class*="span"] {
+  margin-left: 20px;
+}
+
+input.span12,
+textarea.span12,
+.uneditable-input.span12 {
+  width: 926px;
+}
+
+input.span11,
+textarea.span11,
+.uneditable-input.span11 {
+  width: 846px;
+}
+
+input.span10,
+textarea.span10,
+.uneditable-input.span10 {
+  width: 766px;
+}
+
+input.span9,
+textarea.span9,
+.uneditable-input.span9 {
+  width: 686px;
+}
+
+input.span8,
+textarea.span8,
+.uneditable-input.span8 {
+  width: 606px;
+}
+
+input.span7,
+textarea.span7,
+.uneditable-input.span7 {
+  width: 526px;
+}
+
+input.span6,
+textarea.span6,
+.uneditable-input.span6 {
+  width: 446px;
+}
+
+input.span5,
+textarea.span5,
+.uneditable-input.span5 {
+  width: 366px;
+}
+
+input.span4,
+textarea.span4,
+.uneditable-input.span4 {
+  width: 286px;
+}
+
+input.span3,
+textarea.span3,
+.uneditable-input.span3 {
+  width: 206px;
+}
+
+input.span2,
+textarea.span2,
+.uneditable-input.span2 {
+  width: 126px;
+}
+
+input.span1,
+textarea.span1,
+.uneditable-input.span1 {
+  width: 46px;
+}
+
+.controls-row {
+  *zoom: 1;
+}
+
+.controls-row:before,
+.controls-row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.controls-row:after {
+  clear: both;
+}
+
+.controls-row [class*="span"] {
+  float: left;
+}
+
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #eeeeee;
+}
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+
+.control-group.warning > label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+
+.control-group.warning .checkbox,
+.control-group.warning .radio,
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+  border-color: #c09853;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.warning .checkbox:focus,
+.control-group.warning .radio:focus,
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+}
+
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+
+.control-group.error > label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+
+.control-group.error .checkbox,
+.control-group.error .radio,
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+  border-color: #b94a48;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.error .checkbox:focus,
+.control-group.error .radio:focus,
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+}
+
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+
+.control-group.success > label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+
+.control-group.success .checkbox,
+.control-group.success .radio,
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+  border-color: #468847;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.success .checkbox:focus,
+.control-group.success .radio:focus,
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+}
+
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+
+input:focus:required:invalid,
+textarea:focus:required:invalid,
+select:focus:required:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+
+input:focus:required:invalid:focus,
+textarea:focus:required:invalid:focus,
+select:focus:required:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+     -moz-box-shadow: 0 0 6px #f8b9b7;
+          box-shadow: 0 0 6px #f8b9b7;
+}
+
+.form-actions {
+  padding: 19px 20px 20px;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #e5e5e5;
+  *zoom: 1;
+}
+
+.form-actions:before,
+.form-actions:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-actions:after {
+  clear: both;
+}
+
+.help-block,
+.help-inline {
+  color: #323456;
+}
+
+.help-block {
+  display: block;
+  margin-bottom: 10px;
+}
+
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  padding-left: 5px;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.input-append,
+.input-prepend {
+  margin-bottom: 5px;
+  font-size: 0;
+  white-space: nowrap;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+  position: relative;
+  margin-bottom: 0;
+  *margin-left: 0;
+  font-size: 14px;
+  vertical-align: top;
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+.input-append input:focus,
+.input-prepend input:focus,
+.input-append select:focus,
+.input-prepend select:focus,
+.input-append .uneditable-input:focus,
+.input-prepend .uneditable-input:focus {
+  z-index: 2;
+}
+
+.input-append .add-on,
+.input-prepend .add-on {
+  display: inline-block;
+  width: auto;
+  height: 20px;
+  min-width: 16px;
+  padding: 4px 5px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+}
+
+.input-append .add-on,
+.input-prepend .add-on,
+.input-append .btn,
+.input-prepend .btn {
+  margin-left: -1px;
+  vertical-align: top;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-append .active,
+.input-prepend .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+
+.input-prepend .add-on,
+.input-prepend .btn {
+  margin-right: -1px;
+}
+
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.input-append .add-on:last-child,
+.input-append .btn:last-child {
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+  margin-right: -1px;
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+  margin-left: -1px;
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+  margin-bottom: 0;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+/* Allow for input prepend/append in search forms */
+
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.form-search .input-append .search-query {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search .input-append .btn {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .btn {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+  display: inline-block;
+}
+
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+
+.control-group {
+  margin-bottom: 10px;
+}
+
+legend + .control-group {
+  margin-top: 20px;
+  -webkit-margin-top-collapse: separate;
+}
+
+.form-horizontal .control-group {
+  margin-bottom: 20px;
+  *zoom: 1;
+}
+
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-horizontal .control-group:after {
+  clear: both;
+}
+
+.form-horizontal .control-label {
+  float: left;
+  width: 140px;
+  padding-top: 5px;
+  text-align: right;
+}
+
+.form-horizontal .controls {
+  *display: inline-block;
+  *padding-left: 20px;
+  margin-left: 160px;
+  *margin-left: 0;
+}
+
+.form-horizontal .controls:first-child {
+  *padding-left: 160px;
+}
+
+.form-horizontal .help-block {
+  margin-top: 10px;
+  margin-bottom: 0;
+}
+
+.form-horizontal .form-actions {
+  padding-left: 160px;
+}
+
+table {
+  max-width: 100%;
+  background-color: transparent;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+.table {
+  width: 100%;
+  margin-bottom: 20px;
+}
+
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 20px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+
+.table th {
+  font-weight: bold;
+}
+
+.table thead th {
+  vertical-align: bottom;
+}
+
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+
+.table-bordered {
+  border: 1px solid #dddddd;
+  border-collapse: separate;
+  *border-collapse: collapse;
+  border-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.table-bordered th,
+.table-bordered td {
+  border-left: 1px solid #dddddd;
+}
+
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered thead:first-child tr:first-child th:last-child,
+.table-bordered tbody:first-child tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child th:first-child,
+.table-bordered tbody:last-child tr:last-child td:first-child,
+.table-bordered tfoot:last-child tr:last-child td:first-child {
+  -webkit-border-radius: 0 0 0 4px;
+     -moz-border-radius: 0 0 0 4px;
+          border-radius: 0 0 0 4px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child th:last-child,
+.table-bordered tbody:last-child tr:last-child td:last-child,
+.table-bordered tfoot:last-child tr:last-child td:last-child {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:first-child,
+.table-bordered caption + tbody tr:first-child td:first-child,
+.table-bordered colgroup + thead tr:first-child th:first-child,
+.table-bordered colgroup + tbody tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:last-child,
+.table-bordered caption + tbody tr:first-child td:last-child,
+.table-bordered colgroup + thead tr:first-child th:last-child,
+.table-bordered colgroup + tbody tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-right-topleft: 4px;
+}
+
+.table-striped tbody tr:nth-child(odd) td,
+.table-striped tbody tr:nth-child(odd) th {
+  background-color: #f9f9f9;
+}
+
+.table-hover tbody tr:hover td,
+.table-hover tbody tr:hover th {
+  background-color: #f5f5f5;
+}
+
+table [class*=span],
+.row-fluid table [class*=span] {
+  display: table-cell;
+  float: none;
+  margin-left: 0;
+}
+
+table .span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+
+table .span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+
+table .span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+
+table .span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+
+table .span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+
+table .span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+
+table .span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+
+table .span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+
+table .span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+
+table .span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+
+table .span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+
+table .span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+
+table .span13 {
+  float: none;
+  width: 1004px;
+  margin-left: 0;
+}
+
+table .span14 {
+  float: none;
+  width: 1084px;
+  margin-left: 0;
+}
+
+table .span15 {
+  float: none;
+  width: 1164px;
+  margin-left: 0;
+}
+
+table .span16 {
+  float: none;
+  width: 1244px;
+  margin-left: 0;
+}
+
+table .span17 {
+  float: none;
+  width: 1324px;
+  margin-left: 0;
+}
+
+table .span18 {
+  float: none;
+  width: 1404px;
+  margin-left: 0;
+}
+
+table .span19 {
+  float: none;
+  width: 1484px;
+  margin-left: 0;
+}
+
+table .span20 {
+  float: none;
+  width: 1564px;
+  margin-left: 0;
+}
+
+table .span21 {
+  float: none;
+  width: 1644px;
+  margin-left: 0;
+}
+
+table .span22 {
+  float: none;
+  width: 1724px;
+  margin-left: 0;
+}
+
+table .span23 {
+  float: none;
+  width: 1804px;
+  margin-left: 0;
+}
+
+table .span24 {
+  float: none;
+  width: 1884px;
+  margin-left: 0;
+}
+
+.table tbody tr.success td {
+  background-color: #dff0d8;
+}
+
+.table tbody tr.error td {
+  background-color: #f2dede;
+}
+
+.table tbody tr.info td {
+  background-color: #d9edf7;
+}
+
+/*  Font Awesome
+    the iconic font designed for use with Twitter Bootstrap
+    -------------------------------------------------------
+    The full suite of pictographic icons, examples, and documentation
+    can be found at: http://fortawesome.github.com/Font-Awesome/
+
+    License
+    -------------------------------------------------------
+    The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:
+    http://creativecommons.org/licenses/by/3.0/ A mention of
+    'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable
+    source code is considered acceptable attribution (most common on the web).
+    If human readable source code is not available to the end user, a mention in
+    an 'About' or 'Credits' screen is considered acceptable (most common in desktop
+    or mobile software).
+
+    Contact
+    -------------------------------------------------------
+    Email: dave@davegandy.com
+    Twitter: http://twitter.com/fortaweso_me
+    Work: Lead Product Designer @ http://kyruus.com
+
+    */
+
+@font-face {
+  font-family: 'FontAwesome';
+  font-style: normal;
+  font-weight: normal;
+  src: url('../font/fontawesome-webfont.eot');
+  src: url('../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'), url('../font/fontawesome-webfont.woff') format('woff'), url('../font/fontawesome-webfont.ttf') format('truetype'), url('../font/fontawesome-webfont.svg#FontAwesome') format('svg');
+}
+
+/*  Font Awesome styles
+    ------------------------------------------------------- */
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+  display: inline-block;
+  font-family: FontAwesome;
+  font-style: normal;
+  font-weight: normal;
+  text-decoration: inherit;
+}
+
+a [class^="icon-"],
+a [class*=" icon-"] {
+  display: inline-block;
+  text-decoration: inherit;
+}
+
+/* makes the font 33% larger relative to the icon container */
+
+.icon-large:before {
+  font-size: 1.3333333333333333em;
+  vertical-align: middle;
+}
+
+.btn [class^="icon-"],
+.nav-tabs [class^="icon-"],
+.btn [class*=" icon-"],
+.nav-tabs [class*=" icon-"] {
+  /* keeps button heights with and without icons the same */
+
+  line-height: .9em;
+}
+
+li [class^="icon-"],
+li [class*=" icon-"] {
+  display: inline-block;
+  width: 1.25em;
+  text-align: center;
+}
+
+li .icon-large:before,
+li .icon-large:before {
+  /* 1.5 increased font size for icon-large * 1.25 width */
+
+  width: 1.875em;
+}
+
+ul.icons {
+  margin-left: 2em;
+  text-indent: -0.8em;
+  list-style-type: none;
+}
+
+ul.icons li [class^="icon-"],
+ul.icons li [class*=" icon-"] {
+  width: .8em;
+}
+
+ul.icons li .icon-large:before,
+ul.icons li .icon-large:before {
+  /* 1.5 increased font size for icon-large * 1.25 width */
+
+  vertical-align: initial;
+}
+
+/*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+    readers do not read off random characters that represent icons */
+
+.icon-glass:before {
+  content: "\f000";
+}
+
+.icon-music:before {
+  content: "\f001";
+}
+
+.icon-search:before {
+  content: "\f002";
+}
+
+.icon-envelope:before {
+  content: "\f003";
+}
+
+.icon-heart:before {
+  content: "\f004";
+}
+
+.icon-star:before {
+  content: "\f005";
+}
+
+.icon-star-empty:before {
+  content: "\f006";
+}
+
+.icon-user:before {
+  content: "\f007";
+}
+
+.icon-film:before {
+  content: "\f008";
+}
+
+.icon-th-large:before {
+  content: "\f009";
+}
+
+.icon-th:before {
+  content: "\f00a";
+}
+
+.icon-th-list:before {
+  content: "\f00b";
+}
+
+.icon-ok:before {
+  content: "\f00c";
+}
+
+.icon-remove:before {
+  content: "\f00d";
+}
+
+.icon-zoom-in:before {
+  content: "\f00e";
+}
+
+.icon-zoom-out:before {
+  content: "\f010";
+}
+
+.icon-off:before {
+  content: "\f011";
+}
+
+.icon-signal:before {
+  content: "\f012";
+}
+
+.icon-cog:before {
+  content: "\f013";
+}
+
+.icon-trash:before {
+  content: "\f014";
+}
+
+.icon-home:before {
+  content: "\f015";
+}
+
+.icon-file:before {
+  content: "\f016";
+}
+
+.icon-time:before {
+  content: "\f017";
+}
+
+.icon-road:before {
+  content: "\f018";
+}
+
+.icon-download-alt:before {
+  content: "\f019";
+}
+
+.icon-download:before {
+  content: "\f01a";
+}
+
+.icon-upload:before {
+  content: "\f01b";
+}
+
+.icon-inbox:before {
+  content: "\f01c";
+}
+
+.icon-play-circle:before {
+  content: "\f01d";
+}
+
+.icon-repeat:before {
+  content: "\f01e";
+}
+
+/* \f020 doesn't work in Safari. all shifted one down */
+
+.icon-refresh:before {
+  content: "\f021";
+}
+
+.icon-list-alt:before {
+  content: "\f022";
+}
+
+.icon-lock:before {
+  content: "\f023";
+}
+
+.icon-flag:before {
+  content: "\f024";
+}
+
+.icon-headphones:before {
+  content: "\f025";
+}
+
+.icon-volume-off:before {
+  content: "\f026";
+}
+
+.icon-volume-down:before {
+  content: "\f027";
+}
+
+.icon-volume-up:before {
+  content: "\f028";
+}
+
+.icon-qrcode:before {
+  content: "\f029";
+}
+
+.icon-barcode:before {
+  content: "\f02a";
+}
+
+.icon-tag:before {
+  content: "\f02b";
+}
+
+.icon-tags:before {
+  content: "\f02c";
+}
+
+.icon-book:before {
+  content: "\f02d";
+}
+
+.icon-bookmark:before {
+  content: "\f02e";
+}
+
+.icon-print:before {
+  content: "\f02f";
+}
+
+.icon-camera:before {
+  content: "\f030";
+}
+
+.icon-font:before {
+  content: "\f031";
+}
+
+.icon-bold:before {
+  content: "\f032";
+}
+
+.icon-italic:before {
+  content: "\f033";
+}
+
+.icon-text-height:before {
+  content: "\f034";
+}
+
+.icon-text-width:before {
+  content: "\f035";
+}
+
+.icon-align-left:before {
+  content: "\f036";
+}
+
+.icon-align-center:before {
+  content: "\f037";
+}
+
+.icon-align-right:before {
+  content: "\f038";
+}
+
+.icon-align-justify:before {
+  content: "\f039";
+}
+
+.icon-list:before {
+  content: "\f03a";
+}
+
+.icon-indent-left:before {
+  content: "\f03b";
+}
+
+.icon-indent-right:before {
+  content: "\f03c";
+}
+
+.icon-facetime-video:before {
+  content: "\f03d";
+}
+
+.icon-picture:before {
+  content: "\f03e";
+}
+
+.icon-pencil:before {
+  content: "\f040";
+}
+
+.icon-map-marker:before {
+  content: "\f041";
+}
+
+.icon-adjust:before {
+  content: "\f042";
+}
+
+.icon-tint:before {
+  content: "\f043";
+}
+
+.icon-edit:before {
+  content: "\f044";
+}
+
+.icon-share:before {
+  content: "\f045";
+}
+
+.icon-check:before {
+  content: "\f046";
+}
+
+.icon-move:before {
+  content: "\f047";
+}
+
+.icon-step-backward:before {
+  content: "\f048";
+}
+
+.icon-fast-backward:before {
+  content: "\f049";
+}
+
+.icon-backward:before {
+  content: "\f04a";
+}
+
+.icon-play:before {
+  content: "\f04b";
+}
+
+.icon-pause:before {
+  content: "\f04c";
+}
+
+.icon-stop:before {
+  content: "\f04d";
+}
+
+.icon-forward:before {
+  content: "\f04e";
+}
+
+.icon-fast-forward:before {
+  content: "\f050";
+}
+
+.icon-step-forward:before {
+  content: "\f051";
+}
+
+.icon-eject:before {
+  content: "\f052";
+}
+
+.icon-chevron-left:before {
+  content: "\f053";
+}
+
+.icon-chevron-right:before {
+  content: "\f054";
+}
+
+.icon-plus-sign:before {
+  content: "\f055";
+}
+
+.icon-minus-sign:before {
+  content: "\f056";
+}
+
+.icon-remove-sign:before {
+  content: "\f057";
+}
+
+.icon-ok-sign:before {
+  content: "\f058";
+}
+
+.icon-question-sign:before {
+  content: "\f059";
+}
+
+.icon-info-sign:before {
+  content: "\f05a";
+}
+
+.icon-screenshot:before {
+  content: "\f05b";
+}
+
+.icon-remove-circle:before {
+  content: "\f05c";
+}
+
+.icon-ok-circle:before {
+  content: "\f05d";
+}
+
+.icon-ban-circle:before {
+  content: "\f05e";
+}
+
+.icon-arrow-left:before {
+  content: "\f060";
+}
+
+.icon-arrow-right:before {
+  content: "\f061";
+}
+
+.icon-arrow-up:before {
+  content: "\f062";
+}
+
+.icon-arrow-down:before {
+  content: "\f063";
+}
+
+.icon-share-alt:before {
+  content: "\f064";
+}
+
+.icon-resize-full:before {
+  content: "\f065";
+}
+
+.icon-resize-small:before {
+  content: "\f066";
+}
+
+.icon-plus:before {
+  content: "\f067";
+}
+
+.icon-minus:before {
+  content: "\f068";
+}
+
+.icon-asterisk:before {
+  content: "\f069";
+}
+
+.icon-exclamation-sign:before {
+  content: "\f06a";
+}
+
+.icon-gift:before {
+  content: "\f06b";
+}
+
+.icon-leaf:before {
+  content: "\f06c";
+}
+
+.icon-fire:before {
+  content: "\f06d";
+}
+
+.icon-eye-open:before {
+  content: "\f06e";
+}
+
+.icon-eye-close:before {
+  content: "\f070";
+}
+
+.icon-warning-sign:before {
+  content: "\f071";
+}
+
+.icon-plane:before {
+  content: "\f072";
+}
+
+.icon-calendar:before {
+  content: "\f073";
+}
+
+.icon-random:before {
+  content: "\f074";
+}
+
+.icon-comment:before {
+  content: "\f075";
+}
+
+.icon-magnet:before {
+  content: "\f076";
+}
+
+.icon-chevron-up:before {
+  content: "\f077";
+}
+
+.icon-chevron-down:before {
+  content: "\f078";
+}
+
+.icon-retweet:before {
+  content: "\f079";
+}
+
+.icon-shopping-cart:before {
+  content: "\f07a";
+}
+
+.icon-folder-close:before {
+  content: "\f07b";
+}
+
+.icon-folder-open:before {
+  content: "\f07c";
+}
+
+.icon-resize-vertical:before {
+  content: "\f07d";
+}
+
+.icon-resize-horizontal:before {
+  content: "\f07e";
+}
+
+.icon-bar-chart:before {
+  content: "\f080";
+}
+
+.icon-twitter-sign:before {
+  content: "\f081";
+}
+
+.icon-facebook-sign:before {
+  content: "\f082";
+}
+
+.icon-camera-retro:before {
+  content: "\f083";
+}
+
+.icon-key:before {
+  content: "\f084";
+}
+
+.icon-cogs:before {
+  content: "\f085";
+}
+
+.icon-comments:before {
+  content: "\f086";
+}
+
+.icon-thumbs-up:before {
+  content: "\f087";
+}
+
+.icon-thumbs-down:before {
+  content: "\f088";
+}
+
+.icon-star-half:before {
+  content: "\f089";
+}
+
+.icon-heart-empty:before {
+  content: "\f08a";
+}
+
+.icon-signout:before {
+  content: "\f08b";
+}
+
+.icon-linkedin-sign:before {
+  content: "\f08c";
+}
+
+.icon-pushpin:before {
+  content: "\f08d";
+}
+
+.icon-external-link:before {
+  content: "\f08e";
+}
+
+.icon-signin:before {
+  content: "\f090";
+}
+
+.icon-trophy:before {
+  content: "\f091";
+}
+
+.icon-github-sign:before {
+  content: "\f092";
+}
+
+.icon-upload-alt:before {
+  content: "\f093";
+}
+
+.icon-lemon:before {
+  content: "\f094";
+}
+
+.icon-phone:before {
+  content: "\f095";
+}
+
+.icon-check-empty:before {
+  content: "\f096";
+}
+
+.icon-bookmark-empty:before {
+  content: "\f097";
+}
+
+.icon-phone-sign:before {
+  content: "\f098";
+}
+
+.icon-twitter:before {
+  content: "\f099";
+}
+
+.icon-facebook:before {
+  content: "\f09a";
+}
+
+.icon-github:before {
+  content: "\f09b";
+}
+
+.icon-unlock:before {
+  content: "\f09c";
+}
+
+.icon-credit-card:before {
+  content: "\f09d";
+}
+
+.icon-rss:before {
+  content: "\f09e";
+}
+
+.icon-hdd:before {
+  content: "\f0a0";
+}
+
+.icon-bullhorn:before {
+  content: "\f0a1";
+}
+
+.icon-bell:before {
+  content: "\f0a2";
+}
+
+.icon-certificate:before {
+  content: "\f0a3";
+}
+
+.icon-hand-right:before {
+  content: "\f0a4";
+}
+
+.icon-hand-left:before {
+  content: "\f0a5";
+}
+
+.icon-hand-up:before {
+  content: "\f0a6";
+}
+
+.icon-hand-down:before {
+  content: "\f0a7";
+}
+
+.icon-circle-arrow-left:before {
+  content: "\f0a8";
+}
+
+.icon-circle-arrow-right:before {
+  content: "\f0a9";
+}
+
+.icon-circle-arrow-up:before {
+  content: "\f0aa";
+}
+
+.icon-circle-arrow-down:before {
+  content: "\f0ab";
+}
+
+.icon-globe:before {
+  content: "\f0ac";
+}
+
+.icon-wrench:before {
+  content: "\f0ad";
+}
+
+.icon-tasks:before {
+  content: "\f0ae";
+}
+
+.icon-filter:before {
+  content: "\f0b0";
+}
+
+.icon-briefcase:before {
+  content: "\f0b1";
+}
+
+.icon-fullscreen:before {
+  content: "\f0b2";
+}
+
+.icon-group:before {
+  content: "\f0c0";
+}
+
+.icon-link:before {
+  content: "\f0c1";
+}
+
+.icon-cloud:before {
+  content: "\f0c2";
+}
+
+.icon-beaker:before {
+  content: "\f0c3";
+}
+
+.icon-cut:before {
+  content: "\f0c4";
+}
+
+.icon-copy:before {
+  content: "\f0c5";
+}
+
+.icon-paper-clip:before {
+  content: "\f0c6";
+}
+
+.icon-save:before {
+  content: "\f0c7";
+}
+
+.icon-sign-blank:before {
+  content: "\f0c8";
+}
+
+.icon-reorder:before {
+  content: "\f0c9";
+}
+
+.icon-list-ul:before {
+  content: "\f0ca";
+}
+
+.icon-list-ol:before {
+  content: "\f0cb";
+}
+
+.icon-strikethrough:before {
+  content: "\f0cc";
+}
+
+.icon-underline:before {
+  content: "\f0cd";
+}
+
+.icon-table:before {
+  content: "\f0ce";
+}
+
+.icon-magic:before {
+  content: "\f0d0";
+}
+
+.icon-truck:before {
+  content: "\f0d1";
+}
+
+.icon-pinterest:before {
+  content: "\f0d2";
+}
+
+.icon-pinterest-sign:before {
+  content: "\f0d3";
+}
+
+.icon-google-plus-sign:before {
+  content: "\f0d4";
+}
+
+.icon-google-plus:before {
+  content: "\f0d5";
+}
+
+.icon-money:before {
+  content: "\f0d6";
+}
+
+.icon-caret-down:before {
+  content: "\f0d7";
+}
+
+.icon-caret-up:before {
+  content: "\f0d8";
+}
+
+.icon-caret-left:before {
+  content: "\f0d9";
+}
+
+.icon-caret-right:before {
+  content: "\f0da";
+}
+
+.icon-columns:before {
+  content: "\f0db";
+}
+
+.icon-sort:before {
+  content: "\f0dc";
+}
+
+.icon-sort-down:before {
+  content: "\f0dd";
+}
+
+.icon-sort-up:before {
+  content: "\f0de";
+}
+
+.icon-envelope-alt:before {
+  content: "\f0e0";
+}
+
+.icon-linkedin:before {
+  content: "\f0e1";
+}
+
+.icon-undo:before {
+  content: "\f0e2";
+}
+
+.icon-legal:before {
+  content: "\f0e3";
+}
+
+.icon-dashboard:before {
+  content: "\f0e4";
+}
+
+.icon-comment-alt:before {
+  content: "\f0e5";
+}
+
+.icon-comments-alt:before {
+  content: "\f0e6";
+}
+
+.icon-bolt:before {
+  content: "\f0e7";
+}
+
+.icon-sitemap:before {
+  content: "\f0e8";
+}
+
+.icon-umbrella:before {
+  content: "\f0e9";
+}
+
+.icon-paste:before {
+  content: "\f0ea";
+}
+
+.icon-user-md:before {
+  content: "\f200";
+}
+
+.dropup,
+.dropdown {
+  position: relative;
+}
+
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top: 4px solid #000000;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+  content: "";
+}
+
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.dropdown-menu .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.dropdown-menu a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 20px;
+  color: #333333;
+  white-space: nowrap;
+}
+
+.dropdown-menu li > a:hover,
+.dropdown-menu li > a:focus,
+.dropdown-submenu:hover > a {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #4b7d38;
+  background-color: #477635;
+  background-image: -moz-linear-gradient(top, #4b7d38, #406c30);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#4b7d38), to(#406c30));
+  background-image: -webkit-linear-gradient(top, #4b7d38, #406c30);
+  background-image: -o-linear-gradient(top, #4b7d38, #406c30);
+  background-image: linear-gradient(to bottom, #4b7d38, #406c30);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38', endColorstr='#ff406c30', GradientType=0);
+}
+
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #4b7d38;
+  background-color: #477635;
+  background-image: -moz-linear-gradient(top, #4b7d38, #406c30);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#4b7d38), to(#406c30));
+  background-image: -webkit-linear-gradient(top, #4b7d38, #406c30);
+  background-image: -o-linear-gradient(top, #4b7d38, #406c30);
+  background-image: linear-gradient(to bottom, #4b7d38, #406c30);
+  background-repeat: repeat-x;
+  outline: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38', endColorstr='#ff406c30', GradientType=0);
+}
+
+.dropdown-menu .disabled > a,
+.dropdown-menu .disabled > a:hover {
+  color: #999999;
+}
+
+.dropdown-menu .disabled > a:hover {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+}
+
+.open {
+  *z-index: 1000;
+}
+
+.open > .dropdown-menu {
+  display: block;
+}
+
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid #000000;
+  content: "\2191";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+
+.dropdown-submenu {
+  position: relative;
+}
+
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+     -moz-border-radius: 0 6px 6px 6px;
+          border-radius: 0 6px 6px 6px;
+}
+
+.dropdown-submenu:hover .dropdown-menu {
+  display: block;
+}
+
+.dropdown-submenu > a:after {
+  display: block;
+  float: right;
+  width: 0;
+  height: 0;
+  margin-top: 5px;
+  margin-right: -10px;
+  border-color: transparent;
+  border-left-color: #cccccc;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  content: " ";
+}
+
+.dropdown-submenu:hover > a:after {
+  border-left-color: #ffffff;
+}
+
+.dropdown .dropdown-menu .nav-header {
+  padding-right: 20px;
+  padding-left: 20px;
+}
+
+.typeahead {
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-large {
+  padding: 24px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.well-small {
+  padding: 9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+     -moz-transition: opacity 0.15s linear;
+       -o-transition: opacity 0.15s linear;
+          transition: opacity 0.15s linear;
+}
+
+.fade.in {
+  opacity: 1;
+}
+
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  overflow: visible \9;
+  -webkit-transition: height 0.35s ease;
+     -moz-transition: height 0.35s ease;
+       -o-transition: height 0.35s ease;
+          transition: height 0.35s ease;
+}
+
+.collapse.in {
+  height: auto;
+}
+
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+
+.close:hover {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+}
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+
+.btn {
+  display: inline-block;
+  *display: inline;
+  padding: 4px 14px;
+  margin-bottom: 0;
+  *margin-left: .3em;
+  font-size: 14px;
+  line-height: 20px;
+  *line-height: 20px;
+  color: #333333;
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  vertical-align: middle;
+  cursor: pointer;
+  background-color: #f5f5f5;
+  *background-color: #e6e6e6;
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  border: 1px solid #bbbbbb;
+  *border: 0;
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border-bottom-color: #a2a2a2;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn:hover,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  color: #333333;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+}
+
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+
+.btn:first-child {
+  *margin-left: 0;
+}
+
+.btn:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+  /* Buttons in IE7 don't get borders, so darken on hover */
+
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+     -moz-transition: background-position 0.1s linear;
+       -o-transition: background-position 0.1s linear;
+          transition: background-position 0.1s linear;
+}
+
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.btn.active,
+.btn:active {
+  background-color: #e6e6e6;
+  background-color: #d9d9d9 \9;
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-color: #e6e6e6;
+  background-image: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-large {
+  padding: 9px 14px;
+  font-size: 16px;
+  line-height: normal;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.btn-large [class^="icon-"] {
+  margin-top: 2px;
+}
+
+.btn-small {
+  padding: 3px 9px;
+  font-size: 12px;
+  line-height: 18px;
+}
+
+.btn-small [class^="icon-"] {
+  margin-top: 0;
+}
+
+.btn-mini {
+  padding: 2px 6px;
+  font-size: 11px;
+  line-height: 16px;
+}
+
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+.btn {
+  border-color: #c5c5c5;
+  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
+}
+
+.btn-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #437d3a;
+  *background-color: #387d3c;
+  background-image: -moz-linear-gradient(top, #4b7d38, #387d3c);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#4b7d38), to(#387d3c));
+  background-image: -webkit-linear-gradient(top, #4b7d38, #387d3c);
+  background-image: -o-linear-gradient(top, #4b7d38, #387d3c);
+  background-image: linear-gradient(to bottom, #4b7d38, #387d3c);
+  background-repeat: repeat-x;
+  border-color: #387d3c #387d3c #214823;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38', endColorstr='#ff387d3c', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-primary:hover,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  color: #ffffff;
+  background-color: #387d3c;
+  *background-color: #306c34;
+}
+
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #285a2c \9;
+}
+
+.btn-warning {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #faa732;
+  *background-color: #f89406;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-warning:hover,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  color: #ffffff;
+  background-color: #f89406;
+  *background-color: #df8505;
+}
+
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+
+.btn-danger {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #da4f49;
+  *background-color: #bd362f;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-danger:hover,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  color: #ffffff;
+  background-color: #bd362f;
+  *background-color: #a9302a;
+}
+
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+
+.btn-success {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #5bb75b;
+  *background-color: #51a351;
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(to bottom, #62c462, #51a351);
+  background-repeat: repeat-x;
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-success:hover,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  color: #ffffff;
+  background-color: #51a351;
+  *background-color: #499249;
+}
+
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+
+.btn-info {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #49afcd;
+  *background-color: #2f96b4;
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-info:hover,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  color: #ffffff;
+  background-color: #2f96b4;
+  *background-color: #2a85a0;
+}
+
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+
+.btn-inverse {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #363636;
+  *background-color: #222222;
+  background-image: -moz-linear-gradient(top, #444444, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
+  background-image: -webkit-linear-gradient(top, #444444, #222222);
+  background-image: -o-linear-gradient(top, #444444, #222222);
+  background-image: linear-gradient(to bottom, #444444, #222222);
+  background-repeat: repeat-x;
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-inverse:hover,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  color: #ffffff;
+  background-color: #222222;
+  *background-color: #151515;
+}
+
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #080808 \9;
+}
+
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+  *padding-top: 1px;
+  *padding-bottom: 1px;
+}
+
+.btn-link,
+.btn-link:active {
+  background-color: transparent;
+  background-image: none;
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-link {
+  color: #4b7d38;
+  cursor: pointer;
+  border-color: transparent;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-link:hover {
+  color: #6bb151;
+  text-decoration: underline;
+  background-color: transparent;
+}
+
+.btn-group {
+  position: relative;
+  *margin-left: .3em;
+  font-size: 0;
+  white-space: nowrap;
+}
+
+.btn-group:first-child {
+  *margin-left: 0;
+}
+
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-toolbar {
+  margin-top: 10px;
+  margin-bottom: 10px;
+  font-size: 0;
+}
+
+.btn-toolbar .btn-group {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+
+.btn-toolbar .btn + .btn,
+.btn-toolbar .btn-group + .btn,
+.btn-toolbar .btn + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-group > .btn {
+  position: relative;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group > .btn + .btn {
+  margin-left: -1px;
+}
+
+.btn-group > .btn,
+.btn-group > .dropdown-menu {
+  font-size: 14px;
+}
+
+.btn-group > .btn-mini {
+  font-size: 11px;
+}
+
+.btn-group > .btn-small {
+  font-size: 12px;
+}
+
+.btn-group > .btn-large {
+  font-size: 16px;
+}
+
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+  *padding-top: 5px;
+  padding-right: 8px;
+  *padding-bottom: 5px;
+  padding-left: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group > .btn-mini + .dropdown-toggle {
+  *padding-top: 2px;
+  padding-right: 5px;
+  *padding-bottom: 2px;
+  padding-left: 5px;
+}
+
+.btn-group > .btn-small + .dropdown-toggle {
+  *padding-top: 5px;
+  *padding-bottom: 4px;
+}
+
+.btn-group > .btn-large + .dropdown-toggle {
+  *padding-top: 7px;
+  padding-right: 12px;
+  *padding-bottom: 7px;
+  padding-left: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group.open .btn.dropdown-toggle {
+  background-color: #e6e6e6;
+}
+
+.btn-group.open .btn-primary.dropdown-toggle {
+  background-color: #387d3c;
+}
+
+.btn-group.open .btn-warning.dropdown-toggle {
+  background-color: #f89406;
+}
+
+.btn-group.open .btn-danger.dropdown-toggle {
+  background-color: #bd362f;
+}
+
+.btn-group.open .btn-success.dropdown-toggle {
+  background-color: #51a351;
+}
+
+.btn-group.open .btn-info.dropdown-toggle {
+  background-color: #2f96b4;
+}
+
+.btn-group.open .btn-inverse.dropdown-toggle {
+  background-color: #222222;
+}
+
+.btn .caret {
+  margin-top: 8px;
+  margin-left: 0;
+}
+
+.btn-mini .caret,
+.btn-small .caret,
+.btn-large .caret {
+  margin-top: 6px;
+}
+
+.btn-large .caret {
+  border-top-width: 5px;
+  border-right-width: 5px;
+  border-left-width: 5px;
+}
+
+.dropup .btn-large .caret {
+  border-top: 0;
+  border-bottom: 5px solid #000000;
+}
+
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.btn-group-vertical {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+
+.btn-group-vertical .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group-vertical .btn + .btn {
+  margin-top: -1px;
+  margin-left: 0;
+}
+
+.btn-group-vertical .btn:first-child {
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.btn-group-vertical .btn:last-child {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.btn-group-vertical .btn-large:first-child {
+  -webkit-border-radius: 6px 6px 0 0;
+     -moz-border-radius: 6px 6px 0 0;
+          border-radius: 6px 6px 0 0;
+}
+
+.btn-group-vertical .btn-large:last-child {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 20px;
+  color: #c09853;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.alert h4 {
+  margin: 0;
+}
+
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 20px;
+}
+
+.alert-success {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+
+.alert-danger,
+.alert-error {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #eed3d7;
+}
+
+.alert-info {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+
+.alert-block p + p {
+  margin-top: 5px;
+}
+
+.nav {
+  margin-bottom: 20px;
+  margin-left: 0;
+  list-style: none;
+}
+
+.nav > li > a {
+  display: block;
+}
+
+.nav > li > a:hover {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+
+.nav > .pull-right {
+  float: right;
+}
+
+.nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+
+.nav-list {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-bottom: 0;
+}
+
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-right: -15px;
+  margin-left: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+
+.nav-list > .active > a,
+.nav-list > .active > a:hover {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #4b7d38;
+}
+
+.nav-list [class^="icon-"] {
+  margin-right: 2px;
+}
+
+.nav-list .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: 20px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover {
+  color: #555555;
+  cursor: default;
+  background-color: #ffffff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover {
+  color: #ffffff;
+  background-color: #4b7d38;
+}
+
+.nav-stacked > li {
+  float: none;
+}
+
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li > a:hover {
+  z-index: 2;
+  border-color: #ddd;
+}
+
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+
+.nav-tabs .dropdown-menu {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.nav .dropdown-toggle .caret {
+  margin-top: 6px;
+  border-top-color: #4b7d38;
+  border-bottom-color: #4b7d38;
+}
+
+.nav .dropdown-toggle:hover .caret {
+  border-top-color: #6bb151;
+  border-bottom-color: #6bb151;
+}
+
+/* move down carets for tabs */
+
+.nav-tabs .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.nav .active .dropdown-toggle .caret {
+  border-top-color: #fff;
+  border-bottom-color: #fff;
+}
+
+.nav-tabs .active .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.nav > .dropdown.active > a:hover {
+  cursor: pointer;
+}
+
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+
+.tabs-stacked .open > a:hover {
+  border-color: #999999;
+}
+
+.tabbable {
+  *zoom: 1;
+}
+
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.tabbable:after {
+  clear: both;
+}
+
+.tab-content {
+  overflow: auto;
+}
+
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+
+.tabs-below > .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.tabs-below > .nav-tabs > li > a:hover {
+  border-top-color: #ddd;
+  border-bottom-color: transparent;
+}
+
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover {
+  border-color: transparent #ddd #ddd #ddd;
+}
+
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.tabs-left > .nav-tabs > li > a:hover {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.tabs-right > .nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+
+.nav > .disabled > a {
+  color: #999999;
+}
+
+.nav > .disabled > a:hover {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+}
+
+.navbar {
+  *position: relative;
+  *z-index: 2;
+  margin-bottom: 20px;
+  overflow: visible;
+  color: #eff4f7;
+}
+
+.navbar-inner {
+  min-height: 60px;
+  padding-right: 20px;
+  padding-left: 20px;
+  background-color: #121320;
+  background-image: -moz-linear-gradient(top, #161726, #0d0d16);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#161726), to(#0d0d16));
+  background-image: -webkit-linear-gradient(top, #161726, #0d0d16);
+  background-image: -o-linear-gradient(top, #161726, #0d0d16);
+  background-image: linear-gradient(to bottom, #161726, #0d0d16);
+  background-repeat: repeat-x;
+  border: 1px solid #000000;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff161726', endColorstr='#ff0d0d16', GradientType=0);
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+}
+
+.navbar .container {
+  width: auto;
+  padding-top: 0;
+}
+
+.nav-collapse.collapse {
+  height: auto;
+}
+
+.navbar .brand {
+  display: block;
+  float: left;
+  padding: 20px 20px 20px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  color: #c4c6dd;
+  text-shadow: 0 1px 0 #161726;
+}
+
+.navbar .brand:hover {
+  text-decoration: none;
+}
+
+.navbar-text {
+  margin-bottom: 0;
+  line-height: 60px;
+}
+
+.navbar-link {
+  color: #c4c6dd;
+}
+
+.navbar-link:hover {
+  color: #eff4f7;
+}
+
+.navbar .divider-vertical {
+  height: 60px;
+  margin: 0 9px;
+  border-right: 1px solid #161726;
+  border-left: 1px solid #0d0d16;
+}
+
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 16px;
+}
+
+.navbar .btn-group .btn {
+  margin: 0;
+}
+
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-form:after {
+  clear: both;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 15px;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .btn {
+  display: inline-block;
+  margin-bottom: 0;
+}
+
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 6px;
+  white-space: nowrap;
+}
+
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 15px;
+  margin-bottom: 0;
+}
+
+.navbar-search .search-query {
+  padding: 4px 14px;
+  margin-bottom: 0;
+  font-family: Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.navbar-static-top {
+  position: static;
+  width: 100%;
+  margin-bottom: 0;
+}
+
+.navbar-static-top .navbar-inner {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  margin-bottom: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner,
+.navbar-static-top .navbar-inner {
+  border: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.navbar-fixed-top {
+  top: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar-fixed-bottom {
+  bottom: 0;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+
+.navbar .nav.pull-right {
+  float: right;
+}
+
+.navbar .nav > li {
+  float: left;
+}
+
+.navbar .nav > li > a {
+  float: none;
+  padding: 20px 15px 20px;
+  color: #c4c6dd;
+  text-decoration: none;
+  text-shadow: 0 1px 0 #161726;
+  border-top: 2px #161726 solid;
+}
+
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  color: #eff4f7;
+  text-decoration: none;
+  background-color: transparent;
+  border-top-color: #eff4f7;
+}
+
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: #eff4f7;
+  text-decoration: none;
+  background-color: #030306;
+  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+}
+
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-right: 5px;
+  margin-left: 5px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #09090f;
+  *background-color: #030306;
+  background-image: -moz-linear-gradient(top, #0d0d16, #030306);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0d0d16), to(#030306));
+  background-image: -webkit-linear-gradient(top, #0d0d16, #030306);
+  background-image: -o-linear-gradient(top, #0d0d16, #030306);
+  background-image: linear-gradient(to bottom, #0d0d16, #030306);
+  background-repeat: repeat-x;
+  border-color: #030306 #030306 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0d0d16', endColorstr='#ff030306', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #030306;
+  *background-color: #000000;
+}
+
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+  background-color: #000000 \9;
+}
+
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+     -moz-border-radius: 1px;
+          border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+
+.navbar .nav > li > .dropdown-menu:before {
+  position: absolute;
+  top: -7px;
+  left: 9px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.navbar .nav > li > .dropdown-menu:after {
+  position: absolute;
+  top: -6px;
+  left: 10px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
+  top: auto;
+  bottom: -7px;
+  border-top: 7px solid #ccc;
+  border-bottom: 0;
+  border-top-color: rgba(0, 0, 0, 0.2);
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
+  top: auto;
+  bottom: -6px;
+  border-top: 6px solid #ffffff;
+  border-bottom: 0;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #eff4f7;
+  background-color: #030306;
+}
+
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #c4c6dd;
+  border-bottom-color: #c4c6dd;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #eff4f7;
+  border-bottom-color: #eff4f7;
+}
+
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu.pull-right:before {
+  right: 12px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:after,
+.navbar .nav > li > .dropdown-menu.pull-right:after {
+  right: 13px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
+  right: 100%;
+  left: auto;
+  margin-right: -1px;
+  margin-left: 0;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.navbar-inverse {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-inner {
+  background-color: #1b1b1b;
+  background-image: -moz-linear-gradient(top, #222222, #111111);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
+  background-image: -webkit-linear-gradient(top, #222222, #111111);
+  background-image: -o-linear-gradient(top, #222222, #111111);
+  background-image: linear-gradient(to bottom, #222222, #111111);
+  background-repeat: repeat-x;
+  border-color: #252525;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
+}
+
+.navbar-inverse .brand,
+.navbar-inverse .nav > li > a {
+  color: #999999;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-inverse .brand:hover,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+}
+
+.navbar-inverse .nav > li > a:focus,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+  background-color: transparent;
+}
+
+.navbar-inverse .nav .active > a,
+.navbar-inverse .nav .active > a:hover,
+.navbar-inverse .nav .active > a:focus {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .navbar-link {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-link:hover {
+  color: #ffffff;
+}
+
+.navbar-inverse .divider-vertical {
+  border-right-color: #222222;
+  border-left-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #999999;
+  border-bottom-color: #999999;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .navbar-search .search-query {
+  color: #ffffff;
+  background-color: #515151;
+  border-color: #111111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+  -webkit-transition: none;
+     -moz-transition: none;
+       -o-transition: none;
+          transition: none;
+}
+
+.navbar-inverse .navbar-search .search-query:-moz-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:focus,
+.navbar-inverse .navbar-search .search-query.focused {
+  padding: 5px 15px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  outline: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+.navbar-inverse .btn-navbar {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e0e0e;
+  *background-color: #040404;
+  background-image: -moz-linear-gradient(top, #151515, #040404);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
+  background-image: -webkit-linear-gradient(top, #151515, #040404);
+  background-image: -o-linear-gradient(top, #151515, #040404);
+  background-image: linear-gradient(to bottom, #151515, #040404);
+  background-repeat: repeat-x;
+  border-color: #040404 #040404 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.navbar-inverse .btn-navbar:hover,
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active,
+.navbar-inverse .btn-navbar.disabled,
+.navbar-inverse .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #040404;
+  *background-color: #000000;
+}
+
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active {
+  background-color: #000000 \9;
+}
+
+.breadcrumb {
+  padding: 8px 15px;
+  margin: 0 0 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.breadcrumb li {
+  display: inline-block;
+  *display: inline;
+  text-shadow: 0 1px 0 #ffffff;
+  *zoom: 1;
+}
+
+.breadcrumb .divider {
+  padding: 0 5px;
+  color: #ccc;
+}
+
+.breadcrumb .active {
+  color: #999999;
+}
+
+.pagination {
+  height: 40px;
+  margin: 20px 0;
+}
+
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  margin-left: 0;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.pagination li {
+  display: inline;
+}
+
+.pagination a,
+.pagination span {
+  float: left;
+  padding: 0 14px;
+  line-height: 38px;
+  text-decoration: none;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-left-width: 0;
+}
+
+.pagination a:hover,
+.pagination .active a,
+.pagination .active span {
+  background-color: #f5f5f5;
+}
+
+.pagination .active a,
+.pagination .active span {
+  color: #999999;
+  cursor: default;
+}
+
+.pagination .disabled span,
+.pagination .disabled a,
+.pagination .disabled a:hover {
+  color: #999999;
+  cursor: default;
+  background-color: transparent;
+}
+
+.pagination li:first-child a,
+.pagination li:first-child span {
+  border-left-width: 1px;
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.pagination li:last-child a,
+.pagination li:last-child span {
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+.pagination-centered {
+  text-align: center;
+}
+
+.pagination-right {
+  text-align: right;
+}
+
+.pager {
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+  *zoom: 1;
+}
+
+.pager:before,
+.pager:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.pager:after {
+  clear: both;
+}
+
+.pager li {
+  display: inline;
+}
+
+.pager a {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.pager a:hover {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+
+.pager .next a {
+  float: right;
+}
+
+.pager .previous a {
+  float: left;
+}
+
+.pager .disabled a,
+.pager .disabled a:hover {
+  color: #999999;
+  cursor: default;
+  background-color: #fff;
+}
+
+.modal-open .dropdown-menu {
+  z-index: 2050;
+}
+
+.modal-open .dropdown.open {
+  *z-index: 2050;
+}
+
+.modal-open .popover {
+  z-index: 2060;
+}
+
+.modal-open .tooltip {
+  z-index: 2080;
+}
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+
+.modal-backdrop.fade {
+  opacity: 0;
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.modal {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  z-index: 1050;
+  width: 560px;
+  margin: -250px 0 0 -280px;
+  overflow: auto;
+  background-color: #ffffff;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding-box;
+          background-clip: padding-box;
+}
+
+.modal.fade {
+  top: -25%;
+  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
+     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
+       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
+          transition: opacity 0.3s linear, top 0.3s ease-out;
+}
+
+.modal.fade.in {
+  top: 50%;
+}
+
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+
+.modal-header .close {
+  margin-top: 2px;
+}
+
+.modal-header h3 {
+  margin: 0;
+  line-height: 30px;
+}
+
+.modal-body {
+  max-height: 400px;
+  padding: 15px;
+  overflow-y: auto;
+}
+
+.modal-form {
+  margin-bottom: 0;
+}
+
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+     -moz-box-shadow: inset 0 1px 0 #ffffff;
+          box-shadow: inset 0 1px 0 #ffffff;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.modal-footer:after {
+  clear: both;
+}
+
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+
+.tooltip {
+  position: absolute;
+  z-index: 1030;
+  display: block;
+  padding: 5px;
+  font-size: 11px;
+  opacity: 0;
+  filter: alpha(opacity=0);
+  visibility: visible;
+}
+
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.tooltip.top {
+  margin-top: -3px;
+}
+
+.tooltip.right {
+  margin-left: 3px;
+}
+
+.tooltip.bottom {
+  margin-top: 3px;
+}
+
+.tooltip.left {
+  margin-left: -3px;
+}
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #ffffff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000000;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-top-color: #000000;
+  border-width: 5px 5px 0;
+}
+
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-right-color: #000000;
+  border-width: 5px 5px 5px 0;
+}
+
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-left-color: #000000;
+  border-width: 5px 0 5px 5px;
+}
+
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-bottom-color: #000000;
+  border-width: 0 5px 5px;
+}
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  width: 236px;
+  padding: 1px;
+  background-color: #eff4f7;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.popover.top {
+  margin-bottom: 10px;
+}
+
+.popover.right {
+  margin-left: 10px;
+}
+
+.popover.bottom {
+  margin-top: 10px;
+}
+
+.popover.left {
+  margin-right: 10px;
+}
+
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: #e5edf2;
+  border-bottom: 1px solid #d4e1e9;
+  -webkit-border-radius: 5px 5px 0 0;
+     -moz-border-radius: 5px 5px 0 0;
+          border-radius: 5px 5px 0 0;
+}
+
+.popover-content {
+  padding: 9px 14px;
+}
+
+.popover-content p,
+.popover-content ul,
+.popover-content ol {
+  margin-bottom: 0;
+}
+
+.popover .arrow,
+.popover .arrow:after {
+  position: absolute;
+  display: inline-block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.popover .arrow:after {
+  z-index: -1;
+  content: "";
+}
+
+.popover.top .arrow {
+  bottom: -10px;
+  left: 50%;
+  margin-left: -10px;
+  border-top-color: #ffffff;
+  border-width: 10px 10px 0;
+}
+
+.popover.top .arrow:after {
+  bottom: -1px;
+  left: -11px;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  border-width: 11px 11px 0;
+}
+
+.popover.right .arrow {
+  top: 50%;
+  left: -10px;
+  margin-top: -10px;
+  border-right-color: #ffffff;
+  border-width: 10px 10px 10px 0;
+}
+
+.popover.right .arrow:after {
+  bottom: -11px;
+  left: -1px;
+  border-right-color: rgba(0, 0, 0, 0.25);
+  border-width: 11px 11px 11px 0;
+}
+
+.popover.bottom .arrow {
+  top: -10px;
+  left: 50%;
+  margin-left: -10px;
+  border-bottom-color: #ffffff;
+  border-width: 0 10px 10px;
+}
+
+.popover.bottom .arrow:after {
+  top: -1px;
+  left: -11px;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+  border-width: 0 11px 11px;
+}
+
+.popover.left .arrow {
+  top: 50%;
+  right: -10px;
+  margin-top: -10px;
+  border-left-color: #ffffff;
+  border-width: 10px 0 10px 10px;
+}
+
+.popover.left .arrow:after {
+  right: -1px;
+  bottom: -11px;
+  border-left-color: rgba(0, 0, 0, 0.25);
+  border-width: 11px 0 11px 11px;
+}
+
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.thumbnails:after {
+  clear: both;
+}
+
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+
+.thumbnails > li {
+  float: left;
+  margin-bottom: 20px;
+  margin-left: 20px;
+}
+
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 20px;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -webkit-transition: all 0.2s ease-in-out;
+     -moz-transition: all 0.2s ease-in-out;
+       -o-transition: all 0.2s ease-in-out;
+          transition: all 0.2s ease-in-out;
+}
+
+a.thumbnail:hover {
+  border-color: #4b7d38;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.thumbnail .caption {
+  padding: 9px;
+  color: #555555;
+}
+
+.label,
+.badge {
+  font-size: 11.844px;
+  font-weight: bold;
+  line-height: 14px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  white-space: nowrap;
+  vertical-align: baseline;
+  background-color: #999999;
+}
+
+.label {
+  padding: 1px 4px 2px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.badge {
+  padding: 1px 9px 2px;
+  -webkit-border-radius: 9px;
+     -moz-border-radius: 9px;
+          border-radius: 9px;
+}
+
+a.label:hover,
+a.badge:hover {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.label-important,
+.badge-important {
+  background-color: #b94a48;
+}
+
+.label-important[href],
+.badge-important[href] {
+  background-color: #953b39;
+}
+
+.label-warning,
+.badge-warning {
+  background-color: #f89406;
+}
+
+.label-warning[href],
+.badge-warning[href] {
+  background-color: #c67605;
+}
+
+.label-success,
+.badge-success {
+  background-color: #468847;
+}
+
+.label-success[href],
+.badge-success[href] {
+  background-color: #356635;
+}
+
+.label-info,
+.badge-info {
+  background-color: #3a87ad;
+}
+
+.label-info[href],
+.badge-info[href] {
+  background-color: #2d6987;
+}
+
+.label-inverse,
+.badge-inverse {
+  background-color: #333333;
+}
+
+.label-inverse[href],
+.badge-inverse[href] {
+  background-color: #1a1a1a;
+}
+
+.btn .label,
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+
+.btn-mini .label,
+.btn-mini .badge {
+  top: 0;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 0 0;
+  }
+  to {
+    background-position: 40px 0;
+  }
+}
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f7f7f7;
+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
+  background-repeat: repeat-x;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress .bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e90d2;
+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+  background-image: -o-linear-gradient(top, #149bdf, #0480be);
+  background-image: linear-gradient(to bottom, #149bdf, #0480be);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: width 0.6s ease;
+     -moz-transition: width 0.6s ease;
+       -o-transition: width 0.6s ease;
+          transition: width 0.6s ease;
+}
+
+.progress .bar + .bar {
+  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+}
+
+.progress-striped .bar {
+  background-color: #149bdf;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+     -moz-background-size: 40px 40px;
+       -o-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+     -moz-animation: progress-bar-stripes 2s linear infinite;
+      -ms-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-danger .bar,
+.progress .bar-danger {
+  background-color: #dd514c;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
+}
+
+.progress-danger.progress-striped .bar,
+.progress-striped .bar-danger {
+  background-color: #ee5f5b;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-success .bar,
+.progress .bar-success {
+  background-color: #5eb95e;
+  background-image: -moz-linear-gradient(top, #62c462, #57a957);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+  background-image: -o-linear-gradient(top, #62c462, #57a957);
+  background-image: linear-gradient(to bottom, #62c462, #57a957);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
+}
+
+.progress-success.progress-striped .bar,
+.progress-striped .bar-success {
+  background-color: #62c462;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-info .bar,
+.progress .bar-info {
+  background-color: #4bb1cf;
+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
+}
+
+.progress-info.progress-striped .bar,
+.progress-striped .bar-info {
+  background-color: #5bc0de;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-warning .bar,
+.progress .bar-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+}
+
+.progress-warning.progress-striped .bar,
+.progress-striped .bar-warning {
+  background-color: #fbb450;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.accordion {
+  margin-bottom: 20px;
+}
+
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.accordion-heading {
+  border-bottom: 0;
+}
+
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+
+.accordion-toggle {
+  cursor: pointer;
+}
+
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
+
+.carousel {
+  position: relative;
+  margin-bottom: 20px;
+  line-height: 1;
+}
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+
+.carousel .item {
+  position: relative;
+  display: none;
+  -webkit-transition: 0.6s ease-in-out left;
+     -moz-transition: 0.6s ease-in-out left;
+       -o-transition: 0.6s ease-in-out left;
+          transition: 0.6s ease-in-out left;
+}
+
+.carousel .item > img {
+  display: block;
+  line-height: 1;
+}
+
+.carousel .active,
+.carousel .next,
+.carousel .prev {
+  display: block;
+}
+
+.carousel .active {
+  left: 0;
+}
+
+.carousel .next,
+.carousel .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+
+.carousel .next {
+  left: 100%;
+}
+
+.carousel .prev {
+  left: -100%;
+}
+
+.carousel .next.left,
+.carousel .prev.right {
+  left: 0;
+}
+
+.carousel .active.left {
+  left: -100%;
+}
+
+.carousel .active.right {
+  left: 100%;
+}
+
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: #ffffff;
+  text-align: center;
+}
+
+.carousel-control.right {
+  right: 15px;
+  left: auto;
+}
+
+.carousel-control:hover {
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+
+.carousel-caption {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 15px;
+  background: #161726;
+}
+
+.carousel-caption h4,
+.carousel-caption p {
+  line-height: 20px;
+  color: #ffffff;
+}
+
+.carousel-caption h4 {
+  margin: 0 0 5px;
+}
+
+.carousel-caption p {
+  margin-bottom: 0;
+}
+
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  background-color: #eeeeee;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  letter-spacing: -1px;
+  color: inherit;
+}
+
+.hero-unit p {
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 30px;
+  color: inherit;
+}
+
+.home-box.span4 {
+  height: 0;
+  overflow: hidden;
+  opacity: 0;
+  -webkit-transition: height 0.5s ease, opacity 0.5s ease, margin-bottom 0.5s ease;
+     -moz-transition: height 0.5s ease, opacity 0.5s ease, margin-bottom 0.5s ease;
+       -o-transition: height 0.5s ease, opacity 0.5s ease, margin-bottom 0.5s ease;
+          transition: height 0.5s ease, opacity 0.5s ease, margin-bottom 0.5s ease;
+}
+
+#home-frameworks {
+  -webkit-transition-delay: 0;
+     -moz-transition-delay: 0;
+      -ms-transition-delay: 0;
+       -o-transition-delay: 0;
+          transition-delay: 0;
+}
+
+#home-protocols {
+  -webkit-transition-delay: 200ms;
+     -moz-transition-delay: 200ms;
+      -ms-transition-delay: 200ms;
+       -o-transition-delay: 200ms;
+          transition-delay: 200ms;
+}
+
+#home-tools {
+  -webkit-transition-delay: 400ms;
+     -moz-transition-delay: 400ms;
+      -ms-transition-delay: 400ms;
+       -o-transition-delay: 400ms;
+          transition-delay: 400ms;
+}
+
+#home-community {
+  -webkit-transition-delay: 600ms;
+     -moz-transition-delay: 600ms;
+      -ms-transition-delay: 600ms;
+       -o-transition-delay: 600ms;
+          transition-delay: 600ms;
+}
+
+#home-sandbox {
+  -webkit-transition-delay: 800ms;
+     -moz-transition-delay: 800ms;
+      -ms-transition-delay: 800ms;
+       -o-transition-delay: 800ms;
+          transition-delay: 800ms;
+}
+
+.pull-right {
+  float: right;
+}
+
+.pull-left {
+  float: left;
+}
+
+.hide {
+  display: none;
+}
+
+.show {
+  display: block;
+}
+
+.invisible {
+  visibility: hidden;
+}
+
+.affix {
+  position: fixed;
+}
diff --git a/static/css/bootstrap/bootstrap.min.css b/static/css/bootstrap/bootstrap.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..e8dafbecf27a9db4f5613fd1beee537c4d50860d
--- /dev/null
+++ b/static/css/bootstrap/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#161726;background:#dee8ef}a{color:#4b7d38;text-decoration:none}a:hover{color:#6bb151;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{padding-top:80px;margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:24px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal dt{float:left;width:120px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea{width:210px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #bbb}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#323456}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{margin-left:-1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:160px}.form-horizontal .help-block{margin-top:10px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-right-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.info td{background-color:#d9edf7}@font-face{font-family:'FontAwesome';font-style:normal;font-weight:normal;src:url('../font/fontawesome-webfont.eot');src:url('../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),url('../font/fontawesome-webfont.woff') format('woff'),url('../font/fontawesome-webfont.ttf') format('truetype'),url('../font/fontawesome-webfont.svg#FontAwesome') format('svg')}[class^="icon-"]:before,[class*=" icon-"]:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;text-decoration:inherit}a [class^="icon-"],a [class*=" icon-"]{display:inline-block;text-decoration:inherit}.icon-large:before{font-size:1.3333333333333333em;vertical-align:middle}.btn [class^="icon-"],.nav-tabs [class^="icon-"],.btn [class*=" icon-"],.nav-tabs [class*=" icon-"]{line-height:.9em}li [class^="icon-"],li [class*=" icon-"]{display:inline-block;width:1.25em;text-align:center}li .icon-large:before,li .icon-large:before{width:1.875em}ul.icons{margin-left:2em;text-indent:-0.8em;list-style-type:none}ul.icons li [class^="icon-"],ul.icons li [class*=" icon-"]{width:.8em}ul.icons li .icon-large:before,ul.icons li .icon-large:before{vertical-align:initial}.icon-glass:before{content:"\f000"}.icon-music:before{content:"\f001"}.icon-search:before{content:"\f002"}.icon-envelope:before{content:"\f003"}.icon-heart:before{content:"\f004"}.icon-star:before{content:"\f005"}.icon-star-empty:before{content:"\f006"}.icon-user:before{content:"\f007"}.icon-film:before{content:"\f008"}.icon-th-large:before{content:"\f009"}.icon-th:before{content:"\f00a"}.icon-th-list:before{content:"\f00b"}.icon-ok:before{content:"\f00c"}.icon-remove:before{content:"\f00d"}.icon-zoom-in:before{content:"\f00e"}.icon-zoom-out:before{content:"\f010"}.icon-off:before{content:"\f011"}.icon-signal:before{content:"\f012"}.icon-cog:before{content:"\f013"}.icon-trash:before{content:"\f014"}.icon-home:before{content:"\f015"}.icon-file:before{content:"\f016"}.icon-time:before{content:"\f017"}.icon-road:before{content:"\f018"}.icon-download-alt:before{content:"\f019"}.icon-download:before{content:"\f01a"}.icon-upload:before{content:"\f01b"}.icon-inbox:before{content:"\f01c"}.icon-play-circle:before{content:"\f01d"}.icon-repeat:before{content:"\f01e"}.icon-refresh:before{content:"\f021"}.icon-list-alt:before{content:"\f022"}.icon-lock:before{content:"\f023"}.icon-flag:before{content:"\f024"}.icon-headphones:before{content:"\f025"}.icon-volume-off:before{content:"\f026"}.icon-volume-down:before{content:"\f027"}.icon-volume-up:before{content:"\f028"}.icon-qrcode:before{content:"\f029"}.icon-barcode:before{content:"\f02a"}.icon-tag:before{content:"\f02b"}.icon-tags:before{content:"\f02c"}.icon-book:before{content:"\f02d"}.icon-bookmark:before{content:"\f02e"}.icon-print:before{content:"\f02f"}.icon-camera:before{content:"\f030"}.icon-font:before{content:"\f031"}.icon-bold:before{content:"\f032"}.icon-italic:before{content:"\f033"}.icon-text-height:before{content:"\f034"}.icon-text-width:before{content:"\f035"}.icon-align-left:before{content:"\f036"}.icon-align-center:before{content:"\f037"}.icon-align-right:before{content:"\f038"}.icon-align-justify:before{content:"\f039"}.icon-list:before{content:"\f03a"}.icon-indent-left:before{content:"\f03b"}.icon-indent-right:before{content:"\f03c"}.icon-facetime-video:before{content:"\f03d"}.icon-picture:before{content:"\f03e"}.icon-pencil:before{content:"\f040"}.icon-map-marker:before{content:"\f041"}.icon-adjust:before{content:"\f042"}.icon-tint:before{content:"\f043"}.icon-edit:before{content:"\f044"}.icon-share:before{content:"\f045"}.icon-check:before{content:"\f046"}.icon-move:before{content:"\f047"}.icon-step-backward:before{content:"\f048"}.icon-fast-backward:before{content:"\f049"}.icon-backward:before{content:"\f04a"}.icon-play:before{content:"\f04b"}.icon-pause:before{content:"\f04c"}.icon-stop:before{content:"\f04d"}.icon-forward:before{content:"\f04e"}.icon-fast-forward:before{content:"\f050"}.icon-step-forward:before{content:"\f051"}.icon-eject:before{content:"\f052"}.icon-chevron-left:before{content:"\f053"}.icon-chevron-right:before{content:"\f054"}.icon-plus-sign:before{content:"\f055"}.icon-minus-sign:before{content:"\f056"}.icon-remove-sign:before{content:"\f057"}.icon-ok-sign:before{content:"\f058"}.icon-question-sign:before{content:"\f059"}.icon-info-sign:before{content:"\f05a"}.icon-screenshot:before{content:"\f05b"}.icon-remove-circle:before{content:"\f05c"}.icon-ok-circle:before{content:"\f05d"}.icon-ban-circle:before{content:"\f05e"}.icon-arrow-left:before{content:"\f060"}.icon-arrow-right:before{content:"\f061"}.icon-arrow-up:before{content:"\f062"}.icon-arrow-down:before{content:"\f063"}.icon-share-alt:before{content:"\f064"}.icon-resize-full:before{content:"\f065"}.icon-resize-small:before{content:"\f066"}.icon-plus:before{content:"\f067"}.icon-minus:before{content:"\f068"}.icon-asterisk:before{content:"\f069"}.icon-exclamation-sign:before{content:"\f06a"}.icon-gift:before{content:"\f06b"}.icon-leaf:before{content:"\f06c"}.icon-fire:before{content:"\f06d"}.icon-eye-open:before{content:"\f06e"}.icon-eye-close:before{content:"\f070"}.icon-warning-sign:before{content:"\f071"}.icon-plane:before{content:"\f072"}.icon-calendar:before{content:"\f073"}.icon-random:before{content:"\f074"}.icon-comment:before{content:"\f075"}.icon-magnet:before{content:"\f076"}.icon-chevron-up:before{content:"\f077"}.icon-chevron-down:before{content:"\f078"}.icon-retweet:before{content:"\f079"}.icon-shopping-cart:before{content:"\f07a"}.icon-folder-close:before{content:"\f07b"}.icon-folder-open:before{content:"\f07c"}.icon-resize-vertical:before{content:"\f07d"}.icon-resize-horizontal:before{content:"\f07e"}.icon-bar-chart:before{content:"\f080"}.icon-twitter-sign:before{content:"\f081"}.icon-facebook-sign:before{content:"\f082"}.icon-camera-retro:before{content:"\f083"}.icon-key:before{content:"\f084"}.icon-cogs:before{content:"\f085"}.icon-comments:before{content:"\f086"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-star-half:before{content:"\f089"}.icon-heart-empty:before{content:"\f08a"}.icon-signout:before{content:"\f08b"}.icon-linkedin-sign:before{content:"\f08c"}.icon-pushpin:before{content:"\f08d"}.icon-external-link:before{content:"\f08e"}.icon-signin:before{content:"\f090"}.icon-trophy:before{content:"\f091"}.icon-github-sign:before{content:"\f092"}.icon-upload-alt:before{content:"\f093"}.icon-lemon:before{content:"\f094"}.icon-phone:before{content:"\f095"}.icon-check-empty:before{content:"\f096"}.icon-bookmark-empty:before{content:"\f097"}.icon-phone-sign:before{content:"\f098"}.icon-twitter:before{content:"\f099"}.icon-facebook:before{content:"\f09a"}.icon-github:before{content:"\f09b"}.icon-unlock:before{content:"\f09c"}.icon-credit-card:before{content:"\f09d"}.icon-rss:before{content:"\f09e"}.icon-hdd:before{content:"\f0a0"}.icon-bullhorn:before{content:"\f0a1"}.icon-bell:before{content:"\f0a2"}.icon-certificate:before{content:"\f0a3"}.icon-hand-right:before{content:"\f0a4"}.icon-hand-left:before{content:"\f0a5"}.icon-hand-up:before{content:"\f0a6"}.icon-hand-down:before{content:"\f0a7"}.icon-circle-arrow-left:before{content:"\f0a8"}.icon-circle-arrow-right:before{content:"\f0a9"}.icon-circle-arrow-up:before{content:"\f0aa"}.icon-circle-arrow-down:before{content:"\f0ab"}.icon-globe:before{content:"\f0ac"}.icon-wrench:before{content:"\f0ad"}.icon-tasks:before{content:"\f0ae"}.icon-filter:before{content:"\f0b0"}.icon-briefcase:before{content:"\f0b1"}.icon-fullscreen:before{content:"\f0b2"}.icon-group:before{content:"\f0c0"}.icon-link:before{content:"\f0c1"}.icon-cloud:before{content:"\f0c2"}.icon-beaker:before{content:"\f0c3"}.icon-cut:before{content:"\f0c4"}.icon-copy:before{content:"\f0c5"}.icon-paper-clip:before{content:"\f0c6"}.icon-save:before{content:"\f0c7"}.icon-sign-blank:before{content:"\f0c8"}.icon-reorder:before{content:"\f0c9"}.icon-list-ul:before{content:"\f0ca"}.icon-list-ol:before{content:"\f0cb"}.icon-strikethrough:before{content:"\f0cc"}.icon-underline:before{content:"\f0cd"}.icon-table:before{content:"\f0ce"}.icon-magic:before{content:"\f0d0"}.icon-truck:before{content:"\f0d1"}.icon-pinterest:before{content:"\f0d2"}.icon-pinterest-sign:before{content:"\f0d3"}.icon-google-plus-sign:before{content:"\f0d4"}.icon-google-plus:before{content:"\f0d5"}.icon-money:before{content:"\f0d6"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-columns:before{content:"\f0db"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-envelope-alt:before{content:"\f0e0"}.icon-linkedin:before{content:"\f0e1"}.icon-undo:before{content:"\f0e2"}.icon-legal:before{content:"\f0e3"}.icon-dashboard:before{content:"\f0e4"}.icon-comment-alt:before{content:"\f0e5"}.icon-comments-alt:before{content:"\f0e6"}.icon-bolt:before{content:"\f0e7"}.icon-sitemap:before{content:"\f0e8"}.icon-umbrella:before{content:"\f0e9"}.icon-paste:before{content:"\f0ea"}.icon-user-md:before{content:"\f200"}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#4b7d38;background-color:#477635;background-image:-moz-linear-gradient(top,#4b7d38,#406c30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4b7d38),to(#406c30));background-image:-webkit-linear-gradient(top,#4b7d38,#406c30);background-image:-o-linear-gradient(top,#4b7d38,#406c30);background-image:linear-gradient(to bottom,#4b7d38,#406c30);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38',endColorstr='#ff406c30',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#4b7d38;background-color:#477635;background-image:-moz-linear-gradient(top,#4b7d38,#406c30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4b7d38),to(#406c30));background-image:-webkit-linear-gradient(top,#4b7d38,#406c30);background-image:-o-linear-gradient(top,#4b7d38,#406c30);background-image:linear-gradient(to bottom,#4b7d38,#406c30);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38',endColorstr='#ff406c30',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover .dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;overflow:visible \9;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 14px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^="icon-"]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:16px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#437d3a;*background-color:#387d3c;background-image:-moz-linear-gradient(top,#4b7d38,#387d3c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4b7d38),to(#387d3c));background-image:-webkit-linear-gradient(top,#4b7d38,#387d3c);background-image:-o-linear-gradient(top,#4b7d38,#387d3c);background-image:linear-gradient(to bottom,#4b7d38,#387d3c);background-repeat:repeat-x;border-color:#387d3c #387d3c #214823;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38',endColorstr='#ff387d3c',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#387d3c;*background-color:#306c34}.btn-primary:active,.btn-primary.active{background-color:#285a2c \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#4b7d38;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#6bb151;text-decoration:underline;background-color:transparent}.btn-group{position:relative;*margin-left:.3em;font-size:0;white-space:nowrap}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#387d3c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#4b7d38}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#4b7d38}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#4b7d38;border-bottom-color:#4b7d38}.nav .dropdown-toggle:hover .caret{border-top-color:#6bb151;border-bottom-color:#6bb151}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#eff4f7}.navbar-inner{min-height:60px;padding-right:20px;padding-left:20px;background-color:#121320;background-image:-moz-linear-gradient(top,#161726,#0d0d16);background-image:-webkit-gradient(linear,0 0,0 100%,from(#161726),to(#0d0d16));background-image:-webkit-linear-gradient(top,#161726,#0d0d16);background-image:-o-linear-gradient(top,#161726,#0d0d16);background-image:linear-gradient(to bottom,#161726,#0d0d16);background-repeat:repeat-x;border:1px solid #000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff161726',endColorstr='#ff0d0d16',GradientType=0);-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar .container{width:auto;padding-top:0}.nav-collapse.collapse{height:auto}.navbar .brand{display:block;float:left;padding:20px 20px 20px;margin-left:-20px;font-size:20px;font-weight:200;color:#c4c6dd;text-shadow:0 1px 0 #161726}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:60px}.navbar-link{color:#c4c6dd}.navbar-link:hover{color:#eff4f7}.navbar .divider-vertical{height:60px;margin:0 9px;border-right:1px solid #161726;border-left:1px solid #0d0d16}.navbar .btn,.navbar .btn-group{margin-top:16px}.navbar .btn-group .btn{margin:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:15px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:15px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner,.navbar-static-top .navbar-inner{border:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:20px 15px 20px;color:#c4c6dd;text-decoration:none;text-shadow:0 1px 0 #161726;border-top:2px #161726 solid}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#eff4f7;text-decoration:none;background-color:transparent;border-top-color:#eff4f7}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#eff4f7;text-decoration:none;background-color:#030306;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#09090f;*background-color:#030306;background-image:-moz-linear-gradient(top,#0d0d16,#030306);background-image:-webkit-gradient(linear,0 0,0 100%,from(#0d0d16),to(#030306));background-image:-webkit-linear-gradient(top,#0d0d16,#030306);background-image:-o-linear-gradient(top,#0d0d16,#030306);background-image:linear-gradient(to bottom,#0d0d16,#030306);background-repeat:repeat-x;border-color:#030306 #030306 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0d0d16',endColorstr='#ff030306',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#030306;*background-color:#000}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#000 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#eff4f7;background-color:#030306}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#c4c6dd;border-bottom-color:#c4c6dd}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#eff4f7;border-bottom-color:#eff4f7}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{height:40px;margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination li{display:inline}.pagination a,.pagination span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination a:hover,.pagination .active a,.pagination .active span{background-color:#f5f5f5}.pagination .active a,.pagination .active span{color:#999;cursor:default}.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999;cursor:default;background-color:transparent}.pagination li:first-child a,.pagination li:first-child span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination li:last-child a,.pagination li:last-child span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover{color:#999;cursor:default;background-color:#fff}.modal-open .dropdown-menu{z-index:2050}.modal-open .dropdown.open{*z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#eff4f7;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#e5edf2;border-bottom:1px solid #d4e1e9;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#4b7d38;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#161726}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit}.home-box.span4{height:0;overflow:hidden;opacity:0;-webkit-transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease;-moz-transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease;-o-transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease;transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease}#home-frameworks{-webkit-transition-delay:0;-moz-transition-delay:0;-ms-transition-delay:0;-o-transition-delay:0;transition-delay:0}#home-protocols{-webkit-transition-delay:200ms;-moz-transition-delay:200ms;-ms-transition-delay:200ms;-o-transition-delay:200ms;transition-delay:200ms}#home-tools{-webkit-transition-delay:400ms;-moz-transition-delay:400ms;-ms-transition-delay:400ms;-o-transition-delay:400ms;transition-delay:400ms}#home-community{-webkit-transition-delay:600ms;-moz-transition-delay:600ms;-ms-transition-delay:600ms;-o-transition-delay:600ms;transition-delay:600ms}#home-sandbox{-webkit-transition-delay:800ms;-moz-transition-delay:800ms;-ms-transition-delay:800ms;-o-transition-delay:800ms;transition-delay:800ms}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/static/css/font/fontawesome-webfont.eot b/static/css/font/fontawesome-webfont.eot
new file mode 100755
index 0000000000000000000000000000000000000000..89070c1e63c2703b2334023922ecc1664f759b55
Binary files /dev/null and b/static/css/font/fontawesome-webfont.eot differ
diff --git a/static/css/font/fontawesome-webfont.svg b/static/css/font/fontawesome-webfont.svg
new file mode 100755
index 0000000000000000000000000000000000000000..1245f92c2ed23560ac66e37c5e1382e70495e2b9
--- /dev/null
+++ b/static/css/font/fontawesome-webfont.svg
@@ -0,0 +1,255 @@
+<?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="FontAwesomeRegular" horiz-adv-x="1843" >
+<font-face units-per-em="2048" ascent="1536" descent="-512" />
+<missing-glyph horiz-adv-x="512" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="0" />
+<glyph unicode="&#xd;" horiz-adv-x="512" />
+<glyph unicode=" "  horiz-adv-x="512" />
+<glyph unicode="&#x09;" horiz-adv-x="512" />
+<glyph unicode="&#xa0;" horiz-adv-x="512" />
+<glyph unicode="o" horiz-adv-x="1591" />
+<glyph unicode="&#xa8;" horiz-adv-x="2048" />
+<glyph unicode="&#xa9;" horiz-adv-x="2048" />
+<glyph unicode="&#xae;" horiz-adv-x="2048" />
+<glyph unicode="&#xb4;" horiz-adv-x="2048" />
+<glyph unicode="&#xc6;" horiz-adv-x="2048" />
+<glyph unicode="&#xcd;" horiz-adv-x="2048" />
+<glyph unicode="&#x2000;" horiz-adv-x="784" />
+<glyph unicode="&#x2001;" horiz-adv-x="1569" />
+<glyph unicode="&#x2002;" horiz-adv-x="784" />
+<glyph unicode="&#x2003;" horiz-adv-x="1569" />
+<glyph unicode="&#x2004;" horiz-adv-x="523" />
+<glyph unicode="&#x2005;" horiz-adv-x="392" />
+<glyph unicode="&#x2006;" horiz-adv-x="261" />
+<glyph unicode="&#x2007;" horiz-adv-x="261" />
+<glyph unicode="&#x2008;" horiz-adv-x="196" />
+<glyph unicode="&#x2009;" horiz-adv-x="313" />
+<glyph unicode="&#x200a;" horiz-adv-x="87" />
+<glyph unicode="&#x202f;" horiz-adv-x="313" />
+<glyph unicode="&#x203a;" horiz-adv-x="2048" />
+<glyph unicode="&#x205f;" horiz-adv-x="392" />
+<glyph unicode="&#x2122;" horiz-adv-x="2048" />
+<glyph unicode="&#x221e;" horiz-adv-x="2048" />
+<glyph unicode="&#xe000;" horiz-adv-x="1024" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1536" d="M6 1489q20 47 70 47h1382q51 0 72 -47q20 -47 -17 -84l-610 -610v-641h248q33 0 55.5 -22.5t22.5 -53.5q0 -33 -22.5 -55.5t-55.5 -22.5h-768q-31 0 -53.5 22.5t-22.5 55.5q0 31 22.5 53.5t53.5 22.5h250v641l-610 610q-37 37 -17 84z" />
+<glyph unicode="&#xf001;" horiz-adv-x="1488" d="M0 213q0 57 27.5 103t72.5 77t98.5 47.5t106.5 16.5q25 0 50.5 -4t50.5 -11v779q0 27 16 48t43 29q23 6 99.5 29t178 52.5t215 62.5t211 60.5t164 46t74.5 18.5q35 0 58.5 -23.5t23.5 -58.5v-1028q0 -59 -27.5 -104.5t-73 -76t-99.5 -47t-105 -16.5t-105.5 16.5t-98.5 47 t-71.5 75.5t-27.5 105q0 57 27.5 103t71.5 77t98.5 47t105.5 16q27 0 52.5 -4t49.5 -10v537l-678 -195v-815q0 -59 -27.5 -104.5t-71.5 -76t-98.5 -47t-105.5 -16.5q-53 0 -106.5 16.5t-98.5 47t-72.5 76t-27.5 104.5z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1597" d="M0 901q0 137 52 258t143.5 212t212 143.5t258.5 52.5q137 0 257.5 -52.5t212 -143.5t143.5 -212t52 -258q0 -98 -28.5 -191.5t-81.5 -174.5l358 -359q18 -18 18 -47q0 -16 -18 -43t-45 -53.5t-53.5 -45t-42.5 -18.5q-29 0 -47 19l-359 358q-82 -53 -175 -81.5t-191 -28.5 q-137 0 -258 52t-212.5 143t-143.5 212t-52 258zM266 901q0 -84 32 -156.5t86 -126t127 -85t155 -31.5t154.5 31.5t126.5 85t86 126t32 156.5q0 82 -32 154.5t-86 127t-126.5 86t-154.5 31.5t-155 -31.5t-127 -86t-86 -127t-32 -154.5zM414 901q0 51 19.5 97t54 81t80 54.5 t98.5 19.5q20 0 34.5 -14.5t14.5 -36.5q0 -20 -14.5 -34.5t-34.5 -14.5q-63 0 -107.5 -44t-44.5 -108q0 -20 -14.5 -34.5t-34.5 -14.5q-23 0 -37 14.5t-14 34.5z" />
+<glyph unicode="&#xf003;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h1536v852q-31 -31 -58 -50q-106 -80 -212.5 -159.5t-211.5 -163.5q-61 -49 -131.5 -94t-156.5 -45q-82 0 -153 45t-132 94 q-104 84 -211 164t-213 159q-27 18 -57 50v-852zM154 1317q0 -31 14 -65.5t35.5 -66.5t47 -59.5t50.5 -46.5q100 -76 199.5 -150.5t199.5 -152.5q20 -16 48 -37.5t58 -42t59.5 -35t54.5 -14.5h2h2q25 0 54.5 14.5t59 35t57 42t48.5 37.5q100 78 199.5 153t199.5 150 q25 18 50.5 46t47 60t36 66.5t14.5 65.5v65h-1536v-65z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1802" d="M0 1073q0 113 34 205t97.5 155.5t153.5 98.5t202 35q59 0 117 -18.5t110 -48.5t99 -68.5t88 -77.5q39 39 87 77.5t100.5 68.5t109 48.5t115.5 18.5q113 0 204 -35t154.5 -98.5t97 -155.5t33.5 -205q0 -66 -18.5 -130t-51 -124.5t-74.5 -115t-87 -99.5l-615 -612 q-23 -23 -55 -23q-31 0 -57 23l-615 614q-45 45 -87 99.5t-73.5 114t-50 124t-18.5 129.5z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1675" d="M1 959.5q9 27.5 54 33.5l506 74l227 459q20 41 49 41t50 -41l227 -459l506 -74q45 -6 54 -33.5t-23 -60.5l-367 -356l86 -504q8 -45 -15.5 -62.5t-64.5 5.5l-452 237l-453 -237q-41 -23 -64.5 -5.5t-15.5 62.5l86 504l-364 356q-35 33 -26 60.5z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1675" d="M0 948q0 23 18.5 32t36.5 13l506 74l227 459q6 14 20 27.5t30 13.5q18 0 30.5 -13.5t18.5 -27.5l227 -459l506 -74q18 -4 36.5 -13t18.5 -32q0 -14 -7 -26.5t-17 -22.5l-367 -356l86 -504q0 -4 1 -9t1 -12q0 -20 -9 -34.5t-32 -14.5t-41 13l-452 237l-453 -237 q-18 -12 -39 -13q-23 0 -33 14.5t-10 34.5q0 6 1 11.5t1 9.5l86 504l-364 356q-10 10 -18.5 22.5t-8.5 26.5zM289 866l274 -268l-65 -377l340 178l340 -178l-66 377l274 268l-378 56l-170 344l-170 -344z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1566" d="M0 57v387q0 37 18.5 82t48 86t65.5 74t71 43q18 6 66 13.5t102.5 14.5t104.5 13t77 10q-92 59 -144.5 153.5t-52.5 205.5q0 88 34 165.5t91.5 136t135 92.5t165.5 34t166 -34t136.5 -92.5t92 -136t33.5 -165.5q0 -109 -52 -204.5t-144 -154.5q27 -4 77 -10t104 -13 t101 -14.5t68 -13.5q35 -10 70.5 -42t65.5 -74t48.5 -87t18.5 -82v-387q-10 -4 -22.5 -14t-27 -19.5t-27.5 -16.5t-22 -7h-1370q-35 0 -53 21.5t-45 35.5z" />
+<glyph unicode="&#xf008;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM115 154q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11t11.5 28v153q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11t-11.5 -28v-153zM115 512 q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11.5t11.5 27.5v154q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11.5t-11.5 -27.5v-154zM115 870q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11.5t11.5 27.5v154q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11.5t-11.5 -27.5v-154z M115 1229q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11t11.5 28v153q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11t-11.5 -28v-153zM461 154q0 -16 11 -27.5t28 -11.5h843q16 0 27.5 11t11.5 28v512q0 16 -11 27.5t-28 11.5h-843q-16 0 -27.5 -11.5t-11.5 -27.5v-512z M461 870q0 -16 11 -27.5t28 -11.5h843q16 0 27.5 11.5t11.5 27.5v512q0 16 -11 27.5t-28 11.5h-843q-16 0 -27.5 -11t-11.5 -28v-512zM1497 154q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11t11.5 28v153q0 16 -11.5 27.5t-27.5 11.5h-154q-16 0 -27.5 -11t-11.5 -28v-153 zM1497 512q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11.5t11.5 27.5v154q0 16 -11.5 27.5t-27.5 11.5h-154q-16 0 -27.5 -11.5t-11.5 -27.5v-154zM1497 870q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11.5t11.5 27.5v154q0 16 -11.5 27.5t-27.5 11.5h-154 q-16 0 -27.5 -11.5t-11.5 -27.5v-154zM1497 1229q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11t11.5 28v153q0 16 -11.5 27.5t-27.5 11.5h-154q-16 0 -27.5 -11t-11.5 -28v-153z" />
+<glyph unicode="&#xf009;" d="M0 78v536q0 33 22.5 55.5t55.5 22.5h690q33 0 55.5 -22.5t22.5 -55.5v-536q0 -33 -22.5 -55.5t-55.5 -22.5h-690q-33 0 -55.5 22.5t-22.5 55.5zM0 922v538q0 31 22.5 53.5t55.5 22.5h690q33 0 55.5 -22.5t22.5 -53.5v-538q0 -33 -22.5 -54.5t-55.5 -21.5h-690 q-33 0 -55.5 21.5t-22.5 54.5zM999 78v536q0 33 21.5 55.5t54.5 22.5h692q31 0 53.5 -22.5t22.5 -55.5v-536q0 -33 -22.5 -55.5t-53.5 -22.5h-692q-33 0 -54.5 22.5t-21.5 55.5zM999 922v538q0 31 21.5 53.5t54.5 22.5h692q31 0 53.5 -22.5t22.5 -53.5v-538 q0 -33 -22.5 -54.5t-53.5 -21.5h-692q-33 0 -54.5 21.5t-21.5 54.5z" />
+<glyph unicode="&#xf00a;" d="M0 78v270q0 33 22.5 54.5t55.5 21.5h358q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5zM0 655v226q0 33 22.5 54t55.5 21h358q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-358q-33 0 -55.5 22.5 t-22.5 54.5zM0 1188v272q0 31 22.5 53.5t55.5 22.5h358q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5zM666 78v270q0 33 22.5 54.5t54.5 21.5h359q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5 h-359q-33 0 -55 22.5t-22 55.5zM666 655v226q0 33 22.5 54t54.5 21h359q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-359q-33 0 -55 22.5t-22 54.5zM666 1188v272q0 31 22.5 53.5t54.5 22.5h359q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5 t-53.5 -22.5h-359q-33 0 -55 22.5t-22 55.5zM1331 78v270q0 33 22.5 54.5t55.5 21.5h358q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5zM1331 655v226q0 33 22.5 54t55.5 21h358q31 0 53.5 -21.5t22.5 -53.5v-226 q0 -33 -22.5 -55t-53.5 -22h-358q-33 0 -55.5 22.5t-22.5 54.5zM1331 1188v272q0 31 22.5 53.5t55.5 22.5h358q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5z" />
+<glyph unicode="&#xf00b;" d="M0 78v270q0 33 22.5 54.5t55.5 21.5h297q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5h-297q-33 0 -55.5 22.5t-22.5 55.5zM0 655v226q0 33 22.5 54t55.5 21h297q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-297q-33 0 -55.5 22.5 t-22.5 54.5zM0 1188v272q0 31 22.5 53.5t55.5 22.5h297q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5t-53.5 -22.5h-297q-33 0 -55.5 22.5t-22.5 55.5zM604 78v270q0 33 22.5 54.5t55.5 21.5h1085q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5 h-1085q-33 0 -55.5 22.5t-22.5 55.5zM604 655v226q0 33 22.5 54t55.5 21h1085q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-1085q-33 0 -55.5 22.5t-22.5 54.5zM604 1188v272q0 31 22.5 53.5t55.5 22.5h1085q31 0 53.5 -22.5t22.5 -53.5v-272 q0 -33 -22.5 -55.5t-53.5 -22.5h-1085q-33 0 -55.5 22.5t-22.5 55.5z" />
+<glyph unicode="&#xf00c;" d="M0 732.5q0 33.5 23 55.5l174 175q23 23 56.5 22.5t55.5 -22.5l365 -365q23 -23 56.5 -23t55.5 23l746 745q23 23 56.5 23t56.5 -23l174 -174q23 -23 22.5 -56.5t-22.5 -55.5l-910 -910q-23 -23 -62.5 -39t-72.5 -16h-88q-35 0 -75 16.5t-62 38.5l-526 529 q-23 23 -23 56.5z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1536" d="M0 192.5q0 38.5 29 67.5l508 510l-508 500q-29 29 -29 67.5t29 67.5l100 100q29 29 68 29t67 -29l504 -504l504 504q29 29 67.5 29t67.5 -29l100 -100q29 -29 29 -68t-29 -67l-508 -510l508 -500q29 -29 29 -66.5t-29 -66.5l-100 -102q-29 -29 -68 -29t-67 29l-504 505 l-506 -505q-29 -29 -66.5 -29t-66.5 29l-100 100q-29 29 -29 67.5z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1597" d="M0 901q0 137 52 258t143.5 212t212 143.5t258.5 52.5q137 0 259 -52.5t212 -143.5t142 -212t52 -258q0 -102 -28.5 -195.5t-81.5 -170.5l358 -359q18 -18 18 -46t-18 -48l-94 -94q-20 -18 -48 -18.5t-46 18.5l-359 358q-78 -53 -171 -81.5t-195 -28.5q-137 0 -258 52 t-212.5 142t-143.5 211t-52 260zM266 901q0 -84 32 -156.5t86 -126t127 -85t155 -31.5t155.5 31.5t126.5 85t85 126t32 156.5q0 82 -32 154.5t-85 127t-126.5 86t-155.5 31.5t-155 -31.5t-127 -86t-86 -127t-32 -154.5zM399 868v66q0 33 33 33h168v168q0 33 33 32h65 q14 0 24.5 -9t10.5 -23v-168h166q33 0 33 -33v-66q0 -14 -9.5 -24t-23.5 -10h-166v-166q0 -14 -10 -23.5t-25 -9.5h-65q-33 0 -33 33v166h-168q-14 0 -23.5 10t-9.5 24z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1597" d="M0 901q0 137 52 258t143.5 212t212 143.5t258.5 52.5q137 0 259 -52.5t212 -143.5t142 -212t52 -258q0 -102 -28.5 -195.5t-81.5 -170.5l358 -359q18 -18 18 -46t-18 -48l-94 -94q-20 -18 -48 -18.5t-46 18.5l-359 358q-78 -53 -171 -81.5t-195 -28.5q-137 0 -258 52 t-212.5 142t-143.5 211t-52 260zM266 901q0 -84 32 -156.5t86 -126t127 -85t155 -31.5t155.5 31.5t126.5 85t85 126t32 156.5q0 82 -32 154.5t-85 127t-126.5 86t-155.5 31.5t-155 -31.5t-127 -86t-86 -127t-32 -154.5zM399 868v66q0 33 33 33h467q33 0 33 -33v-66 q0 -14 -9.5 -24t-23.5 -10h-467q-14 0 -23.5 10t-9.5 24z" />
+<glyph unicode="&#xf011;" horiz-adv-x="1488" d="M0 713q0 186 86 349t240 267q12 10 28 6q18 -4 25 -16l90 -131q10 -12 6 -27.5t-16 -25.5q-106 -72 -164.5 -182.5t-58.5 -239.5q0 -104 39.5 -197.5t108.5 -162t162 -108.5t197 -40t197.5 40t163.5 108.5t109.5 161.5t39.5 198q0 129 -59 239.5t-164 182.5 q-14 10 -16 24q-4 16 6 29l88 131q10 12 25.5 15t29.5 -5q154 -104 240 -267t86 -349q0 -154 -58.5 -289t-160 -236.5t-237.5 -160t-290 -58.5t-289 58.5t-236 160t-159.5 236.5t-58.5 289zM627 793v704q0 16 11 27.5t28 11.5h157q16 0 27.5 -11.5t11.5 -27.5v-704 q0 -16 -11 -27.5t-28 -11.5h-157q-16 0 -27.5 11t-11.5 28z" />
+<glyph unicode="&#xf012;" d="M0 39v260q0 16 11.5 27.5t27.5 11.5h192q16 0 26.5 -11.5t10.5 -27.5v-260q0 -16 -10 -27.5t-27 -11.5h-192q-39 0 -39 39zM393 39v434q0 16 11.5 27.5t27.5 11.5h193q16 0 26.5 -11.5t10.5 -27.5v-434q0 -16 -10.5 -27.5t-26.5 -11.5h-193q-16 0 -27.5 11.5t-11.5 27.5z M786 39v676q0 16 11.5 27.5t27.5 11.5h193q16 0 27.5 -11.5t11.5 -27.5v-676q0 -16 -11.5 -27.5t-27.5 -11.5h-193q-16 0 -27.5 11.5t-11.5 27.5zM1182 39v995q0 16 10 27.5t27 11.5h192q16 0 27.5 -11t11.5 -28v-995q0 -16 -11.5 -27.5t-27.5 -11.5h-192q-16 0 -26.5 11.5 t-10.5 27.5zM1575 39v1458q0 39 39 39h190q39 0 39 -39v-1458q0 -39 -39 -39h-190q-39 0 -39 39z" />
+<glyph unicode="&#xf013;" horiz-adv-x="1593" d="M0 651v236q0 12 30.5 21.5t68.5 15.5t74 9t48 5q18 61 49 117q-55 82 -120 157l-7 15q0 8 28 38.5t62.5 65.5t66.5 62.5t40 27.5q2 0 26.5 -18.5t54.5 -41t56.5 -43t32.5 -24.5q29 16 58.5 26.5t60.5 20.5q0 12 3 49t9 75t15.5 69t21.5 31h237q14 0 19 -15 q12 -49 17 -103t14 -106q31 -8 59.5 -19t56.5 -28q8 6 34 26.5t55.5 43t53 40t29.5 17.5t37 -27.5t65 -62.5t61.5 -65.5t27.5 -38.5q0 -4 -17.5 -28.5t-39 -53.5t-42 -55.5t-24.5 -32.5q33 -55 51 -123q49 -10 103.5 -13t101.5 -20q16 -4 16 -18v-236q0 -12 -29.5 -21.5 t-68.5 -15.5t-76 -9t-49 -5q-14 -57 -47 -117q55 -82 121 -157l6 -15q0 -8 -27.5 -38.5t-62.5 -65.5t-66.5 -62.5t-40.5 -27.5q-2 0 -26.5 18.5t-54 41t-56 43t-33.5 24.5q-29 -16 -58.5 -27.5t-59.5 -19.5q-2 -12 -5.5 -49.5t-9.5 -76t-14 -69.5t-21 -31h-237q-14 0 -19 17 q-14 49 -19 103t-11 103q-61 18 -117 50q-41 -31 -81 -60.5t-79 -62.5l-12 -4q-6 0 -37 27.5t-64.5 62.5t-61 65.5t-27.5 38.5q0 2 16 26.5t37.5 53.5t42 55.5t26.5 34.5q-33 55 -51 123q-51 10 -104.5 13t-100.5 20q-16 4 -16 18zM557 768q0 -49 18.5 -93t51 -77t77 -52.5 t93.5 -19.5t93 19.5t75.5 52.5t51 77t19.5 93t-19.5 92t-51 76t-75.5 51.5t-93 18.5t-93.5 -18.5t-77 -51.5t-51 -76t-18.5 -92z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1304" d="M0 1175.5v34.5v36t2 36q25 14 71 23.5t98 15.5t102.5 9t78.5 5q-8 82 11.5 128t59.5 68.5t98.5 29t131.5 6.5q55 0 109.5 -3t97.5 -20.5t68.5 -54.5t25.5 -105v-24t-2 -25q29 -2 79 -5t102.5 -9t99.5 -15.5t72 -23.5v-72v-69q-37 -20 -123 -32.5t-185.5 -19t-193.5 -7.5 t-150 -1q-55 0 -150 1t-194.5 7.5t-184.5 18.5t-122 33q-2 16 -2 34.5zM133 154v837q123 -16 244 -21t244 -5h32q129 2 258 6t258 20v-837q0 -63 -44 -108.5t-107 -45.5h-731q-63 0 -108.5 45t-45.5 109zM303 199q0 -16 10.5 -26.5t26.5 -10.5h39q16 0 27.5 10t11.5 27v614 q0 16 -11.5 27.5t-27.5 11.5h-39q-16 0 -26.5 -11.5t-10.5 -27.5v-614zM504 1384q0 -10 1 -22t3 -23q144 2 291 0q0 12 2 23.5t0 21.5v15q-35 10 -74 11t-74 1q-37 0 -75.5 -1t-73.5 -11v-15zM596 199q0 -16 10 -26.5t27 -10.5h39q16 0 27.5 10t11.5 27v614q0 16 -11.5 27.5 t-27.5 11.5h-39q-16 0 -26.5 -11.5t-10.5 -27.5v-614zM887 199q0 -16 11 -26.5t28 -10.5h39q16 0 27.5 10t11.5 27v614q0 16 -11.5 27.5t-27.5 11.5h-39q-16 0 -27.5 -11.5t-11.5 -27.5v-614z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1880" d="M0 809.5q2 15.5 14 26.5l867 710q27 20 59 21q33 0 59 -21l240 -196v102q0 16 11.5 27.5t27.5 11.5h223q16 0 26.5 -11.5t10.5 -27.5v-348l328 -268q12 -10 14 -25.5t-8 -28.5l-45 -53q-10 -14 -29 -14h-65q-16 0 -25 8l-743 608q-25 20 -50 0l-743 -608q-8 -8 -25 -8 h-65q-18 0 -29 14l-45 53q-10 12 -8 27.5zM266 76v622l674 553l674 -553v-622q0 -33 -21.5 -54.5t-54.5 -21.5h-422v498h-352v-498h-422q-33 0 -54.5 21.5t-21.5 54.5z" />
+<glyph unicode="&#xf016;" horiz-adv-x="1228" d="M0 78v1382q0 31 22.5 53.5t55.5 22.5h614q33 0 71 -16.5t60 -38.5l351 -351q23 -23 39 -60.5t16 -70.5v-921q0 -33 -22.5 -55.5t-53.5 -22.5h-1075q-33 0 -55.5 22.5t-22.5 55.5zM154 154h921v692h-459q-31 0 -53 22.5t-22 55.5v458h-387v-1228zM268 326v116h693v-116 h-693zM268 596v115h693v-115h-693zM694 999h381q0 4 -4 13.5t-6 11.5l-350 348q-2 4 -9.5 6t-11.5 4v-383z" />
+<glyph unicode="&#xf017;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM635 608v465q0 33 23.5 56.5t56.5 23.5h80q35 0 57 -23.5t22 -56.5v-305h201q33 0 56.5 -23.5t23.5 -56.5v-80q0 -33 -23.5 -56.5t-56.5 -23.5h-360q-33 0 -56.5 23.5 t-23.5 56.5z" />
+<glyph unicode="&#xf018;" d="M2 35l594 1466q6 14 21.5 24.5t31.5 10.5h195l-8 -170h172l-9 170h195q16 0 31.5 -10t21.5 -25l594 -1466q6 -14 -1 -24.5t-23 -10.5h-740l-26 512h-258l-27 -512h-739q-16 0 -23.5 10t-1.5 25zM807 797h229l-20 413h-189z" />
+<glyph unicode="&#xf019;" d="M0 39v614q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-346h1229v346q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-614q0 -39 -39 -39h-1765q-39 0 -39 39zM345.5 944.5q6.5 16.5 39.5 16.5h307v499q0 31 21.5 53.5t54.5 22.5h307q33 0 55.5 -22.5 t22.5 -53.5v-499h307q31 0 37 -16.5t-16 -39.5l-504 -506q-23 -23 -55.5 -22.5t-55.5 22.5l-504 506q-23 23 -16.5 39.5z" />
+<glyph unicode="&#xf01a;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM414 743q10 25 37 25h208v358q0 16 11.5 28.5t27.5 12.5h201q16 0 27.5 -12t11.5 -29v-358h209q27 0 37 -25t-10 -43l-347 -346q-14 -10 -28 -10t-29 10l-346 346 q-20 18 -10 43z" />
+<glyph unicode="&#xf01b;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177 120t-218 44t-218.5 -44t-177 -120t-119.5 -177t-44 -218zM414 793q-10 25 10 43l346 346q14 10 29 10q14 0 28 -10l347 -346q20 -18 10 -43t-37 -25h-209v-360q0 -16 -11.5 -27.5t-27.5 -11.5h-201q-16 0 -27.5 11t-11.5 28v360h-208 q-27 0 -37 25z" />
+<glyph unicode="&#xf01c;" d="M0 78v577q0 33 9 76t22 72l284 663q12 29 44 49.5t63 20.5h999q31 0 63 -20.5t44 -49.5l284 -663q12 -29 21.5 -72t9.5 -76v-577q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM238 694h387l114 -231h383l117 231h367q-2 4 -2 9.5t-2 9.5l-256 594 h-848l-256 -596q-2 -2 -2 -7.5t-2 -9.5z" />
+<glyph unicode="&#xf01d;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM582 453v628q0 18 16 29q20 8 31 0l545 -315q16 -6 16 -27q0 -20 -16 -27l-545 -315q-8 -4 -15 -4q-8 0 -16 4q-16 10 -16 27z" />
+<glyph unicode="&#xf01e;" horiz-adv-x="1591" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5q141 0 271 -48.5t239 -140.5l161 162q35 35 58.5 24.5t23.5 -57.5v-463q0 -33 -22 -55q-10 -10 -23.5 -16t-29.5 -6h-463q-47 0 -58.5 23.5t23.5 58.5l160 159q-72 57 -159 88t-181 31q-117 0 -218.5 -44t-177 -120 t-119.5 -177t-44 -218t44 -218t119.5 -177t177 -120t218.5 -44q104 0 198.5 37t169 101.5t123.5 153.5t64 191q0 16 14 27q14 10 31 8l157 -20q16 -4 26.5 -16.5t8.5 -28.5q-20 -147 -89.5 -274.5t-176 -220.5t-242 -145.5t-284.5 -52.5q-166 0 -311.5 62.5t-254 171 t-171 254t-62.5 311.5z" />
+<glyph unicode="&#xf021;" horiz-adv-x="1916" d="M6 311l150 437q10 33 39 45t59 4l438 -150q45 -16 46 -40.5t-42 -47.5l-202 -100q53 -78 123.5 -134.5t160.5 -86.5q111 -37 221.5 -28t207 56t170 129t110.5 193q6 16 20.5 22t30.5 2l152 -51q16 -6 23 -20.5t1 -30.5q-53 -158 -159.5 -274.5t-243.5 -184t-296 -81 t-315 39.5q-135 47 -241.5 134t-179.5 208l-205 -100q-43 -23 -63.5 -5.5t-4.5 64.5zM203 1024q53 156 159.5 273.5t243.5 185t295 81t316 -39.5q133 -47 240.5 -134t180.5 -208l205 100q43 23 63.5 5.5t4.5 -62.5l-150 -439q-10 -33 -39 -45t-59 -4l-438 150 q-45 16 -46 40.5t40 47.5l202 100q-51 78 -122.5 134.5t-159.5 86.5q-111 37 -221.5 28t-207 -56t-170 -129t-110.5 -193q-6 -16 -20.5 -22t-30.5 -2l-152 51q-16 6 -23 20.5t-1 30.5z" />
+<glyph unicode="&#xf022;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h1536v1075h-1536v-1075zM307 346v76q0 39 39 39h154q16 0 27.5 -11.5t11.5 -27.5v-76q0 -16 -11.5 -27.5t-27.5 -11.5h-154q-39 0 -39 39 zM307 653v76q0 39 39 39h154q16 0 27.5 -11.5t11.5 -27.5v-76q0 -16 -11.5 -27.5t-27.5 -11.5h-154q-39 0 -39 39zM307 961v75q0 39 39 39h154q16 0 27.5 -11t11.5 -28v-75q0 -16 -11.5 -27.5t-27.5 -11.5h-154q-39 0 -39 39zM692 346v76q0 16 10.5 27.5t26.5 11.5h768 q39 0 39 -39v-76q0 -39 -39 -39h-768q-16 0 -26.5 11.5t-10.5 27.5zM692 653v76q0 16 10.5 27.5t26.5 11.5h768q39 0 39 -39v-76q0 -39 -39 -39h-768q-16 0 -26.5 11.5t-10.5 27.5zM692 961v75q0 16 10.5 27.5t26.5 11.5h768q39 0 39 -39v-75q0 -39 -39 -39h-768 q-16 0 -26.5 11t-10.5 28z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1253" d="M0 117v626q0 39 21.5 69t56.5 42v164q0 113 43 213t117.5 175t175 118t213.5 43t213 -43t175 -118t118 -175.5t43 -212.5v-164q35 -12 56 -42t21 -69v-626q0 -47 -34.5 -82t-81.5 -35h-1020q-47 0 -82 35t-35 82zM313 862h627v156q0 66 -24.5 123t-67.5 99t-100.5 66.5 t-120.5 24.5q-66 0 -122 -24.5t-99.5 -66.5t-68 -99.5t-24.5 -122.5v-156zM494 164h266l-66 285q29 18 47.5 48.5t18.5 65.5q0 55 -39 95t-94 40t-94 -40t-39 -95q0 -35 18 -65.5t47 -46.5z" />
+<glyph unicode="&#xf024;" d="M0 1382q0 63 45 108.5t109 45.5q63 0 108 -45.5t45 -108.5q0 -41 -20.5 -74.5t-55.5 -56.5v-1212q0 -16 -11 -27.5t-27 -11.5h-78q-16 0 -26.5 11.5t-10.5 27.5v1212q-35 23 -56.5 56.5t-21.5 74.5zM307 416v745q0 33 19.5 66t48.5 49q104 55 188 86t144 45q70 16 124 18 q68 0 124.5 -11t107.5 -29.5t99 -43t100 -51.5q63 -29 145 -33q70 -4 164 15.5t207 87.5q29 16 47 6t18 -43v-748q0 -31 -18.5 -64.5t-46.5 -49.5q-113 -68 -207 -87.5t-164 -15.5q-82 4 -145 33q-51 27 -99.5 51.5t-99.5 43t-107.5 29.5t-124.5 11q-55 -2 -124 -18 q-59 -14 -143.5 -45t-188.5 -88q-29 -16 -48.5 -4t-19.5 45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1916" d="M0 729q0 172 85 324.5t221 266.5t307 180.5t345 66.5t345.5 -66.5t307.5 -180.5t221 -266.5t85 -326.5q0 -182 -78 -350l-27 -60l-174 -26q-27 -104 -110.5 -173t-196.5 -69v-41q0 -16 -12 -27.5t-29 -11.5h-80q-16 0 -27.5 11.5t-11.5 27.5v719q0 16 11.5 28.5 t27.5 12.5h80q16 0 28.5 -12.5t12.5 -28.5v-39q88 0 161 -44t114 -116l39 7q33 90 32 192q0 125 -65.5 233.5t-170 190.5t-232.5 129t-251 47t-250.5 -47t-232 -128t-170 -190.5t-65.5 -232.5q0 -104 32 -194l39 -7q41 72 114 116t161 44v39q0 16 12 28.5t29 12.5h80 q16 0 27 -12.5t11 -28.5v-719q0 -16 -11 -27.5t-27 -11.5h-80q-16 0 -28.5 11.5t-12.5 27.5v41q-55 0 -106.5 18.5t-91.5 50.5t-68.5 76t-40.5 97l-175 26l-26 60q-78 168 -78 352z" />
+<glyph unicode="&#xf026;" horiz-adv-x="905" d="M0 578v380q0 16 11.5 27.5t27.5 11.5h420l325 326q49 51 84 37t35 -86v-1012q0 -72 -34.5 -86t-84.5 37l-325 326h-420q-16 0 -27.5 11t-11.5 28z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1277" d="M0 578v380q0 16 11.5 27.5t27.5 11.5h420l325 326q49 51 84 37t35 -86v-1012q0 -72 -34.5 -86t-84.5 37l-325 326h-420q-16 0 -27.5 11t-11.5 28zM1027 406q-9 32 7 61q84 145 84 301t-84 301q-16 29 -7 61t38 48t60.5 8t48.5 -37q104 -182 104 -381q0 -201 -104 -381 q-23 -41 -70 -41q-20 0 -39 12q-29 16 -38 48z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1916" d="M0 578v380q0 16 11.5 27.5t27.5 11.5h420l325 326q49 51 84 37t35 -86v-1012q0 -72 -34.5 -86t-84.5 37l-325 326h-420q-16 0 -27.5 11t-11.5 28zM1027 406q-9 32 7 61q84 145 84 301t-84 301q-16 29 -7 61t38 48t60.5 8t48.5 -37q104 -182 104 -381q0 -201 -104 -381 q-23 -41 -70 -41q-20 0 -39 12q-29 16 -38 48zM1285 219q-7 33 11 62q141 225 142 487q0 262 -142 487q-18 29 -11 62t36 49q29 18 61 11t50 -36q82 -131 123.5 -275t41.5 -298q0 -309 -167 -573q-10 -18 -29 -27.5t-37 -9.5q-25 0 -43 12q-29 16 -36 49zM1540 33 q-6 33 12 59q100 154 152.5 325t52.5 351t-52 351t-153 323q-18 29 -12 61.5t35 50.5q29 16 61 10.5t50 -32.5q115 -174 173 -366.5t58 -397.5t-58.5 -397.5t-172.5 -364.5q-10 -18 -29 -27.5t-37 -9.5q-25 0 -45 13q-29 18 -35 51z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1536" d="M0 0v698h698v-698h-698zM0 838v698h698v-698h-698zM139 139h420v420h-420v-420zM139 977h420v420h-420v-420zM279 279v141h141v-141h-141zM279 1116v139h141v-139h-141zM838 0v698h417v-139h142v139h139v-419h-420v139h-139v-418h-139zM838 838v698h698v-698h-698z M977 977h420v420h-420v-420zM1116 0v139h139v-139h-139zM1116 1116v139h139v-139h-139zM1397 0v139h139v-139h-139z" />
+<glyph unicode="&#xf02a;" d="M0 0v1536h154v-1536h-154zM227 0v1536h37v-1536h-37zM356 0v1536h117v-1536h-117zM545 0v1536h78v-1536h-78zM715 0v1536h76v-1536h-76zM903 0v1536h37v-1536h-37zM1014 0v1536h153v-1536h-153zM1221 0v1536h77v-1536h-77zM1409 0v1536h39v-1536h-39zM1579 0v1536h37 v-1536h-37zM1690 0v1536h153v-1536h-153z" />
+<glyph unicode="&#xf02b;" horiz-adv-x="1488" d="M0 961v454q0 49 35 85t86 36h454q51 0 113 -24.5t94 -61.5l672 -748q33 -39 34 -88t-34 -84l-526 -526q-35 -35 -86 -36t-86 36l-670 750q-35 37 -60.5 96t-25.5 111zM197 1223q0 -49 33.5 -83t82.5 -34t83 34t34 83t-34 82.5t-83 33.5t-82.5 -33.5t-33.5 -82.5z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1875" d="M0 961v454q0 49 35 85t86 36h454q25 0 53.5 -6t57.5 -18.5t54.5 -28t41.5 -33.5l670 -748q33 -37 34 -86t-34 -84l-526 -524q-35 -35 -86.5 -37t-83.5 37l-670 746q-35 39 -60.5 98t-25.5 109zM195 1223q0 -47 34.5 -82t83.5 -35q47 0 82 35t35 82q0 49 -35 83.5 t-82 34.5q-49 0 -83.5 -34.5t-34.5 -83.5zM791 1534h174q51 0 112.5 -24.5t93.5 -61.5l670 -748q35 -37 35 -87t-35 -85l-524 -524q-35 -35 -86 -36t-86 36l-12 14l514 514q35 35 34.5 84.5t-34.5 85.5l-670 748q-31 35 -84 56.5t-102 27.5z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1710" d="M10 311q2 16 4 31.5t4 34.5q0 10 -4 20.5t-2 20.5q2 16 15.5 31.5t25.5 35.5q23 37 45.5 90.5t32.5 92.5q4 16 -1 30.5t-1 26.5q4 16 16.5 27.5t20.5 23.5q10 18 21.5 42t21.5 49.5t16 50t8 40.5t-2 33t0 29q6 16 20.5 26.5t24.5 24.5q10 12 21.5 34.5t23 49.5t19.5 52.5 t10 45.5q2 12 -4 24.5t-2 27.5q4 14 18.5 29.5t26.5 31.5q16 25 28.5 58.5t30 61t46 43t77.5 1.5l-2 -4q31 10 54 10h780q78 0 119 -57q41 -53 18 -129l-283 -906q-18 -63 -77.5 -107t-126.5 -44h-893q-10 0 -20.5 -2t-18.5 -12q-12 -20 0 -56q16 -43 60 -75.5t87 -32.5h946 q29 0 57.5 21.5t37.5 47.5l309 987q4 16 5 29.5t-1 28.5q41 -14 61 -43q41 -53 19 -129l-283 -905q-18 -66 -77.5 -109t-127.5 -43h-946q-41 0 -79.5 14.5t-73.5 39t-61.5 58t-41.5 72.5q-25 68 -2 127zM500 961q-10 -39 26 -39h615q16 0 30.5 11t18.5 28l24 75 q4 16 -3 27.5t-23 11.5h-615q-16 0 -31.5 -11t-19.5 -28zM569 1190q-4 -16 3.5 -26.5t23.5 -10.5h614q16 0 30.5 10.5t21.5 26.5l22 78q4 16 -3 27.5t-24 11.5h-614q-16 0 -30.5 -11.5t-20.5 -27.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1253" d="M0 84v1337q0 47 34 81t81 34h1024q47 0 80.5 -34t33.5 -81v-1337q0 -47 -33.5 -81t-80.5 -34t-80 33l-432 432l-432 -432q-33 -33 -80 -33t-81 34t-34 81z" />
+<glyph unicode="&#xf02f;" d="M0 39v346q0 47 18.5 89t50 73t73.5 49t89 18h1383q47 0 89 -18t72.5 -49t49 -73t18.5 -89v-346q0 -39 -39 -39h-1765q-39 0 -39 39zM268 193q0 -16 11.5 -26.5t27.5 -10.5h1229q16 0 27.5 10t11.5 27v38q0 16 -11.5 27.5t-27.5 11.5h-1229q-16 0 -27.5 -11t-11.5 -28v-38 zM307 729v731q0 31 22.5 53.5t55.5 22.5h651v-383q0 -49 34 -83t81 -34h385v-307h-1229zM1151 1153v383l385 -383h-385z" />
+<glyph unicode="&#xf030;" d="M0 115v1075q0 47 34 82t81 35h366l58 125q18 43 66 73.5t95 30.5h443q47 0 95 -30.5t67 -73.5l57 -125h367q47 0 80.5 -35t33.5 -82v-1075q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM442 653q0 -100 38 -187t102.5 -152.5t153 -103.5t186.5 -38t186 38 t152.5 103.5t102.5 152.5t38 187q0 98 -38 186.5t-102.5 153t-152.5 102.5t-186 38t-186.5 -38t-153 -102.5t-102.5 -152.5t-38 -187zM596 653q0 68 25.5 127.5t69.5 103.5t103.5 69.5t127.5 25.5t127 -25.5t103 -69.5t69.5 -103.5t25.5 -127.5t-25.5 -127t-69.5 -104 t-103.5 -70.5t-126.5 -25.5q-68 0 -127.5 25.5t-103.5 70.5t-69.5 104.5t-25.5 126.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1644" d="M0 0l2 80q10 4 29.5 8t48.5 8q92 18 108 33q16 10 50 68l233 614l277 725h73h53l11 -20l202 -482q33 -78 64 -151.5t59 -145.5q29 -72 52.5 -130t42.5 -103q12 -29 28.5 -70t36.5 -94q23 -66 64 -150q25 -49 34 -57q20 -18 68 -24q25 -2 49.5 -9.5t52.5 -17.5 q6 -37 7 -55v-10.5t-3 -16.5q-43 0 -90 2t-98 6q-53 4 -99 6t-87 2h-80t-53 -2l-199 -10l-57 -2q0 20 1 39.5t3 38.5l129 26q57 14 67 25q12 8 13 27q0 14 -7 30l-47 115l-90 227l-446 2q-12 -29 -37 -96t-66 -178q-23 -63 -22 -84q0 -27 16 -43q14 -10 40 -17.5t63 -13.5 q14 -4 84 -12v-59q0 -16 -2 -27q-35 0 -121 5t-224 16l-49 -9q-43 -8 -83 -11t-81 -3h-20zM549 655q135 -2 216 -4t105 0l29 2q-18 51 -40.5 111.5t-51.5 130.5t-51.5 122t-38.5 87z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1419" d="M0 0l2 94q27 6 68 12q39 6 69.5 13.5t55.5 17.5q8 14 13 26.5t7 24.5q6 33 8 81t2 112l-2 498q-2 39 -3 139t-5 266q-4 88 -12 109q-4 8 -13 10q-20 14 -69 16q-23 0 -115 13l-4 84l262 6l383 12h45q8 2 15.5 2h13.5t21.5 -1t39.5 -1h76q92 0 193 -27q18 -4 42.5 -13 t53.5 -26q63 -31 104 -75q45 -47 66 -105q10 -29 15 -58.5t5 -62.5q0 -72 -32 -129q-31 -57 -95 -104q-16 -12 -54 -30.5t-97 -47.5q178 -41 268 -145q92 -104 92 -236q0 -72 -28 -162q-23 -66 -72 -116q-66 -72 -141 -109q-78 -35 -205 -59q-70 -12 -199 -11l-199 5 q-63 2 -138 -2.5t-163 -10.5q-25 -2 -93 -4t-181 -6zM537 1419q0 -12 1 -31.5t3 -44.5q2 -51 4 -119.5t0 -158.5v-98v-78q25 -4 52.5 -6t57.5 -2q176 0 267 65q90 66 90 225q0 113 -86 187q-84 76 -258 76q-53 0 -131 -15zM545 457l4 -271q0 -16 10 -43q74 -33 141 -32 q131 0 220 41q82 39 122 112q18 37 28.5 82t10.5 100q0 113 -43 181q-59 94 -141 125q-80 33 -250 32q-37 0 -61.5 -3t-40.5 -7v-143v-174z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1054" d="M0 0l18 84q12 4 32 9t46 11q41 10 71 19.5t50 19.5q29 39 41 103l29 137l57 268l12 64q23 119 41.5 178t18.5 63l30 156l17 64l22 135l9 49v39q-45 23 -148 28q-14 0 -23.5 1.5t-17.5 1.5l21 104l325 -14q31 -2 49.5 -2h26.5q35 0 89 2t132 6q41 4 68.5 6t38.5 2 q-2 -10 -3 -19.5t-3 -19.5q-4 -10 -7.5 -22.5t-7.5 -28.5q-49 -16 -110 -31q-66 -16 -105 -31q-12 -33 -24 -88q-6 -25 -9.5 -45t-5.5 -37q-23 -100 -40 -175.5t-27 -129.5l-64 -311l-39 -158l-43 -235l-14 -45v-10.5t2 -16.5q35 -8 64.5 -13t58.5 -9q4 0 21.5 -2.5 l45.5 -6.5q-2 -18 -3 -32.5t-3 -26.5q-2 -6 -4 -16.5t-6 -22.5q-8 0 -14 -1t-10 -1q-18 -2 -28.5 -2h-14.5h-11.5t-17.5 4q-8 0 -45 4t-105 12l-202 2q-61 0 -181 -12q-39 -4 -63.5 -6t-36.5 -2z" />
+<glyph unicode="&#xf034;" d="M0 1151q14 37 34.5 110.5t45.5 184.5q8 33 13 54.5t9 31.5h58q4 -6 6 -10t4 -9q29 -57 41 -71q16 -4 129 -4q35 0 66.5 1t60.5 1l20 2l113 2l213 -2h289l55 10q10 8 27 53q2 6 4 12.5t6 16.5l43 2h10.5t16.5 -2q2 -39 1 -97.5t1 -138.5v-100v-57q0 -14 -1 -27.5t-3 -23.5 q-20 -8 -37 -11.5t-31 -7.5q-27 51 -53 129q-29 82 -37 92q-12 14 -27 21q-10 4 -60 4h-138h-31t-35 -4q-6 -43 -6 -72l2 -151v-334l2 -359v-147q0 -72 10 -117q8 -4 21.5 -8t34.5 -8q4 0 21 -4t50 -13q27 -10 49 -18q4 -20 4 -33.5v-17.5v-11.5t-2 -17.5h-34q-47 0 -88 2 t-76 6t-95.5 6t-148.5 2q-16 0 -57 -4t-109 -10q-29 -2 -45 -3t-24 -1q0 10 -1.5 16.5t-1.5 10.5l-2 24v10q18 31 80 50q94 27 135 49q4 10 6.5 25.5t4.5 31.5q4 68 6 176.5t0 255.5l-4 428q-2 90 -2 142.5t-4 72.5q0 8 -7 15q-4 6 -12 6q-16 4 -63 4h-127q-90 0 -119 -21 q-41 -29 -121 -153q-23 -35 -35 -35q-23 12 -36 23.5t-19 19.5zM1383 1305.5q-5 13.5 14 33.5l184 185q14 12 33 12q14 0 31 -12l184 -185q18 -20 13 -33.5t-34 -13.5h-118v-1048h118q29 0 34 -13.5t-13 -31.5l-184 -187q-16 -12 -33 -12q-16 0 -31 12l-184 187 q-18 18 -13 31.5t31 13.5h121v1048h-121q-27 0 -32 13.5z" />
+<glyph unicode="&#xf035;" horiz-adv-x="1536" d="M0 233q0 18 12 31l187 185q18 20 31.5 14t13.5 -33v-121h1048v121q0 27 13.5 33t33.5 -14l185 -185q12 -12 12 -31q0 -18 -12 -30l-185 -187q-20 -18 -33.5 -13t-13.5 34v119h-1048v-119q0 -29 -13.5 -34t-31.5 13l-187 187q-12 12 -12 30zM0 1233q14 29 33.5 87 t44.5 146q6 27 11 43.5t9 26.5h56q8 -12 10 -14q27 -47 37 -58q2 0 35.5 -1t77.5 -1h90.5h74.5h123l19 2h108h203h416l53 6q12 10 24 46l4.5 9l6.5 13h39h28v-188v-80v-45q0 -12 -1 -21.5t-3 -19.5q-33 -10 -63 -15q-25 37 -52 103q-27 59 -34 74q-12 10 -27 14q-6 2 -42 3 t-85 1h-103.5h-97.5h-28.5t-34.5 -2q-2 -18 -3 -32.5t-1 -24.5l4 -445l-2 -119q0 -61 12 -92q12 -6 53 -12q4 0 20.5 -4t45.5 -10q14 -4 26.5 -7.5t22.5 -7.5q2 -16 3 -25.5t1 -13.5t-1 -10t-1 -14h-33q-94 0 -157 6q-66 6 -236 6q-14 0 -53 -3t-105 -7q-27 -2 -43 -3 t-24 -1q0 16 -2 20v21v8q20 27 73 39q90 20 132 41q4 8 6 19t4 26q0 18 1 70.5t1 120t-1 142t-2 139t-2 107.5t-1 47q0 8 -6 13q-2 2 -13 6q-14 2 -59 2h-123q-20 0 -62 -1t-85 -2t-78 -4t-41 -7q-41 -25 -117 -123q-20 -29 -33 -29q-23 10 -35 19.5t-18 15.5z" />
+<glyph unicode="&#xf036;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t55.5 22.5h1075q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1075 q-33 0 -55.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t55.5 22.5h1536q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1536q-33 0 -55.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t55.5 22.5h921q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-921q-33 0 -55.5 22.5t-22.5 52.5z" />
+<glyph unicode="&#xf037;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM78 922v114q0 33 21.5 55.5t54.5 22.5h1536q33 0 55 -22.5t22 -55.5v-114q0 -33 -22.5 -54.5t-54.5 -21.5h-1536 q-33 0 -54.5 21.5t-21.5 54.5zM307 500v114q0 33 22.5 55.5t55.5 22.5h1075q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1075q-33 0 -55.5 22.5t-22.5 55.5zM385 1343v117q0 31 21.5 53.5t54.5 22.5h921q33 0 55.5 -22.5t22.5 -53.5v-117 q0 -31 -22.5 -53t-55.5 -22h-921q-33 0 -54.5 22.5t-21.5 52.5z" />
+<glyph unicode="&#xf038;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM154 922v114q0 33 22.5 55.5t54.5 22.5h1536q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1536 q-33 0 -55 21.5t-22 54.5zM614 500v114q0 33 22.5 55.5t55.5 22.5h1075q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1075q-33 0 -55.5 22.5t-22.5 55.5zM768 1343v117q0 31 22.5 53.5t55.5 22.5h921q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-921q-33 0 -55.5 22.5t-22.5 52.5z" />
+<glyph unicode="&#xf039;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1689 q-33 0 -55.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1689q-33 0 -55.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-117 q0 -31 -22.5 -53t-53.5 -22h-1689q-33 0 -55.5 22.5t-22.5 52.5z" />
+<glyph unicode="&#xf03a;" d="M0 78v115q0 31 22.5 53t55.5 22h153q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-153q-33 0 -55.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t55.5 22.5h153q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-153 q-33 0 -55.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t55.5 22.5h153q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-153q-33 0 -55.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t55.5 22.5h153q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-153q-33 0 -55.5 22.5t-22.5 52.5zM461 78v115q0 31 22.5 53t55.5 22h1228q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1228q-33 0 -55.5 22.5t-22.5 55.5zM461 500v114q0 33 22.5 55.5t55.5 22.5h1228q31 0 53.5 -22.5t22.5 -55.5v-114 q0 -33 -22.5 -55.5t-53.5 -22.5h-1228q-33 0 -55.5 22.5t-22.5 55.5zM461 922v114q0 33 22.5 55.5t55.5 22.5h1228q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1228q-33 0 -55.5 21.5t-22.5 54.5zM461 1343v117q0 31 22.5 53.5t55.5 22.5h1228 q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53t-53.5 -22h-1228q-33 0 -55.5 22.5t-22.5 52.5z" />
+<glyph unicode="&#xf03b;" d="M0 756v75q0 39 39 39h213v154q0 31 16.5 37t38.5 -17l215 -215q16 -16 17 -36q0 -18 -17 -35l-215 -215q-23 -23 -39 -17t-16 39v152h-213q-39 0 -39 39zM614 39v1458q0 39 39 39h76q39 0 39 -39v-1458q0 -39 -39 -39h-76q-39 0 -39 39zM922 78v115q0 31 22.5 53t54.5 22 h768q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-768q-33 0 -55 22.5t-22 55.5zM922 500v114q0 33 22.5 55.5t54.5 22.5h615q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-615q-33 0 -55 22.5t-22 55.5zM922 922v114 q0 33 22.5 55.5t54.5 22.5h691q33 0 55 -22.5t22 -55.5v-114q0 -33 -22.5 -54.5t-54.5 -21.5h-691q-33 0 -55 21.5t-22 54.5zM922 1343v117q0 31 22.5 53.5t54.5 22.5h537q33 0 55.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53t-55.5 -22h-537q-33 0 -55 22.5t-22 52.5z" />
+<glyph unicode="&#xf03c;" d="M0 78v115q0 31 22.5 53t53.5 22h768q33 0 55.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-55.5 -22.5h-768q-31 0 -53.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t53.5 22.5h614q33 0 55.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-55.5 -22.5h-614 q-31 0 -53.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t53.5 22.5h692q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-692q-31 0 -53.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t53.5 22.5h538q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-538q-31 0 -53.5 22.5t-22.5 52.5zM1075 39v1458q0 39 39 39h76q16 0 27.5 -11.5t11.5 -27.5v-1458q0 -16 -11.5 -27.5t-27.5 -11.5h-76q-39 0 -39 39zM1305 743q0 16 14 35l217 215q23 23 38 17t15 -39v-152h215q16 0 27.5 -11t11.5 -28v-75q0 -16 -11 -27.5 t-28 -11.5h-215v-154q0 -31 -15 -38t-38 15l-217 218q-14 18 -14 36z" />
+<glyph unicode="&#xf03d;" d="M0 324v768q0 47 18.5 89t50 72.5t73.5 49t89 18.5h768q47 0 89 -18.5t73 -49t49.5 -72.5t18.5 -89v-240l483 471q23 23 55 23q13 -1 29 -7q47 -20 47 -69v-1127q0 -49 -47 -69q-16 -6 -29 -6q-33 0 -55 22l-483 471v-237q0 -47 -18.5 -89t-49.5 -74t-72.5 -50.5 t-89.5 -18.5h-768q-47 0 -89 18.5t-73.5 50.5t-50 73.5t-18.5 89.5z" />
+<glyph unicode="&#xf03e;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h1536v1228h-1536v-1228zM307 307v105l277 360l188 -156l354 537l410 -424v-422h-1229zM307 1073q0 66 45 111t111 45q63 0 108 -45 t45 -111q0 -63 -45 -108t-108 -45q-66 0 -111 45t-45 108z" />
+<glyph unicode="&#xf040;" horiz-adv-x="1536" d="M0 0l137 418l867 866l280 -280l-866 -867zM287 407.5q0 -12.5 10 -22.5q8 -8 22 -8q12 0 21 8l690 690q20 20 0 43q-10 10 -22.5 10t-20.5 -10l-690 -688q-10 -10 -10 -22.5zM1102 1382l119 119q35 35 84 35t84 -35l57 -55l55 -57q35 -35 35 -84.5t-35 -83.5l-119 -119z " />
+<glyph unicode="&#xf041;" horiz-adv-x="1128" d="M0 1001q0 117 44 220.5t121 180.5t180.5 121t219.5 44q117 0 219.5 -44t179 -121t120.5 -180.5t44 -220.5q0 -84 -24.5 -159.5t-65.5 -143.5l-379 -661q-41 -68 -95 -68t-93 68l-381 663q-41 68 -65.5 143t-24.5 158zM285 1001q0 -57 21.5 -108t60.5 -89t89 -59.5 t109 -21.5q57 0 108.5 21.5t89.5 59.5t59.5 89t21.5 108t-21.5 108.5t-59.5 90.5t-89 60.5t-109 21.5q-59 0 -109 -21.5t-89 -60.5t-60.5 -90t-21.5 -109z" />
+<glyph unicode="&#xf042;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44v1118q-117 0 -218.5 -44 t-177 -120t-119.5 -177t-44 -218z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1130" d="M0 535q0 86 23.5 161.5t66.5 141.5q20 33 69.5 99.5t108 154.5t113.5 193.5t90 217.5q10 35 37 51.5t57 12.5q31 4 57.5 -12.5t36.5 -51.5q33 -113 89.5 -218t115 -193t107.5 -154.5t69 -99.5q43 -66 66.5 -141.5t23.5 -161.5q0 -117 -44 -220.5t-120.5 -180.5t-180 -121 t-220.5 -44t-220 44t-180 121t-121 180.5t-44 220.5zM248 410q0 -59 41 -100.5t100 -41.5t100 41t41 101q0 43 -22 75q-6 8 -18.5 24.5t-26.5 39t-28.5 48.5t-22.5 54q-4 20 -23 17q-18 4 -24 -17q-8 -29 -21.5 -54.5t-28 -48t-27 -38.5t-18.5 -25q-23 -33 -22 -75z" />
+<glyph unicode="&#xf044;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h1075q4 0 10.5 -1t10.5 -1l-191 -191h-905q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v445l193 192v-637q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5 h-1075q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM631 324l108 329l652 652l221 -222l-651 -651zM866 629q6 -8 17 -8q10 0 16 8l512 510q18 18 0 35q-18 16 -35 0l-510 -510q-18 -18 0 -35zM1501 1415l92 94q29 29 68 29t65 -29l46 -45l45 -45 q27 -29 27.5 -66.5t-27.5 -66.5l-95 -92z" />
+<glyph unicode="&#xf045;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h836q-6 -31 -6 -63v-52q-164 -20 -310 -78h-520q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v111q16 10 31.5 21.5t32.5 27.5l129 127v-287q0 -63 -25 -118.5 t-67 -97.5t-97 -66.5t-119 -24.5h-1075q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM385 388.5v37.5q0 166 56.5 312.5t173 256t293.5 173t419 65.5v231q0 57 28.5 69.5t69.5 -28.5l392 -391q27 -25 26 -65q0 -39 -26 -64l-392 -391q-41 -41 -69.5 -28.5 t-28.5 69.5v260q-207 0 -364.5 -43t-266 -116.5t-170 -174t-77.5 -215.5q-4 -27 -31 -27q-25 0 -29 27q-4 23 -4 42.5z" />
+<glyph unicode="&#xf046;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h1075q27 0 52 -6l-187 -187h-940q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v326l193 192v-518q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5h-1075 q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM385 966.5q0 32.5 23 55.5l98 98q23 23 55.5 23t54.5 -23l340 -340l654 656q23 23 56.5 22.5t55.5 -22.5l99 -99q23 -23 22.5 -55.5t-22.5 -54.5l-711 -711l-98 -98q-23 -23 -55.5 -23t-55.5 23l-100 98l-393 395 q-23 23 -23 55.5z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1597" d="M0 768q0 25 18 43l256 256q27 27 45.5 19.5t18.5 -46.5v-170h360v359h-172q-37 0 -45 18.5t19 44.5l256 256q18 18 43 19q25 0 43 -19l256 -256q27 -27 19.5 -45t-46.5 -18h-172v-359h361v170q0 39 18 46.5t45 -19.5l256 -256q18 -18 18 -43t-18 -43l-256 -256 q-27 -27 -45 -19.5t-18 46.5v176h-361v-365h172q39 0 47 -18.5t-20 -44.5l-256 -256q-18 -18 -43 -19q-25 0 -43 19l-256 256q-27 27 -20 45t46 18h172v365h-360v-176q0 -39 -18.5 -46.5t-45.5 19.5l-256 256q-18 18 -18 43z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1075" d="M0 76q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5v-1382zM307.5 768q-0.5 27 16.5 43l653 707q14 18 41 18q6 0 22 -4q35 -18 35 -59v-1412q0 -41 -35 -57q-39 -14 -63 14l-653 705 q-16 18 -16.5 45z" />
+<glyph unicode="&#xf049;" d="M0 76q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5v-1382zM307.5 768q-0.5 27 16.5 43l653 707q14 18 41 18q6 0 22 -4q35 -18 35 -59v-1412q0 -41 -35 -57q-39 -14 -63 14l-653 705 q-16 18 -16.5 45zM1075.5 768q-0.5 27 16.5 43l653 707q14 18 41 18q6 0 22 -4q35 -18 35 -59v-1412q0 -41 -35 -57q-39 -14 -63 14l-653 705q-16 18 -16.5 45z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1536" d="M0 767q0 26 16 44l654 707q14 18 41 18q10 0 22 -6q35 -14 35 -57v-1412q0 -41 -35 -57q-37 -16 -63 14l-654 705q-16 18 -16 44zM768 767q0 26 16 44l654 707q14 18 41 18q10 0 22 -6q35 -14 35 -57v-1412q0 -41 -35 -57q-37 -16 -63 14l-654 705q-16 18 -16 44z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1349" d="M0 70v1396q0 39 35 60q37 23 69 0l1211 -697q35 -25 35 -61q0 -37 -35 -61l-1211 -697q-16 -10 -34 -10t-35 10q-35 20 -35 60z" />
+<glyph unicode="&#xf04c;" horiz-adv-x="1536" d="M0 70v1396q0 29 20.5 49.5t49.5 20.5h489q29 0 49.5 -20.5t20.5 -49.5v-1396q0 -29 -20.5 -49.5t-49.5 -20.5h-489q-29 0 -49.5 20.5t-20.5 49.5zM907 70v1396q0 29 20.5 49.5t49.5 20.5h489q29 0 49.5 -20.5t20.5 -49.5v-1396q0 -29 -20.5 -49.5t-49.5 -20.5h-489 q-29 0 -49.5 20.5t-20.5 49.5z" />
+<glyph unicode="&#xf04d;" horiz-adv-x="1536" d="M0 70v1396q0 29 20.5 49.5t49.5 20.5h1396q29 0 49.5 -20.5t20.5 -49.5v-1396q0 -29 -20.5 -49.5t-49.5 -20.5h-1396q-29 0 -49.5 20.5t-20.5 49.5z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1536" d="M0 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM768 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57z" />
+<glyph unicode="&#xf050;" d="M0 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM768 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM1536 76 q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5v-1382z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1075" d="M0 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM768 76q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5 v-1382z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1536" d="M0 70v198q0 29 20.5 49.5t49.5 20.5h1396q29 0 49.5 -20.5t20.5 -49.5v-198q0 -29 -20.5 -49.5t-49.5 -20.5h-1396q-29 0 -49.5 20.5t-20.5 49.5zM6 594q-18 43 14 76l699 698q20 20 49 20.5t49 -20.5l699 -698q33 -33 14 -76q-16 -43 -64 -43h-1396q-47 0 -64 43z" />
+<glyph unicode="&#xf053;" horiz-adv-x="964" d="M0 765q0 38 29 66l671 674q29 29 68 29t68 -29l100 -100q29 -29 29 -68t-29 -67l-508 -510l508 -500q29 -29 29 -66.5t-29 -66.5l-100 -102q-29 -29 -68 -29t-68 29l-671 673q-29 29 -29 67z" />
+<glyph unicode="&#xf054;" horiz-adv-x="964" d="M0 194.5q0 38.5 29 67.5l508 508l-508 502q-29 29 -29 66.5t29 66.5l100 102q29 29 68 29t67 -29l672 -673q29 -29 29 -68t-29 -68l-672 -671q-29 -29 -67.5 -29t-67.5 29l-100 100q-29 29 -29 67.5z" />
+<glyph unicode="&#xf055;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM338 688q0 -33 33 -33h313v-344q0 -33 33 -32h164q33 0 32 32v344h314 q12 0 22.5 9.5t10.5 23.5v158q0 14 -10.5 23.5t-22.5 9.5h-314v346q0 33 -32 32h-164q-33 0 -33 -32v-346h-313q-33 0 -33 -33v-158z" />
+<glyph unicode="&#xf056;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM338 688q0 -33 33 -33h856q12 0 22.5 9.5t10.5 23.5v158q0 14 -10.5 23.5 t-22.5 9.5h-856q-33 0 -33 -33v-158z" />
+<glyph unicode="&#xf057;" horiz-adv-x="1597" d="M0 770q0 154 58.5 301.5t174.5 263.5q117 117 264.5 175.5t301 58.5t301 -58.5t264.5 -175.5t175 -264t58 -301t-58 -301t-175 -264t-264.5 -175.5t-301 -58.5t-301 58.5t-264.5 175.5t-175 264t-58 301zM385 505q0 -13 10 -24l115 -116q10 -10 23.5 -10.5t23.5 10.5 l244 243l219 -221q10 -10 23.5 -10t23.5 10l113 113q23 23 0 47l-222 219l246 246q23 23 0 47l-117 115q-25 25 -47 0l-243 -244l-222 221q-10 10 -23 10t-24 -10l-110 -113q-25 -23 0 -47l219 -219l-242 -244q-10 -10 -10 -23z" />
+<glyph unicode="&#xf058;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 718q0 -20 14 -34l319 -319q14 -14 38 -24.5t44 -10.5h56q20 0 43.5 10 t38.5 25l550 550q14 14 14.5 34t-14.5 34l-104 107q-16 14 -35.5 14t-34.5 -14l-452 -453q-14 -14 -33.5 -14t-34.5 14l-221 221q-14 14 -33.5 14t-36.5 -14l-104 -106q-14 -14 -14 -34z" />
+<glyph unicode="&#xf059;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM532 1100l95 -115q4 -8 20 -12q12 0 23 6l10 8t27.5 17.5t39 16.5t46.5 7 q41 0 69.5 -22.5t28.5 -57.5q0 -37 -24.5 -64.5t-61.5 -60.5q-23 -18 -46.5 -40.5t-43 -51.5t-31.5 -63.5t-12 -79.5v-64q0 -12 9 -21t21 -9h164q12 0 20.5 9t8.5 21v51q0 39 25.5 66.5t62.5 60.5q25 20 49.5 46t46 57t34.5 69.5t13 90.5q0 68 -27.5 121t-73.5 87.5 t-103.5 53t-114.5 18.5q-63 0 -113.5 -16.5t-85.5 -35.5t-53 -35.5t-20 -18.5q-16 -16 -3 -39zM672 252q0 -12 9 -21.5t21 -9.5h164q12 0 20.5 9.5t8.5 21.5v156q0 12 -8 21t-21 9h-164q-12 0 -21 -9t-9 -21v-156z" />
+<glyph unicode="&#xf05a;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM573 858q0 -29 29 -29h86v-409h-78q-12 0 -21 -8.5t-9 -20.5v-139q0 -12 9 -21.5 t21 -9.5h402q12 0 20 9.5t8 21.5v139q0 29 -28 29h-78v577q0 12 -8 21.5t-21 9.5h-303q-12 0 -20.5 -9t-8.5 -22v-139zM686 1151q0 -12 9.5 -21.5t21.5 -9.5h188q12 0 20.5 9.5t8.5 21.5v166q0 29 -29 29h-188q-12 0 -21.5 -8.5t-9.5 -20.5v-166z" />
+<glyph unicode="&#xf05b;" horiz-adv-x="1536" d="M0 692v154q0 16 11.5 26.5t27.5 10.5h164q18 84 59 158.5t99.5 133t133 99.5t158.5 59v164q0 39 39 39h154q16 0 26.5 -11.5t10.5 -27.5v-164q84 -18 158.5 -59t133 -99.5t99.5 -133t59 -158.5h164q16 0 27.5 -10.5t11.5 -26.5v-154q0 -39 -39 -39h-164 q-18 -84 -59 -158.5t-99.5 -133t-133 -99.5t-158.5 -59v-164q0 -16 -10.5 -27.5t-26.5 -11.5h-154q-39 0 -39 39v164q-84 18 -158.5 59t-133 99.5t-99.5 133t-59 158.5h-164q-39 0 -39 39zM365 653q29 -106 105.5 -183t182.5 -105v174q0 16 11.5 26t27.5 10h154 q16 0 26.5 -10t10.5 -26v-174q106 29 183 105.5t105 182.5h-172q-39 0 -38 39v154q0 16 11 26.5t27 10.5h172q-29 106 -105.5 183t-182.5 105v-172q0 -16 -10.5 -27t-26.5 -11h-154q-39 0 -39 38v172q-106 -29 -183 -105.5t-105 -182.5h174q16 0 26 -10.5t10 -26.5v-154 q0 -16 -10 -27.5t-26 -11.5h-174z" />
+<glyph unicode="&#xf05c;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM451 573.5q0 16.5 12 28.5l166 166l-166 166q-12 12 -12 28.5t12 28.5l112 113q29 29 58 0l166 -166l166 166q29 29 57 0l113 -113q29 -29 0 -57l-166 -166l166 -166 q29 -29 0 -57l-113 -113q-12 -12 -28.5 -12t-28.5 12l-166 166l-166 -166q-12 -12 -28.5 -12t-29.5 12l-112 113q-12 12 -12 28.5z" />
+<glyph unicode="&#xf05d;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM332 717.5q0 17.5 10 27.5l115 115q10 10 27.5 10t27.5 -10l178 -180q29 -25 58 0l337 340q10 10 27.5 10t28.5 -10l114 -115q10 -10 10.5 -27.5t-10.5 -27.5l-409 -410 q-12 -12 -32.5 -20t-37.5 -8h-114q-16 0 -37 8t-33 20l-250 250q-10 10 -10 27.5z" />
+<glyph unicode="&#xf05e;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -84 23.5 -160t66.5 -141l770 770q-66 43 -141.5 66.5t-159.5 23.5 q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM498 297q66 -41 141.5 -64.5t159.5 -23.5q117 0 218 44t177 120t120 177t44 218q0 84 -23.5 160t-64.5 141z" />
+<glyph unicode="&#xf060;" horiz-adv-x="1536" d="M0 768q0 39 29 68l671 673q29 29 68 29t68 -29l100 -100q29 -29 29 -67.5t-29 -67.5l-338 -338h842q41 0 68.5 -27.5t27.5 -68.5v-144q0 -39 -27.5 -66.5t-66.5 -27.5h-844l338 -338q29 -29 29 -67.5t-29 -67.5l-100 -100q-29 -29 -68 -29t-68 29l-671 671q-29 29 -29 68 z" />
+<glyph unicode="&#xf061;" horiz-adv-x="1536" d="M0 698v144q0 39 27.5 66.5t66.5 27.5h844l-338 338q-29 29 -29 67.5t29 67.5l100 100q29 29 68 29t68 -29l671 -673q29 -29 29 -67t-29 -67l-671 -673q-29 -29 -68 -29t-68 29l-100 100q-29 29 -29 68t29 67l338 338h-844q-39 0 -66.5 27.5t-27.5 68.5z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1536" d="M-1 768q-1 39 28 68l673 671q29 29 68 29t68 -29l671 -671q29 -29 29 -68t-29 -68l-100 -100q-29 -29 -66.5 -29t-66.5 29l-340 338v-844q0 -39 -27.5 -66.5t-66.5 -27.5h-144q-41 0 -67.5 27.5t-26.5 66.5v844l-338 -338q-29 -29 -67.5 -29t-67.5 29l-100 100 q-29 29 -30 68z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1536" d="M0 766q0 39 29 68l100 100q29 29 68 29t67 -29l338 -338v844q0 39 27.5 66.5t66.5 27.5h144q41 0 67.5 -27.5t26.5 -66.5v-844l340 338q29 29 66.5 29t66.5 -29l102 -100q29 -29 29 -68t-29 -68l-673 -671q-29 -29 -68 -29t-68 29l-671 671q-29 29 -29 68z" />
+<glyph unicode="&#xf064;" d="M0 135q0 209 71.5 393.5t218 322.5t371 219t531.5 83v293q0 72 36 87t89 -36l491 -493q35 -33 35 -82q0 -47 -35 -82l-491 -494q-51 -51 -88 -35.5t-37 86.5v330q-262 -2 -461 -56.5t-336 -147.5t-215 -219t-98 -271q-4 -33 -37 -33h-2q-33 0 -37 33q-6 51 -6 102z" />
+<glyph unicode="&#xf065;" horiz-adv-x="1536" d="M0 86v522q0 53 26.5 64.5t65.5 -25.5l166 -166l274 275q12 12 31 12t33 -12l160 -160q12 -14 12 -32.5t-12 -31.5l-275 -274l166 -166q39 -39 27 -65.5t-66 -26.5h-520q-37 0 -61 25q-27 27 -27 61zM768 972.5q0 18.5 12 31.5l275 274l-166 166q-39 39 -27 65.5t66 26.5 h520q37 0 61 -25q27 -27 27 -61v-522q0 -53 -26.5 -64.5t-65.5 25.5l-166 166l-274 -273q-12 -14 -31 -14t-33 14l-160 158q-12 14 -12 32.5z" />
+<glyph unicode="&#xf066;" horiz-adv-x="1536" d="M0 202.5q0 18.5 12 33.5l275 272l-166 166q-39 39 -27 65.5t66 26.5h520q38 0 61 -25q27 -27 27 -61v-522q0 -53 -26.5 -64.5t-65.5 27.5l-166 166l-274 -275q-12 -14 -31 -14t-33 14l-160 160q-12 12 -12 30.5zM768 854v522q0 53 26.5 64.5t65.5 -27.5l166 -166l274 275 q12 14 31 14t33 -14l160 -160q12 -12 12 -30.5t-12 -33.5l-275 -272l166 -166q39 -39 27 -65.5t-66 -26.5h-520q-41 0 -61 25q-27 27 -27 61z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1536" d="M0 696v144q0 39 27.5 66.5t66.5 27.5h508v506q0 41 26.5 68.5t67.5 27.5h144q39 0 66.5 -27.5t27.5 -66.5v-508h508q39 0 66.5 -27.5t27.5 -66.5v-144q0 -39 -27.5 -66.5t-66.5 -27.5h-508v-506q0 -41 -27.5 -68.5t-66.5 -27.5h-144q-39 0 -66.5 27.5t-27.5 66.5v508 h-506q-41 0 -68.5 26.5t-27.5 67.5z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1536" d="M0 696v144q0 39 27.5 66.5t66.5 27.5h1348q39 0 66.5 -27.5t27.5 -66.5v-144q0 -39 -27.5 -66.5t-66.5 -27.5h-1346q-41 0 -68.5 26.5t-27.5 67.5z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1427" d="M2 1018q-10 37 10 72l72 124q20 35 58 44.5t73 -9.5l332 -192v383q0 41 27.5 68.5t68.5 27.5h141q41 0 69 -27.5t28 -66.5v-385l331 192q35 18 73 9t58 -44l70 -124q20 -35 11 -72t-44 -57l-333 -193l333 -193q35 -20 44.5 -57t-9.5 -72l-72 -124q-20 -35 -58 -44.5 t-73 9.5l-331 192v-383q0 -41 -28 -68.5t-69 -27.5h-141q-41 0 -68.5 27.5t-27.5 66.5v385l-332 -192q-35 -20 -73 -10t-58 45l-72 124q-18 35 -9 72t44 57l334 193l-334 193q-35 20 -45 57z" />
+<glyph unicode="&#xf06a;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM672 1274l14 -739q4 -29 31 -29h162q12 0 21 8t9 21l17 739q0 10 -8 22q-8 8 -23 9 h-193q-14 0 -22 -9q-8 -12 -8 -22zM680 236q0 -12 8 -21.5t21 -9.5h180q12 0 21.5 9t9.5 22v174q0 12 -9.5 21t-21.5 9h-180q-12 0 -20.5 -9t-8.5 -21v-174z" />
+<glyph unicode="&#xf06b;" horiz-adv-x="1880" d="M0 588v391q0 16 11.5 27.5t27.5 11.5h539q-57 0 -107.5 21.5t-87.5 58.5t-58.5 87t-21.5 107t21.5 107.5t58.5 87.5t87 58.5t108 21.5q61 0 115.5 -24.5t88.5 -69.5l158 -203l158 203q35 45 89 69.5t116 24.5q57 0 107 -21.5t87 -58.5t58.5 -87t21.5 -108 q0 -57 -21.5 -107t-58.5 -87t-87 -58.5t-107 -21.5h538q16 0 27.5 -11.5t11.5 -27.5v-391q0 -16 -11 -27.5t-28 -11.5h-117v-432q0 -47 -34.5 -82t-83.5 -35h-1332q-49 0 -82.5 35t-33.5 82v432h-119q-16 0 -27.5 11t-11.5 28zM461 1292q0 -49 33.5 -82.5t83.5 -33.5h237 l-151 196q-10 10 -32 24.5t-54 14.5q-49 0 -83 -35t-34 -84zM743 221q0 -33 24 -56.5t56 -23.5h234q33 0 56.5 23.5t23.5 56.5v797h-394v-797zM1065 1176h238q49 0 82.5 33.5t33.5 82.5t-33.5 84t-82.5 35q-33 0 -54.5 -14.5t-31.5 -24.5z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1916" d="M6 135q20 53 56 89t71 65q29 23 50.5 43t27.5 43q2 6 0 12t-10 25q-6 12 -11.5 27.5t-9.5 35.5q-25 160 13 295t120 242.5t195 185.5t235 121q82 29 179.5 34t203.5 7q61 0 127 2t127.5 11t113.5 28.5t85 54.5q20 20 38.5 41t38 36t43 24.5t58.5 9.5q23 0 42.5 -11.5 t29.5 -31.5q66 -133 83 -281.5t-18 -322.5q-90 -487 -579 -740q-231 -123 -467 -123q-154 0 -307 54q-23 8 -45.5 20t-44.5 25q-29 16 -57.5 30.5t-49.5 14.5q-10 -2 -23.5 -17.5t-27.5 -35t-26.5 -41t-20.5 -33.5q-14 -23 -26.5 -41.5t-22.5 -32.5q-25 -31 -64 -31h-4 q-29 2 -49.5 12.5t-33.5 24.5t-20.5 28.5t-9.5 22.5q-27 37 -10 78zM401 507.5q2 -32.5 29 -54.5q20 -18 51 -19q37 0 62 27q90 102 181 175t191.5 117t212 62t242.5 14q33 -4 57.5 19.5t26.5 56.5q2 35 -20.5 58.5t-57.5 25.5q-147 6 -277 -16.5t-247 -73.5t-223.5 -133 t-206.5 -199q-23 -27 -21 -59.5z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1445" d="M0 442q0 123 63.5 254t174.5 238q10 16 33.5 13t31.5 -21q4 -16 0 -29q-8 -35 -14 -84t-4 -101.5t13 -101.5t38 -84q31 -37 78 -49q-49 154 -40 293t49 259t101.5 217t118.5 167t98 106.5t43 39.5q25 18 47 0q10 -8 13.5 -21.5t-0.5 -24.5q0 -2 -15.5 -42.5t-21.5 -102 t7 -134.5t71 -136q37 -43 67.5 -85t52 -93.5t34 -120t12.5 -162.5q0 -33 -31 -39q-12 -2 -24.5 4t-16.5 19q-14 31 -42 49t-63 18q-47 0 -79.5 -33.5t-32.5 -81.5q0 -121 156 -120q98 0 153 63q37 43 53.5 101.5t20.5 114.5t2 102.5t-4 62.5q-6 12 0 29q8 18 31.5 21 t35.5 -13q111 -106 173.5 -237.5t62.5 -254.5q0 -109 -51.5 -195.5t-145.5 -148t-228 -95.5t-298 -34t-298 34t-228.5 95.5t-145.5 148.5t-51 195z" />
+<glyph unicode="&#xf06e;" d="M0 722q0 44 25 83q78 125 178 224t216 168t242.5 104.5t260.5 35.5q135 0 262 -35.5t241.5 -103.5t215 -167t180.5 -226q23 -39 22.5 -83t-22.5 -81q-80 -127 -180.5 -226.5t-215 -167t-241.5 -103t-262 -35.5q-133 0 -260 35.5t-243 104t-216.5 168t-177.5 224.5 q-25 37 -25 81zM154 723q66 -104 149.5 -190.5t182 -145.5t208 -92t228.5 -33t228.5 33t207.5 92t182 145t150 191q-80 129 -187.5 226.5t-236.5 156.5q51 -59 79.5 -133t28.5 -160q0 -96 -35.5 -179t-99 -146.5t-147.5 -99.5t-179 -36q-96 0 -179 36t-146.5 99.5t-99 146.5 t-35.5 179q0 78 25.5 148.5t68.5 128.5q-117 -59 -217.5 -152.5t-175.5 -214.5zM614 813q0 -23 16.5 -40t41.5 -17t41 17.5t16 39.5q0 78 53.5 131t130.5 53q25 0 41.5 17.5t16.5 40.5q0 25 -16.5 41t-41.5 16q-61 0 -116.5 -23.5t-95 -63.5t-63.5 -95.5t-24 -116.5z" />
+<glyph unicode="&#xf070;" d="M0 767q0 44 25 83q78 125 178 224.5t216 168t242.5 104t260.5 35.5q53 0 105 -7t103 -17l89 158q8 14 24 18q12 6 29 -2l133 -76q14 -8 19.5 -23.5t-3.5 -29.5l-774 -1383q-6 -14 -22 -18q-4 -2 -11 -2q-6 0 -18 4l-135 76q-14 8 -18.5 23.5t3.5 29.5l66 115 q-145 68 -269 178.5t-218 259.5q-25 37 -25 81zM154 768q82 -131 191.5 -229.5t240.5 -157.5l57 104q-86 63 -138 159.5t-52 213.5q0 78 25.5 148.5t68.5 130.5q-117 -61 -217.5 -153.5t-175.5 -215.5zM614 858q0 -23 16.5 -40t41.5 -17t41 17.5t16 39.5q0 78 53.5 131 t130.5 53q25 0 41.5 17.5t16.5 40.5q0 25 -16.5 41t-41.5 16q-61 0 -116.5 -23.5t-95 -63.5t-63.5 -95.5t-24 -116.5zM928 154l88 159q209 25 382 145t292 310q-109 170 -263 283l76 137q92 -66 172 -150t146 -188q23 -39 22.5 -83t-22.5 -81q-160 -254 -392.5 -392 t-500.5 -140zM1081 430l285 510q4 -20 6 -39.5t2 -42.5q0 -74 -21.5 -140.5t-60.5 -121.5t-93 -98t-118 -68z" />
+<glyph unicode="&#xf071;" horiz-adv-x="1775" d="M0 92q0 20 6 39t17 35l768 1331q16 27 39.5 48.5t56.5 21.5t56.5 -21.5t39.5 -48.5l770 -1331q10 -16 16.5 -34.5t6.5 -39.5q0 -49 -38 -70.5t-81 -21.5h-1538q-43 0 -81 21.5t-38 70.5zM770 1114l12 -633q0 -14 10.5 -24.5t24.5 -10.5h139q14 0 24.5 10.5t10.5 24.5 l15 633q0 14 -10.5 24.5t-24.5 10.5h-166q-16 0 -25.5 -10.5t-9.5 -24.5zM776 168q0 -16 10.5 -25.5t24.5 -9.5h154q35 0 34 35v147q0 16 -9 26.5t-25 10.5h-154q-14 0 -24.5 -10t-10.5 -27v-147z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1597" d="M0 541v4q0 31 23 57l30 29q20 25 56 24q8 0 10 -2l280 -32q39 63 93.5 134.5t125.5 151.5l-583 457q-31 25 -31 59v4q0 31 23 58l57 57q27 23 57 23h13.5t13.5 -4l803 -293l151 149q70 70 161 110t167 40q72 0 109 -37q20 -18 28 -46t8 -63q0 -76 -38.5 -167t-110.5 -160 l-150 -152l293 -803q6 -12 6 -26q0 -33 -24 -58l-58 -57q-23 -25 -57 -25h-4q-35 4 -59 31l-455 586q-82 -72 -153.5 -126t-135.5 -93l35 -281v-10q0 -33 -22 -55l-31 -31q-23 -23 -58 -23h-4q-39 4 -59 31l-205 272l-274 207q-29 25 -31 60z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1566" d="M0 117v1147q0 47 35 81.5t82 34.5h39v13q0 31 10 62.5t32.5 56t59.5 40t90 15.5t90 -15.5t59.5 -40t33 -56.5t10.5 -62v-13h49v13q0 31 10 62.5t32.5 56t59.5 40t90 15.5t90 -15.5t60.5 -40t34 -56.5t10.5 -62v-13h49v13q0 31 10.5 62.5t33 56t59 40t90.5 15.5 q53 0 90 -15.5t59.5 -40t32.5 -56.5t10 -62v-13h39q47 0 82 -34.5t35 -81.5v-1147q0 -47 -35 -82t-82 -35h-1333q-47 0 -82 35t-35 82zM158 158h282v250h-282v-250zM158 446h282v252h-282v-252zM158 737h282v252h-282v-252zM272 1165q0 -57 76 -57t76 57v228q0 57 -76 57 t-76 -57v-228zM479 158h285v250h-285v-250zM479 446h285v252h-285v-252zM479 737h285v252h-285v-252zM709 1165q0 -31 16 -44t57 -13t58.5 13.5t17.5 43.5v228q0 29 -17.5 43t-58.5 14t-57 -14.5t-16 -42.5v-228zM803 158h284v250h-284v-250zM803 446h284v252h-284v-252z M803 737h284v252h-284v-252zM1126 158h283v250h-283v-250zM1126 446h283v252h-283v-252zM1126 737h283v252h-283v-252zM1143 1165q0 -57 76 -57t75 57v228q0 57 -75 57q-76 0 -76 -57v-228z" />
+<glyph unicode="&#xf074;" d="M0 252v154q0 16 11.5 27t27.5 11h219q51 0 99.5 31t93.5 83t90 119.5t90 139.5q55 88 114.5 175t127 156t147.5 110.5t180 41.5h203v185q0 41 24.5 49t59.5 -21l334 -278q23 -18 22 -45q0 -29 -22 -47l-334 -277q-35 -29 -59.5 -20.5t-24.5 49.5v174h-203 q-53 0 -100 -31.5t-93 -84t-91.5 -120t-90.5 -139.5q-55 -88 -113.5 -174t-126 -154.5t-148.5 -110.5t-179 -42h-219q-16 0 -27.5 11.5t-11.5 27.5zM0 1108v154q0 39 39 38h219q68 0 127 -20t111.5 -56t97.5 -84t88 -104q-61 -90 -117 -178q-4 -8 -9 -14t-9 -15 q-70 102 -139.5 172t-149.5 70h-219q-16 0 -27.5 10.5t-11.5 26.5zM778 481q29 41 56.5 85t56.5 87q4 10 10 17.5t10 17.5q70 -102 139.5 -170.5t149.5 -68.5h203v190q0 41 24.5 49t59.5 -20l334 -277q23 -18 22 -47q0 -27 -22 -45l-334 -279q-35 -29 -59.5 -20.5 t-24.5 49.5v168h-203q-68 0 -127 20.5t-110.5 56.5t-97.5 84t-87 103z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1916" d="M0 866q0 145 76 272.5t206 222.5t303.5 150.5t372.5 55.5t373 -55.5t304 -150.5t206 -222t76 -273q0 -145 -76 -272t-206 -222.5t-304 -150.5t-373 -55q-92 0 -180 12q-176 -139 -411 -192q-25 -4 -50.5 -8.5t-54.5 -8.5q-16 -2 -27.5 6.5t-15.5 24.5t5 26.5t20 20.5 q23 23 43 44.5t36.5 51t30 69.5t23.5 97q-174 98 -275.5 241.5t-101.5 315.5z" />
+<glyph unicode="&#xf076;" horiz-adv-x="1566" d="M0 621v288q0 16 11.5 27.5t27.5 11.5h391q16 0 28.5 -11t12.5 -28v-288q0 -29 22.5 -60t63.5 -58.5t98.5 -45t128.5 -17.5q70 0 128.5 17.5t99.5 45t63.5 58.5t22.5 60v288q0 39 39 39h391q16 0 27.5 -11t11.5 -28v-288q0 -135 -61.5 -254t-168 -207t-249 -139.5 t-304.5 -51.5q-164 0 -306 51.5t-248.5 139.5t-168 206.5t-61.5 254.5zM0 1106v391q0 16 11.5 27.5t27.5 11.5h391q16 0 28.5 -11.5t12.5 -27.5v-391q0 -16 -12.5 -27.5t-28.5 -11.5h-391q-16 0 -27.5 11.5t-11.5 27.5zM1098 1106v391q0 16 11 27.5t28 11.5h391 q16 0 27.5 -11.5t11.5 -27.5v-391q0 -16 -11.5 -27.5t-27.5 -11.5h-391q-39 0 -39 39z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1536" d="M-1 355.5q-1 37.5 28 66.5l673 674q29 29 68 28.5t68 -28.5l671 -674q29 -29 29 -67t-29 -66l-100 -103q-29 -29 -68 -28.5t-67 28.5l-508 510l-500 -510q-29 -29 -67.5 -28.5t-67.5 28.5l-100 103q-29 29 -30 66.5z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1536" d="M0 918.5q0 37.5 29 66.5l100 102q29 29 68 29t67 -29l508 -509l500 509q29 29 67.5 29t67.5 -29l100 -102q29 -29 30 -66.5t-28 -66.5l-673 -674q-29 -29 -68 -28.5t-68 28.5l-671 674q-29 29 -29 66.5z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1916" d="M2.5 1038.5q-12.5 30.5 28.5 75.5l385 424q25 29 63 29q39 0 64 -29l385 -424q41 -45 28.5 -75.5t-67.5 -30.5h-250v-680h174q6 -10 12 -19.5t17 -19.5l252 -281h-695q-33 0 -56.5 23.5t-23.5 56.5v920h-249q-55 0 -67.5 30.5zM823 1526h695q33 0 56 -22.5t23 -57.5v-918 h250q55 0 67.5 -30.5t-28.5 -75.5l-385 -424q-25 -29 -63 -29q-39 0 -64 29l-385 424q-41 45 -28.5 75.5t67.5 30.5h250v678h-174q-6 10 -12.5 20.5t-14.5 20.5z" />
+<glyph unicode="&#xf07a;" d="M0 1421v76q0 39 39 39h231q16 0 38 -4t36 -8q6 -4 14.5 -14.5t15.5 -23.5t12 -26.5t7 -21.5l27 -125h1347q35 0 58 -27t16 -59l-108 -578q-6 -25 -26.5 -42t-49.5 -17h-1084l35 -168q4 -16 17.5 -26.5t29.5 -10.5h856q16 0 27.5 -11.5t11.5 -27.5v-78q0 -16 -11 -26.5 t-28 -10.5h-163h-652h-104q-16 0 -36.5 3.5t-35.5 9.5q-6 2 -14 13t-15.5 24.5t-12.5 27t-7 21.5l-215 1016q-4 16 -17.5 26t-29.5 10h-170q-39 0 -39 39zM582 115q0 47 33.5 81.5t80.5 34.5q49 0 83 -34.5t34 -81.5t-34 -81t-83 -34q-47 0 -80.5 34t-33.5 81zM1233 115 q0 47 33.5 81.5t81.5 34.5q47 0 80.5 -34.5t33.5 -81.5t-33.5 -81t-80.5 -34t-81 34t-34 81z" />
+<glyph unicode="&#xf07b;" d="M0 115v1306q0 47 34 81t81 34h692q47 0 81 -34t34 -81t33.5 -80.5t80.5 -33.5h693q47 0 80.5 -35t33.5 -82v-1075q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81z" />
+<glyph unicode="&#xf07c;" d="M0 379v1042q0 47 34 81t81 34h692q47 0 81 -34t34 -81t33.5 -80.5t80.5 -33.5h443q47 0 80.5 -35t33.5 -82v-221h-1228q-37 0 -72 -12.5t-65.5 -34t-53 -51t-35.5 -64.5zM43 0l246 760q6 23 30.5 39t47.5 16h1476l-260 -758q-6 -23 -30.5 -40t-47.5 -17h-1462z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="798" d="M2 368.5q10 22.5 57 22.5h203v754h-203q-47 0 -57 22.5t25 57.5l319 319q23 23 53 23q31 0 54 -23l321 -319q33 -35 22.5 -57.5t-57.5 -22.5h-202v-754h202q47 0 57.5 -22.5t-24.5 -57.5l-319 -319q-23 -23 -54 -23t-53 23l-321 319q-33 35 -23 57.5z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1597" d="M0 729q0 31 23 53l319 322q35 33 57.5 23.5t22.5 -56.5v-205h754v203q0 47 22.5 57.5t56.5 -22.5l320 -322q23 -23 22 -53q0 -31 -22 -53l-320 -322q-35 -33 -57 -22.5t-22 57.5v203h-754v-203q0 -47 -22.5 -57t-57.5 24l-319 320q-23 23 -23 53z" />
+<glyph unicode="&#xf080;" d="M0 115v1306q0 47 35 81t82 34h1612q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1612q-47 0 -82 34t-35 81zM154 154h1536v1228h-1536v-1228zM307 264v363h203v-363h-203zM649 264v776h201v-776h-201zM993 264v592h203v-592h-203zM1333 264v922h203v-922 h-203z" />
+<glyph unicode="&#xf081;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t73 15.5h1153q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1153q-39 0 -73.5 15.5t-60 41t-41 60.5t-15.5 76zM201 559q80 -111 198.5 -169t259.5 -58q96 0 184.5 26.5t160 73.5 t124 112.5t76.5 143.5q82 6 129 57q14 14 4 33q-8 18 -30 15h-4q23 23 30 45q8 20 -8 32q-14 14 -33 2q-8 -4 -29.5 -10t-45.5 -6q-4 0 -7.5 1t-7.5 1q0 2 -1 4t-1 4q-16 61 -57 110.5t-94 72.5q4 4 6 8t6 8q6 16 0 33q-2 6 -12.5 16t-34.5 8q-2 4 -6 8q-12 12 -25 9 q-25 -4 -49 -13l-2 2q-14 8 -31 -2q-59 -37 -98 -100t-68 -135q-35 31 -57 41q-61 35 -129 63.5t-154 61.5q-14 4 -24 -4q-10 -6 -15 -21q-2 -27 8.5 -58.5t38.5 -62.5q-25 -6 -20 -32q12 -68 68 -101l-13 -12q-14 -14 -4 -33q4 -12 26.5 -37.5t65.5 -38.5q-6 -12 -6 -22 t2 -14q6 -33 39 -50q-37 -25 -79 -34t-85 -5.5t-83 20.5t-70 46q-8 8 -19.5 8t-19.5 -8q-23 -18 -4 -39z" />
+<glyph unicode="&#xf082;" horiz-adv-x="1536" d="M2 193v1150q0 39 15.5 75t41 61.5t60.5 41t74 15.5h1153q80 0 136 -56.5t56 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-74 -15.5h-486v643h172q12 0 21.5 8t9.5 21l12 168q0 14 -8 24q-10 10 -23 10h-184v74q0 41 10.5 54.5t53.5 13.5q25 0 55.5 -4t58.5 -11 q6 0 13.5 1.5t11.5 5.5q10 6 14 22l23 162q4 29 -25 35q-90 25 -188 24q-301 0 -301 -293v-84h-103q-33 0 -32 -32v-168q0 -12 9 -21.5t23 -9.5h103v-643h-393q-39 0 -74 15.5t-60.5 41t-41 60.5t-15.5 76z" />
+<glyph unicode="&#xf083;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 160h1536v114h-1536v-114zM154 1145h1536v231h-957l-14 -92h-565v-139zM266 1341h316v93h-316v-93zM557 709q0 -76 28.5 -142.5t78 -116 t116 -78t142.5 -28.5t142 28.5t115.5 78t78 116t28.5 142.5t-28.5 142.5t-78 115.5t-116 77.5t-141.5 28.5q-76 0 -142.5 -28.5t-116 -77.5t-78 -115.5t-28.5 -142.5zM672 709q0 51 19.5 97t53 80t79.5 53t98 19q51 0 97 -19t80 -53t53 -80t19 -97t-19 -97.5t-53 -80 t-80 -53t-97 -19.5t-97.5 19.5t-80 53t-53 79.5t-19.5 98zM743 709q0 -16 12.5 -28.5t28.5 -12.5q18 0 30.5 12.5t12.5 28.5q0 41 28 67.5t67 26.5v2q18 0 30.5 12t12.5 29q0 18 -12.5 30.5t-30.5 12.5q-74 0 -126.5 -53.5t-52.5 -126.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1916" d="M0 803.5q-6 111.5 30 230.5t113 228q78 109 179.5 180t209 102t213 17.5t191.5 -74.5q76 -53 121 -134t59 -176.5t-4 -199t-68 -203.5l414 -297l101 139l-105 74q-14 10 -17 27.5t7 32.5l51 69q10 14 26.5 17.5t32.5 -7.5l344 -247q16 -10 18.5 -27.5t-7.5 -32.5l-49 -69 q-10 -14 -27.5 -17.5t-32.5 6.5l-102 76l-101 -139l248 -178q43 -31 52.5 -83t-21.5 -95q-33 -43 -84 -51.5t-94 22.5l-803 573q-78 -80 -170 -130t-186.5 -68.5t-185.5 -2t-167 71.5q-86 61 -133 157.5t-53 208zM230.5 766q7.5 -41 30 -78t58.5 -63q37 -27 79 -36t83 -2 t78 29.5t64 59.5q39 53 41 114.5t-27 114.5q59 -10 116.5 11.5t96.5 74.5q27 37 36 79t2 84t-29.5 79t-59.5 63q-37 27 -79 36t-84 2t-79 -29.5t-63 -59.5q-37 -53 -39 -114.5t26 -114.5q-59 10 -116.5 -12.5t-96.5 -75.5q-27 -37 -36 -79t-1.5 -83z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1916" d="M0 801v180q0 8 22.5 15.5t52 11.5t56.5 7t37 3q12 49 37 88q-23 31 -45.5 61.5t-46.5 59.5l-4 10q0 6 20.5 29.5t47 50t50 47t29.5 20.5q2 0 20.5 -13t41 -30.5t43 -34t24.5 -20.5q43 25 90 37q0 8 3 37t7 57.5t10.5 52t16.5 23.5h178q8 0 15.5 -23.5t11.5 -52t7 -57.5 t5 -37q45 -12 86 -35q31 23 62.5 45.5t60.5 46.5l8 4q4 0 27.5 -21.5t49.5 -47t47.5 -49t21.5 -29.5q0 -4 -13.5 -22.5t-30 -40t-32 -41t-19.5 -25.5q23 -39 39 -92q10 -2 37 -5t55.5 -8.5t51 -11.5t22.5 -14v-178q0 -10 -22.5 -16.5t-51 -11.5t-56.5 -7t-36 -4 q-14 -43 -37 -88q23 -31 44.5 -60.5t48.5 -58.5l2 -10q0 -6 -20.5 -30t-47.5 -50.5t-50.5 -47t-29.5 -20.5q-2 0 -20.5 13.5t-41 31t-42 32.5t-25.5 20q-45 -23 -88 -37q0 -10 -3 -37t-8 -56.5t-12.5 -52t-15.5 -22.5h-178q-8 0 -15.5 22.5t-11.5 52t-7 56t-3 37.5 q-45 12 -88 37q-31 -23 -61.5 -46.5t-59.5 -48.5l-10 -2q-4 0 -27.5 20.5t-49 47t-46 50.5t-20.5 30q0 2 13 20.5t29.5 40t31 41t18.5 25.5q-23 43 -39 94q-10 2 -37 5t-55.5 7t-51 10.5t-22.5 14.5zM420 889q0 -37 14.5 -70t39 -57.5t58 -38.5t70.5 -14t70 14t57.5 38.5 t38.5 57.5t14 70t-14 70.5t-38.5 58t-57.5 39t-70 14.5q-76 0 -129 -53t-53 -129zM1114 373q0 6 13.5 13t31 14.5t33.5 12.5t22 7q4 23 9.5 39t15.5 37q-4 4 -13 17t-18.5 27.5t-16.5 28t-7 17.5t18.5 23.5t43 41t47 40t28.5 24.5l8 4q4 0 16.5 -8.5t25.5 -19.5t25.5 -21.5 t16.5 -14.5q35 12 76 19q2 6 9 21.5t16.5 30.5t17.5 27.5t14 12.5q4 0 34 -7t63.5 -18.5t60.5 -23.5t27 -23q0 -23 -5.5 -47t-9.5 -47q16 -12 28.5 -26.5t22.5 -30.5q25 2 49.5 3t47.5 1q8 0 18 -26.5t17.5 -60.5t12.5 -64.5t5 -39.5q0 -6 -13.5 -13t-29.5 -13t-32.5 -12.5 t-22.5 -8.5q-9 -38 -23 -71q2 -6 11.5 -18.5t18.5 -27t16 -27.5t7 -18q0 -4 -18.5 -23.5t-43 -41t-47 -40.5t-28.5 -26l-8 -4q-4 0 -16.5 8.5t-25.5 19.5t-25.5 21.5t-16.5 14.5q-37 -12 -78 -19q-2 -6 -9 -21.5t-15.5 -30.5t-16.5 -27.5t-14 -12.5t-35 7.5t-62.5 18.5 t-60 23.5t-26.5 22.5q0 23 5 47.5t9 46.5q-16 12 -28.5 26.5t-22.5 30.5q-23 -2 -45.5 -3t-44.5 -1h-14.5t-8.5 11q-2 8 -8 35.5t-13.5 58t-12.5 55.5t-5 29zM1192 1264q0 6 12.5 12t29.5 10t33.5 6t22.5 4q10 33 31 64q-2 4 -8 17.5t-12.5 27.5t-11.5 25.5t-5 15.5 q0 6 21.5 22.5t49 35t51.5 32.5t28 14t13 -9t20.5 -21.5t20.5 -23.5t13 -15q14 4 28.5 6t29.5 0h14q2 4 11 16.5t18.5 25.5t17.5 23.5t12 10.5t30 -11.5t55.5 -26t53 -28.5t23.5 -20q0 -4 -4 -15.5t-8 -26t-8.5 -27.5t-6.5 -17q20 -25 39 -60q51 -4 74 -7t29 -18.5t5 -52 t3 -106.5q0 -6 -12.5 -12.5t-28.5 -10.5t-32.5 -6t-22.5 -4q-13 -36 -31 -63q2 -4 8 -16.5t13.5 -27t12.5 -26.5t5 -14q0 -6 -22.5 -23.5t-50 -36t-51.5 -33t-26 -14.5q-4 0 -14 9.5t-21.5 21.5t-20.5 23.5t-13 15.5q-14 -4 -28.5 -6t-29.5 0h-14q-4 -4 -12 -16.5t-17.5 -26 t-18.5 -23.5t-13 -10t-30 11t-54.5 25.5t-52 29t-23.5 20.5q0 2 3 14.5t8 26.5t9 27.5t6 17.5q-23 23 -38 59q-53 2 -75 5t-29 18.5t-5 52.5t-4 109zM1397 367q0 -49 34.5 -85t84.5 -36q49 0 84.5 34.5t35.5 86.5q0 49 -34.5 83.5t-85.5 34.5q-49 0 -84 -34.5t-35 -83.5z M1446 1206q0 -47 31.5 -78.5t76.5 -31.5q47 0 79 31.5t32 76.5q0 47 -31.5 79t-77.5 32q-47 0 -78.5 -32t-31.5 -77z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1916" d="M0 997q0 119 61.5 222.5t167 180.5t246.5 122t303 45t303.5 -45t247 -122t166.5 -180.5t61 -222.5q0 -117 -61 -221t-166.5 -181t-247 -122t-303.5 -45q-37 0 -73.5 3t-71.5 7q-147 -113 -336 -155q-20 -4 -40.5 -7.5t-43.5 -7.5q-12 -2 -21.5 6.5t-13.5 18.5v2 q-4 12 3 19.5t18 17.5q18 18 34.5 36.5t29.5 42t24.5 55.5t19.5 79q-141 78 -224 195.5t-83 256.5zM649 258q6 4 13.5 8t13.5 8q51 -6 102 -6q197 0 369 56.5t298 155t198.5 231.5t72.5 286q0 41 -6 84q96 -78 151.5 -175t55.5 -208q0 -139 -83 -256.5t-224 -195.5 q8 -47 19 -79t25.5 -55.5t30 -42t33.5 -36.5q10 -10 17.5 -18.5t3.5 -18.5v-2q-2 -12 -12.5 -19.5t-22.5 -5.5q-23 4 -43.5 7.5t-40.5 7.5q-96 20 -180 60t-156 95q-35 -4 -71.5 -7t-73.5 -3q-141 0 -265 35t-225 94z" />
+<glyph unicode="&#xf087;" horiz-adv-x="1597" d="M0 193v643q0 49 35 83.5t84 34.5h348q27 14 43 30.5t35 39.5q16 20 32.5 38.5t34.5 37.5q33 35 76 68.5t66 74.5q16 29 23 64.5t12.5 71.5t12.5 70t23.5 60.5t47 42t81.5 15.5q61 0 111.5 -25.5t85.5 -68.5t54.5 -98.5t19.5 -112.5q0 -59 -17.5 -112.5t-42.5 -107.5 q35 2 70 4.5t70 2.5q55 0 107 -10.5t93 -35t66.5 -67.5t25.5 -109q0 -29 -5 -57t-15 -57q18 -43 18 -90q0 -78 -41 -142q10 -59 -7 -118.5t-58 -104.5q-4 -84 -45 -139.5t-102.5 -89t-135 -47t-143.5 -13.5q-72 0 -144.5 10.5t-142.5 28.5q-70 20 -139.5 43t-142.5 23h-375 q-49 0 -84 34.5t-35 84.5zM236 276q0 -35 22 -57t57 -22q33 0 56.5 22.5t23.5 56.5q0 33 -23.5 56.5t-56.5 23.5q-35 0 -57 -23.5t-22 -56.5zM492 193q70 0 136 -16.5t133.5 -35t141.5 -35t160 -16.5q45 0 98 6t99.5 26.5t78 56.5t31.5 95q0 10 -1 18.5t-3 18.5 q35 16 53.5 53t18.5 74q0 39 -21 68q60 49 60 123q0 23 -12.5 43t-26.5 35q16 29 28.5 57.5t12.5 62.5q0 35 -17.5 55.5t-43 31t-56.5 12.5t-57 2q-45 0 -90.5 -3t-90.5 -3q-31 0 -61.5 3t-58.5 15q0 41 16 78t35.5 74.5t35 78.5t15.5 91q0 33 -10.5 65.5t-29.5 59t-47 44 t-65 17.5h-11t-11 -2q-8 -4 -9 -8t-3 -13q-12 -59 -22.5 -123.5t-39.5 -117.5q-29 -51 -74 -88t-86 -78q-29 -31 -49 -56.5t-41.5 -48t-48.5 -42t-65 -35.5h-2v-643z" />
+<glyph unicode="&#xf088;" horiz-adv-x="1597" d="M0 309q0 29 5 57.5t15 57.5q-18 43 -18 90q0 78 41 141q-10 59 7.5 119t58.5 105q4 84 45 139t102 89t135 47t144 13q72 0 144.5 -10t141.5 -29q70 -20 139.5 -42.5t143.5 -22.5h375q49 0 83.5 -35t34.5 -84v-643q0 -49 -34.5 -84t-83.5 -35h-349q-27 -14 -43 -30.5 t-34 -38.5q-16 -20 -32.5 -39t-35.5 -37q-33 -35 -76 -69t-65 -74q-25 -43 -31 -99.5t-18.5 -106.5t-44 -84t-107.5 -34q-61 0 -111.5 25.5t-85 68.5t-54 98.5t-19.5 112.5q0 59 17.5 112.5t41.5 106.5q-35 -2 -69.5 -4t-69.5 -2q-55 0 -107.5 10.5t-93.5 35t-66.5 67.5 t-25.5 108zM119 309q0 -35 17.5 -55.5t43 -30.5t56 -12t57.5 -2q47 0 91 3t89 3q31 0 61.5 -3t59.5 -15q0 -41 -16.5 -78t-36 -75t-34.5 -79t-15 -90q0 -33 10 -65.5t29.5 -59t47 -43t64.5 -16.5q4 0 11.5 -1t11.5 1q8 4 9 8l3 12q12 59 22.5 124t38.5 118q29 51 74 88 t86 78q29 31 49.5 56.5t42 48t47 42t66.5 35.5h2v643q-72 0 -137.5 16.5t-133 36t-141 36t-159.5 16.5q-45 0 -98.5 -7.5t-99.5 -27t-78 -56t-32 -96.5q0 -10 1 -18t3 -19q-35 -16 -53 -53t-18 -74q0 -39 20 -67q-59 -49 -59 -123q0 -23 12 -43.5t27 -34.5 q-16 -29 -28.5 -57.5t-12.5 -63.5zM1202 860q0 -33 23.5 -56.5t56.5 -23.5q35 0 57.5 23.5t22.5 56.5q0 35 -22.5 57.5t-57.5 22.5q-33 0 -56.5 -22.5t-23.5 -57.5z" />
+<glyph unicode="&#xf089;" horiz-adv-x="837" d="M1 959.5q9 27.5 54 33.5l506 74l227 459q23 41 50 41v-1348l-453 -237q-41 -23 -64.5 -6.5t-15.5 63.5l86 504l-364 356q-35 33 -26 60.5z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1802" d="M0 1073q0 137 43 231.5t112.5 153t156.5 84t177 25.5q63 0 125 -21.5t115 -53.5t97 -70t75 -68q31 31 76 68.5t98 69.5t113.5 53.5t126.5 21.5q88 0 175 -25.5t156.5 -84t112.5 -153t43 -231.5q0 -94 -34.5 -177t-76.5 -146.5t-79 -102.5t-39 -43l-615 -612 q-26 -23 -57 -23q-33 0 -55 23l-617 614q-4 2 -39.5 41t-77.5 102.5t-77 146.5t-35 177zM160 1073q0 -68 27.5 -131t61.5 -112.5t63 -79.5l28 -29l561 -559l561 559l29 29q29 30 62.5 79.5t61 113t27.5 130.5q0 104 -29.5 169t-77.5 101.5t-106.5 50t-113.5 13.5 q-53 0 -107.5 -25.5t-102.5 -61.5t-86 -74t-56 -60q-25 -31 -62 -31t-61 31q-18 23 -56.5 60.5t-86.5 73.5t-102.5 61.5t-105.5 25.5q-57 0 -115.5 -13.5t-106.5 -50t-77.5 -101t-29.5 -169.5z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1689" d="M0 307v922q0 63 24.5 118.5t66.5 97.5t97.5 66.5t118.5 24.5h461v-193h-461q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h461v-193h-461q-63 0 -118.5 24.5t-97.5 66.5t-66.5 97.5t-24.5 118.5zM508 584v368q0 33 22.5 54.5t55.5 21.5h428v293 q0 41 39 57q39 14 65 -14l553 -553q18 -18 18.5 -44t-18.5 -42l-553 -553q-18 -18 -43 -18q-10 0 -22 4q-39 16 -39 57v291h-428q-33 0 -55.5 22.5t-22.5 55.5z" />
+<glyph unicode="&#xf08c;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1150q-80 0 -136.5 56.5t-56.5 136.5zM207 1192q0 -57 40 -97t95 -40q57 0 97 40t40 97q0 55 -40 95t-97 40q-55 0 -95 -40 t-40 -95zM213 240q0 -10 9 -19.5t20 -9.5h200q12 0 20.5 9t8.5 20v706q0 29 -29 29h-200q-10 0 -19.5 -8.5t-9.5 -20.5v-706zM580 240q0 -10 9 -19.5t19 -9.5h201q12 0 20.5 9t8.5 20v383q0 68 26.5 113.5t102.5 45.5q59 0 79.5 -28.5t20.5 -81.5v-432q0 -10 8 -19.5 t21 -9.5h204q10 0 19.5 9t9.5 20v477q0 141 -81 208.5t-216 67.5q-55 0 -107.5 -15t-93.5 -56q0 16 -3 34.5t-25 18.5h-195q-10 0 -19 -8.5t-9 -20.5v-706z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1916" d="M2 950q8 82 45 172t100 176t139 147.5t152 92.5t145.5 30t121.5 -40q53 -41 73.5 -107.5t12.5 -148.5l301 -225q111 63 215 73t180 -47q55 -41 80.5 -108.5t23.5 -150.5t-30.5 -177t-83.5 -188l428 -410q25 -25 4 -53q-12 -16 -33 -17q-10 0 -18 6l-517 293 q-74 -80 -155.5 -135t-161.5 -80.5t-151.5 -19.5t-127.5 47q-76 55 -95 158.5t9 228.5l-303 223q-76 -33 -145.5 -32t-122.5 40q-51 39 -72.5 104.5t-13.5 147.5zM171 858.5q3 -16.5 15 -27.5q21 -14 50 -14q31 0 65.5 17.5t71.5 46t72.5 66.5t66.5 79q10 14 7 30.5 t-15 26.5q-14 10 -30.5 8.5t-27.5 -16.5q-78 -104 -138 -143t-72 -35q-14 10 -31 7t-27 -15q-10 -14 -7 -30.5zM465 754l364 -271q8 -8 23 -8q20 0 33 17q10 14 8 29.5t-16 25.5l-347 258q-16 -14 -32.5 -27.5t-32.5 -23.5zM829.5 239.5q1.5 -16.5 16.5 -26.5q29 -23 69 -23 q41 0 88.5 21.5t95.5 57.5t94 84.5t87 101.5q10 12 8 28.5t-16 26.5q-12 10 -28.5 8t-26.5 -16q-51 -68 -102.5 -116t-95.5 -75.5t-78 -36t-48 4.5q-14 10 -29.5 7t-25.5 -18q-10 -12 -8.5 -28.5z" />
+<glyph unicode="&#xf08e;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h582q-2 -14 -4 -27.5t-2 -29.5v-88q0 -23 6 -48h-582q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v340q41 -31 90 -49t103 -20v-271q0 -63 -25 -118.5 t-67 -97.5t-97 -66.5t-119 -24.5h-1075q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM692.5 522q-0.5 25 16.5 41l770 772h-269q-25 0 -41 16.5t-16 41.5v86q-2 23 15.5 40t41.5 17h576q23 0 40 -17.5t17 -39.5v-86v-490q0 -25 -17.5 -42t-39.5 -15h-86 q-25 0 -41.5 16.5t-16.5 40.5v268l-772 -770q-16 -16 -40.5 -16t-41.5 16l-79 80q-16 16 -16.5 41z" />
+<glyph unicode="&#xf090;" horiz-adv-x="1689" d="M0 584v368q0 33 22.5 54.5t55.5 21.5h428v293q0 41 37 57q39 14 67 -14l553 -553q16 -18 16.5 -44t-16.5 -42l-553 -553q-18 -18 -43 -18q-8 0 -24 4q-37 16 -37 57v291h-428q-33 0 -55.5 22.5t-22.5 55.5zM922 0v193h460q47 0 81 33.5t34 80.5v922q0 47 -33.5 80.5 t-81.5 33.5h-460v193h460q63 0 118.5 -24.5t97.5 -65.5t67 -97.5t25 -119.5v-922q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5h-460z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1689" d="M0 1042v187q0 33 22.5 54.5t55.5 21.5h323q-2 12 -2 25v24v4q0 53 4.5 88t15.5 54.5t31.5 27.5t55.5 8h678q33 0 54.5 -8t32.5 -27.5t15 -54.5t4 -88v-25.5t-2 -27.5h324q33 0 55.5 -21.5t22.5 -54.5v-187q0 -63 -45.5 -130.5t-122 -128t-180 -106.5t-222.5 -65 q-51 -10 -91 -41.5t-40 -70.5q0 -35 17.5 -51.5t39 -31t40 -31.5t22.5 -52q4 -23 -2 -47q-4 -14 23.5 -23.5t67.5 -18.5t82 -22.5t64 -34.5q12 -10 19.5 -39.5t9.5 -64.5q2 -33 -6 -58.5t-29 -25.5h-985q-20 0 -28.5 25.5t-6.5 58.5q2 35 9.5 64.5t19.5 39.5q23 20 64 34 t80.5 23t68.5 18t25 24q-4 14 -4 25.5v21.5q2 35 21.5 52t42 31.5t39.5 31t17 51.5q0 39 -39.5 70.5t-93.5 41.5q-117 20 -220 66.5t-180 106t-122 127t-45 130.5zM154 1042q0 -20 23.5 -54t67.5 -70.5t106.5 -71.5t140.5 -60q-25 80 -44.5 175.5t-33.5 189.5h-260v-109z M1198 786q78 25 140.5 60t106.5 71.5t67.5 70.5t23.5 54v109h-262q-12 -94 -31.5 -189.5t-44.5 -175.5z" />
+<glyph unicode="&#xf092;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-337v25q0 39 2 97t-3.5 115.5t-24.5 104.5t-65 66q188 20 290 110t102 287q0 66 -22.5 128t-67.5 114q6 23 8 45t2 45 q0 41 -9.5 91t-31.5 85h-12q-43 2 -79 -8.5t-68 -27.5t-62.5 -37.5t-65.5 -39.5q-33 4 -65.5 6t-65.5 2t-65.5 -2t-65.5 -6q-35 18 -65.5 39t-62.5 38t-67.5 27.5t-79.5 8.5h-12q-23 -35 -32 -85t-9 -91q0 -23 2 -45.5t8 -44.5q-45 -51 -66.5 -114t-21.5 -128 q0 -193 95.5 -283t281.5 -112q-39 -16 -59.5 -50t-32.5 -75q-27 -8 -49.5 -15.5t-50.5 -7.5q-55 0 -88 28.5t-59.5 62.5t-56.5 62.5t-79 28.5q-4 0 -20.5 -2t-16.5 -12q0 -23 19.5 -32t31.5 -19q39 -31 56.5 -71t39 -76.5t62.5 -62.5t127 -26q35 0 80 11q0 -10 -1 -18.5 t-1 -16.5q0 -29 2 -59.5t-2 -59.5h-317q-80 0 -136.5 56.5t-56.5 136.5z" />
+<glyph unicode="&#xf093;" d="M0 39v614q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-346h1229v346q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-614q0 -39 -39 -39h-1765q-39 0 -39 39zM346 969.5q-6 15.5 16 38.5l504 505q23 23 55.5 23t55.5 -23l506 -505q23 -23 15.5 -38.5 t-38.5 -15.5h-307v-499q0 -33 -22.5 -55.5t-55.5 -22.5h-307q-33 0 -54.5 22.5t-21.5 55.5v499h-307q-33 0 -39 15.5z" />
+<glyph unicode="&#xf094;" horiz-adv-x="1609" d="M2 514q-2 35 1 68.5t7 74.5q4 35 7 72t10 66q14 66 30.5 128t44.5 117q20 41 45 81t54 79q10 14 21 24.5t24 20.5q23 23 45 45.5t49 42.5t57.5 36.5t65.5 33.5q33 16 67.5 29.5t71.5 27.5q70 29 156 51l2 2q45 12 85 17.5t79 5.5q59 0 112.5 -9t106.5 -20q41 -8 85 -15 t93 -7h2q29 0 62.5 5t66.5 5q25 0 45.5 -6t32.5 -25q23 -31 26 -71.5t-2 -75.5q-4 -35 -8 -71t2 -72q4 -23 11.5 -39.5t15.5 -36.5q8 -18 11 -40t7 -42q18 -104 15.5 -195.5t-23 -170.5t-56.5 -148.5t-81 -132.5q-37 -49 -79 -97.5t-92 -91.5t-110.5 -77.5t-134.5 -59.5 q-76 -27 -158.5 -34t-158.5 -11h-31q-104 0 -194.5 16.5t-192.5 16.5h-4q-35 0 -77 -10.5t-83 -12.5h-2q-37 0 -65.5 17.5t-42.5 42.5q-20 35 -17.5 72.5t12.5 68.5t10.5 66.5t-5 75.5t-12.5 81t-9 82z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1597" d="M0 1169q0 55 14.5 114.5t43 114t68.5 98.5t93 69q12 -2 26.5 0t26.5 2q10 0 30 -1l40 -2t38.5 -4.5t27.5 -7.5q8 -6 15 -18t12 -26.5t9.5 -30t8.5 -25.5q6 -18 23.5 -65.5t35.5 -97.5t32.5 -93t14.5 -53q0 -37 -24.5 -68t-54 -57.5t-54.5 -50t-25 -45.5q0 -20 16.5 -49 t26.5 -46q84 -145 188.5 -248.5t252.5 -187.5q18 -10 45.5 -27.5t50.5 -17.5t52.5 32t60 70.5t62 70.5t58.5 32q10 0 51.5 -22.5t89.5 -50t93 -55.5t61 -36q16 -10 46 -25.5t40 -35.5q2 -6 2 -23q0 -16 -3 -36.5t-8 -43t-12 -43t-13 -35.5q-18 -39 -59.5 -71.5t-92.5 -55 t-104.5 -36t-92.5 -13.5q-80 0 -153.5 25.5t-145.5 54.5q-123 45 -232.5 118t-203.5 164t-175 196.5t-144 215.5q-25 41 -52.5 95.5t-51 112t-39 113.5t-15.5 105z" />
+<glyph unicode="&#xf096;" d="M0 307v922q0 63 24.5 118.5t66.5 97.5t97.5 66.5t118.5 24.5h1075q63 0 118.5 -24.5t97.5 -66.5t67 -97.5t25 -118.5v-922q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5h-1075q-63 0 -118.5 24.5t-97.5 66.5t-66.5 97.5t-24.5 118.5zM193 307q0 -47 33.5 -80.5 t80.5 -33.5h1075q47 0 81 33.5t34 80.5v922q0 47 -34 80.5t-81 33.5h-1075q-47 0 -80.5 -33.5t-33.5 -80.5v-922z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1253" d="M0 84v1337q0 47 34 81t81 34h1024q47 0 80.5 -34t33.5 -81v-1337q0 -47 -33.5 -81t-80.5 -34t-80 33l-432 432l-432 -432q-33 -33 -80 -33t-81 34t-34 81zM158 186l469 471l469 -471v1194h-938v-1194z" />
+<glyph unicode="&#xf098;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1150q-80 0 -136.5 56.5t-56.5 136.5zM193 1040q2 -35 15 -76.5t30 -78.5q16 -37 33.5 -72t33.5 -63q74 -129 176.5 -241 t225.5 -190q31 -18 67.5 -36.5t75.5 -32.5q41 -16 83 -31.5t81 -21.5q63 -10 112.5 2t90.5 34q27 12 57.5 33.5t44.5 52.5q4 8 9 27t9 38t6.5 37.5t-2.5 29.5q-4 12 -24.5 22t-36.5 21q-43 25 -71.5 41t-67.5 38q-16 10 -36 23.5t-38 13.5q-23 0 -46.5 -27.5t-37.5 -43.5 q-12 -14 -36.5 -43t-47.5 -31q-14 -2 -32.5 10t-37.5 23q-106 59 -182 136t-135 177q-10 16 -21.5 37.5t-7.5 38.5q2 18 24.5 33.5t35.5 29.5q14 16 31.5 37t19.5 43q4 16 -5 38t-16 42q-16 43 -28.5 76t-26.5 76q-6 16 -12 40.5t-21 30.5q-8 4 -26.5 7t-39 4.5t-37.5 0 t-24 -1.5h-8q-33 -16 -62.5 -45.5t-51 -69.5t-34 -88t-9.5 -100z" />
+<glyph unicode="&#xf099;" d="M0 399q0 20 13.5 33.5t33.5 13.5q14 0 31 -12q123 -109 287 -108q59 0 117.5 15t107.5 48q-29 16 -47.5 42t-18.5 58q0 23 8 39q-18 6 -44.5 20.5t-51 34t-41 43t-16.5 46.5q0 16 10 28.5t25 22.5q-41 25 -76 74t-35 98q0 33 33 43q-35 35 -55.5 81t-20.5 95 q0 23 9.5 41.5t37.5 18.5q18 0 84 -27t142.5 -60.5t146.5 -67.5t98 -48q25 -14 47.5 -31.5t44.5 -36.5q20 51 47 106.5t60 106.5t73 96t89 74q8 6 24 6q18 0 27 -8q16 6 41.5 13.5t42.5 7.5q29 0 43 -27q31 0 56.5 -15.5t25.5 -50.5q0 -31 -27 -53q96 -43 159.5 -125 t90.5 -182q6 -2 23 -2q47 0 88 16.5t57 16.5q18 0 31.5 -14.5t13.5 -32.5q0 -23 -19.5 -48.5t-33.5 -39.5q23 4 42 -7.5t19 -38.5q0 -29 -26.5 -50t-61.5 -37.5t-72.5 -25.5t-58.5 -11q-43 -139 -133 -246t-210 -178.5t-258 -109.5t-275 -38q-219 0 -415 93.5t-325 273.5 q-8 16 -8 26z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="790" d="M0 862v203q0 16 11.5 28.5t27.5 12.5h125v102q0 358 366 359q123 0 232 -31q33 -10 29 -43l-27 -199q-4 -16 -16 -26q-16 -10 -31 -6q-35 8 -72.5 12t-66.5 4q-53 0 -65.5 -16.5t-12.5 -67.5v-88h223q14 0 29 -14q10 -10 10 -29l-17 -205q0 -16 -11 -25.5t-27 -9.5h-207 v-784q0 -16 -11.5 -27.5t-27.5 -11.5h-258q-16 0 -27.5 11.5t-11.5 27.5v784h-125q-16 0 -27.5 11.5t-11.5 27.5z" />
+<glyph unicode="&#xf09b;" horiz-adv-x="1847" d="M0 743q0 115 37 222.5t113 193.5l-3 4l3 2q-16 39 -21.5 81t-5.5 85q0 25 2 56.5t8 65.5t15.5 63.5t23.5 50.5h8q61 0 110.5 -12.5t94.5 -35t87 -52t91 -60.5q86 25 178.5 33t182.5 8t182 -8t180 -33q47 31 90 60.5t87 52t93.5 35t110.5 12.5h10q12 -20 21.5 -50 t15.5 -64t9 -65.5t3 -56.5q0 -43 -6 -85t-20 -81v-2l-2 -4q76 -86 112.5 -193.5t36.5 -222.5q0 -233 -66.5 -383.5t-188.5 -236.5t-292 -120t-376 -34q-207 0 -378 34t-292 120t-187.5 236.5t-66.5 383.5zM250 483q0 -145 64.5 -224t165 -116t219 -43t227.5 -6q74 0 152.5 2 t153.5 12.5t142.5 34t117.5 67.5t80 111.5t30 165.5q0 84 -27 147.5t-75 106.5t-114.5 64.5t-146.5 21.5q-78 0 -156.5 -7t-156.5 -7t-157 7t-157 7q-162 0 -262 -87t-100 -257zM494 524q0 66 26.5 113t65.5 47t66.5 -47t27.5 -113t-27.5 -112.5t-66.5 -46.5t-65.5 46.5 t-26.5 112.5zM795 258q-6 16 12 25q16 6 24 -13q27 -76 93 -75q31 0 56.5 20.5t35.5 54.5q8 20 26 13q16 -6 13 -25q-16 -47 -51 -75.5t-80 -28.5q-43 0 -78 28.5t-51 75.5zM864 369q0 -12 17.5 -21.5t42.5 -9.5t42 9.5t17 21.5t-17.5 21t-41.5 9q-25 0 -42.5 -9t-17.5 -21z M1167 524q0 -66 28 -112.5t67 -46.5t65.5 46.5t26.5 112.5t-27 113t-65 47q-39 0 -67 -47t-28 -113z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1880" d="M0 117v626q0 49 35 84t82 35h665v156q0 113 43 213t118 175t175 118t213 43t213.5 -43t175 -118t117.5 -175.5t43 -212.5v-152q0 -33 -22.5 -55.5t-55.5 -22.5h-80q-33 0 -55 23t-22 55v152q0 66 -25 123t-67 99t-99 66.5t-123 24.5t-122 -24.5t-99 -66.5t-67.5 -99.5 t-24.5 -122.5v-156h119q47 0 81.5 -34.5t34.5 -84.5v-626q0 -47 -34.5 -82t-81.5 -35h-1020q-47 0 -82 35t-35 82zM494 164h266l-66 285q29 18 47.5 48.5t18.5 65.5q0 55 -39 95t-94 40t-94 -40t-39 -95q0 -35 18 -65.5t47 -46.5z" />
+<glyph unicode="&#xf09d;" d="M0 154v1228q0 63 45 108.5t109 45.5h1536q63 0 108 -45t45 -109v-1228q0 -63 -45 -108.5t-108 -45.5h-1536q-63 0 -108.5 45t-45.5 109zM154 154h1536v575h-1536v-575zM154 1114h1536v268h-1536v-268zM260 250v115h307v-115h-307zM676 250v115h446v-115h-446z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1566" d="M0 236q0 49 18.5 91t50 74.5t75 51t92.5 18.5t91 -18.5t74.5 -51t51 -74.5t18.5 -91t-18.5 -92.5t-51 -75t-74.5 -50t-91 -18.5t-92.5 18.5t-75 50t-50 74.5t-18.5 93zM0 819v158q0 35 25 57q23 23 53 23q2 0 3 -1t3 -1q193 -14 362.5 -95t301 -212.5t212 -301.5 t95.5 -362q4 -35 -21 -59q-23 -25 -57 -25h-158q-29 0 -51.5 20.5t-26.5 51.5q-12 133 -68.5 249.5t-145.5 205.5t-205.5 145.5t-249.5 68.5q-31 4 -51.5 27t-20.5 51zM0 1331v158q0 33 25 55q23 23 53 23h4q301 -16 565 -137t463 -320t319.5 -463t137.5 -565q4 -31 -23 -57 q-23 -25 -55 -25h-158q-31 0 -53.5 21.5t-24.5 52.5q-14 238 -110 446.5t-255 367.5t-368 255t-446 110q-31 2 -52.5 24.5t-21.5 53.5z" />
+<glyph unicode="&#xf0a0;" d="M0 193v382q0 23 6 45.5t12 45.5l238 727q20 63 75.5 103t121.5 40h938q66 0 121 -40t75 -103l238 -727q6 -23 12 -45.5t6 -45.5v-382q0 -41 -15.5 -76t-41 -60.5t-61 -41t-74.5 -15.5h-1458q-80 0 -136.5 56.5t-56.5 136.5zM154 193q0 -16 11 -27.5t28 -11.5h1458 q16 0 27.5 11t11.5 28v382q0 16 -11.5 27.5t-27.5 11.5h-1458q-16 0 -27.5 -11t-11.5 -28v-382zM213 768h1417l-188 578q-4 16 -19.5 26t-31.5 10h-938q-16 0 -31.5 -10t-20.5 -26zM1057 385q0 39 27.5 66.5t68.5 27.5q39 0 66.5 -27.5t27.5 -66.5q0 -41 -27.5 -68.5 t-66.5 -27.5q-41 0 -68.5 27.5t-27.5 68.5zM1364 385q0 39 27.5 66.5t68.5 27.5q39 0 66.5 -27.5t27.5 -66.5q0 -41 -27.5 -68.5t-66.5 -27.5q-41 0 -68.5 27.5t-27.5 68.5z" />
+<glyph unicode="&#xf0a1;" d="M0 754v229q0 63 45 108.5t109 45.5h499q115 0 245 33.5t255 90t235.5 128t186.5 147.5q63 0 108.5 -45t45.5 -109v-368q49 -12 81.5 -52.5t32.5 -93.5t-32.5 -93t-81.5 -52v-369q0 -63 -45.5 -108t-108.5 -45q-68 68 -164 132t-206.5 117.5t-227.5 91.5t-227 50 q-43 -12 -70 -40t-37 -62.5t-2 -70.5t37 -65q-25 -41 -23 -75.5t20.5 -66.5t49.5 -61.5t66 -58.5q-20 -43 -69.5 -65.5t-106 -25.5t-110.5 10.5t-85 43.5q-18 61 -40 125t-36 130.5t-14 138t24 151.5h-200q-63 0 -108.5 45t-45.5 109zM807 741q102 -16 206.5 -49t205 -78 t191.5 -99t165 -112v930q-76 -59 -166 -113.5t-190.5 -98.5t-205 -77.5t-206.5 -48.5v-254z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1759" d="M0 317q104 78 172 172.5t109 201t60 224t28 240.5q6 84 56 159t126 131t163 89t167 33q74 0 163 -33t165.5 -88t129 -129t52.5 -158q6 -121 27.5 -239.5t63.5 -227t109.5 -204t167.5 -171.5q-4 -70 -56 -114.5t-120 -44.5h-469q-18 -82 -82.5 -135.5t-150.5 -53.5 t-151.5 53.5t-84.5 135.5h-469q-68 0 -120 45t-56 114zM238 317h1284q-78 86 -129.5 183.5t-84 202t-50 214t-25.5 222.5q-4 55 -41 104t-89 86t-111.5 57.5t-110.5 20.5q-47 0 -107.5 -21.5t-114 -56.5t-91.5 -83t-40 -99q-6 -111 -23.5 -222.5t-51 -218t-87 -205 t-128.5 -184.5zM713 209q0 -70 49 -119t119 -49q18 0 18 20t-18 21q-53 0 -91 37t-38 90q0 20 -19 20q-20 0 -20 -20z" />
+<glyph unicode="&#xf0a3;" horiz-adv-x="1597" d="M0 573q0 33 23 56l143 139l-143 139q-23 23 -23 56q0 25 16.5 45t40.5 26l195 49q-6 18 -15.5 48t-18.5 61t-16 59.5t-7 46.5q0 31 21.5 52.5t51.5 21.5q18 0 47 -7t60 -16.5t60.5 -18.5t47.5 -15l49 194q6 25 27 41.5t45 16.5q35 0 53 -23l142 -143l139 143q23 23 53 23 q27 0 47.5 -15.5t26.5 -42.5l49 -194q18 6 48 15t60.5 18.5t59.5 16.5t47 7q29 0 51.5 -21.5t22.5 -52.5q0 -18 -7 -46.5t-16.5 -59.5t-18.5 -60.5t-15 -48.5l194 -49q25 -6 41 -26.5t16 -44.5q0 -33 -22 -56l-145 -139l145 -139q23 -23 22 -56q0 -25 -16 -45t-41 -26 l-194 -49q6 -18 15 -48t18.5 -61t16.5 -59.5t7 -46.5q0 -29 -21.5 -51.5t-52.5 -22.5q-18 0 -47 7t-59.5 16.5t-60 18.5t-48.5 15l-49 -194q-6 -25 -26.5 -41.5t-45.5 -16.5q-33 0 -55 23l-139 143l-142 -143q-18 -23 -53 -23q-25 0 -45 16.5t-27 41.5l-49 194 q-18 -6 -47.5 -15t-60.5 -18.5t-59.5 -16.5t-47.5 -7q-31 0 -52 22.5t-21 51.5q0 18 7 46.5t16 59.5t18.5 60.5t15.5 48.5l-195 49q-25 6 -41 26.5t-16 44.5z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1916" d="M0 193v643q0 49 35 83.5t84 34.5h348q27 14 42 30.5t34 39.5q16 20 33.5 38.5t33.5 37.5q35 35 77 68.5t65 74.5q25 43 29.5 99.5t17 106.5t44 84t109.5 34q61 0 111.5 -25.5t85.5 -68.5t54.5 -98.5t19.5 -112.5q0 -53 -15.5 -104.5t-38.5 -98.5h134l376 -2 q49 0 93.5 -17.5t76 -49.5t50 -75t18.5 -94q0 -49 -18.5 -92t-50 -74.5t-75.5 -49t-94 -17.5h-200q-10 -59 -39 -107q10 -59 -7.5 -117.5t-56.5 -103.5q0 -76 -28.5 -131t-75.5 -90t-109.5 -52.5t-132.5 -17.5q-78 0 -148.5 16.5t-136 36t-128 36t-123.5 16.5h-375 q-49 0 -84 34.5t-35 84.5zM233 276q0 -35 22.5 -57t57.5 -22q33 0 56.5 22.5t23.5 56.5q0 33 -23.5 56.5t-56.5 23.5q-35 0 -57.5 -23.5t-22.5 -56.5zM489 193q70 0 136.5 -16.5t133 -35t133 -35t138.5 -16.5q43 0 84 8t72 27.5t50 52.5t19 82q0 14 -1 26.5t-3 24.5 q35 16 53.5 53t18.5 74q0 39 -20 68q59 49 59 123q0 23 -12.5 43.5t-26.5 34.5q90 0 178 1t178 1q51 0 84 30.5t33 81.5q0 53 -32.5 85t-84.5 32q-172 0 -340 1t-338 1q0 41 16.5 78t35 74.5t34 78.5t15.5 91q0 33 -10.5 65.5t-29 59t-46 44t-64.5 17.5h-11t-11 -2 q-8 -4 -9 -8t-3 -13q-12 -59 -22.5 -123.5t-39.5 -117.5q-29 -51 -73 -88t-85 -78q-29 -31 -49 -56.5t-41.5 -48t-48.5 -42t-65 -35.5h-5v-643z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1916" d="M0 821q0 51 18.5 94t50 75t75.5 49.5t94 17.5l376 2h134q-23 47 -38.5 98t-15.5 105q0 57 19.5 112.5t54.5 98.5t85 68.5t112 25.5q78 0 109.5 -34t43.5 -84t17.5 -106.5t29.5 -99.5q23 -41 65 -74.5t77 -68.5q16 -18 33.5 -37t33.5 -39q18 -23 33.5 -39t42.5 -31h348 q49 0 84 -34.5t35 -83.5v-643q0 -49 -35 -84t-84 -35h-375q-61 0 -123.5 -16.5t-128 -36t-136 -36t-148.5 -16.5q-70 0 -132.5 17.5t-109.5 52.5t-75.5 90t-28.5 131q-39 45 -56.5 103.5t-7.5 117.5q-29 47 -39 107h-200q-49 0 -93.5 17.5t-76 49t-50 74.5t-18.5 92z M121 821q0 -51 32.5 -81.5t84.5 -30.5q90 0 178 -1t178 -1q-14 -14 -26.5 -35t-12.5 -43q0 -74 59 -123q-20 -29 -20 -68q0 -37 18.5 -73.5t53.5 -53.5q-2 -12 -3 -24.5t-1 -26.5q0 -49 19 -82t50 -52.5t72 -27.5t84 -8q70 0 137.5 16.5t134 35t133 35t135.5 16.5v643h-4 q-41 16 -66.5 35.5t-47 42t-42 48t-48.5 56.5q-41 41 -85 78t-73 88q-29 53 -39 117.5t-23 123.5q-2 8 -3 12.5t-9 8.5q-4 2 -11 2h-11q-37 0 -65 -17.5t-46 -44t-28.5 -59.5t-10.5 -65q0 -49 15.5 -90.5t34 -79t34.5 -74.5t16 -78q-170 0 -337.5 -1t-339.5 -1 q-51 0 -84 -32t-33 -85zM1524 276q0 -35 23.5 -57t56.5 -22q35 0 57 22.5t22 56.5q0 33 -22.5 56.5t-56.5 23.5q-33 0 -56.5 -23.5t-23.5 -56.5z" />
+<glyph unicode="&#xf0a6;" horiz-adv-x="1597" d="M0 602q0 61 25.5 111.5t68.5 85.5t98.5 54t112.5 19q53 0 104.5 -15t98.5 -38v133l2 377q0 49 17.5 93t49 76t74.5 50.5t94 18.5q49 0 92.5 -18.5t75 -50.5t49 -76t17.5 -93v-201q59 -10 106 -38q59 10 118 -7.5t104 -56.5q76 0 131 -28.5t90 -76t52 -109.5t17 -132 q0 -78 -16 -148.5t-35.5 -136t-36 -128t-16.5 -124.5v-374q0 -49 -35 -84t-84 -35h-643q-49 0 -84 34.5t-35 84.5v348q-14 27 -30.5 42t-38.5 34q-20 16 -39 33.5t-37 33.5q-35 35 -68.5 77t-74.5 64q-43 25 -99.5 30t-106.5 17.5t-84 44t-34 109.5zM120 591q-1 -7 1 -11 q4 -8 8 -9.5t12 -3.5q59 -12 124 -22t118 -39q51 -29 88 -73t78 -85q31 -29 56.5 -49t48 -41.5t42 -48.5t35.5 -66v-4h643q0 70 16.5 136.5t35 133t35 133t16.5 138.5q0 43 -8.5 84t-28 71.5t-52 50t-81.5 19.5q-14 0 -26.5 -1t-25.5 -3q-16 35 -53 53.5t-74 18.5 q-39 0 -67 -21q-49 59 -123 60q-23 0 -43.5 -12.5t-34.5 -26.5q0 90 -1 178t-1 178q0 51 -30.5 84t-82.5 33q-53 0 -84.5 -33t-31.5 -84q0 -172 -1 -340t-1 -338q-41 0 -78 16.5t-75 35t-79 34t-90 15.5q-33 0 -65.5 -10.5t-59 -29t-43 -46t-16.5 -64.5q0 -4 -1 -11z M1210 -37q0 -35 23.5 -57.5t56.5 -22.5q35 0 57.5 22.5t22.5 57.5q0 33 -22.5 56.5t-57.5 23.5q-33 0 -56.5 -23.5t-23.5 -56.5z" />
+<glyph unicode="&#xf0a7;" horiz-adv-x="1597" d="M0 584q0 78 34 109.5t84 44t106.5 17.5t99.5 29q41 23 74.5 65t68.5 77q18 16 36.5 33.5t39.5 33.5q23 18 39 33.5t30 42.5v348q0 49 35 84t84 35h643q49 0 84 -35t35 -84v-375q0 -61 16.5 -123.5t36 -128t35.5 -136t16 -148.5q0 -70 -17 -132.5t-52 -109.5t-90.5 -75.5 t-130.5 -28.5q-45 -39 -103.5 -56.5t-118.5 -7.5q-47 -29 -106 -39v-200q0 -49 -17.5 -93.5t-49 -76t-74.5 -50t-93 -18.5q-51 0 -94 18.5t-74.5 50t-49 75.5t-17.5 94l-2 376v134q-47 -23 -98.5 -38.5t-104.5 -15.5q-57 0 -112.5 19.5t-98.5 54.5t-68.5 85t-25.5 112z M120 595q1 -7 1 -11q0 -37 16.5 -64.5t43 -46t59 -29t65.5 -10.5q49 0 90 15.5t79 34t75 35t78 16.5q0 -170 1 -338t1 -340q0 -51 31.5 -84t84.5 -33q51 0 82 32.5t31 84.5q0 90 1 178t1 178q14 -14 34.5 -26.5t43.5 -12.5q74 0 123 59q29 -20 67 -20q37 0 74 18.5t53 53.5 q12 -2 24.5 -3t27.5 -1q49 0 81.5 19t52 50t28 72t8.5 84q0 70 -16.5 137.5t-35 134t-35 133t-16.5 136.5h-643v-5q-16 -41 -35.5 -66.5t-42 -47t-48 -42t-56.5 -48.5q-41 -41 -78 -85t-88 -73q-53 -29 -117.5 -39t-124.5 -23l-12 -3t-8 -9q-2 -4 -1 -11zM1210 1223 q0 -33 23.5 -56.5t56.5 -23.5q35 0 57.5 23.5t22.5 56.5q0 35 -22.5 57.5t-57.5 22.5q-33 0 -56.5 -23t-23.5 -57z" />
+<glyph unicode="&#xf0a8;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -29 20 -49l490 -490q20 -20 48.5 -20t49.5 20l74 74q20 20 20 48 t-20 50l-246 246h612q29 0 49.5 19.5t20.5 48.5v104q0 29 -20.5 49.5t-49.5 20.5h-612l246 246q20 20 20 48.5t-20 49.5l-74 74q-20 20 -48 20t-50 -20l-490 -490q-20 -20 -20 -49z" />
+<glyph unicode="&#xf0a9;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 717q0 -29 20.5 -49.5t48.5 -20.5h613l-246 -246q-20 -20 -20.5 -48.5 t20.5 -49.5l74 -74q20 -20 47.5 -20t50.5 20l489 490q20 20 20.5 49t-20.5 49l-489 490q-20 20 -49 20t-49 -20l-74 -74q-20 -20 -20.5 -48t20.5 -50l246 -246h-613q-29 0 -49 -19.5t-20 -48.5v-104z" />
+<glyph unicode="&#xf0aa;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -29 20 -49l74 -74q20 -20 48 -20t50 20l246 246v-612q0 -29 19.5 -49.5 t47.5 -20.5h105q29 0 49.5 20.5t20.5 49.5v612l245 -246q20 -20 49 -20t50 20l73 74q20 20 20.5 48t-20.5 50l-489 490q-20 20 -49 20t-49 -20l-490 -490q-20 -20 -20 -49z" />
+<glyph unicode="&#xf0ab;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 769q0 -28 20 -50l490 -490q20 -20 48.5 -20t49.5 20l489 490q20 20 20.5 49 t-20.5 49l-73 74q-20 20 -48 20t-51 -20l-245 -246v612q0 29 -19.5 49.5t-48.5 20.5h-104q-29 0 -49.5 -20.5t-20.5 -49.5v-612l-246 246q-20 20 -49 20t-49 -20l-74 -74q-20 -20 -20 -48z" />
+<glyph unicode="&#xf0ac;" horiz-adv-x="1597" d="M0 768q0 162 63.5 307.5t173 255t254 173t308.5 63.5q162 0 307 -63.5t254.5 -173t173 -255t63.5 -307.5q0 -164 -63.5 -308.5t-173 -254t-254.5 -173t-307 -63.5q-164 0 -308.5 63.5t-254 173t-173 254t-63.5 308.5zM186 1141h4q4 0 12.5 3t8.5 -9q0 -4 -3 -10.5 t11 -6.5q4 0 5 6t3 0l4 -16v-2q0 -4 -5 -6t-3 -6q4 -4 9.5 -4h9.5l4 2l2 2q0 -6 6 -8.5t10 -2.5h2q0 -2 -4 -4t0 -6l23 -4v-2l14 -29q0 -4 -3 -10t-7 -6t-3 3t1 7t-2 7t-15 3q-2 0 -5 -1t-1 -5l12 -26l3 -2l2 -2q-10 0 -13.5 -24t-3.5 -34l4 -18l2 -6v-4l-4 -19l29 -43h6 q2 -4 -2 -8t-2 -8l8 -8q0 -10 4 -14.5t13 -12.5q-2 -12 20.5 -22.5t28.5 -14.5q8 -23 20 -45.5t29 -38.5l2 -14q0 -2 -5 -4t-1 -6l16 -7q4 4 10.5 -8t10.5 -16l-2 -6l12 -17l6 -2l4 8q-4 10 -14 26.5t-20.5 32t-17.5 28t-7 14.5t-2 16t-4 17q6 -4 15 -7.5t15 -7.5 q4 -25 19.5 -40t27.5 -34q-4 -4 0 -5t7 -1q4 -4 4 -14q14 -16 36.5 -44t22.5 -44v-2l-4 -14q6 -16 20.5 -25.5t28.5 -15.5h4q20 -10 41 -21.5t43 -19.5l23 14q8 -2 17 -10t20.5 -18.5t27 -19.5t35.5 -11q14 10 14 -5v-4l25 -30l4 -15q10 -6 20.5 -15t16.5 -20h4 q10 0 16.5 -9t16.5 -9q6 0 6 6q0 14 2 18.5t5 5.5t6 1t3 4l-4 6q-4 0 -6 -5t-6 -1l-14 -8l-17 4l-24 41l8 57q2 4 -7.5 9t-5.5 10q-14 8 -34 8q-4 0 -20.5 -3t-16.5 3t3 16t7 21.5t6 19.5t2 10l13 27l-3 4l-16 4q-4 0 -13 -6t-17.5 -14.5t-14.5 -16.5t-6 -14l-45 -10 q-14 0 -23 12q-4 16 -17 35.5t-13 34.5q0 23 8 43t-6 43q2 0 5 2t1 6l12 14l2 2l2 -2q14 10 37 7t29 14l16 -13q4 -2 9 4.5t5 10.5l-8 4l39 10l2 -6l19 2l22 -14q4 0 8 5t9 1l20 -21q-4 -8 -1 -12t3 -8q0 -6 10.5 -27.5t18.5 -21.5q10 0 9 13t-1 17q0 20 -8 39t-15 39v6 q0 10 12.5 17.5t12.5 9.5q10 8 22.5 16t18.5 19l8 16v10h6t4 6q0 2 -3 3.5t-7 5.5q-4 2 -8 6l6 4q4 6 6 15t-2 16l15 8q-2 -6 4 -8t10 0l10 16q-4 10 -5 7t5 7q10 4 19.5 9.5t19.5 5.5q2 -2 4 -2q6 0 6 2q0 10 -4 12l12 25q14 0 21 12l18 2q6 2 6 8v2l35 10l4 11l-10 14 q2 0 2 4t-4 6t-7 4t-7 4l-4 -2l4 2h6h13t9 9q0 12 -14 12q-18 0 -41.5 -8.5t-32.5 -28.5l-14 -8l18 18l3 6q0 4 -9.5 5.5t-5.5 1.5q18 0 27.5 4t15.5 9t12.5 10t18.5 9q23 -4 44 -2t44 2q6 4 12 8.5t8 10.5l23 4q4 -4 12 2t8 10q0 10 -11 13t-11 14q0 2 1 6t-3 4 q-6 0 -19.5 -6t-19.5 -10q-4 -2 -5 1t-1 7l2 -2l8 4l23 8l4 4q0 6 -7.5 8t-11.5 2t-12 -3t-8 3l2 4q-12 10 -21.5 22.5t-9.5 16.5t1 8.5t-5 4.5q-4 0 -7 -1t-3 5q0 4 -5 17t-14 13l-8 -8q0 -6 -6 -9t-6 -7h-4l-21 -12q-2 4 -5 2t-7 -2h-2l-2 -2q8 0 7 9t-7 9l-16 -4 q-4 0 -4.5 1t2 4t4.5 7t0 8t-6.5 1t-4.5 1h6l5 5q2 2 -1.5 7t-5.5 7l-22 4l-14 12q-2 -2 -7.5 3t-9.5 7l-16 -6l-39 9q-4 0 -8 -2.5t-4 -6.5t4 -6t4 -6t3 -21.5t-5 -13.5l-10 -14q2 -4 7 -7t10 -7.5t9 -10.5t2 -18l-45 -31v-4q0 -8 4 -15t8 -18q10 -4 9.5 -7t-7 -6t-12.5 -6 t-6 -5t-4 -2h-8h-4q0 2 2 3t2 5l-19 12v-2l-8 16q4 10 1 14.5t-3 10.5q0 16 -14.5 16t-30.5 -4q4 2 -1 6.5t-7 4.5q-16 0 -38 14t-36 14q-6 0 -14 -2t-15 -4q4 2 5 10l-13 23l-2 2q-6 0 -14 -5t-8 9q0 2 2 4t0 4q-2 12 5 20.5t11 18.5q4 4 4 8t4 4q8 0 15.5 4.5t17.5 6.5 l2 6q0 4 -21.5 7t-21.5 7l2 2q20 -6 30.5 -7t17.5 2t16.5 8t29.5 14q0 4 -21.5 8t-27.5 8h12q4 0 10.5 -2t10.5 -4q0 -4 6 -5t10 -1l15 10v6l-4 6l22 4q-2 2 1 4t5 2q6 0 12.5 -6t8.5 -6l20 8q-2 2 5.5 3t4.5 6l-14 16q-2 0 -3 3t1 3q10 0 6 10q-8 4 -17 9.5t-20 5.5 q-4 0 -9 -2t-5 -7q0 -4 5 -4t7 -4q4 -4 -2 -4t-6 -2q-8 0 -15 -12t-18 -17q-4 0 -3 2.5t-1 4.5q-2 4 -7 5t-5 5t5 13t-13 9q-8 0 -11.5 -6t-7.5 -12l-22 25l-17 2q0 8 3.5 14t-9.5 16q-6 4 -11 7.5t-11 3.5q-2 0 -9.5 -4.5t-13.5 -8.5t-6 -8t10 -4h-2q-6 0 -6 -8 q0 -2 9.5 -5t13.5 -3q4 2 6 -1.5t6 -3.5l8 3v-5q-2 -2 -2 -4l2 -8l-20 -10q-2 -2 -4 -2t-5 -2q0 -6 5.5 -12.5t-11.5 -6.5l-6 4q0 8 -16.5 13.5t-40 7.5t-47 3t-35.5 1l-33 -10l8 -19q-4 0 -5 -3t3 -5q-4 4 -15 14.5t-15 10.5l-17 4q-35 -2 -78 -33t-84 -72t-75.5 -84 t-53.5 -71zM471 674h2h-2zM487 1413q14 2 25.5 8t24.5 6l6 -4q6 -2 11 -2t9 -4q8 2 17 -2l6 4v8l-2 5l6 -2q6 0 12 10l-2 4q-4 2 -10 4t-10 2t-16.5 -5t-28 -11.5t-29.5 -12.5t-19 -8zM918 86q0 -4 3 -9t3 -9q0 -5 -2 -7q115 20 217 74.5t182 140.5h-2q-8 -4 -14 0l-5 -4 l-12 4h-4l-4 -8l2 8q-6 8 -14 15l-4 2q-4 0 -4 -8q2 16 -8.5 27.5t-26.5 11.5q0 -2 -2 -2h-4l-5 4h7l4 12l-11 8l-2 -2q-14 2 -20 16l-4 2l-2 -2l-4 -2q-12 -4 -21 -8q-12 4 -18 10l-27 -2q0 6 -4 12.5t-12 6.5q-10 0 -20.5 -2t-14.5 -13q0 -4 2 -8t4 -6v-8l-2 -6l-4 -2h-2 l-6 16l6 10q-2 4 -2 10.5t-2 10.5l-2 4h-6l-15 -10h-8l-4 -4q-2 -2 -2 -4t-2 -3l-2 3h-8q-8 -8 -9 -19l3 -4l-9 -6l-2 -4l-6 -4q0 -2 -1 -2t-1 -2v-2v-9l-2 -2v4l-2 2q-2 12 -23 21h-6v-4q2 -6 8.5 -10.5t10.5 -8.5q-2 2 -5 1t-3 -3v-4l14 -20v-39l4 -10q-4 -16 -16 -27v2 l-4 -2l-3 -2l-2 -10l2 -2v-2l-4 4l-2 -13l-12 -4q-6 -4 -5 -11t-5 -11l2 -4l-6 -6q0 -4 -1 -6.5t-1 -6.5l2 -14l6 -4l4 4l2 6l2 -12q0 -4 -4 -8q-6 -4 -12 -9.5t-6 -15.5z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1593" d="M8 242q0 33 12.5 62.5t34.5 51.5l609 609q-16 66 -17 122q0 98 38 186.5t102.5 153t151.5 102.5t185 38q94 0 181.5 -36t154.5 -101l-442 -162l-43 -236l184 -153l443 159q-10 -92 -50.5 -171t-104 -137t-145 -91t-174.5 -33q-61 0 -127 17l-606 -607q-47 -47 -112 -47 q-68 0 -115 47q-23 23 -50.5 47.5t-52 52t-41 58.5t-16.5 68zM203 242q0 -33 22.5 -56.5t57.5 -23.5q33 0 56 23.5t23 56.5q0 35 -23.5 57.5t-55.5 22.5q-35 0 -57.5 -23t-22.5 -57z" />
+<glyph unicode="&#xf0ae;" d="M0 76v217q0 31 22.5 53.5t53.5 22.5h1689q33 0 55.5 -22.5t22.5 -53.5v-217q0 -31 -22.5 -53.5t-55.5 -22.5h-1689q-31 0 -53.5 22.5t-22.5 53.5zM0 662v215q0 31 22.5 53t53.5 22h1689q33 0 55.5 -22.5t22.5 -52.5v-215q0 -33 -22.5 -55.5t-55.5 -22.5h-1689 q-31 0 -53.5 22.5t-22.5 55.5zM0 1243v217q0 31 22.5 53.5t53.5 22.5h1689q33 0 55.5 -22.5t22.5 -53.5v-217q0 -31 -22.5 -53.5t-55.5 -22.5h-1689q-31 0 -53.5 22.5t-22.5 53.5zM752 692h999v154h-999v-154zM1059 109h692v153h-692v-153zM1366 1274h385v153h-385v-153z " />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1566" d="M0 1458q0 33 22.5 55.5t55.5 22.5h1411q33 0 55.5 -22.5t22.5 -55.5t-23 -55l-565 -565v-791q0 -33 -22.5 -55.5t-55.5 -22.5t-55 23l-236 235q-23 23 -22 56v555l-565 565q-23 23 -23 55z" />
+<glyph unicode="&#xf0b1;" d="M0 115v512h713q-2 -6 -2 -19v-153q0 -55 38.5 -95.5t96.5 -40.5h153q55 0 94.5 40t39.5 96v153q0 12 -3 19h713v-512q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM0 743v371q0 47 34 81t81 34h424v231q0 31 21.5 53.5t53.5 22.5h615q33 0 55.5 -22.5 t22.5 -53.5v-231h422q47 0 80.5 -34t33.5 -81v-371h-1843zM692 1229h461v153h-461v-153zM825 455v153q0 18 21 19h153q18 0 19 -19v-153q0 -18 -19 -19h-153q-20 0 -21 19z" />
+<glyph unicode="&#xf0b2;" horiz-adv-x="1536" d="M0 80v477q0 51 24.5 61.5t59.5 -24.5l162 -162l340 338l-338 338l-164 -164q-35 -35 -59.5 -25.5t-24.5 60.5v477q0 31 23 57q27 23 57 23h477q51 0 61.5 -24.5t-24.5 -59.5l-160 -158l338 -338l332 334l-162 162q-35 35 -24.5 59.5t61.5 24.5h477q33 0 55 -23 q25 -25 25 -57v-477q0 -51 -24.5 -61.5t-59.5 24.5l-162 162l-334 -334l338 -336l158 160q35 35 59.5 24.5t24.5 -61.5v-477q0 -35 -25 -55q-23 -25 -55 -25h-477q-51 0 -61.5 24.5t24.5 59.5l166 166l-336 336l-340 -340l162 -162q35 -35 24.5 -59.5t-61.5 -24.5h-477 q-31 0 -55 25q-25 20 -25 55z" />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1880" d="M0 852v152q0 18 1 47.5t10 56.5t29.5 46.5t57.5 19.5q-45 29 -71.5 75.5t-26.5 104.5q0 43 16.5 82t46 68.5t68.5 46t82 16.5q45 0 84 -16.5t67.5 -46t46 -68.5t17.5 -82q0 -57 -27.5 -104t-72.5 -76q37 0 57.5 -19.5t29.5 -46.5t11 -56.5t2 -47.5v-152 q-14 -8 -23.5 -18.5t-27.5 -10.5h-328q-16 0 -26.5 10.5t-22.5 18.5zM158 57v387q0 78 45 138.5t98 109.5q10 10 25.5 21.5t33.5 15.5q18 6 41 7t45 5q61 10 130 19.5t135 19.5q-90 57 -144.5 151.5t-54.5 207.5q0 88 34 166.5t92 136t136 91.5t166 34t166 -34t136 -91.5 t92 -136t34 -166.5q0 -113 -54 -207t-145 -152q66 -10 134.5 -19t130.5 -20q23 -4 45 -5t41 -7q18 -4 33.5 -15.5t27.5 -21.5q66 -59 103.5 -116.5t37.5 -131.5v-387q-12 -6 -20 -13t-18.5 -14t-23.5 -14.5t-36 -15.5h-1368q-35 0 -54.5 22.5t-43.5 34.5zM1452 852v152 q0 18 2 47.5t11.5 56.5t30 46.5t56.5 19.5q-45 29 -72.5 75.5t-27.5 104.5q0 43 16.5 82t46 68.5t68.5 46t84 16.5q43 0 82 -16.5t68.5 -46t46 -68.5t16.5 -82q0 -57 -26.5 -104t-71.5 -76q37 0 56.5 -19.5t28.5 -46.5t11 -56.5t2 -47.5v-152q-12 -8 -22.5 -18.5 t-26.5 -10.5h-328q-18 0 -27.5 10.5t-23.5 18.5z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1597" d="M0 1137q0 88 34 166.5t92 137t136 92.5t168 34q86 0 166 -33t139 -92q8 -8 21.5 -20.5t26 -25t21.5 -25.5t9 -25q0 -18 -12 -31q-6 -8 -25 -12q-47 -10 -88 -22.5t-86 -31.5q-4 -4 -16 -4t-25.5 10.5t-31 21.5t-42 21.5t-57.5 10.5q-35 0 -66.5 -13.5t-54 -37t-36 -54 t-13.5 -67.5q0 -41 17.5 -75t43 -63.5t56.5 -56.5t57 -53l180 -178q23 -25 54.5 -37t66.5 -12q43 0 73 16t46 16q12 0 39 -21.5t55.5 -49t50 -55t21.5 -42.5q0 -29 -36 -51t-83 -38.5t-94 -26t-72 -9.5q-86 0 -164.5 33t-140.5 92l-303 305q-61 59 -94 139.5t-33 166.5z M578 1010q0 29 35.5 51t82.5 38.5t94 26t72 9.5q86 0 166 -33t139 -92l303 -305q61 -59 94 -139.5t33 -166.5q0 -90 -33.5 -167.5t-92 -136t-137.5 -92.5t-167 -34q-86 0 -165.5 34t-139.5 93q-8 8 -21.5 19.5t-25.5 25t-21.5 26.5t-9.5 26q0 18 13 28q6 8 24 12 q47 10 88 22.5t86 33.5q12 4 17 4q12 0 25.5 -10.5t30.5 -21.5t41 -21.5t58 -10.5q72 0 121 49.5t49 120.5q0 41 -17 76t-44 63.5t-56.5 55.5t-56.5 53l-178 180q-53 49 -123 50q-43 0 -72.5 -17.5t-46.5 -17.5q-12 0 -38.5 21.5t-55 49t-50 56t-21.5 41.5z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1880" d="M0 391q0 70 23.5 132.5t64.5 113.5t96.5 86t120.5 51q-33 41 -51 90t-18 105q0 66 24.5 123t66.5 99t99 66.5t123 24.5q113 0 196 -72q18 76 61.5 141.5t103 113.5t133 75t157.5 27q96 0 182 -37t149.5 -100.5t100.5 -149.5t37 -182q0 -57 -13 -109.5t-36 -99.5 q117 -59 188.5 -170t71.5 -248q0 -98 -37 -183t-101.5 -149.5t-149.5 -101.5t-183 -37h-1018q-80 0 -151.5 30.5t-125 84t-84 125t-30.5 151.5z" />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1536" d="M16 72q-39 72 7 141l516 803v366h-78q-33 0 -54.5 22.5t-21.5 55.5q0 31 21.5 53.5t54.5 22.5h614q33 0 55.5 -22.5t22.5 -53.5q0 -33 -22.5 -55.5t-55.5 -22.5h-76v-368l514 -801q45 -70 7 -141q-18 -35 -51 -53.5t-70 -18.5h-1262q-37 0 -69.5 18.5t-51.5 53.5z M377 479h782l-313 490v413h-154v-411z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1916" d="M0 180q0 86 44 168t113.5 146.5t154.5 103.5t169 39h13q18 25 57 60.5t63 58.5v12v12q-12 12 -28.5 27.5t-35 32t-33.5 32t-23 27.5q-84 -6 -172.5 33t-160 105.5t-116.5 150.5t-45 168q0 98 62.5 154.5t160.5 56.5q82 0 168 -39t155.5 -103.5t114 -146.5t44.5 -168 q0 -10 -1.5 -21.5t-3.5 -21.5l86 -76l34 17q34 18 90.5 46.5t129 65.5t148.5 76t150.5 77t135 69.5t102.5 52t52 26.5q16 8 37 9q14 0 39 -4.5t52.5 -9.5t53 -11t41.5 -8q29 -4 47.5 -26.5t18.5 -51.5q0 -43 -35 -66l-700 -485l700 -485q35 -23 35 -66q0 -29 -18.5 -51.5 t-47.5 -26.5q-16 -4 -41.5 -9t-53 -10t-52.5 -9.5t-39 -4.5q-10 0 -18.5 2.5t-18.5 6.5l-842 430l-86 -76q2 -10 3.5 -21.5t1.5 -21.5q0 -86 -44.5 -168t-114 -146.5t-155.5 -103.5t-168 -39q-98 0 -160.5 56.5t-62.5 154.5zM197 1358q0 -23 11 -49.5t27.5 -51t35 -45 t34.5 -34.5q35 -29 82 -54.5t94 -25.5q10 0 27 4v6q0 23 -11.5 48.5t-27.5 50t-34.5 46t-35.5 35.5q-35 29 -82 54.5t-94 25.5q-14 0 -26 -4v-6zM199 180q0 -6 2 -10q6 0 11 -1t11 -1q41 0 90 24.5t92.5 61.5t72 83t28.5 89q0 4 -1 5t-1 5q-8 2 -23 2q-41 0 -90 -24.5 t-92 -61.5t-71.5 -83t-28.5 -89zM586 616q53 -25 82 -69l108 96l45 -27l1016 703l-172 31l-975 -498l6 -127zM586 920l35 -35q12 29 36.5 41t53.5 26l-43 37q-29 -45 -82 -69zM741 768q0 35 23.5 57.5t58.5 22.5q33 0 55.5 -22.5t22.5 -57.5q0 -33 -22.5 -56.5t-57.5 -23.5 q-33 0 -56.5 23.5t-23.5 56.5zM903 575l762 -389l172 31l-727 502z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1597" d="M0 385v707q0 33 16.5 70.5t38.5 60.5l258 258q23 23 61 39t70 16h463q31 0 53.5 -22.5t22.5 -53.5v-250q16 8 35.5 13.5t40.5 5.5h463q31 0 53 -22.5t22 -53.5v-1075q0 -33 -22.5 -55.5t-52.5 -22.5h-830q-33 0 -55.5 22.5t-22.5 55.5v229h-536q-33 0 -55.5 22.5 t-22.5 55.5zM154 461h460v293q0 45 10.5 87t45.5 74l159 162v305h-278v-321q0 -31 -22.5 -53.5t-53.5 -22.5h-321v-524zM186 1139h211v211zM768 154h676v921h-279v-321q0 -31 -22.5 -53.5t-52.5 -22.5h-322v-524zM801 831h211v211z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1470" d="M0 1128q0 90 35 170t94 139.5t139 94.5t170 35q88 0 169 -34t143 -95l655 -656q12 -12 12 -28q0 -10 -11 -26.5t-26.5 -32t-32 -27t-26.5 -11.5q-16 0 -29 13l-655 655q-41 41 -92 61.5t-107 20.5q-57 0 -108 -21.5t-89 -59.5t-59.5 -89t-21.5 -109q0 -55 20.5 -106 t61.5 -92l745 -746q55 -55 133 -55q39 0 74 15.5t60.5 41t41 60.5t15.5 73q0 78 -56 134l-563 563q-29 29 -69 28q-41 0 -71 -29.5t-30 -70.5t29 -70l475 -475q12 -12 12 -28q0 -10 -11 -26.5t-26.5 -32t-32 -27t-26.5 -11.5q-16 0 -29 13l-475 473q-35 37 -55.5 85 t-20.5 99q0 53 20.5 100.5t55.5 83t83.5 56t101.5 20.5q51 0 99 -20.5t85 -55.5l561 -563q102 -102 102 -246q0 -74 -27.5 -137t-74.5 -110t-110.5 -75t-137.5 -28q-143 0 -246 103l-745 745q-61 61 -95 142t-34 169z" />
+<glyph unicode="&#xf0c7;" horiz-adv-x="1536" d="M0 154v1228q0 63 45 108.5t109 45.5h1075q63 0 108 -45l154 -154q45 -45 45 -108v-1075q0 -63 -45 -108.5t-109 -45.5h-1228q-63 0 -108.5 45t-45.5 109zM154 846h1075v536h-1075v-536zM846 922v385h190v-385h-190z" />
+<glyph unicode="&#xf0c8;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1150q-80 0 -136.5 56.5t-56.5 136.5z" />
+<glyph unicode="&#xf0c9;" d="M0 78v215q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-215q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM0 659v218q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-218q0 -31 -22.5 -53t-53.5 -22h-1689 q-33 0 -55.5 22.5t-22.5 52.5zM0 1243v217q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-217q0 -31 -22.5 -53.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 53.5z" />
+<glyph unicode="&#xf0ca;" d="M0 211q0 39 15.5 75t41 61.5t60.5 40.5t76 15q39 0 73.5 -15t61 -40.5t42 -61.5t15.5 -75q0 -41 -15.5 -76t-42 -60.5t-61.5 -41t-73 -15.5q-80 0 -136.5 56.5t-56.5 136.5zM0 768q0 39 15.5 75t41 61.5t60.5 41t76 15.5q39 0 73.5 -15.5t61 -41t42 -61.5t15.5 -75 q0 -41 -15.5 -76t-42 -60.5t-61.5 -41t-73 -15.5q-41 0 -76 15.5t-60.5 41t-41 60.5t-15.5 76zM0 1325q0 39 15.5 75t41 61.5t60.5 41t76 15.5q39 0 73.5 -15.5t61 -41t42 -61.5t15.5 -75q0 -41 -15.5 -76t-42 -60.5t-61.5 -40.5t-73 -15q-41 0 -76 15t-60.5 40.5t-41 60.5 t-15.5 76zM522 154v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1167q-33 0 -55.5 21.5t-22.5 54.5zM522 711v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5 h-1167q-33 0 -55.5 22.5t-22.5 55.5zM522 1268v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1167q-33 0 -55.5 22.5t-22.5 55.5z" />
+<glyph unicode="&#xf0cb;" d="M0 594q0 55 30.5 90t68.5 61.5t69 50t31 56.5q0 29 -17.5 44t-46.5 15q-25 0 -44 -15t-34 -36l-53 37q23 39 58.5 60.5t78.5 21.5q55 0 96.5 -32t41.5 -91q0 -49 -30 -80t-67 -55.5t-67.5 -47t-30.5 -55.5h143v54h66v-115h-289q-2 10 -3 18.5t-1 18.5zM4 55l37 54 q6 -4 12 -10.5t15 -10.5q12 -8 29.5 -14t37.5 -6q35 0 55.5 18t20.5 47q0 31 -23.5 48.5t-58.5 17.5h-23l-16 37l90 108l6 6t7 6l4 6h-9q-4 -2 -14 -2h-92v-49h-66v111h263v-53l-97 -115q41 -6 74 -35t33 -82t-38 -95t-110 -42q-35 0 -60.5 9t-41.5 20q-25 14 -35 26z M14 1434l105 102h67v-360h93v-62h-259v62h93v258v8h-2q-10 -16 -22.5 -28.5t-29.5 -27.5zM522 154v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1167q-33 0 -55.5 21.5t-22.5 54.5zM522 711v114q0 33 22.5 55.5 t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1167q-33 0 -55.5 22.5t-22.5 55.5zM522 1268v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1167q-33 0 -55.5 22.5t-22.5 55.5z " />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1536" d="M0 692v152h1536v-152h-1536zM268 1114q0 117 44 202t118 141t170 83t203 27q88 0 176 -20.5t172 -49.5q20 -72 27.5 -156t7.5 -157q0 -10 -1 -22.5t-3 -24.5l-13 -2q-23 2 -50 2t-50 6q-18 59 -44 114.5t-62.5 98.5t-88 68.5t-122.5 25.5q-49 0 -94.5 -13.5t-80 -40 t-56 -66.5t-21.5 -93q0 -59 28.5 -102t75.5 -75t105.5 -54.5t118 -42t113.5 -39t93 -41.5h-696q-33 53 -51.5 110.5t-18.5 120.5zM285 310v63v45l110 2q31 -72 64 -134.5t76 -108.5t104 -71.5t152 -25.5q55 0 110 16.5t100.5 48t74 78.5t28.5 109q0 76 -49 128t-119 88 t-146.5 59.5t-132.5 45.5h617q8 -16 15 -38.5t10.5 -48t5.5 -50t2 -43.5q0 -131 -47.5 -226t-127 -156.5t-186 -91.5t-225.5 -30q-53 0 -93 4t-78 12.5t-78 20.5t-93 29q-12 4 -38 12t-36 16q-8 6 -12 50.5t-6 96.5t-2 100z" />
+<glyph unicode="&#xf0cd;" horiz-adv-x="1536" d="M0 0v154h1536v-154h-1536zM0 1532q10 2 19.5 2h19.5q72 0 140.5 -5t137.5 -5q100 0 200.5 2t199.5 6q-4 -16 -1 -36.5t3 -37.5v-8q-66 -10 -108 -7t-65.5 -5t-32.5 -39t-9 -109q0 -137 4 -272t10 -273q8 -147 88 -237t238 -90q125 0 207 29.5t131 88t69.5 146.5t20.5 203 q0 20 -2 65t-5 102.5t-8.5 119t-11.5 113.5t-13 89t-15 45q-33 33 -78 33q-6 0 -23.5 -1t-36 -1t-34 1t-21.5 3l2 82q82 4 163 -3t165 -7q39 0 77.5 5t79.5 5q4 0 9.5 -1t9.5 -1q2 -12 4 -24.5t2 -24.5t-4 -29q-23 -6 -52.5 -8t-58 -7t-48 -16.5t-19.5 -38.5q0 -14 1 -27 t3 -28q2 -6 5 -38.5t5 -79t4 -101.5t4 -103t3 -85t1 -50q0 -37 -2 -80.5t-8 -89t-17.5 -87.5t-29.5 -74q-41 -68 -104.5 -114t-137 -72.5t-153.5 -38t-154 -11.5q-72 0 -144.5 9.5t-140.5 35.5q-96 35 -151 88.5t-84 121t-36 148.5t-7 173v321v42t-1 62.5t-5 60.5t-10 38 q-12 16 -37 23.5t-53.5 10.5t-56.5 3t-44 4z" />
+<glyph unicode="&#xf0ce;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h460v335h-460v-335zM154 565h460v332h-460v-332zM154 975h460v332h-460v-332zM692 154h461v335h-461v-335zM692 565h461v332h-461v-332z M692 975h461v332h-461v-332zM1229 154h461v335h-461v-335zM1229 565h461v332h-461v-332zM1229 975h461v332h-461v-332z" />
+<glyph unicode="&#xf0d0;" d="M0 197q0 39 29 61l1579 1247q20 17 47 17q35 0 59 -29q10 -12 29.5 -33.5t38 -44t32 -47.5t13.5 -43q0 -39 -29 -61l-1579 -1248q-20 -16 -47 -16q-37 0 -59 29q-10 12 -30 33.5t-38 44t-31.5 47t-13.5 43.5zM256 922l117 36l37 117l34 -117l119 -36l-119 -37l-34 -117 l-37 117zM373 1229l235 71l72 236l72 -236l235 -71l-235 -72l-72 -235l-72 235zM942 1382l117 37l37 117l37 -117l116 -37l-116 -36l-37 -117l-37 117zM1286 1153l94 -121l369 291l-94 121zM1536 885l117 35l37 118l36 -118l117 -35l-117 -37l-36 -117l-37 117z" />
+<glyph unicode="&#xf0d1;" d="M0 358v404q0 25 6 51.5t17.5 53t27 51t31.5 40.5l223 222q16 16 41 31.5t51.5 26.5t53 17.5t51.5 6.5h80v198q0 31 22.5 53.5t52.5 22.5h1108q33 0 55.5 -22.5t22.5 -53.5v-1102q0 -31 -22.5 -53t-55.5 -22h-75v-7q0 -63 -25 -119.5t-65.5 -97.5t-97 -65.5t-120.5 -24.5 q-63 0 -119.5 24.5t-97.5 65.5t-65.5 97.5t-24.5 119.5v7h-307v-7q0 -63 -24.5 -119.5t-65.5 -97.5t-97.5 -65.5t-119.5 -24.5t-119.5 24.5t-97.5 65.5t-65.5 97.5t-24.5 119.5v7h-78q-31 0 -53.5 22.5t-22.5 52.5zM193 700h387v369h-78q-10 0 -31.5 -8t-30.5 -17l-223 -221 q-8 -8 -16 -29.5t-8 -31.5v-62zM346 276q0 -47 34 -80.5t81 -33.5t80.5 33.5t33.5 80.5t-33.5 81t-80.5 34t-81 -33.5t-34 -81.5zM1268 276q0 -47 33.5 -80.5t80.5 -33.5t81 33.5t34 80.5t-33.5 81t-81.5 34q-47 0 -80.5 -33.5t-33.5 -81.5z" />
+<glyph unicode="&#xf0d2;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5q-59 0 -115.5 8.5t-112.5 24.5q23 35 46.5 80t35.5 92l11 41q6 23 16 66t29 112q23 -41 76 -70.5t118 -29.5q96 0 176 41 t136.5 114.5t88 174t31.5 217.5q0 88 -35.5 171t-102.5 147.5t-160 102t-208 37.5q-141 0 -248.5 -46t-179 -118.5t-107.5 -160.5t-36 -174q0 -104 40 -187.5t124 -117.5q31 -10 41 20q2 10 7 31.5t9 32.5q4 16 1 23t-13 22q-53 59 -53 155q0 76 27.5 145.5t78.5 122t124 84 t163 31.5q80 0 142.5 -23.5t105.5 -64.5t64.5 -96t21.5 -121q0 -86 -18.5 -164t-52.5 -136t-80 -92t-103 -34q-31 0 -57.5 12.5t-45 34t-25.5 49t1 60.5q18 76 44.5 151.5t26.5 130.5q0 49 -26.5 84t-81.5 35q-66 0 -110 -58.5t-44 -146.5q-2 -23 2 -45q2 -18 7.5 -40.5 t15.5 -41.5q-33 -141 -53.5 -225t-30.5 -131q-12 -55 -18 -80q-10 -45 -13.5 -93t-1.5 -89q-104 45 -192 119.5t-151.5 169t-98.5 207t-35 235.5z" />
+<glyph unicode="&#xf0d3;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-829q27 39 59.5 95.5t49.5 117.5l10 41q6 25 17.5 68t29.5 112q20 -41 75.5 -70.5t121.5 -29.5q96 0 176 42t137 115.5 t89 175t32 220.5q0 90 -37 173t-103.5 147.5t-161 102.5t-208.5 38q-143 0 -251 -46.5t-180.5 -120t-108.5 -162.5t-36 -175q0 -104 40 -188.5t124 -118.5q14 -6 25.5 -1t15.5 21q4 10 8 31.5t8 34.5q8 23 -12 43q-23 29 -37 67.5t-14 91.5q0 76 27.5 145.5t79 123t124 85 t164.5 31.5q82 0 144.5 -23.5t105.5 -64.5t64.5 -97t21.5 -124q0 -86 -18.5 -164t-52 -136t-81 -93t-104.5 -35q-31 0 -57.5 12.5t-45 34t-25.5 49t1 60.5q18 78 45 154.5t27 131.5q0 49 -26.5 85t-82.5 36q-66 0 -110.5 -59t-44.5 -150q-2 -23 2 -45q4 -43 22 -84 q-35 -141 -54.5 -226t-29.5 -132q-12 -55 -18 -80q-16 -70 -14 -142.5t6 -117.5h-260q-80 0 -136.5 56.5t-56.5 136.5z" />
+<glyph unicode="&#xf0d4;" horiz-adv-x="1536" d="M0 342v438q55 -68 120.5 -96.5t153.5 -28.5h36t34 4q-8 -23 -14 -42t-6 -42q0 -41 18 -77.5t43 -67.5q-104 -4 -198.5 -22.5t-186.5 -65.5zM0 1214v129q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5 t-61.5 -41t-75 -15.5h-583q23 39 36 81t13 89q0 70 -21.5 121t-54.5 90t-70.5 69.5t-70.5 57.5t-54.5 53.5t-21.5 59.5q0 49 34 81.5t76 72.5t75.5 99.5t33.5 163.5q0 78 -39 157t-106 122h131l133 76h-428q-129 0 -237.5 -36t-188.5 -143zM2 170q14 57 55 96t96.5 61.5 t115 33t110.5 10.5h31.5t31.5 -2q37 -27 78 -54.5t75 -61.5t55.5 -75t21.5 -92q0 -47 -19 -86h-460q-72 0 -126.5 49t-64.5 121zM102 1094q0 43 11.5 85t35 73.5t59.5 51t85 19.5q68 0 118 -41t81.5 -100.5t47 -128t15.5 -123.5q0 -45 -9 -84t-30.5 -68.5t-56.5 -47 t-84 -17.5q-66 0 -116 39t-85 96t-53.5 123.5t-18.5 122.5zM854 1051h223v-224h109v224h223v108h-223v225h-109v-225h-223v-108z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1536" d="M0 262q0 100 56.5 166t139.5 105.5t179 56t174 18.5q-23 29 -41.5 64t-18.5 76q0 23 6.5 41t14.5 40q-16 -4 -33.5 -4h-34.5q-68 0 -130 23.5t-108 66.5t-74 101.5t-28 130.5q0 68 25 128t67 109.5t98 84t120 49.5q88 18 176 18h411l-127 -74h-127q72 -43 107 -120.5 t35 -157.5q0 -94 -33 -149.5t-73 -94.5t-72.5 -70.5t-32.5 -78.5q0 -45 44 -82t97 -82t97 -107.5t44 -161.5q0 -102 -50 -175.5t-126.5 -121t-170 -70t-181.5 -22.5q-66 0 -141.5 15.5t-140 50.5t-106.5 90t-42 137zM174 307q0 -68 35 -116t87 -78.5t114.5 -44t117.5 -13.5 q51 0 104.5 11.5t96.5 38t69.5 68.5t26.5 103q0 49 -21.5 89.5t-53 72t-70.5 59t-76 52.5q-14 2 -29.5 3t-29.5 1q-57 0 -123 -12.5t-121 -41t-91 -75.5t-36 -117zM276 1247q0 -53 17.5 -117.5t51.5 -120t82.5 -92t111.5 -36.5q96 0 134 61.5t38 147.5q0 53 -14.5 118.5 t-45 124t-78 97t-112.5 38.5q-47 0 -82 -18t-57.5 -49t-34 -71t-11.5 -83zM999 1206h215v-215h107v215h215v105h-215v217h-107v-217h-215v-105z" />
+<glyph unicode="&#xf0d6;" d="M0 78v1382q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-1382q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM154 461q63 0 119.5 -24.5t97.5 -65.5t65.5 -97.5t24.5 -119.5h921q0 63 25 119.5t65.5 97.5t97 65.5t120.5 24.5v614 q-63 0 -120 24.5t-97.5 65.5t-65.5 97.5t-25 119.5h-921q0 -63 -24.5 -119.5t-65.5 -97.5t-97.5 -65.5t-119.5 -24.5v-614zM539 768q0 104 29.5 195.5t81.5 159t122 106.5t150 39t149.5 -39t121.5 -106.5t83 -159t31 -195.5t-31 -195.5t-83 -159t-122 -106.5t-149 -39 q-80 0 -150 39t-122 106.5t-81.5 159t-29.5 195.5zM692 969l94 -99l39 35q8 6 11.5 13.5t7.5 11.5q4 2 8 10h2v-16q0 -8 -1 -16.5t-1 -18.5v-283h-139v-129h438v129h-141v529h-140z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1228" d="M6 967q20 47 72 47h1075q50 0 70 -47t-17 -84l-536 -537q-27 -23 -56 -22q-29 0 -55 22l-536 537q-37 37 -17 84z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1228" d="M6 371q-20 47 17 84l536 536q23 23 55 23q31 0 54 -23l538 -536q37 -37 17 -84t-70 -47h-1077q-50 0 -70 47z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="692" d="M0 768q0 33 23 55l538 537q16 16 38 21t44 -5q23 -8 36 -27.5t13 -41.5v-1076q0 -25 -13 -43t-36 -28t-44 -5t-38 21l-538 539q-23 23 -23 53z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="692" d="M0 231v1076q0 49 47 69t84 -16l539 -537q23 -23 22 -55q0 -31 -22 -53l-539 -539q-37 -37 -84 -16q-47 20 -47 71z" />
+<glyph unicode="&#xf0db;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h692v1153h-692v-1153zM999 154h691v1153h-691v-1153z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1228" d="M0 584q0 31 22.5 54.5t53.5 23.5h1075q33 0 55.5 -23t22.5 -55q0 -33 -23 -56l-536 -536q-23 -23 -56 -23t-55 23l-536 536q-23 23 -23 56zM0 952q0 33 23 56l536 536q23 23 55 23q33 0 56 -23l536 -536q23 -23 23 -56q0 -31 -22.5 -54.5t-55.5 -23.5h-1075 q-31 0 -53.5 23t-22.5 55z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1228" d="M0 584q0 31 22.5 54.5t53.5 23.5h1077q31 0 53.5 -23t22.5 -55q0 -33 -23 -56l-536 -536q-23 -23 -56 -23q-35 0 -53 23l-538 536q-23 23 -23 56z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1228" d="M0 952q0 33 23 56l536 536q23 23 55 23q33 0 56 -23l536 -536q23 -23 23 -56q0 -31 -22.5 -54.5t-53.5 -23.5h-1077q-31 0 -53.5 23t-22.5 55z" />
+<glyph unicode="&#xf0e0;" d="M0 115v905q10 -10 20.5 -17.5t20.5 -15.5q129 -96 256 -191.5t252 -195.5q39 -31 82 -62.5t89 -57t96.5 -41t103.5 -15.5q55 0 105 15.5t96 40t89 56t84 64.5q125 100 252 195.5t256 191.5q10 8 20.5 15.5t20.5 17.5v-905q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34 t-34 81zM2 1434q0 41 36 71.5t77 30.5h1614q41 0 76.5 -30.5t35.5 -71.5q0 -31 -18.5 -69t-45 -75t-57 -67.5t-53.5 -48.5q-123 -92 -241.5 -182.5t-239.5 -182.5q-25 -18 -57.5 -45t-67.5 -51.5t-71 -42t-66 -17.5h-2h-2q-31 0 -67 17.5t-70.5 42t-67.5 51.5t-58 45 q-121 92 -239.5 182t-241.5 183q-23 18 -53.5 48.5t-57 67.5t-45 75t-18.5 69z" />
+<glyph unicode="&#xf0e1;" horiz-adv-x="1576" d="M0 1376q0 39 15.5 74t41 60.5t60 41t73.5 15.5t74 -15.5t61.5 -41t41 -60.5t14.5 -74t-14.5 -73.5t-41 -60t-61.5 -41t-74 -15.5t-73.5 15.5t-60 41t-41 60t-15.5 73.5zM10 41v991q0 16 12.5 28.5t28.5 12.5h281q16 0 28.5 -12t12.5 -29v-991q0 -16 -12.5 -28.5 t-28.5 -12.5h-281q-16 0 -28.5 12.5t-12.5 28.5zM524 41v991q0 16 12.5 28.5t28.5 12.5h273q33 0 37 -25.5t4 -48.5q57 53 129.5 76t150.5 23q190 0 304 -95.5t114 -293.5v-668q0 -16 -12.5 -28.5t-28.5 -12.5h-289q-16 0 -27.5 12.5t-11.5 28.5v604q0 76 -27.5 116 t-111.5 40q-53 0 -89 -17.5t-56.5 -47t-28.5 -70.5t-8 -88v-537q0 -16 -12.5 -28.5t-28.5 -12.5h-281q-16 0 -28.5 12.5t-12.5 28.5z" />
+<glyph unicode="&#xf0e2;" horiz-adv-x="1591" d="M0 662q-4 39 35 45l158 20q12 2 30 -8q12 -8 15 -27q14 -102 63 -191t123 -153.5t169 -101.5t200 -37q115 0 217 44t178 120t120 177t44 218t-44 218t-120 177t-178.5 120t-216.5 44q-94 0 -181.5 -30.5t-158.5 -88.5l159 -159q35 -35 24 -58.5t-58 -23.5h-463 q-16 0 -29.5 6t-24.5 16q-25 25 -24 55v463q0 47 24.5 57.5t59.5 -24.5l162 -162q109 92 238.5 140.5t271.5 48.5q166 0 311 -62.5t253.5 -171t171 -254t62.5 -311.5t-62.5 -311.5t-171 -254t-254 -171t-310.5 -62.5q-150 0 -285 52.5t-241.5 145.5t-176.5 220t-90 275z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1916" d="M0 651q0 49 37 91t88 42q35 0 68 -22q-20 14 -21 37q0 8 8 24l334 502q14 20 37 21q16 0 24 -9q-25 18 -40 43t-15 56q0 49 38 90t87 41q33 0 62 -19l514 -342q23 -16 36 -40.5t13 -53.5q0 -25 -10.5 -48.5t-26.5 -41.5t-40 -29.5t-48 -11.5q-33 0 -68 23q20 -14 21 -37 q0 -14 -8 -25l-105 -158l227 -151q14 4 28 6t28 2q53 0 94 -29l475 -315q37 -27 58.5 -65.5t21.5 -84.5q0 -74 -52.5 -126t-125.5 -52q-55 0 -99 31l-475 315q-70 47 -75 131l-228 152l-106 -158q-14 -20 -37 -20q-14 0 -25 8q55 -39 56 -100q0 -25 -10.5 -47.5t-28 -41 t-40 -29.5t-46.5 -11q-35 0 -62 18l-514 342q-49 33 -49 92z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1880" d="M0 627q0 195 73.5 365.5t201.5 298.5t299 202t366 74t366 -74t299 -202t201.5 -299t73.5 -365q0 -78 -14.5 -159t-42 -159t-68.5 -149.5t-92 -130.5q-23 -29 -59 -29h-1328q-37 0 -59 29q-53 59 -93 130.5t-67.5 149.5t-42 159t-14.5 159zM158 627q0 -49 33.5 -83 t82.5 -34t83 34t34 83t-34.5 82.5t-82.5 33.5q-49 0 -82.5 -33.5t-33.5 -82.5zM352 1098q0 -49 35 -84t82 -35q49 0 84 35t35 84t-35 82.5t-84 33.5q-47 0 -82 -33.5t-35 -82.5zM743 313q0 -82 57.5 -139t139.5 -57t139.5 57t57.5 139q0 49 -26 91t-67 71q4 14 15.5 55 t27 95.5t33 114t30.5 110.5t22.5 88t9.5 43q0 23 -17.5 40t-40.5 17q-20 0 -35.5 -12t-21.5 -31l-135 -487q-39 -2 -74 -17.5t-60.5 -42t-40 -61.5t-14.5 -74zM823 1292q0 -49 34 -82.5t83 -33.5t83 33.5t34 82.5t-34 83t-83 34t-83 -34t-34 -83zM1292 1098q0 -49 35 -83 t84 -34t83 34t34 83t-34 82.5t-83 33.5t-84 -33.5t-35 -82.5zM1489 627q0 -49 34 -83t83 -34t82.5 34t33.5 83t-33.5 82.5t-82.5 33.5t-83 -33.5t-34 -82.5z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1916" d="M0 866q0 123 49 225.5t130 183.5t184.5 139.5t209.5 92.5q94 31 190.5 45.5t194.5 14.5t194.5 -14.5t190.5 -45.5q106 -35 210 -93t185 -139t130 -183.5t49 -225.5t-49 -225t-130 -183t-184.5 -140.5t-210.5 -92.5q-94 -31 -190 -45t-195 -14q-92 0 -180 12 q-92 -72 -195.5 -119t-215.5 -73q-27 -4 -55.5 -10.5t-53.5 -6.5q-16 0 -27.5 11.5t-11.5 27.5q0 12 8.5 21.5t16.5 17.5q31 33 53 60.5t37.5 57.5t25 64.5t17.5 79.5q-78 43 -145.5 100.5t-120 128t-82 153.5t-29.5 175zM160 866q0 -72 24.5 -133t65.5 -113.5t94 -95.5 t111 -75q27 -14 51 -27.5t49 -28.5q-10 -47 -17.5 -94t-19.5 -94q59 29 111.5 64.5t105.5 76.5q55 -8 110.5 -14t112.5 -6q156 0 308 43q84 25 171 68.5t158.5 107t116.5 143.5t45 178t-45 178t-116.5 143.5t-158.5 107.5t-171 69q-152 43 -308 43q-158 0 -307 -43 q-84 -25 -171 -69t-158.5 -107.5t-116.5 -143t-45 -178.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1916" d="M0 997q0 98 40 182.5t106.5 151t150.5 113.5t170 76q76 25 154.5 36t156.5 11q80 0 159 -11.5t155 -35.5q86 -29 170 -76t149.5 -113.5t105 -150.5t39.5 -183q0 -98 -39.5 -182t-105 -149.5t-149.5 -113.5t-170 -77q-154 -47 -314 -47q-37 0 -72.5 3t-72.5 7 q-150 -115 -336 -155q-20 -4 -43 -9.5t-45 -5.5q-12 0 -21.5 9.5t-9.5 23.5q0 10 7.5 17.5l13.5 13.5q51 51 72.5 96t35.5 117q-63 35 -118.5 82t-97.5 104t-66.5 124t-24.5 142zM160 997q0 -72 30.5 -127t77.5 -99t104.5 -78t112.5 -64l-20 -111q33 18 63.5 42t59.5 46 q47 -6 95 -12t95 -6q135 0 264 41q61 18 124 52t114 81t84 105.5t33 129.5q0 72 -33 131.5t-84 105.5t-113.5 80t-124.5 52q-63 23 -129.5 32t-134.5 9q-66 0 -132 -9t-132 -32q-59 -18 -122.5 -52t-115 -80t-84 -105.5t-32.5 -131.5zM649 258l27 16q51 -6 102 -6 q197 0 381 62q111 37 211 99.5t177 147.5t123 190t46 230q0 41 -6 84q90 -72 148.5 -169t58.5 -214q0 -76 -24.5 -142.5t-66.5 -123.5t-97.5 -104t-118.5 -82q14 -72 35.5 -117t72.5 -96q6 -6 13.5 -14.5t7.5 -18.5q0 -16 -10.5 -23.5t-24.5 -7.5q-20 0 -43 5.5t-41 9.5 q-186 41 -336 155q-37 -4 -72.5 -7t-72.5 -3q-129 0 -254 32t-236 97z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="933" d="M0 557q0 8 2 10l209 932q4 16 16.5 26.5t28.5 10.5h344q18 0 31.5 -13.5t13.5 -33.5q0 -6 -1 -10t-3 -11l-180 -524q12 4 47 13.5t81 21.5t95 26.5t93 25.5t75 18.5t37 7.5q18 0 31.5 -13.5t13.5 -33.5q0 -12 -2 -19l-565 -1306q-10 -29 -43 -29q-18 0 -33 13.5t-15 33.5 q0 6 3 10l204 914q-12 -4 -48 -14.5t-82 -22.5t-97 -26.5t-95 -27t-76 -19.5t-38 -7q-20 0 -33.5 14.5t-13.5 32.5z" />
+<glyph unicode="&#xf0e8;" d="M0 78v383q0 33 22.5 55.5t55.5 22.5h133v153q0 55 40 94t95 39h518v174h-135q-31 0 -53.5 21.5t-22.5 54.5v385q0 31 22.5 53.5t53.5 22.5h385q31 0 53.5 -22.5t22.5 -53.5v-385q0 -33 -22.5 -54.5t-53.5 -21.5h-135v-174h518q55 0 95 -38.5t40 -94.5v-153h135 q31 0 53.5 -22.5t22.5 -55.5v-383q0 -33 -22.5 -55.5t-53.5 -22.5h-385q-33 0 -54 22.5t-21 55.5v383q0 33 21.5 55.5t53.5 22.5h136v153q0 18 -21 19h-518v-172h135q31 0 53.5 -22.5t22.5 -55.5v-383q0 -33 -22.5 -55.5t-53.5 -22.5h-385q-31 0 -53.5 22.5t-22.5 55.5v383 q0 33 22.5 55.5t53.5 22.5h135v172h-518q-20 0 -20 -19v-153h135q33 0 55.5 -22.5t22.5 -55.5v-383q0 -33 -22.5 -55.5t-55.5 -22.5h-383q-33 0 -55.5 22.5t-22.5 55.5z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1884" d="M0 770q31 137 109.5 253t193.5 204t257 141t302 66v53q0 35 23.5 57.5t56.5 22.5q35 0 57.5 -22.5t22.5 -57.5v-53q160 -12 303 -65.5t258 -141.5t192.5 -204t108.5 -253q6 -29 -20 -43q-10 -6 -19 -6q-20 0 -28 12q-98 102 -218 103q-86 0 -163.5 -54.5t-130.5 -152.5 q-10 -23 -35 -23t-35 23q-82 150 -213 194v-526q0 -68 -23.5 -127t-63.5 -104.5t-93.5 -71t-114.5 -25.5t-115.5 25.5t-94.5 71t-63.5 104.5t-23.5 127q0 35 23.5 57.5t56.5 22.5q35 0 57.5 -22.5t22.5 -57.5q0 -70 40 -119t97 -49q55 0 95 49t40 119v526 q-131 -45 -213 -194q-10 -23 -35 -23t-34 23q-53 98 -130 152.5t-163 54.5q-121 0 -217 -103q-12 -12 -31 -12q-10 0 -19 6q-25 14 -20 43z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1597" d="M0 385v1075q0 31 22.5 53.5t55.5 22.5h921q31 0 53.5 -22.5t22.5 -53.5v-231h33h61q25 0 55.5 -13.5t49.5 -29.5l280 -281q18 -18 30.5 -49t12.5 -55v-62v-678q0 -27 -17 -44t-44 -17h-860q-27 0 -44.5 17.5t-17.5 43.5v246h-536q-33 0 -55.5 22.5t-22.5 55.5zM276 1321 q0 -12 9.5 -21.5t21.5 -9.5h461q12 0 21.5 9.5t9.5 21.5v61q0 12 -9.5 21.5t-21.5 9.5h-461q-12 0 -21.5 -9t-9.5 -22v-61zM737 123h738v555h-367q-27 0 -44 17.5t-17 43.5v367h-310v-983zM1169 801h306q0 2 -3.5 8t-5.5 10l-280 279q0 4 -6 4q-2 0 -2 1t-2 1t-3.5 1t-3.5 1 v-305z" />
+<glyph unicode="&#xf105;" horiz-adv-x="2048" />
+<glyph unicode="&#xf200;" horiz-adv-x="1536" d="M0 57v379q0 39 20.5 87t54.5 90t74.5 73t81.5 35q-35 -59 -34 -129q0 -59 16 -124t59 -106q-18 -37 -18 -75q0 -72 50 -122t122 -50q37 0 68.5 13t55 36.5t37 55.5t13.5 67t-13.5 66.5t-37 55t-55 38t-68.5 14.5q-18 0 -36.5 -5t-35.5 -14q-12 12 -20 31t-13.5 40.5 t-7.5 41.5t-2 37q0 47 28 86t62 67l142 21q-92 57 -142.5 150.5t-50.5 201.5q0 86 33 162t90 133t133 90t162 33t162 -33t133 -90t90 -133t33 -162q0 -109 -50.5 -202t-142.5 -150l158 -23q18 -16 34.5 -36.5t16.5 -47.5q0 -45 -18 -77q-59 33 -121 32q-45 0 -87 -17 t-77 -46q-6 2 -11 3t-11 1q-47 0 -82 -34t-35 -81t34.5 -80.5t82.5 -33.5q47 0 80.5 33.5t33.5 80.5q0 8 -2 15.5t-4 13.5q16 12 35.5 20.5t42.5 8.5q55 0 95 -39t40 -94q0 -23 -8 -41.5t-19 -34.5q-25 10 -45 10q-47 0 -81.5 -34t-34.5 -81t34.5 -80.5t81.5 -33.5t81 33.5 t34 80.5l-2 4q74 74 74 177q0 74 -41 137q45 70 45 157q0 31 -12 62q41 -4 83 -34t74.5 -72t53 -90t20.5 -89v-379q-10 -6 -22.5 -15t-25.5 -18.5t-26.5 -16.5t-21.5 -7h-1344q-35 0 -52 20.5t-44 36.5zM369 287q0 25 17 41t40 16q25 0 41 -16t16 -41q0 -23 -16 -40.5 t-41 -17.5q-23 0 -40 17.5t-17 40.5z" />
+<glyph unicode="&#xf201;" horiz-adv-x="1597" />
+<glyph unicode="&#xf202;" horiz-adv-x="1597" />
+<glyph unicode="&#xf203;" horiz-adv-x="1597" />
+<glyph unicode="&#xf204;" horiz-adv-x="1597" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/static/css/font/fontawesome-webfont.ttf b/static/css/font/fontawesome-webfont.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..c17e9f8d100d01a002029b5b93cc081062618bf3
Binary files /dev/null and b/static/css/font/fontawesome-webfont.ttf differ
diff --git a/static/css/font/fontawesome-webfont.woff b/static/css/font/fontawesome-webfont.woff
new file mode 100755
index 0000000000000000000000000000000000000000..09f2469a1f7a71acb4c4778842511d797d7f6ad8
Binary files /dev/null and b/static/css/font/fontawesome-webfont.woff differ
diff --git a/static/css/img/bg_index.gif b/static/css/img/bg_index.gif
new file mode 100644
index 0000000000000000000000000000000000000000..99bdbe873fcf3f7a46266a87d3d11ea32749a52c
Binary files /dev/null and b/static/css/img/bg_index.gif differ
diff --git a/static/css/img/bg_index.png b/static/css/img/bg_index.png
new file mode 100644
index 0000000000000000000000000000000000000000..cdbb50eef86a1342b3d988e51986da9675085a1d
Binary files /dev/null and b/static/css/img/bg_index.png differ
diff --git a/static/css/img/glyphicons-halflings-white.png b/static/css/img/glyphicons-halflings-white.png
new file mode 100644
index 0000000000000000000000000000000000000000..a20760bfde58d1c92cee95116059fba03c68d689
Binary files /dev/null and b/static/css/img/glyphicons-halflings-white.png differ
diff --git a/static/css/img/glyphicons-halflings.png b/static/css/img/glyphicons-halflings.png
new file mode 100644
index 0000000000000000000000000000000000000000..92d4445dfd0af414835467132cf50c7c38a303af
Binary files /dev/null and b/static/css/img/glyphicons-halflings.png differ
diff --git a/static/css/img/m2m_eclipse_logo.png b/static/css/img/m2m_eclipse_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b50fb1e3ff2a392ae00fde99c88e79f358845a6
Binary files /dev/null and b/static/css/img/m2m_eclipse_logo.png differ
diff --git a/static/css/theme.css b/static/css/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..83f1c4b850b448de6fceb8af5f05d2c4f9929ebd
--- /dev/null
+++ b/static/css/theme.css
@@ -0,0 +1,18 @@
+.highlight-unit {
+    background-color: #F5F5F5;
+    border-radius: 6px 6px 6px 6px;
+    margin-bottom: 30px;
+}
+
+.home-box .lead {
+	width: 350px !important;
+}
+
+/* home page: remove border-top's between members logos */
+tr + tr td {
+	border-top: none !important;
+}
+
+#wg-members.table td {
+	vertical-align: middle;
+}
\ No newline at end of file
diff --git a/static/demo/.gitignore b/static/demo/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/static/demo/component.json b/static/demo/component.json
new file mode 100644
index 0000000000000000000000000000000000000000..0d1a19b0adb53c7ffacd32eb9de4a4628836b634
--- /dev/null
+++ b/static/demo/component.json
@@ -0,0 +1,11 @@
+{
+  "name": "app",
+  "version": "0.0.0",
+  "dependencies": {
+    "bootstrap.css": "git://github.com/bowerjs/bootstrap.git#~2.1.1",
+    "angular": "git://github.com/angular/bower-angular.git#~1.0.6",
+    "jquery": "git://github.com/components/jquery.git#~1.9.1",
+    "d3": "~3.0.0",
+	"angular-socialshare": "0.0.2"
+  }
+}
\ No newline at end of file
diff --git a/static/demo/components/angular-socialshare/.bower.json b/static/demo/components/angular-socialshare/.bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..7a3433a6eee5d6270c25236c6a22eaaf149b427c
--- /dev/null
+++ b/static/demo/components/angular-socialshare/.bower.json
@@ -0,0 +1,34 @@
+{
+  "name": "angular-socialshare",
+  "main": "angular-socialshare.js",
+  "version": "0.0.2",
+  "authors": [
+    "djds4rce <djd4rce@gmail.com>"
+  ],
+  "description": "Social Share buttons for AngularJS",
+  "keywords": [
+    "social",
+    "googleplus",
+    "facebook",
+    "twitter",
+    "linkdin"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ],
+  "homepage": "https://github.com/djds4rce/angular-socialshare",
+  "_release": "0.0.2",
+  "_resolution": {
+    "type": "version",
+    "tag": "0.0.2",
+    "commit": "2bfd3f7c46f370b97560402b936c521e45ad2674"
+  },
+  "_source": "git://github.com/djds4rce/angular-socialshare.git",
+  "_target": "0.0.2",
+  "_originalSource": "angular-socialshare"
+}
\ No newline at end of file
diff --git a/static/demo/components/angular-socialshare/README.md b/static/demo/components/angular-socialshare/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..c7dc5585bd712d8c17d4888efd8cd01c8652adf2
--- /dev/null
+++ b/static/demo/components/angular-socialshare/README.md
@@ -0,0 +1,218 @@
+Angular Social Share
+=========
+
+Angular Social Share is a collection of directives which lets you easily share your links various social networks. Currently Facebok, Google, Twitter and Linkdin are supported. Social Networks get the Meta data of the shared content like Title, Summary and Image from the Meta tags on the page by scraping. But Single Page Apps like Angular are unable to support crawling. But these dirictives use alternative so that Meta data is displayed where it is possible. 
+Checkout the [Demo].
+Getting Started
+-----
+Install the library through bower.
+```js
+bower install angular-socialshare.
+```
+Include the script (and optional css file) in your html file.
+```html
+<style rel='stylesheet' type='text/css' href="bower_components/angular-socialshare/angular-socialshare.min.css"></style>
+<script src="bower_components/angular-socialshare/angular-socialshare.min.js"></script>
+```
+
+Add to your APP's dependency.
+```js
+angular.module('testing',['djds4rce.angular-socialshare'])
+```
+IMPORTANT
+----
+For Correct Sharing of links and updating share count you must enable HTML5 Mode True for your application. i.e No `#` in URL'S .
+```js
+angular.module('testing').config(function($locationProvider){
+    $locationProvider.html5Mode(true).hashPrefix('!');
+});
+```
+HTML5 Mode requires server configration [Explained Here] 
+
+
+Share on Facebook
+----
+Facebook share uses facebook API which requires us to provide a APPID. Register a facebook app and Configure the APPID in your appplication. Note that you will get an error regarding 'not permitted URL' if you are testing this button in a localhost environment.
+
+```js
+angular.module('testing').run(function($FB){
+  $FB.init('YOUR_APPID');
+});
+```
+Use the Facebook Directive
+```html
+ <a facebook class="facebookShare" data-url='http://google.com' data-shares='shares'>{{ shares }}</a>
+```
+As we are using Facebook share API and not the facebook share button, you will have to style your own Facebook button, or use the provided stylesheet that has styles for the horizontal count button. You also need to display the share count, which the directive fetches from a diffrent API. The directive has transclusion set to true. The latest Facebook share API only allows for a URL to be supplied, it will scrape the other data (image, title, description) from the supplied URL.
+
+The Attributes for the directives are
+```js
+/*
+data-url: URL of the Shared Content
+data-shares: The Scope variable on which share count will be binded to. This lets you put
+multiple share buttons on a single page and bind the share count to the respective model object.
+*/
+```
+
+Twitter
+----
+Include the twitter javascript in your HTML. 
+```html
+<script src="http://platform.twitter.com/widgets.js"></script>
+```
+Add Directive to the element where you want to display your Twitter Button
+```html
+<a twitter  data-lang="en" data-count='horizontal' data-url='http://google.com' data-via='notsosleepy' data-size="medium" data-text='Testing Twitter Share' ></a>
+```
+The Attributes for the directives are
+```js
+/*
+data-lang: Language of the tweet
+data-url: URL of the Shared Content
+data-count: Position of the share counter
+data-size: Size of the tweet button
+data-text: Content of the tweet
+data-via: User handle which will be tagged in the tweet
+For options checkout https://dev.twitter.com/docs/tweet-button
+*/
+```
+Linkedin
+----
+Although Linkedin has a share button and also a Javascript share API it does not take the title and the content as its parameters hence we will have to use the raw share URL to share the content.
+
+Use the Linkedin Directive
+```html
+<div linkdin class="linkedinShare" data-url='http://www.google.com.au' data-title='Linkedin Share' data-summary="testing Linkedin Share" data-shares='linkedinshares'>{{linkedinshares}}</div>
+```
+Linkedin Directive works similar to the Facebook Mechanism. This will force us to add our own style to the button and also display count which is fetched by the directive through a diffrent API. The supplied stylesheet contains styling for the horizontal styled button.
+
+The Attributes for the directives are
+```js
+/*
+data-title: Title of the Shared Content
+data-url: URL of the Shared Content
+data-summary: Summary of the content
+data-shares: The Scope variable on which share count will be binded to. This lets you put
+multiple share buttons on a single page and bind the share count to the respective model object.
+*/
+```
+
+Google +
+----
+```html
+ <div gplus class="g-plus" data-size="tall" data-annotation="bubble" data-href='http://google.com' data-action='share'></div>
+```
+For more information on the share button attributes check the [Google Share Documentation]
+>If you change the class of the button to `g-plusone' it will be converted to a google plus one button.
+
+Tumblr
+----
+
+
+####Link Share
+Include the tumblr javascript in your HTML. 
+```html
+<script src="http://platform.tumblr.com/v1/share.js"></script>
+
+```
+
+```html
+<div tumblr-text data-url='http://google.com' data-name='Sharing to Tumblr' data-title='test' data-buttontext='Sharing Text' data-styling="display:inline-block; text-indent:-9999px; overflow:hidden; width:129px; height:20px; background:url('http://platform.tumblr.com/v1/share_3.png') top left no-repeat transparent;" data-description='this is awesome'></div>  
+
+```
+The Attributes for the directives are
+```js
+/*
+data-url: URL of the content to be shared
+data-name: Name of the content URL
+data-title(Optional): Title of the button on hover
+data-description: Description of the URL
+data-style(Optional): Style of the button
+*/
+```
+
+####Qoute Share
+
+```html
+<div tumblr-qoute data-qoute='Texting Tumblr Qoute share' data-source='http://djds4rce.github.io'></div>  
+```
+The Attributes for the directives are
+```js
+/*
+data-source: Source URL of the qoute to be shared
+data-qoute: Qoute to be shared
+data-title(Optional): Title of the button on hover
+data-style(Optional): Style of the button
+*/
+```
+
+####Image Share
+
+```html
+<div tumblr-image data-source='http://plnkr.co/img/plunker.png' data-caption='Image Share' data-clickthru='http://google.com'></div>  
+```
+The Attributes for the directives are
+```js
+/*
+data-source: Source URL of the Image to be shared
+data-caption: Caption for the image
+data-clickthru: clickthru URL for the image
+data-title(Optional): Title of the button on hover
+data-style(Optional): Style of the button
+*/
+```
+
+####Image Share
+
+```html
+<div tumblr-video data-embedcode='<iframe width="560" height="315" src="//www.youtube.com/embed/aqHBLS_6gF8" frameborder="0" allowfullscreen></iframe>'></div>  
+```
+The Attributes for the directives are
+```js
+/*
+data-embedcode: Embed code for the external video
+data-caption: Caption for the Video
+data-title(Optional): Title of the button on hover
+data-style(Optional): Style of the button
+*/
+```
+
+
+Pinterest
+----
+
+Include the  Pinterest javascript in your HTML. 
+```html
+<script type="text/javascript" src="//assets.pinterest.com/js/pinit.js"></script>
+
+```
+
+
+####Usage
+```html
+<div pintrest data-href='http://google.com' data-description='testing share' data-img='http://plnkr.co/img/plunker.png' data-pin-do='buttonPin' data-pin-config='beside'></div>
+```
+
+The Attributes for the directives are
+
+```js
+/*
+data-href: Url To be shared
+data-Description: Description of the content
+data-img: Image for the Pin
+data-pin-do(Optional): Type of pin
+data-pin-config(Optional): Pin count Orientation 'beside' or 'above'
+*/
+```
+
+
+**Made with Love by [Djds4rce]**
+**Additions with ♡ by [haxxxton]**
+
+
+
+[Explained Here]:http://ericduran.io/2013/05/31/angular-html5Mode-with-yeoman/
+[Demo]:http://plnkr.co/edit/Cah9FtwXDrUMQjChdBG2?p=info    
+[Google Share Documentation]:https://developers.google.com/+/web/share/
+[Djds4rce]:http://djds4rce.wordpress.com/
+[haxxxton]:http://gaandder.com/
diff --git a/static/demo/components/angular-socialshare/angular-socialshare.css b/static/demo/components/angular-socialshare/angular-socialshare.css
new file mode 100644
index 0000000000000000000000000000000000000000..f4542e961ae085df912ce84ac6b3e934f1178395
--- /dev/null
+++ b/static/demo/components/angular-socialshare/angular-socialshare.css
@@ -0,0 +1,304 @@
+.facebookShare {
+  border: none;
+  visibility: visible;
+  width: auto;
+  height: 22px;
+  background: transparent;
+  overflow: hidden;
+  -webkit-text-size-adjust: none;
+  color: #333;
+  line-height: 1.28;
+  margin: 0;
+  padding: 0;
+  text-align: left;
+  direction: ltr;
+  cursor: pointer;
+  font-family: 'Helvetica Neue', Helvetica, Arial, 'lucida grande', tahoma, verdana, arial, sans-serif;
+  display: inline-block;
+}
+.facebookShare:hover .facebookButton .pluginButton,
+.facebookShare:active .facebookButton .pluginButton,
+.facebookShare:focus .facebookButton .pluginButton {
+  background: #5b7bd5;
+  background: -moz-linear-gradient(top, #5b7bd5 0%, #4864b1 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5b7bd5), color-stop(100%, #4864b1));
+  background: -webkit-linear-gradient(top, #5b7bd5 0%, #4864b1 100%);
+  background: -o-linear-gradient(top, #5b7bd5 0%, #4864b1 100%);
+  background: -ms-linear-gradient(top, #5b7bd5 0%, #4864b1 100%);
+  background: linear-gradient(to bottom, #5b7bd5 0%, #4864b1 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5b7bd5', endColorstr='#4864b1', GradientType=0);
+  border-color: #5874c3 #4961a8 #41599f;
+  box-shadow: inset 0 0 1px #607fd6;
+}
+.facebookShare .facebookButton {
+  color: #3b5998;
+  text-decoration: none;
+  font-size: 11px;
+  text-align: left;
+  display: inline-block;
+  width: 55px;
+}
+.facebookShare .facebookButton .pluginButton {
+  background: #4c69ba;
+  background: -moz-linear-gradient(top, #4c69ba 0%, #3b55a0 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4c69ba), color-stop(100%, #3b55a0));
+  background: -webkit-linear-gradient(top, #4c69ba 0%, #3b55a0 100%);
+  background: -o-linear-gradient(top, #4c69ba 0%, #3b55a0 100%);
+  background: -ms-linear-gradient(top, #4c69ba 0%, #3b55a0 100%);
+  background: linear-gradient(to bottom, #4c69ba 0%, #3b55a0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c69ba', endColorstr='#3b55a0', GradientType=0);
+  border: none;
+  border-radius: 3px;
+  color: #fff;
+  cursor: pointer;
+  font-weight: bold;
+  height: 20px;
+  line-height: 20px;
+  padding: 0;
+  text-shadow: 0 -1px 0 #354c8c;
+  white-space: nowrap;
+}
+.facebookShare .facebookButton .pluginButton .pluginButtonContainer {
+  -webkit-font-smoothing: antialiased;
+  text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.004);
+}
+.facebookShare .facebookButton .pluginButton .pluginButtonContainer .pluginButtonImage {
+  display: inline-block;
+}
+.facebookShare .facebookButton .pluginButton button {
+  background: transparent;
+  border: 0;
+  color: inherit;
+  cursor: pointer;
+  font: inherit;
+  font-weight: bold;
+  margin: -1px;
+  outline: none;
+  padding: 0;
+  text-shadow: 0 -1px 0 #354c8c;
+}
+.facebookShare .facebookButton .pluginButton button .pluginButtonIcon {
+  height: 14px;
+  left: 0;
+  margin: 0 4px 0 4px;
+  position: relative;
+  top: 3px;
+  vertical-align: top;
+  width: 14px;
+}
+.facebookShare .facebookButton .pluginButton button .sp_plugin-button-2x {
+  background-image: url(https://fbstatic-a.akamaihd.net/rsrc.php/v2/y5/r/KxVPs0eEy36.png);
+  background-size: 30px 72px;
+  background-repeat: no-repeat;
+  display: inline-block;
+  height: 14px;
+  width: 14px;
+}
+.facebookShare .facebookButton .pluginButton button .sx_plugin-button-2x_favblue {
+  background-position: 0 -42px;
+}
+.facebookShare .facebookButton .pluginButton button i.img {
+  -ms-high-contrast-adjust: none;
+  _overflow: hidden;
+}
+.facebookShare .facebookButton .pluginButton .pluginButtonLabel {
+  padding: 0 5px 0 0;
+  position: relative;
+  vertical-align: top;
+}
+.facebookShare .facebookCount {
+  display: inline-block;
+  width: auto;
+}
+.facebookShare .facebookCount .pluginCountButton {
+  background: white;
+  border: 1px solid #bbb;
+  border-radius: 3px;
+  color: #6a7180;
+  display: inline-block;
+  font-size: 11px;
+  height: auto;
+  line-height: 18px;
+  margin-left: 6px;
+  min-width: 15px;
+  padding: 0 3px;
+  text-align: center;
+  white-space: nowrap;
+}
+.facebookShare .facebookCount .pluginCountButton span {
+  display: inline-block;
+  min-height: 12px;
+  min-width: 4px;
+  color: #333;
+}
+.facebookShare .facebookCount .pluginCountButtonNub {
+  height: 0;
+  left: 2px;
+  position: relative;
+  top: -15px;
+  width: 5px;
+  z-index: 2;
+}
+.facebookShare .facebookCount .pluginCountButtonNub s,
+.facebookShare .facebookCount .pluginCountButtonNub i {
+  border-color: transparent #bbb;
+  border-style: solid;
+  border-width: 4px 5px 4px 0;
+  display: block;
+  position: relative;
+  top: 1px;
+}
+.facebookShare .facebookCount .pluginCountButtonNub i {
+  border-right-color: #fff;
+  left: 2px;
+  top: -7px;
+}
+@-moz-document url-prefix() {
+  .facebookShare .facebookButton .pluginButton button .pluginButtonIcon {
+    margin: 0 1px;
+  }
+}
+.linkedinShare {
+  line-height: 1;
+  vertical-align: baseline;
+  display: inline-block;
+  text-align: center;
+  width: auto;
+  padding: 0;
+  margin: 0;
+  position: relative;
+  border: 0;
+  text-decoration: none;
+  height: 20px;
+  cursor: pointer;
+}
+.linkedinShare:hover .linkedinButton .pluginButtonLabel,
+.linkedinShare:active .linkedinButton .pluginButtonLabel,
+.linkedinShare:focus .linkedinButton .pluginButtonLabel {
+  border: 1px solid #000;
+  border-top-color: #ABABAB;
+  border-right-color: #9A9A9A;
+  border-bottom-color: #787878;
+  border-left-color: #04568B;
+  border-left: 0;
+  background: #ededed;
+  background: -moz-linear-gradient(top, #ededed 0%, #dedede 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ededed), color-stop(100%, #dedede));
+  background: -webkit-linear-gradient(top, #ededed 0%, #dedede 100%);
+  background: -o-linear-gradient(top, #ededed 0%, #dedede 100%);
+  background: -ms-linear-gradient(top, #ededed 0%, #dedede 100%);
+  background: linear-gradient(to bottom, #ededed 0%, #dedede 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#dedede', GradientType=0);
+}
+.linkedinShare .linkedinButton {
+  display: inline-block;
+  width: 59px;
+  height: 20px;
+  padding: 0;
+  margin: 0;
+}
+.linkedinShare .linkedinButton .pluginButtonImage {
+  background-image: url(https://www.linkedin.com/scds/common/u/images/apps/connect/sprites/sprite_connect_v14.png);
+  background-position: 0px -276px;
+  background-repeat: no-repeat;
+  cursor: pointer;
+  border: 0;
+  text-indent: -9999em;
+  overflow: hidden;
+  padding: 0;
+  margin: 0;
+  position: absolute;
+  left: 0px;
+  top: 0px;
+  display: block;
+  width: 20px;
+  height: 20px;
+  border-radius: 2px;
+  color: #069;
+}
+.linkedinShare .linkedinButton .pluginButtonLabel {
+  color: #333;
+  cursor: pointer;
+  display: block;
+  white-space: nowrap;
+  float: left;
+  margin-left: 1px;
+  overflow: hidden;
+  text-align: center;
+  height: 18px;
+  padding: 0 4px 0 23px;
+  border: 1px solid #000;
+  border-top-color: #E2E2E2;
+  border-right-color: #BFBFBF;
+  border-bottom-color: #B9B9B9;
+  border-left-color: #E2E2E2;
+  border-left: 0;
+  text-shadow: #ffffff -1px 1px 0;
+  line-height: 20px;
+  border-radius: 2px;
+  background-color: #ECECEC;
+  background: -moz-linear-gradient(top, #fefefe 0%, #ececec 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fefefe), color-stop(100%, #ececec));
+  background: -webkit-linear-gradient(top, #fefefe 0%, #ececec 100%);
+  background: -o-linear-gradient(top, #fefefe 0%, #ececec 100%);
+  background: -ms-linear-gradient(top, #fefefe 0%, #ececec 100%);
+  background: linear-gradient(to bottom, #fefefe 0%, #ececec 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fefefe', endColorstr='#ececec', GradientType=0);
+}
+.linkedinShare .linkedinButton .pluginButtonLabel span {
+  color: #333;
+  font-size: 11px;
+  font-family: Arial, sans-serif;
+  font-weight: bold;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  display: inline-block;
+  background: transparent none;
+  vertical-align: top;
+  height: 18px;
+  line-height: 20px;
+  float: none;
+}
+.linkedinShare .linkedinCount {
+  padding: 0px;
+  margin: 0px;
+  text-indent: 0px;
+  display: inline-block;
+  vertical-align: baseline;
+}
+.linkedinShare .linkedinCount .pluginCountButton {
+  display: inline-block;
+  overflow: visible;
+  position: relative;
+  height: 18px;
+  padding-left: 2px;
+}
+.linkedinShare .linkedinCount .pluginCountButton .pluginCountButtonRight {
+  display: block;
+  float: left;
+  height: 18px;
+  padding-right: 4px;
+  background-image: url(https://www.linkedin.com/scds/common/u/images/apps/connect/sprites/sprite_connect_v14.png);
+  background-color: transparent;
+  background-repeat: no-repeat;
+  background-position: right -100px;
+}
+.linkedinShare .linkedinCount .pluginCountButton .pluginCountButtonRight .pluginCountButtonLeft {
+  display: block;
+  float: left;
+  padding-left: 8px;
+  text-align: center;
+  background-image: url(https://www.linkedin.com/scds/common/u/images/apps/connect/sprites/sprite_connect_v14.png);
+  background-color: transparent;
+  background-repeat: no-repeat;
+  background-position: 0px -60px;
+}
+.linkedinShare .linkedinCount .pluginCountButton .pluginCountButtonRight .pluginCountButtonLeft span {
+  display: inline;
+  font-size: 11px;
+  color: #04558B;
+  font-weight: bold;
+  font-family: Arial, sans-serif;
+  line-height: 18px;
+  padding: 0 2px;
+}
diff --git a/static/demo/components/angular-socialshare/angular-socialshare.js b/static/demo/components/angular-socialshare/angular-socialshare.js
new file mode 100644
index 0000000000000000000000000000000000000000..6f15b115fbb1652167ae2d928175f5e031f78481
--- /dev/null
+++ b/static/demo/components/angular-socialshare/angular-socialshare.js
@@ -0,0 +1,224 @@
+// Code goes here
+'use strict';
+
+/*
+ *  * angular-socialshare v0.0.1
+ *   * ♡ CopyHeart 2014 by Dayanand Prabhu http://djds4rce.github.io
+ *    * Copying is an act of love. Please copy.
+ *     */
+
+angular.module('djds4rce.angular-socialshare', [])
+.factory('$FB',['$window',function($window){
+  return {
+    init: function(fbId){
+      if(fbId){
+        this.fbId = fbId;
+        $window.fbAsyncInit = function() {
+          FB.init({ 
+            appId: fbId, 
+            channelUrl: 'app/channel.html', 
+            status: true, 
+            xfbml: true 
+          });
+        };
+        (function(d){
+          var js,           
+          id = 'facebook-jssdk', 
+          ref = d.getElementsByTagName('script')[0];
+          if (d.getElementById(id)) {
+            return;
+          }
+
+          js = d.createElement('script'); 
+          js.id = id; 
+          js.async = true;
+          js.src = "//connect.facebook.net/en_US/all.js";
+
+          ref.parentNode.insertBefore(js, ref);
+
+        }(document));
+      }
+      else{
+        throw("FB App Id Cannot be blank");
+      }
+    }
+  };
+
+}]).directive('facebook', ['$timeout','$http', function($timeout,$http) {
+  return {
+    scope: {
+      shares: '=' 
+    }, 
+    transclude: true,
+    template: '<div class="facebookButton">' + 
+      '<div class="pluginButton">' + 
+        '<div class="pluginButtonContainer">' + 
+          '<div class="pluginButtonImage">' + 
+            '<button type="button">' + 
+              '<i class="pluginButtonIcon img sp_plugin-button-2x sx_plugin-button-2x_favblue"></i>' + 
+            '</button>' + 
+          '</div>' + 
+          '<span class="pluginButtonLabel">Share</span>' + 
+        '</div>' + 
+      '</div>' + 
+    '</div>' + 
+    '<div class="facebookCount">' +
+      '<div class="pluginCountButton pluginCountNum">' + 
+        '<span ng-transclude></span>' +
+      '</div>' + 
+      '<div class="pluginCountButtonNub"><s></s><i></i></div>' + 
+    '</div>',
+    link: function(scope, element, attr) {
+      if(attr.shares){
+        $http.get('https://api.facebook.com/method/links.getStats?urls='+attr.url+'&format=json').success(function(res){
+            var count = res[0].share_count.toString();
+            var decimal = '';
+            if(count.length > 6){
+              if(count.slice(-6,-5) != "0"){
+                decimal = '.'+count.slice(-6,-5);
+              }
+              count = count.slice(0, -6);
+              count = count + decimal + 'M';
+            }else if(count.length > 3){
+              if(count.slice(-3,-2) != "0"){
+                decimal = '.'+count.slice(-3,-2);
+              }
+              count = count.slice(0, -3);
+              count = count + decimal + 'k';
+            }
+            scope.shares = count;
+        }).error(function(){
+          scope.shares = 0;
+        });
+      }
+      $timeout(function(){
+        element.bind('click',function(e){
+          FB.ui(
+            {method: 'share',
+              href: attr.url
+          });
+          e.preventDefault();
+        });
+      });
+    }
+  };
+}]).directive('twitter',['$timeout',function($timeout) {
+  return {
+    link: function(scope, element, attr) {
+      $timeout(function() {
+        twttr.widgets.createShareButton(
+          attr.url,
+          element[0],
+          function() {}, {
+            count: attr.count,
+            text: attr.text,
+            via: attr.via,
+            size: attr.size
+          }
+        );
+      });
+    }
+  };
+}]).directive('linkedin', ['$timeout','$http', '$window',function($timeout,$http,$window) {
+  return {
+    scope: {
+      shares: '=' 
+    }, 
+    transclude: true,
+    template: '<div class="linkedinButton">' + 
+      '<div class="pluginButton">' + 
+        '<div class="pluginButtonContainer">' + 
+          '<div class="pluginButtonImage">in' + 
+          '</div>' + 
+          '<span class="pluginButtonLabel"><span>Share</span></span>' + 
+        '</div>' + 
+      '</div>' + 
+    '</div>' + 
+    '<div class="linkedinCount">' +
+      '<div class="pluginCountButton">' + 
+        '<div class="pluginCountButtonRight">' +
+          '<div class="pluginCountButtonLeft">' +
+            '<span ng-transclude></span>' +
+          '</div>' +
+        '</div>' +
+      '</div>' + 
+    '</div>',
+    link: function(scope, element, attr) {
+      if(attr.shares){
+        $http.jsonp('http://www.linkedin.com/countserv/count/share?url='+attr.link+'&callback=JSON_CALLBACK&format=jsonp').success(function(res){
+          scope.shares = res.count.toLocaleString();
+        }).error(function(){
+          scope.shares = 0;
+        });
+      }
+      $timeout(function(){
+        element.bind('click',function(){
+          var url = encodeURIComponent(attr.url).replace(/'/g,"%27").replace(/"/g,"%22")
+          $window.open("//www.linkedin.com/shareArticle?mini=true&url="+url+"&title="+attr.title+"&summary="+attr.summary);
+        });
+      });
+    }
+  };
+}]).directive('gplus',[function(){
+  return {
+    link: function(scope,element,attr){
+      if(typeof gapi == "undefined"){
+        (function() {
+          var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
+          po.src = 'https://apis.google.com/js/plusone.js';
+          var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
+        })();
+      }
+    }
+  };
+}]).directive('tumblrText',[function(){
+  return {
+    link: function(scope,element,attr){
+      var tumblr_button = document.createElement("a");
+      tumblr_button.setAttribute("href", "http://www.tumblr.com/share/link?url=" + encodeURIComponent(attr.url) + "&name=" + encodeURIComponent(attr.name) + "&description=" + encodeURIComponent(attr.description));
+      tumblr_button.setAttribute("title", attr.title||"Share on Tumblr");
+      tumblr_button.setAttribute("style", attr.styling||"display:inline-block; text-indent:-9999px; overflow:hidden; width:81px; height:20px; background:url('http://platform.tumblr.com/v1/share_1.png') top left no-repeat transparent;");
+      element.append(tumblr_button);
+    }
+
+  }  
+}]).directive('tumblrQoute',[function(){
+  return {
+    link: function(scope,element,attr){
+      var tumblr_button = document.createElement("a");
+      tumblr_button.setAttribute("href", "http://www.tumblr.com/share/quote?quote=" + encodeURIComponent(attr.qoute) + "&source=" + encodeURIComponent(attr.source));
+      tumblr_button.setAttribute("title", attr.title||"Share on Tumblr");
+      tumblr_button.setAttribute("style", attr.styling||"display:inline-block; text-indent:-9999px; overflow:hidden; width:81px; height:20px; background:url('http://platform.tumblr.com/v1/share_1.png') top left no-repeat transparent;");
+      element.append(tumblr_button);
+    }
+  }  
+}]).directive('tumblrImage',[function(){
+  return {
+    link: function(scope,element,attr){
+      var tumblr_button = document.createElement("a");
+      tumblr_button.setAttribute("href", "http://www.tumblr.com/share/photo?source=" + encodeURIComponent(attr.source) + "&caption=" + encodeURIComponent(attr.caption) + "&clickthru=" + encodeURIComponent(attr.clickthru));
+      tumblr_button.setAttribute("title", attr.title||"Share on Tumblr");
+      tumblr_button.setAttribute("style", attr.styling||"display:inline-block; text-indent:-9999px; overflow:hidden; width:81px; height:20px; background:url('http://platform.tumblr.com/v1/share_1.png') top left no-repeat transparent;");
+      element.append(tumblr_button);
+    }
+  }
+}]).directive('tumblrVideo',[function(){
+  return {
+    link: function(scope,element,attr){
+      var tumblr_button = document.createElement("a");
+      tumblr_button.setAttribute("href", "http://www.tumblr.com/share/video?embed=" + encodeURIComponent(attr.embedcode) + "&caption=" + encodeURIComponent(attr.caption));
+      tumblr_button.setAttribute("title", attr.title||"Share on Tumblr");
+      tumblr_button.setAttribute("style", attr.styling||"display:inline-block; text-indent:-9999px; overflow:hidden; width:81px; height:20px; background:url('http://platform.tumblr.com/v1/share_1.png') top left no-repeat transparent;");
+      element.append(tumblr_button);
+    }
+  }
+}]).directive('pintrest',[function(){
+  return {
+    template: '<a href="{{href}}" data-pin-do="{{pinDo}}" data-pin-config="{{pinConfig}}"><img src="//assets.pinterest.com/images/pidgets/pinit_fg_en_rect_gray_20.png" /></a>',
+    link: function(scope,element,attr){
+      scope.href = '//www.pinterest.com/pin/create/button/?url='+encodeURIComponent(attr.href)+'&media='+encodeURIComponent(attr.img)+'&description='+encodeURIComponent(attr.description);
+      scope.pinDo = attr.pinDo||"buttonPin";
+      scope.pinConfig = attr.pinConfig||"beside";
+    }
+  }
+}]);
diff --git a/static/demo/components/angular-socialshare/angular-socialshare.less b/static/demo/components/angular-socialshare/angular-socialshare.less
new file mode 100644
index 0000000000000000000000000000000000000000..ebf5400e5ed33d8a4d408d16cf4f495d639be8b2
--- /dev/null
+++ b/static/demo/components/angular-socialshare/angular-socialshare.less
@@ -0,0 +1,321 @@
+.facebookShare{
+    border: none;
+    visibility: visible;
+    width: auto;
+    height: 22px;
+    background: transparent;
+    overflow: hidden;
+    -webkit-text-size-adjust: none;
+    color: #333;
+    line-height: 1.28;
+    margin: 0;
+    padding: 0;
+    text-align: left;
+    direction: ltr;
+    cursor: pointer;
+    font-family: 'Helvetica Neue', Helvetica, Arial, 'lucida grande',tahoma,verdana,arial,sans-serif;
+    display: inline-block;
+
+    &:hover .facebookButton .pluginButton,
+    &:active .facebookButton .pluginButton,
+    &:focus .facebookButton .pluginButton{
+        background: #5b7bd5;
+        background: -moz-linear-gradient(top,  #5b7bd5 0%, #4864b1 100%);
+        background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#5b7bd5), color-stop(100%,#4864b1));
+        background: -webkit-linear-gradient(top,  #5b7bd5 0%,#4864b1 100%);
+        background: -o-linear-gradient(top,  #5b7bd5 0%,#4864b1 100%);
+        background: -ms-linear-gradient(top,  #5b7bd5 0%,#4864b1 100%);
+        background: linear-gradient(to bottom,  #5b7bd5 0%,#4864b1 100%);
+        filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#5b7bd5', endColorstr='#4864b1',GradientType=0 );
+        border-color: #5874c3 #4961a8 #41599f;
+        box-shadow: inset 0 0 1px #607fd6;
+    }
+
+    .facebookButton{
+        color:#3b5998;
+        text-decoration: none;
+        font-size: 11px;
+        text-align: left;
+        display: inline-block;
+        width:55px;
+
+        .pluginButton{
+            background: #4c69ba;
+            background: -moz-linear-gradient(top,  #4c69ba 0%, #3b55a0 100%);
+            background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#4c69ba), color-stop(100%,#3b55a0));
+            background: -webkit-linear-gradient(top,  #4c69ba 0%,#3b55a0 100%);
+            background: -o-linear-gradient(top,  #4c69ba 0%,#3b55a0 100%);
+            background: -ms-linear-gradient(top,  #4c69ba 0%,#3b55a0 100%);
+            background: linear-gradient(to bottom,  #4c69ba 0%,#3b55a0 100%);
+            filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4c69ba', endColorstr='#3b55a0',GradientType=0 );
+            border: none;
+            border-radius: 3px;
+            color: #fff;
+            cursor: pointer;
+            font-weight: bold;
+            height: 20px;
+            line-height: 20px;
+            padding: 0;
+            text-shadow: 0 -1px 0 #354c8c;
+            white-space: nowrap;
+
+            .pluginButtonContainer {
+                 -webkit-font-smoothing: antialiased;
+                 text-shadow: 1px 1px 1px rgba(255,255,255,0.004);
+
+                .pluginButtonImage {
+                    display: inline-block;
+                }
+            }
+            button {
+                background: transparent;
+                border: 0;
+                color: inherit;
+                cursor: pointer;
+                font: inherit;
+                font-weight: bold;
+                margin: -1px;
+                outline: none;
+                padding: 0;
+                text-shadow: 0 -1px 0 #354c8c;
+
+                .pluginButtonIcon {
+                    height: 14px;
+                    left: 0;
+                    margin: 0 4px 0 4px;
+                    position: relative;
+                    top: 3px;
+                    vertical-align: top;
+                    width: 14px;
+                }
+                .sp_plugin-button-2x {
+                    background-image: url(https://fbstatic-a.akamaihd.net/rsrc.php/v2/y5/r/KxVPs0eEy36.png);
+                    background-size: 30px 72px;
+                    background-repeat: no-repeat;
+                    display: inline-block;
+                    height: 14px;
+                    width: 14px;
+                }
+                .sx_plugin-button-2x_favblue {
+                    background-position: 0 -42px;
+                }
+                i.img {
+                    -ms-high-contrast-adjust: none;
+                    _overflow: hidden;
+                }
+            }
+            .pluginButtonLabel {
+                padding: 0 5px 0 0;
+                position: relative;
+                vertical-align: top;
+            }
+        }
+    }
+    .facebookCount{
+        display: inline-block;
+        width: auto;
+
+        .pluginCountButton {
+            background: white;
+            border: 1px solid #bbb;
+            border-radius: 3px;
+            color: #6a7180;
+            display: inline-block;
+            font-size: 11px;
+            height: auto;
+            line-height: 18px;
+            margin-left: 6px;
+            min-width: 15px;
+            padding: 0 3px;
+            text-align: center;
+            white-space: nowrap;
+
+            span{
+                display: inline-block;
+                min-height:12px;
+                min-width:4px;
+                color:#333;
+            }
+        }
+        .pluginCountButtonNub {
+            height: 0;
+            left: 2px;
+            position: relative;
+            top: -15px;
+            width: 5px;
+            z-index: 2;
+
+            s,
+            i {
+                border-color: transparent #bbb;
+                border-style: solid;
+                border-width: 4px 5px 4px 0;
+                display: block;
+                position: relative;
+                top: 1px;
+            }
+            i {
+                border-right-color: #fff;
+                left: 2px;
+                top: -7px;
+            }
+        }
+    }
+}
+@-moz-document url-prefix() { 
+  .facebookShare .facebookButton .pluginButton button .pluginButtonIcon{
+    margin:0 1px;
+  }
+}
+.linkedinShare{
+    line-height: 1;
+    vertical-align: baseline;
+    display: inline-block;
+    text-align: center;
+    width: auto;
+    padding:0;
+    margin: 0;
+    position: relative;
+    border:0;
+    text-decoration: none;
+    height:20px;
+    cursor: pointer;
+
+    &:hover .linkedinButton .pluginButtonLabel,
+    &:active .linkedinButton .pluginButtonLabel,
+    &:focus .linkedinButton .pluginButtonLabel{
+        border: 1px solid #000;
+        border-top-color: #ABABAB;
+        border-right-color: #9A9A9A;
+        border-bottom-color: #787878;
+        border-left-color: #04568B;
+        border-left: 0;
+        background: #ededed;
+        background: -moz-linear-gradient(top,  #ededed 0%, #dedede 100%);
+        background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ededed), color-stop(100%,#dedede));
+        background: -webkit-linear-gradient(top,  #ededed 0%,#dedede 100%);
+        background: -o-linear-gradient(top,  #ededed 0%,#dedede 100%);
+        background: -ms-linear-gradient(top,  #ededed 0%,#dedede 100%);
+        background: linear-gradient(to bottom,  #ededed 0%,#dedede 100%);
+        filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ededed', endColorstr='#dedede',GradientType=0 );
+    }
+
+    .linkedinButton{
+        display: inline-block;
+        width: 59px;
+        height:20px;
+        padding: 0;
+        margin: 0;
+
+        .pluginButtonImage{
+            background-image: url(https://www.linkedin.com/scds/common/u/images/apps/connect/sprites/sprite_connect_v14.png);
+            background-position: 0px -276px;
+            background-repeat: no-repeat;
+            cursor: pointer;
+            border: 0;
+            text-indent: -9999em;
+            overflow: hidden;
+            padding: 0;
+            margin: 0;
+            position: absolute;
+            left: 0px;
+            top: 0px;
+            display: block;
+            width: 20px;
+            height: 20px;
+            border-radius: 2px;
+            color: #069;
+        }
+        .pluginButtonLabel{
+            color: #333;
+            cursor: pointer;
+            display: block;
+            white-space: nowrap;
+            float: left;
+            margin-left: 1px;
+            overflow: hidden;
+            text-align: center;
+            height: 18px;
+            padding: 0 4px 0 23px;
+            border: 1px solid #000;
+            border-top-color: #E2E2E2;
+            border-right-color: #BFBFBF;
+            border-bottom-color: #B9B9B9;
+            border-left-color: #E2E2E2;
+            border-left: 0;
+            text-shadow: #FFFFFF -1px 1px 0;
+            line-height: 20px;
+            border-radius: 2px;
+            background-color: #ECECEC;
+            background: -moz-linear-gradient(top,  #fefefe 0%, #ececec 100%);
+            background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fefefe), color-stop(100%,#ececec));
+            background: -webkit-linear-gradient(top,  #fefefe 0%,#ececec 100%);
+            background: -o-linear-gradient(top,  #fefefe 0%,#ececec 100%);
+            background: -ms-linear-gradient(top,  #fefefe 0%,#ececec 100%);
+            background: linear-gradient(to bottom,  #fefefe 0%,#ececec 100%);
+            filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fefefe', endColorstr='#ececec',GradientType=0 );
+
+            span{
+                color: #333;
+                font-size: 11px;
+                font-family: Arial, sans-serif;
+                font-weight: bold;
+                font-style: normal;
+                -webkit-font-smoothing: antialiased;
+                display: inline-block;
+                background: transparent none;
+                vertical-align: top;
+                height: 18px;
+                line-height: 20px;
+                float: none;
+            }
+        }
+    }
+    .linkedinCount{
+        padding: 0px;
+        margin: 0px;
+        text-indent: 0px;
+        display: inline-block;
+        vertical-align: baseline;
+
+        .pluginCountButton{
+            display: inline-block;
+            overflow: visible;
+            position: relative;
+            height: 18px;
+            padding-left: 2px;
+
+            .pluginCountButtonRight{
+                display: block;
+                float: left;
+                height: 18px;
+                padding-right: 4px;
+                background-image: url(https://www.linkedin.com/scds/common/u/images/apps/connect/sprites/sprite_connect_v14.png);
+                background-color: transparent;
+                background-repeat: no-repeat;
+                background-position: right -100px;
+
+                .pluginCountButtonLeft{
+                    display: block;
+                    float: left;
+                    padding-left: 8px;
+                    text-align: center;
+                    background-image: url(https://www.linkedin.com/scds/common/u/images/apps/connect/sprites/sprite_connect_v14.png);
+                    background-color: transparent;
+                    background-repeat: no-repeat;
+                    background-position: 0px -60px;
+
+                    span{
+                        display: inline;
+                        font-size: 11px;
+                        color: #04558B;
+                        font-weight: bold;
+                        font-family: Arial, sans-serif;
+                        line-height: 18px;
+                        padding: 0 2px;
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/static/demo/components/angular-socialshare/angular-socialshare.min.css b/static/demo/components/angular-socialshare/angular-socialshare.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..d4b0a2719f281871c871a7be151935570e7a4c17
--- /dev/null
+++ b/static/demo/components/angular-socialshare/angular-socialshare.min.css
@@ -0,0 +1 @@
+.facebookShare{border:none;visibility:visible;width:auto;height:22px;background:0 0;overflow:hidden;-webkit-text-size-adjust:none;color:#333;line-height:1.28;margin:0;padding:0;text-align:left;direction:ltr;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,'lucida grande',tahoma,verdana,arial,sans-serif;display:inline-block}.facebookShare:active .facebookButton .pluginButton,.facebookShare:focus .facebookButton .pluginButton,.facebookShare:hover .facebookButton .pluginButton{background:#5b7bd5;background:-moz-linear-gradient(top,#5b7bd5 0,#4864b1 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#5b7bd5),color-stop(100%,#4864b1));background:-webkit-linear-gradient(top,#5b7bd5 0,#4864b1 100%);background:-o-linear-gradient(top,#5b7bd5 0,#4864b1 100%);background:-ms-linear-gradient(top,#5b7bd5 0,#4864b1 100%);background:linear-gradient(to bottom,#5b7bd5 0,#4864b1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5b7bd5', endColorstr='#4864b1', GradientType=0);border-color:#5874c3 #4961a8 #41599f;box-shadow:inset 0 0 1px #607fd6}.facebookShare .facebookButton{color:#3b5998;text-decoration:none;font-size:11px;text-align:left;display:inline-block;width:55px}.facebookShare .facebookButton .pluginButton{background:#4c69ba;background:-moz-linear-gradient(top,#4c69ba 0,#3b55a0 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#4c69ba),color-stop(100%,#3b55a0));background:-webkit-linear-gradient(top,#4c69ba 0,#3b55a0 100%);background:-o-linear-gradient(top,#4c69ba 0,#3b55a0 100%);background:-ms-linear-gradient(top,#4c69ba 0,#3b55a0 100%);background:linear-gradient(to bottom,#4c69ba 0,#3b55a0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c69ba', endColorstr='#3b55a0', GradientType=0);border:none;border-radius:3px;color:#fff;cursor:pointer;font-weight:700;height:20px;line-height:20px;padding:0;text-shadow:0 -1px 0 #354c8c;white-space:nowrap}.facebookShare .facebookButton .pluginButton .pluginButtonContainer{-webkit-font-smoothing:antialiased;text-shadow:1px 1px 1px rgba(255,255,255,.004)}.facebookShare .facebookButton .pluginButton .pluginButtonContainer .pluginButtonImage{display:inline-block}.facebookShare .facebookButton .pluginButton button{background:0 0;border:0;color:inherit;cursor:pointer;font:inherit;font-weight:700;margin:-1px;outline:0;padding:0;text-shadow:0 -1px 0 #354c8c}.facebookShare .facebookButton .pluginButton button .pluginButtonIcon{height:14px;left:0;margin:0 4px;position:relative;top:3px;vertical-align:top;width:14px}.facebookShare .facebookButton .pluginButton button .sp_plugin-button-2x{background-image:url(https://fbstatic-a.akamaihd.net/rsrc.php/v2/y5/r/KxVPs0eEy36.png);background-size:30px 72px;background-repeat:no-repeat;display:inline-block;height:14px;width:14px}.facebookShare .facebookButton .pluginButton button .sx_plugin-button-2x_favblue{background-position:0 -42px}.facebookShare .facebookButton .pluginButton button i.img{-ms-high-contrast-adjust:none;_overflow:hidden}.facebookShare .facebookButton .pluginButton .pluginButtonLabel{padding:0 5px 0 0;position:relative;vertical-align:top}.facebookShare .facebookCount{display:inline-block;width:auto}.facebookShare .facebookCount .pluginCountButton{background:#fff;border:1px solid #bbb;border-radius:3px;color:#6a7180;display:inline-block;font-size:11px;height:auto;line-height:18px;margin-left:6px;min-width:15px;padding:0 3px;text-align:center;white-space:nowrap}.facebookShare .facebookCount .pluginCountButton span{display:inline-block;min-height:12px;min-width:4px;color:#333}.facebookShare .facebookCount .pluginCountButtonNub{height:0;left:2px;position:relative;top:-15px;width:5px;z-index:2}.facebookShare .facebookCount .pluginCountButtonNub i,.facebookShare .facebookCount .pluginCountButtonNub s{border-color:transparent #bbb;border-style:solid;border-width:4px 5px 4px 0;display:block;position:relative;top:1px}.facebookShare .facebookCount .pluginCountButtonNub i{border-right-color:#fff;left:2px;top:-7px}@-moz-document url-prefix(){.facebookShare .facebookButton .pluginButton button .pluginButtonIcon{margin:0 1px}}.linkedinShare{line-height:1;vertical-align:baseline;display:inline-block;text-align:center;width:auto;padding:0;margin:0;position:relative;border:0;text-decoration:none;height:20px;cursor:pointer}.linkedinShare:active .linkedinButton .pluginButtonLabel,.linkedinShare:focus .linkedinButton .pluginButtonLabel,.linkedinShare:hover .linkedinButton .pluginButtonLabel{border:1px solid #000;border-top-color:#ABABAB;border-right-color:#9A9A9A;border-bottom-color:#787878;border-left:0;background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#dedede 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#dedede));background:-webkit-linear-gradient(top,#ededed 0,#dedede 100%);background:-o-linear-gradient(top,#ededed 0,#dedede 100%);background:-ms-linear-gradient(top,#ededed 0,#dedede 100%);background:linear-gradient(to bottom,#ededed 0,#dedede 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#dedede', GradientType=0)}.linkedinShare .linkedinButton{display:inline-block;width:59px;height:20px;padding:0;margin:0}.linkedinShare .linkedinButton .pluginButtonImage{background-image:url(https://www.linkedin.com/scds/common/u/images/apps/connect/sprites/sprite_connect_v14.png);background-position:0 -276px;background-repeat:no-repeat;cursor:pointer;border:0;text-indent:-9999em;overflow:hidden;padding:0;margin:0;position:absolute;left:0;top:0;display:block;width:20px;height:20px;border-radius:2px;color:#069}.linkedinShare .linkedinButton .pluginButtonLabel{color:#333;cursor:pointer;display:block;white-space:nowrap;float:left;margin-left:1px;overflow:hidden;text-align:center;height:18px;padding:0 4px 0 23px;border:1px solid #000;border-top-color:#E2E2E2;border-right-color:#BFBFBF;border-bottom-color:#B9B9B9;border-left:0;text-shadow:#fff -1px 1px 0;line-height:20px;border-radius:2px;background:-moz-linear-gradient(top,#fefefe 0,#ececec 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#fefefe),color-stop(100%,#ececec));background:-webkit-linear-gradient(top,#fefefe 0,#ececec 100%);background:-o-linear-gradient(top,#fefefe 0,#ececec 100%);background:-ms-linear-gradient(top,#fefefe 0,#ececec 100%);background:linear-gradient(to bottom,#fefefe 0,#ececec 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fefefe', endColorstr='#ececec', GradientType=0)}.linkedinShare .linkedinButton .pluginButtonLabel span{color:#333;font-size:11px;font-family:Arial,sans-serif;font-weight:700;font-style:normal;-webkit-font-smoothing:antialiased;display:inline-block;background:transparent none;vertical-align:top;height:18px;line-height:20px;float:none}.linkedinShare .linkedinCount{padding:0;margin:0;text-indent:0;display:inline-block;vertical-align:baseline}.linkedinShare .linkedinCount .pluginCountButton{display:inline-block;overflow:visible;position:relative;height:18px;padding-left:2px}.linkedinShare .linkedinCount .pluginCountButton .pluginCountButtonRight{display:block;float:left;height:18px;padding-right:4px;background-image:url(https://www.linkedin.com/scds/common/u/images/apps/connect/sprites/sprite_connect_v14.png);background-color:transparent;background-repeat:no-repeat;background-position:right -100px}.linkedinShare .linkedinCount .pluginCountButton .pluginCountButtonRight .pluginCountButtonLeft{display:block;float:left;padding-left:8px;text-align:center;background-image:url(https://www.linkedin.com/scds/common/u/images/apps/connect/sprites/sprite_connect_v14.png);background-color:transparent;background-repeat:no-repeat;background-position:0 -60px}.linkedinShare .linkedinCount .pluginCountButton .pluginCountButtonRight .pluginCountButtonLeft span{display:inline;font-size:11px;color:#04558B;font-weight:700;font-family:Arial,sans-serif;line-height:18px;padding:0 2px}
diff --git a/static/demo/components/angular-socialshare/angular-socialshare.min.js b/static/demo/components/angular-socialshare/angular-socialshare.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..b73e9e9c8021a249dbf04329c499b3d183d94140
--- /dev/null
+++ b/static/demo/components/angular-socialshare/angular-socialshare.min.js
@@ -0,0 +1 @@
+"use strict";angular.module("djds4rce.angular-socialshare",[]).factory("$FB",["$window",function(t){return{init:function(e){if(!e)throw"FB App Id Cannot be blank";this.fbId=e,t.fbAsyncInit=function(){FB.init({appId:e,channelUrl:"app/channel.html",status:!0,xfbml:!0})},function(t){var e,n="facebook-jssdk",i=t.getElementsByTagName("script")[0];t.getElementById(n)||(e=t.createElement("script"),e.id=n,e.async=!0,e.src="//connect.facebook.net/en_US/all.js",i.parentNode.insertBefore(e,i))}(document)}}}]).directive("facebook",["$timeout","$http",function(t,e){return{scope:{shares:"="},transclude:!0,template:'<div class="facebookButton"><div class="pluginButton"><div class="pluginButtonContainer"><div class="pluginButtonImage"><button type="button"><i class="pluginButtonIcon img sp_plugin-button-2x sx_plugin-button-2x_favblue"></i></button></div><span class="pluginButtonLabel">Share</span></div></div></div><div class="facebookCount"><div class="pluginCountButton pluginCountNum"><span ng-transclude></span></div><div class="pluginCountButtonNub"><s></s><i></i></div></div>',link:function(n,i,o){o.shares&&e.get("https://api.facebook.com/method/links.getStats?urls="+o.url+"&format=json").success(function(t){var e=t[0].share_count.toString(),i="";e.length>6?("0"!=e.slice(-6,-5)&&(i="."+e.slice(-6,-5)),e=e.slice(0,-6),e=e+i+"M"):e.length>3&&("0"!=e.slice(-3,-2)&&(i="."+e.slice(-3,-2)),e=e.slice(0,-3),e=e+i+"k"),n.shares=e}).error(function(){n.shares=0}),t(function(){i.bind("click",function(t){FB.ui({method:"share",href:o.url}),t.preventDefault()})})}}}]).directive("twitter",["$timeout",function(t){return{link:function(e,n,i){t(function(){twttr.widgets.createShareButton(i.url,n[0],function(){},{count:i.count,text:i.text,via:i.via,size:i.size})})}}}]).directive("linkedin",["$timeout","$http","$window",function(t,e,n){return{scope:{shares:"="},transclude:!0,template:'<div class="linkedinButton"><div class="pluginButton"><div class="pluginButtonContainer"><div class="pluginButtonImage">in</div><span class="pluginButtonLabel"><span>Share</span></span></div></div></div><div class="linkedinCount"><div class="pluginCountButton"><div class="pluginCountButtonRight"><div class="pluginCountButtonLeft"><span ng-transclude></span></div></div></div></div>',link:function(i,o,r){r.shares&&e.jsonp("http://www.linkedin.com/countserv/count/share?url="+r.link+"&callback=JSON_CALLBACK&format=jsonp").success(function(t){i.shares=t.count.toLocaleString()}).error(function(){i.shares=0}),t(function(){o.bind("click",function(){var t=encodeURIComponent(r.url).replace(/'/g,"%27").replace(/"/g,"%22");n.open("//www.linkedin.com/shareArticle?mini=true&url="+t+"&title="+r.title+"&summary="+r.summary)})})}}}]).directive("gplus",[function(){return{link:function(){"undefined"==typeof gapi&&!function(){var t=document.createElement("script");t.type="text/javascript",t.async=!0,t.src="https://apis.google.com/js/plusone.js";var e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e)}()}}}]).directive("tumblrText",[function(){return{link:function(t,e,n){var i=document.createElement("a");i.setAttribute("href","http://www.tumblr.com/share/link?url="+encodeURIComponent(n.url)+"&name="+encodeURIComponent(n.name)+"&description="+encodeURIComponent(n.description)),i.setAttribute("title",n.title||"Share on Tumblr"),i.setAttribute("style",n.styling||"display:inline-block; text-indent:-9999px; overflow:hidden; width:81px; height:20px; background:url('http://platform.tumblr.com/v1/share_1.png') top left no-repeat transparent;"),e.append(i)}}}]).directive("tumblrQoute",[function(){return{link:function(t,e,n){var i=document.createElement("a");i.setAttribute("href","http://www.tumblr.com/share/quote?quote="+encodeURIComponent(n.qoute)+"&source="+encodeURIComponent(n.source)),i.setAttribute("title",n.title||"Share on Tumblr"),i.setAttribute("style",n.styling||"display:inline-block; text-indent:-9999px; overflow:hidden; width:81px; height:20px; background:url('http://platform.tumblr.com/v1/share_1.png') top left no-repeat transparent;"),e.append(i)}}}]).directive("tumblrImage",[function(){return{link:function(t,e,n){var i=document.createElement("a");i.setAttribute("href","http://www.tumblr.com/share/photo?source="+encodeURIComponent(n.source)+"&caption="+encodeURIComponent(n.caption)+"&clickthru="+encodeURIComponent(n.clickthru)),i.setAttribute("title",n.title||"Share on Tumblr"),i.setAttribute("style",n.styling||"display:inline-block; text-indent:-9999px; overflow:hidden; width:81px; height:20px; background:url('http://platform.tumblr.com/v1/share_1.png') top left no-repeat transparent;"),e.append(i)}}}]).directive("tumblrVideo",[function(){return{link:function(t,e,n){var i=document.createElement("a");i.setAttribute("href","http://www.tumblr.com/share/video?embed="+encodeURIComponent(n.embedcode)+"&caption="+encodeURIComponent(n.caption)),i.setAttribute("title",n.title||"Share on Tumblr"),i.setAttribute("style",n.styling||"display:inline-block; text-indent:-9999px; overflow:hidden; width:81px; height:20px; background:url('http://platform.tumblr.com/v1/share_1.png') top left no-repeat transparent;"),e.append(i)}}}]).directive("pintrest",[function(){return{template:'<a href="{{href}}" data-pin-do="{{pinDo}}" data-pin-config="{{pinConfig}}"><img src="//assets.pinterest.com/images/pidgets/pinit_fg_en_rect_gray_20.png" /></a>',link:function(t,e,n){t.href="//www.pinterest.com/pin/create/button/?url="+encodeURIComponent(n.href)+"&media="+encodeURIComponent(n.img)+"&description="+encodeURIComponent(n.description),t.pinDo=n.pinDo||"buttonPin",t.pinConfig=n.pinConfig||"beside"}}}]);
\ No newline at end of file
diff --git a/static/demo/components/angular-socialshare/bower.json b/static/demo/components/angular-socialshare/bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..b91f97f180ae79eaabe6f913ea5ddf5571ac87e5
--- /dev/null
+++ b/static/demo/components/angular-socialshare/bower.json
@@ -0,0 +1,24 @@
+{
+  "name": "angular-socialshare",
+  "main": "angular-socialshare.js",
+  "version": "0.0.2",
+  "authors": [
+    "djds4rce <djd4rce@gmail.com>"
+  ],
+  "description": "Social Share buttons for AngularJS",
+  "keywords": [
+    "social",
+    "googleplus",
+    "facebook",
+    "twitter",
+    "linkdin"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ]
+}
diff --git a/static/demo/components/angular-socialshare/gulpfile.js b/static/demo/components/angular-socialshare/gulpfile.js
new file mode 100644
index 0000000000000000000000000000000000000000..c0db9dfd4cdeeb69fa210f8fa488bce3efa34e79
--- /dev/null
+++ b/static/demo/components/angular-socialshare/gulpfile.js
@@ -0,0 +1,11 @@
+var gulp = require('gulp');
+var gutil = require('gulp-util');
+var uglify = require('gulp-uglify');
+var rename = require('gulp-rename');
+
+gulp.task('default', function(){
+  gulp.src('./angular-socialshare.js')
+  .pipe(rename('angular-socialshare.min.js'))
+  .pipe(uglify())
+  .pipe(gulp.dest('./'));
+});
diff --git a/static/demo/components/angular/.bower.json b/static/demo/components/angular/.bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..a0bd386ace06a813a3caa5d0d372b5e6a8ddfb1a
--- /dev/null
+++ b/static/demo/components/angular/.bower.json
@@ -0,0 +1,16 @@
+{
+  "name": "angular",
+  "version": "1.0.8",
+  "main": "./angular.js",
+  "dependencies": {},
+  "homepage": "https://github.com/angular/bower-angular",
+  "_release": "1.0.8",
+  "_resolution": {
+    "type": "version",
+    "tag": "v1.0.8",
+    "commit": "b2006330eef656b8e89a883feff7d7d2f3e5afed"
+  },
+  "_source": "git://github.com/angular/bower-angular.git",
+  "_target": "~1.0.6",
+  "_originalSource": "git://github.com/angular/bower-angular.git"
+}
\ No newline at end of file
diff --git a/static/demo/components/angular/angular.js b/static/demo/components/angular/angular.js
new file mode 100755
index 0000000000000000000000000000000000000000..719bc648ed3ef7230f1b76f332f82768bb307564
--- /dev/null
+++ b/static/demo/components/angular/angular.js
@@ -0,0 +1,15158 @@
+/**
+ * @license AngularJS v1.0.8
+ * (c) 2010-2012 Google, Inc. http://angularjs.org
+ * License: MIT
+ */
+(function(window, document, undefined) {
+'use strict';
+
+////////////////////////////////////
+
+/**
+ * @ngdoc function
+ * @name angular.lowercase
+ * @function
+ *
+ * @description Converts the specified string to lowercase.
+ * @param {string} string String to be converted to lowercase.
+ * @returns {string} Lowercased string.
+ */
+var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;};
+
+
+/**
+ * @ngdoc function
+ * @name angular.uppercase
+ * @function
+ *
+ * @description Converts the specified string to uppercase.
+ * @param {string} string String to be converted to uppercase.
+ * @returns {string} Uppercased string.
+ */
+var uppercase = function(string){return isString(string) ? string.toUpperCase() : string;};
+
+
+var manualLowercase = function(s) {
+  return isString(s)
+      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})
+      : s;
+};
+var manualUppercase = function(s) {
+  return isString(s)
+      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})
+      : s;
+};
+
+
+// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish
+// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods
+// with correct but slower alternatives.
+if ('i' !== 'I'.toLowerCase()) {
+  lowercase = manualLowercase;
+  uppercase = manualUppercase;
+}
+
+
+var /** holds major version number for IE or NaN for real browsers */
+    msie              = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]),
+    jqLite,           // delay binding since jQuery could be loaded after us.
+    jQuery,           // delay binding
+    slice             = [].slice,
+    push              = [].push,
+    toString          = Object.prototype.toString,
+
+    /** @name angular */
+    angular           = window.angular || (window.angular = {}),
+    angularModule,
+    nodeName_,
+    uid               = ['0', '0', '0'];
+
+
+/**
+ * @private
+ * @param {*} obj
+ * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, ...)
+ */
+function isArrayLike(obj) {
+  if (!obj || (typeof obj.length !== 'number')) return false;
+
+  // We have on object which has length property. Should we treat it as array?
+  if (typeof obj.hasOwnProperty != 'function' &&
+      typeof obj.constructor != 'function') {
+    // This is here for IE8: it is a bogus object treat it as array;
+    return true;
+  } else  {
+    return obj instanceof JQLite ||                      // JQLite
+           (jQuery && obj instanceof jQuery) ||          // jQuery
+           toString.call(obj) !== '[object Object]' ||   // some browser native object
+           typeof obj.callee === 'function';              // arguments (on IE8 looks like regular obj)
+  }
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.forEach
+ * @function
+ *
+ * @description
+ * Invokes the `iterator` function once for each item in `obj` collection, which can be either an
+ * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value`
+ * is the value of an object property or an array element and `key` is the object property key or
+ * array element index. Specifying a `context` for the function is optional.
+ *
+ * Note: this function was previously known as `angular.foreach`.
+ *
+   <pre>
+     var values = {name: 'misko', gender: 'male'};
+     var log = [];
+     angular.forEach(values, function(value, key){
+       this.push(key + ': ' + value);
+     }, log);
+     expect(log).toEqual(['name: misko', 'gender:male']);
+   </pre>
+ *
+ * @param {Object|Array} obj Object to iterate over.
+ * @param {Function} iterator Iterator function.
+ * @param {Object=} context Object to become context (`this`) for the iterator function.
+ * @returns {Object|Array} Reference to `obj`.
+ */
+function forEach(obj, iterator, context) {
+  var key;
+  if (obj) {
+    if (isFunction(obj)){
+      for (key in obj) {
+        if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) {
+          iterator.call(context, obj[key], key);
+        }
+      }
+    } else if (obj.forEach && obj.forEach !== forEach) {
+      obj.forEach(iterator, context);
+    } else if (isArrayLike(obj)) {
+      for (key = 0; key < obj.length; key++)
+        iterator.call(context, obj[key], key);
+    } else {
+      for (key in obj) {
+        if (obj.hasOwnProperty(key)) {
+          iterator.call(context, obj[key], key);
+        }
+      }
+    }
+  }
+  return obj;
+}
+
+function sortedKeys(obj) {
+  var keys = [];
+  for (var key in obj) {
+    if (obj.hasOwnProperty(key)) {
+      keys.push(key);
+    }
+  }
+  return keys.sort();
+}
+
+function forEachSorted(obj, iterator, context) {
+  var keys = sortedKeys(obj);
+  for ( var i = 0; i < keys.length; i++) {
+    iterator.call(context, obj[keys[i]], keys[i]);
+  }
+  return keys;
+}
+
+
+/**
+ * when using forEach the params are value, key, but it is often useful to have key, value.
+ * @param {function(string, *)} iteratorFn
+ * @returns {function(*, string)}
+ */
+function reverseParams(iteratorFn) {
+  return function(value, key) { iteratorFn(key, value) };
+}
+
+/**
+ * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric
+ * characters such as '012ABC'. The reason why we are not using simply a number counter is that
+ * the number string gets longer over time, and it can also overflow, where as the nextId
+ * will grow much slower, it is a string, and it will never overflow.
+ *
+ * @returns an unique alpha-numeric string
+ */
+function nextUid() {
+  var index = uid.length;
+  var digit;
+
+  while(index) {
+    index--;
+    digit = uid[index].charCodeAt(0);
+    if (digit == 57 /*'9'*/) {
+      uid[index] = 'A';
+      return uid.join('');
+    }
+    if (digit == 90  /*'Z'*/) {
+      uid[index] = '0';
+    } else {
+      uid[index] = String.fromCharCode(digit + 1);
+      return uid.join('');
+    }
+  }
+  uid.unshift('0');
+  return uid.join('');
+}
+
+
+/**
+ * Set or clear the hashkey for an object.
+ * @param obj object 
+ * @param h the hashkey (!truthy to delete the hashkey)
+ */
+function setHashKey(obj, h) {
+  if (h) {
+    obj.$$hashKey = h;
+  }
+  else {
+    delete obj.$$hashKey;
+  }
+}
+
+/**
+ * @ngdoc function
+ * @name angular.extend
+ * @function
+ *
+ * @description
+ * Extends the destination object `dst` by copying all of the properties from the `src` object(s)
+ * to `dst`. You can specify multiple `src` objects.
+ *
+ * @param {Object} dst Destination object.
+ * @param {...Object} src Source object(s).
+ * @returns {Object} Reference to `dst`.
+ */
+function extend(dst) {
+  var h = dst.$$hashKey;
+  forEach(arguments, function(obj){
+    if (obj !== dst) {
+      forEach(obj, function(value, key){
+        dst[key] = value;
+      });
+    }
+  });
+
+  setHashKey(dst,h);
+  return dst;
+}
+
+function int(str) {
+  return parseInt(str, 10);
+}
+
+
+function inherit(parent, extra) {
+  return extend(new (extend(function() {}, {prototype:parent}))(), extra);
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.noop
+ * @function
+ *
+ * @description
+ * A function that performs no operations. This function can be useful when writing code in the
+ * functional style.
+   <pre>
+     function foo(callback) {
+       var result = calculateResult();
+       (callback || angular.noop)(result);
+     }
+   </pre>
+ */
+function noop() {}
+noop.$inject = [];
+
+
+/**
+ * @ngdoc function
+ * @name angular.identity
+ * @function
+ *
+ * @description
+ * A function that returns its first argument. This function is useful when writing code in the
+ * functional style.
+ *
+   <pre>
+     function transformer(transformationFn, value) {
+       return (transformationFn || angular.identity)(value);
+     };
+   </pre>
+ */
+function identity($) {return $;}
+identity.$inject = [];
+
+
+function valueFn(value) {return function() {return value;};}
+
+/**
+ * @ngdoc function
+ * @name angular.isUndefined
+ * @function
+ *
+ * @description
+ * Determines if a reference is undefined.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is undefined.
+ */
+function isUndefined(value){return typeof value == 'undefined';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isDefined
+ * @function
+ *
+ * @description
+ * Determines if a reference is defined.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is defined.
+ */
+function isDefined(value){return typeof value != 'undefined';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isObject
+ * @function
+ *
+ * @description
+ * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not
+ * considered to be objects.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is an `Object` but not `null`.
+ */
+function isObject(value){return value != null && typeof value == 'object';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isString
+ * @function
+ *
+ * @description
+ * Determines if a reference is a `String`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `String`.
+ */
+function isString(value){return typeof value == 'string';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isNumber
+ * @function
+ *
+ * @description
+ * Determines if a reference is a `Number`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `Number`.
+ */
+function isNumber(value){return typeof value == 'number';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isDate
+ * @function
+ *
+ * @description
+ * Determines if a value is a date.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `Date`.
+ */
+function isDate(value){
+  return toString.apply(value) == '[object Date]';
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isArray
+ * @function
+ *
+ * @description
+ * Determines if a reference is an `Array`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is an `Array`.
+ */
+function isArray(value) {
+  return toString.apply(value) == '[object Array]';
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isFunction
+ * @function
+ *
+ * @description
+ * Determines if a reference is a `Function`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `Function`.
+ */
+function isFunction(value){return typeof value == 'function';}
+
+
+/**
+ * Determines if a value is a regular expression object.
+ *
+ * @private
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `RegExp`.
+ */
+function isRegExp(value) {
+  return toString.apply(value) == '[object RegExp]';
+}
+
+
+/**
+ * Checks if `obj` is a window object.
+ *
+ * @private
+ * @param {*} obj Object to check
+ * @returns {boolean} True if `obj` is a window obj.
+ */
+function isWindow(obj) {
+  return obj && obj.document && obj.location && obj.alert && obj.setInterval;
+}
+
+
+function isScope(obj) {
+  return obj && obj.$evalAsync && obj.$watch;
+}
+
+
+function isFile(obj) {
+  return toString.apply(obj) === '[object File]';
+}
+
+
+function isBoolean(value) {
+  return typeof value == 'boolean';
+}
+
+
+var trim = (function() {
+  // native trim is way faster: http://jsperf.com/angular-trim-test
+  // but IE doesn't have it... :-(
+  // TODO: we should move this into IE/ES5 polyfill
+  if (!String.prototype.trim) {
+    return function(value) {
+      return isString(value) ? value.replace(/^\s*/, '').replace(/\s*$/, '') : value;
+    };
+  }
+  return function(value) {
+    return isString(value) ? value.trim() : value;
+  };
+})();
+
+
+/**
+ * @ngdoc function
+ * @name angular.isElement
+ * @function
+ *
+ * @description
+ * Determines if a reference is a DOM element (or wrapped jQuery element).
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).
+ */
+function isElement(node) {
+  return node &&
+    (node.nodeName  // we are a direct element
+    || (node.bind && node.find));  // we have a bind and find method part of jQuery API
+}
+
+/**
+ * @param str 'key1,key2,...'
+ * @returns {object} in the form of {key1:true, key2:true, ...}
+ */
+function makeMap(str){
+  var obj = {}, items = str.split(","), i;
+  for ( i = 0; i < items.length; i++ )
+    obj[ items[i] ] = true;
+  return obj;
+}
+
+
+if (msie < 9) {
+  nodeName_ = function(element) {
+    element = element.nodeName ? element : element[0];
+    return (element.scopeName && element.scopeName != 'HTML')
+      ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;
+  };
+} else {
+  nodeName_ = function(element) {
+    return element.nodeName ? element.nodeName : element[0].nodeName;
+  };
+}
+
+
+function map(obj, iterator, context) {
+  var results = [];
+  forEach(obj, function(value, index, list) {
+    results.push(iterator.call(context, value, index, list));
+  });
+  return results;
+}
+
+
+/**
+ * @description
+ * Determines the number of elements in an array, the number of properties an object has, or
+ * the length of a string.
+ *
+ * Note: This function is used to augment the Object type in Angular expressions. See
+ * {@link angular.Object} for more information about Angular arrays.
+ *
+ * @param {Object|Array|string} obj Object, array, or string to inspect.
+ * @param {boolean} [ownPropsOnly=false] Count only "own" properties in an object
+ * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array.
+ */
+function size(obj, ownPropsOnly) {
+  var size = 0, key;
+
+  if (isArray(obj) || isString(obj)) {
+    return obj.length;
+  } else if (isObject(obj)){
+    for (key in obj)
+      if (!ownPropsOnly || obj.hasOwnProperty(key))
+        size++;
+  }
+
+  return size;
+}
+
+
+function includes(array, obj) {
+  return indexOf(array, obj) != -1;
+}
+
+function indexOf(array, obj) {
+  if (array.indexOf) return array.indexOf(obj);
+
+  for ( var i = 0; i < array.length; i++) {
+    if (obj === array[i]) return i;
+  }
+  return -1;
+}
+
+function arrayRemove(array, value) {
+  var index = indexOf(array, value);
+  if (index >=0)
+    array.splice(index, 1);
+  return value;
+}
+
+function isLeafNode (node) {
+  if (node) {
+    switch (node.nodeName) {
+    case "OPTION":
+    case "PRE":
+    case "TITLE":
+      return true;
+    }
+  }
+  return false;
+}
+
+/**
+ * @ngdoc function
+ * @name angular.copy
+ * @function
+ *
+ * @description
+ * Creates a deep copy of `source`, which should be an object or an array.
+ *
+ * * If no destination is supplied, a copy of the object or array is created.
+ * * If a destination is provided, all of its elements (for array) or properties (for objects)
+ *   are deleted and then all elements/properties from the source are copied to it.
+ * * If  `source` is not an object or array, `source` is returned.
+ *
+ * Note: this function is used to augment the Object type in Angular expressions. See
+ * {@link ng.$filter} for more information about Angular arrays.
+ *
+ * @param {*} source The source that will be used to make a copy.
+ *                   Can be any type, including primitives, `null`, and `undefined`.
+ * @param {(Object|Array)=} destination Destination into which the source is copied. If
+ *     provided, must be of the same type as `source`.
+ * @returns {*} The copy or updated `destination`, if `destination` was specified.
+ */
+function copy(source, destination){
+  if (isWindow(source) || isScope(source)) throw Error("Can't copy Window or Scope");
+  if (!destination) {
+    destination = source;
+    if (source) {
+      if (isArray(source)) {
+        destination = copy(source, []);
+      } else if (isDate(source)) {
+        destination = new Date(source.getTime());
+      } else if (isRegExp(source)) {
+        destination = new RegExp(source.source);
+      } else if (isObject(source)) {
+        destination = copy(source, {});
+      }
+    }
+  } else {
+    if (source === destination) throw Error("Can't copy equivalent objects or arrays");
+    if (isArray(source)) {
+      destination.length = 0;
+      for ( var i = 0; i < source.length; i++) {
+        destination.push(copy(source[i]));
+      }
+    } else {
+      var h = destination.$$hashKey;
+      forEach(destination, function(value, key){
+        delete destination[key];
+      });
+      for ( var key in source) {
+        destination[key] = copy(source[key]);
+      }
+      setHashKey(destination,h);
+    }
+  }
+  return destination;
+}
+
+/**
+ * Create a shallow copy of an object
+ */
+function shallowCopy(src, dst) {
+  dst = dst || {};
+
+  for(var key in src) {
+    if (src.hasOwnProperty(key) && key.substr(0, 2) !== '$$') {
+      dst[key] = src[key];
+    }
+  }
+
+  return dst;
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.equals
+ * @function
+ *
+ * @description
+ * Determines if two objects or two values are equivalent. Supports value types, regular expressions, arrays and
+ * objects.
+ *
+ * Two objects or values are considered equivalent if at least one of the following is true:
+ *
+ * * Both objects or values pass `===` comparison.
+ * * Both objects or values are of the same type and all of their properties pass `===` comparison.
+ * * Both values are NaN. (In JavasScript, NaN == NaN => false. But we consider two NaN as equal)
+ * * Both values represent the same regular expression (In JavasScript,
+ *   /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual
+ *   representation matches).
+ *
+ * During a property comparision, properties of `function` type and properties with names
+ * that begin with `$` are ignored.
+ *
+ * Scope and DOMWindow objects are being compared only by identify (`===`).
+ *
+ * @param {*} o1 Object or value to compare.
+ * @param {*} o2 Object or value to compare.
+ * @returns {boolean} True if arguments are equal.
+ */
+function equals(o1, o2) {
+  if (o1 === o2) return true;
+  if (o1 === null || o2 === null) return false;
+  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN
+  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;
+  if (t1 == t2) {
+    if (t1 == 'object') {
+      if (isArray(o1)) {
+        if (!isArray(o2)) return false;
+        if ((length = o1.length) == o2.length) {
+          for(key=0; key<length; key++) {
+            if (!equals(o1[key], o2[key])) return false;
+          }
+          return true;
+        }
+      } else if (isDate(o1)) {
+        return isDate(o2) && o1.getTime() == o2.getTime();
+      } else if (isRegExp(o1) && isRegExp(o2)) {
+        return o1.toString() == o2.toString();
+      } else {
+        if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false;
+        keySet = {};
+        for(key in o1) {
+          if (key.charAt(0) === '$' || isFunction(o1[key])) continue;
+          if (!equals(o1[key], o2[key])) return false;
+          keySet[key] = true;
+        }
+        for(key in o2) {
+          if (!keySet[key] &&
+              key.charAt(0) !== '$' &&
+              o2[key] !== undefined &&
+              !isFunction(o2[key])) return false;
+        }
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+
+function concat(array1, array2, index) {
+  return array1.concat(slice.call(array2, index));
+}
+
+function sliceArgs(args, startIndex) {
+  return slice.call(args, startIndex || 0);
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.bind
+ * @function
+ *
+ * @description
+ * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for
+ * `fn`). You can supply optional `args` that are prebound to the function. This feature is also
+ * known as [function currying](http://en.wikipedia.org/wiki/Currying).
+ *
+ * @param {Object} self Context which `fn` should be evaluated in.
+ * @param {function()} fn Function to be bound.
+ * @param {...*} args Optional arguments to be prebound to the `fn` function call.
+ * @returns {function()} Function that wraps the `fn` with all the specified bindings.
+ */
+function bind(self, fn) {
+  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];
+  if (isFunction(fn) && !(fn instanceof RegExp)) {
+    return curryArgs.length
+      ? function() {
+          return arguments.length
+            ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))
+            : fn.apply(self, curryArgs);
+        }
+      : function() {
+          return arguments.length
+            ? fn.apply(self, arguments)
+            : fn.call(self);
+        };
+  } else {
+    // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)
+    return fn;
+  }
+}
+
+
+function toJsonReplacer(key, value) {
+  var val = value;
+
+  if (/^\$+/.test(key)) {
+    val = undefined;
+  } else if (isWindow(value)) {
+    val = '$WINDOW';
+  } else if (value &&  document === value) {
+    val = '$DOCUMENT';
+  } else if (isScope(value)) {
+    val = '$SCOPE';
+  }
+
+  return val;
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.toJson
+ * @function
+ *
+ * @description
+ * Serializes input into a JSON-formatted string. Properties with leading $ characters will be
+ * stripped since angular uses this notation internally.
+ *
+ * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.
+ * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.
+ * @returns {string|undefined} Jsonified string representing `obj`.
+ */
+function toJson(obj, pretty) {
+  if (typeof obj === 'undefined') return undefined;
+  return JSON.stringify(obj, toJsonReplacer, pretty ? '  ' : null);
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.fromJson
+ * @function
+ *
+ * @description
+ * Deserializes a JSON string.
+ *
+ * @param {string} json JSON string to deserialize.
+ * @returns {Object|Array|Date|string|number} Deserialized thingy.
+ */
+function fromJson(json) {
+  return isString(json)
+      ? JSON.parse(json)
+      : json;
+}
+
+
+function toBoolean(value) {
+  if (value && value.length !== 0) {
+    var v = lowercase("" + value);
+    value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
+  } else {
+    value = false;
+  }
+  return value;
+}
+
+/**
+ * @returns {string} Returns the string representation of the element.
+ */
+function startingTag(element) {
+  element = jqLite(element).clone();
+  try {
+    // turns out IE does not let you set .html() on elements which
+    // are not allowed to have children. So we just ignore it.
+    element.html('');
+  } catch(e) {}
+  // As Per DOM Standards
+  var TEXT_NODE = 3;
+  var elemHtml = jqLite('<div>').append(element).html();
+  try {
+    return element[0].nodeType === TEXT_NODE ? lowercase(elemHtml) :
+        elemHtml.
+          match(/^(<[^>]+>)/)[1].
+          replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });
+  } catch(e) {
+    return lowercase(elemHtml);
+  }
+
+}
+
+
+/////////////////////////////////////////////////
+
+/**
+ * Tries to decode the URI component without throwing an exception.
+ *
+ * @private
+ * @param str value potential URI component to check.
+ * @returns {boolean} True if `value` can be decoded
+ * with the decodeURIComponent function.
+ */
+function tryDecodeURIComponent(value) {
+  try {
+    return decodeURIComponent(value);
+  } catch(e) {
+    // Ignore any invalid uri component
+  }
+}
+
+
+/**
+ * Parses an escaped url query string into key-value pairs.
+ * @returns Object.<(string|boolean)>
+ */
+function parseKeyValue(/**string*/keyValue) {
+  var obj = {}, key_value, key;
+  forEach((keyValue || "").split('&'), function(keyValue){
+    if ( keyValue ) {
+      key_value = keyValue.split('=');
+      key = tryDecodeURIComponent(key_value[0]);
+      if ( isDefined(key) ) {
+        obj[key] = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
+      }
+    }
+  });
+  return obj;
+}
+
+function toKeyValue(obj) {
+  var parts = [];
+  forEach(obj, function(value, key) {
+    parts.push(encodeUriQuery(key, true) + (value === true ? '' : '=' + encodeUriQuery(value, true)));
+  });
+  return parts.length ? parts.join('&') : '';
+}
+
+
+/**
+ * We need our custom method because encodeURIComponent is too agressive and doesn't follow
+ * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path
+ * segments:
+ *    segment       = *pchar
+ *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
+ *    pct-encoded   = "%" HEXDIG HEXDIG
+ *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
+ *                     / "*" / "+" / "," / ";" / "="
+ */
+function encodeUriSegment(val) {
+  return encodeUriQuery(val, true).
+             replace(/%26/gi, '&').
+             replace(/%3D/gi, '=').
+             replace(/%2B/gi, '+');
+}
+
+
+/**
+ * This method is intended for encoding *key* or *value* parts of query component. We need a custom
+ * method becuase encodeURIComponent is too agressive and encodes stuff that doesn't have to be
+ * encoded per http://tools.ietf.org/html/rfc3986:
+ *    query       = *( pchar / "/" / "?" )
+ *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
+ *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ *    pct-encoded   = "%" HEXDIG HEXDIG
+ *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
+ *                     / "*" / "+" / "," / ";" / "="
+ */
+function encodeUriQuery(val, pctEncodeSpaces) {
+  return encodeURIComponent(val).
+             replace(/%40/gi, '@').
+             replace(/%3A/gi, ':').
+             replace(/%24/g, '$').
+             replace(/%2C/gi, ',').
+             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
+}
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngApp
+ *
+ * @element ANY
+ * @param {angular.Module} ngApp an optional application
+ *   {@link angular.module module} name to load.
+ *
+ * @description
+ *
+ * Use this directive to auto-bootstrap an application. Only
+ * one ngApp directive can be used per HTML document. The directive
+ * designates the root of the application and is typically placed
+ * at the root of the page.
+ *
+ * The first ngApp found in the document will be auto-bootstrapped. To use multiple applications in an
+ * HTML document you must manually bootstrap them using {@link angular.bootstrap}.
+ * Applications cannot be nested.
+ *
+ * In the example below if the `ngApp` directive would not be placed
+ * on the `html` element then the document would not be compiled
+ * and the `{{ 1+2 }}` would not be resolved to `3`.
+ *
+ * `ngApp` is the easiest way to bootstrap an application.
+ *
+ <doc:example>
+   <doc:source>
+    I can add: 1 + 2 =  {{ 1+2 }}
+   </doc:source>
+ </doc:example>
+ *
+ */
+function angularInit(element, bootstrap) {
+  var elements = [element],
+      appElement,
+      module,
+      names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'],
+      NG_APP_CLASS_REGEXP = /\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;
+
+  function append(element) {
+    element && elements.push(element);
+  }
+
+  forEach(names, function(name) {
+    names[name] = true;
+    append(document.getElementById(name));
+    name = name.replace(':', '\\:');
+    if (element.querySelectorAll) {
+      forEach(element.querySelectorAll('.' + name), append);
+      forEach(element.querySelectorAll('.' + name + '\\:'), append);
+      forEach(element.querySelectorAll('[' + name + ']'), append);
+    }
+  });
+
+  forEach(elements, function(element) {
+    if (!appElement) {
+      var className = ' ' + element.className + ' ';
+      var match = NG_APP_CLASS_REGEXP.exec(className);
+      if (match) {
+        appElement = element;
+        module = (match[2] || '').replace(/\s+/g, ',');
+      } else {
+        forEach(element.attributes, function(attr) {
+          if (!appElement && names[attr.name]) {
+            appElement = element;
+            module = attr.value;
+          }
+        });
+      }
+    }
+  });
+  if (appElement) {
+    bootstrap(appElement, module ? [module] : []);
+  }
+}
+
+/**
+ * @ngdoc function
+ * @name angular.bootstrap
+ * @description
+ * Use this function to manually start up angular application.
+ *
+ * See: {@link guide/bootstrap Bootstrap}
+ *
+ * Note that ngScenario-based end-to-end tests cannot use this function to bootstrap manually.
+ * They must use {@link api/ng.directive:ngApp ngApp}.
+ *
+ * @param {Element} element DOM element which is the root of angular application.
+ * @param {Array<String|Function>=} modules an array of module declarations. See: {@link angular.module modules}
+ * @returns {AUTO.$injector} Returns the newly created injector for this app.
+ */
+function bootstrap(element, modules) {
+  var doBootstrap = function() {
+    element = jqLite(element);
+    modules = modules || [];
+    modules.unshift(['$provide', function($provide) {
+      $provide.value('$rootElement', element);
+    }]);
+    modules.unshift('ng');
+    var injector = createInjector(modules);
+    injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',
+       function(scope, element, compile, injector) {
+        scope.$apply(function() {
+          element.data('$injector', injector);
+          compile(element)(scope);
+        });
+      }]
+    );
+    return injector;
+  };
+
+  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;
+
+  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {
+    return doBootstrap();
+  }
+
+  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');
+  angular.resumeBootstrap = function(extraModules) {
+    forEach(extraModules, function(module) {
+      modules.push(module);
+    });
+    doBootstrap();
+  };
+}
+
+var SNAKE_CASE_REGEXP = /[A-Z]/g;
+function snake_case(name, separator){
+  separator = separator || '_';
+  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {
+    return (pos ? separator : '') + letter.toLowerCase();
+  });
+}
+
+function bindJQuery() {
+  // bind to jQuery if present;
+  jQuery = window.jQuery;
+  // reset to jQuery or default to us.
+  if (jQuery) {
+    jqLite = jQuery;
+    extend(jQuery.fn, {
+      scope: JQLitePrototype.scope,
+      controller: JQLitePrototype.controller,
+      injector: JQLitePrototype.injector,
+      inheritedData: JQLitePrototype.inheritedData
+    });
+    // Method signature: JQLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments)
+    JQLitePatchJQueryRemove('remove', true, true, false);
+    JQLitePatchJQueryRemove('empty', false, false, false);
+    JQLitePatchJQueryRemove('html', false, false, true);
+  } else {
+    jqLite = JQLite;
+  }
+  angular.element = jqLite;
+}
+
+/**
+ * throw error if the argument is falsy.
+ */
+function assertArg(arg, name, reason) {
+  if (!arg) {
+    throw new Error("Argument '" + (name || '?') + "' is " + (reason || "required"));
+  }
+  return arg;
+}
+
+function assertArgFn(arg, name, acceptArrayAnnotation) {
+  if (acceptArrayAnnotation && isArray(arg)) {
+      arg = arg[arg.length - 1];
+  }
+
+  assertArg(isFunction(arg), name, 'not a function, got ' +
+      (arg && typeof arg == 'object' ? arg.constructor.name || 'Object' : typeof arg));
+  return arg;
+}
+
+/**
+ * Return the value accessible from the object by path. Any undefined traversals are ignored
+ * @param {Object} obj starting object
+ * @param {string} path path to traverse
+ * @param {boolean=true} bindFnToScope
+ * @returns value as accessible by path
+ */
+//TODO(misko): this function needs to be removed
+function getter(obj, path, bindFnToScope) {
+  if (!path) return obj;
+  var keys = path.split('.');
+  var key;
+  var lastInstance = obj;
+  var len = keys.length;
+
+  for (var i = 0; i < len; i++) {
+    key = keys[i];
+    if (obj) {
+      obj = (lastInstance = obj)[key];
+    }
+  }
+  if (!bindFnToScope && isFunction(obj)) {
+    return bind(lastInstance, obj);
+  }
+  return obj;
+}
+
+/**
+ * @ngdoc interface
+ * @name angular.Module
+ * @description
+ *
+ * Interface for configuring angular {@link angular.module modules}.
+ */
+
+function setupModuleLoader(window) {
+
+  function ensure(obj, name, factory) {
+    return obj[name] || (obj[name] = factory());
+  }
+
+  return ensure(ensure(window, 'angular', Object), 'module', function() {
+    /** @type {Object.<string, angular.Module>} */
+    var modules = {};
+
+    /**
+     * @ngdoc function
+     * @name angular.module
+     * @description
+     *
+     * The `angular.module` is a global place for creating and registering Angular modules. All
+     * modules (angular core or 3rd party) that should be available to an application must be
+     * registered using this mechanism.
+     *
+     *
+     * # Module
+     *
+     * A module is a collection of services, directives, filters, and configuration information.
+     * `angular.module` is used to configure the {@link AUTO.$injector $injector}.
+     *
+     * <pre>
+     * // Create a new module
+     * var myModule = angular.module('myModule', []);
+     *
+     * // register a new service
+     * myModule.value('appName', 'MyCoolApp');
+     *
+     * // configure existing services inside initialization blocks.
+     * myModule.config(function($locationProvider) {
+     *   // Configure existing providers
+     *   $locationProvider.hashPrefix('!');
+     * });
+     * </pre>
+     *
+     * Then you can create an injector and load your modules like this:
+     *
+     * <pre>
+     * var injector = angular.injector(['ng', 'MyModule'])
+     * </pre>
+     *
+     * However it's more likely that you'll just use
+     * {@link ng.directive:ngApp ngApp} or
+     * {@link angular.bootstrap} to simplify this process for you.
+     *
+     * @param {!string} name The name of the module to create or retrieve.
+     * @param {Array.<string>=} requires If specified then new module is being created. If unspecified then the
+     *        the module is being retrieved for further configuration.
+     * @param {Function} configFn Optional configuration function for the module. Same as
+     *        {@link angular.Module#config Module#config()}.
+     * @returns {module} new module with the {@link angular.Module} api.
+     */
+    return function module(name, requires, configFn) {
+      if (requires && modules.hasOwnProperty(name)) {
+        modules[name] = null;
+      }
+      return ensure(modules, name, function() {
+        if (!requires) {
+          throw Error('No module: ' + name);
+        }
+
+        /** @type {!Array.<Array.<*>>} */
+        var invokeQueue = [];
+
+        /** @type {!Array.<Function>} */
+        var runBlocks = [];
+
+        var config = invokeLater('$injector', 'invoke');
+
+        /** @type {angular.Module} */
+        var moduleInstance = {
+          // Private state
+          _invokeQueue: invokeQueue,
+          _runBlocks: runBlocks,
+
+          /**
+           * @ngdoc property
+           * @name angular.Module#requires
+           * @propertyOf angular.Module
+           * @returns {Array.<string>} List of module names which must be loaded before this module.
+           * @description
+           * Holds the list of modules which the injector will load before the current module is loaded.
+           */
+          requires: requires,
+
+          /**
+           * @ngdoc property
+           * @name angular.Module#name
+           * @propertyOf angular.Module
+           * @returns {string} Name of the module.
+           * @description
+           */
+          name: name,
+
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#provider
+           * @methodOf angular.Module
+           * @param {string} name service name
+           * @param {Function} providerType Construction function for creating new instance of the service.
+           * @description
+           * See {@link AUTO.$provide#provider $provide.provider()}.
+           */
+          provider: invokeLater('$provide', 'provider'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#factory
+           * @methodOf angular.Module
+           * @param {string} name service name
+           * @param {Function} providerFunction Function for creating new instance of the service.
+           * @description
+           * See {@link AUTO.$provide#factory $provide.factory()}.
+           */
+          factory: invokeLater('$provide', 'factory'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#service
+           * @methodOf angular.Module
+           * @param {string} name service name
+           * @param {Function} constructor A constructor function that will be instantiated.
+           * @description
+           * See {@link AUTO.$provide#service $provide.service()}.
+           */
+          service: invokeLater('$provide', 'service'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#value
+           * @methodOf angular.Module
+           * @param {string} name service name
+           * @param {*} object Service instance object.
+           * @description
+           * See {@link AUTO.$provide#value $provide.value()}.
+           */
+          value: invokeLater('$provide', 'value'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#constant
+           * @methodOf angular.Module
+           * @param {string} name constant name
+           * @param {*} object Constant value.
+           * @description
+           * Because the constant are fixed, they get applied before other provide methods.
+           * See {@link AUTO.$provide#constant $provide.constant()}.
+           */
+          constant: invokeLater('$provide', 'constant', 'unshift'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#filter
+           * @methodOf angular.Module
+           * @param {string} name Filter name.
+           * @param {Function} filterFactory Factory function for creating new instance of filter.
+           * @description
+           * See {@link ng.$filterProvider#register $filterProvider.register()}.
+           */
+          filter: invokeLater('$filterProvider', 'register'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#controller
+           * @methodOf angular.Module
+           * @param {string} name Controller name.
+           * @param {Function} constructor Controller constructor function.
+           * @description
+           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.
+           */
+          controller: invokeLater('$controllerProvider', 'register'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#directive
+           * @methodOf angular.Module
+           * @param {string} name directive name
+           * @param {Function} directiveFactory Factory function for creating new instance of
+           * directives.
+           * @description
+           * See {@link ng.$compileProvider#directive $compileProvider.directive()}.
+           */
+          directive: invokeLater('$compileProvider', 'directive'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#config
+           * @methodOf angular.Module
+           * @param {Function} configFn Execute this function on module load. Useful for service
+           *    configuration.
+           * @description
+           * Use this method to register work which needs to be performed on module loading.
+           */
+          config: config,
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#run
+           * @methodOf angular.Module
+           * @param {Function} initializationFn Execute this function after injector creation.
+           *    Useful for application initialization.
+           * @description
+           * Use this method to register work which should be performed when the injector is done
+           * loading all modules.
+           */
+          run: function(block) {
+            runBlocks.push(block);
+            return this;
+          }
+        };
+
+        if (configFn) {
+          config(configFn);
+        }
+
+        return  moduleInstance;
+
+        /**
+         * @param {string} provider
+         * @param {string} method
+         * @param {String=} insertMethod
+         * @returns {angular.Module}
+         */
+        function invokeLater(provider, method, insertMethod) {
+          return function() {
+            invokeQueue[insertMethod || 'push']([provider, method, arguments]);
+            return moduleInstance;
+          }
+        }
+      });
+    };
+  });
+
+}
+
+/**
+ * @ngdoc property
+ * @name angular.version
+ * @description
+ * An object that contains information about the current AngularJS version. This object has the
+ * following properties:
+ *
+ * - `full` – `{string}` – Full version string, such as "0.9.18".
+ * - `major` – `{number}` – Major version number, such as "0".
+ * - `minor` – `{number}` – Minor version number, such as "9".
+ * - `dot` – `{number}` – Dot version number, such as "18".
+ * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
+ */
+var version = {
+  full: '1.0.8',    // all of these placeholder strings will be replaced by grunt's
+  major: 1,    // package task
+  minor: 0,
+  dot: 8,
+  codeName: 'bubble-burst'
+};
+
+
+function publishExternalAPI(angular){
+  extend(angular, {
+    'bootstrap': bootstrap,
+    'copy': copy,
+    'extend': extend,
+    'equals': equals,
+    'element': jqLite,
+    'forEach': forEach,
+    'injector': createInjector,
+    'noop':noop,
+    'bind':bind,
+    'toJson': toJson,
+    'fromJson': fromJson,
+    'identity':identity,
+    'isUndefined': isUndefined,
+    'isDefined': isDefined,
+    'isString': isString,
+    'isFunction': isFunction,
+    'isObject': isObject,
+    'isNumber': isNumber,
+    'isElement': isElement,
+    'isArray': isArray,
+    'version': version,
+    'isDate': isDate,
+    'lowercase': lowercase,
+    'uppercase': uppercase,
+    'callbacks': {counter: 0}
+  });
+
+  angularModule = setupModuleLoader(window);
+  try {
+    angularModule('ngLocale');
+  } catch (e) {
+    angularModule('ngLocale', []).provider('$locale', $LocaleProvider);
+  }
+
+  angularModule('ng', ['ngLocale'], ['$provide',
+    function ngModule($provide) {
+      $provide.provider('$compile', $CompileProvider).
+        directive({
+            a: htmlAnchorDirective,
+            input: inputDirective,
+            textarea: inputDirective,
+            form: formDirective,
+            script: scriptDirective,
+            select: selectDirective,
+            style: styleDirective,
+            option: optionDirective,
+            ngBind: ngBindDirective,
+            ngBindHtmlUnsafe: ngBindHtmlUnsafeDirective,
+            ngBindTemplate: ngBindTemplateDirective,
+            ngClass: ngClassDirective,
+            ngClassEven: ngClassEvenDirective,
+            ngClassOdd: ngClassOddDirective,
+            ngCsp: ngCspDirective,
+            ngCloak: ngCloakDirective,
+            ngController: ngControllerDirective,
+            ngForm: ngFormDirective,
+            ngHide: ngHideDirective,
+            ngInclude: ngIncludeDirective,
+            ngInit: ngInitDirective,
+            ngNonBindable: ngNonBindableDirective,
+            ngPluralize: ngPluralizeDirective,
+            ngRepeat: ngRepeatDirective,
+            ngShow: ngShowDirective,
+            ngStyle: ngStyleDirective,
+            ngSwitch: ngSwitchDirective,
+            ngSwitchWhen: ngSwitchWhenDirective,
+            ngSwitchDefault: ngSwitchDefaultDirective,
+            ngOptions: ngOptionsDirective,
+            ngView: ngViewDirective,
+            ngTransclude: ngTranscludeDirective,
+            ngModel: ngModelDirective,
+            ngList: ngListDirective,
+            ngChange: ngChangeDirective,
+            required: requiredDirective,
+            ngRequired: requiredDirective,
+            ngValue: ngValueDirective
+        }).
+        directive(ngAttributeAliasDirectives).
+        directive(ngEventDirectives);
+      $provide.provider({
+        $anchorScroll: $AnchorScrollProvider,
+        $browser: $BrowserProvider,
+        $cacheFactory: $CacheFactoryProvider,
+        $controller: $ControllerProvider,
+        $document: $DocumentProvider,
+        $exceptionHandler: $ExceptionHandlerProvider,
+        $filter: $FilterProvider,
+        $interpolate: $InterpolateProvider,
+        $http: $HttpProvider,
+        $httpBackend: $HttpBackendProvider,
+        $location: $LocationProvider,
+        $log: $LogProvider,
+        $parse: $ParseProvider,
+        $route: $RouteProvider,
+        $routeParams: $RouteParamsProvider,
+        $rootScope: $RootScopeProvider,
+        $q: $QProvider,
+        $sniffer: $SnifferProvider,
+        $templateCache: $TemplateCacheProvider,
+        $timeout: $TimeoutProvider,
+        $window: $WindowProvider
+      });
+    }
+  ]);
+}
+
+//////////////////////////////////
+//JQLite
+//////////////////////////////////
+
+/**
+ * @ngdoc function
+ * @name angular.element
+ * @function
+ *
+ * @description
+ * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.
+ * `angular.element` can be either an alias for [jQuery](http://api.jquery.com/jQuery/) function, if
+ * jQuery is available, or a function that wraps the element or string in Angular's jQuery lite
+ * implementation (commonly referred to as jqLite).
+ *
+ * Real jQuery always takes precedence over jqLite, provided it was loaded before `DOMContentLoaded`
+ * event fired.
+ *
+ * jqLite is a tiny, API-compatible subset of jQuery that allows
+ * Angular to manipulate the DOM. jqLite implements only the most commonly needed functionality
+ * within a very small footprint, so only a subset of the jQuery API - methods, arguments and
+ * invocation styles - are supported.
+ *
+ * Note: All element references in Angular are always wrapped with jQuery or jqLite; they are never
+ * raw DOM references.
+ *
+ * ## Angular's jqLite
+ * Angular's lite version of jQuery provides only the following jQuery methods:
+ *
+ * - [addClass()](http://api.jquery.com/addClass/)
+ * - [after()](http://api.jquery.com/after/)
+ * - [append()](http://api.jquery.com/append/)
+ * - [attr()](http://api.jquery.com/attr/)
+ * - [bind()](http://api.jquery.com/bind/) - Does not support namespaces
+ * - [children()](http://api.jquery.com/children/) - Does not support selectors
+ * - [clone()](http://api.jquery.com/clone/)
+ * - [contents()](http://api.jquery.com/contents/)
+ * - [css()](http://api.jquery.com/css/)
+ * - [data()](http://api.jquery.com/data/)
+ * - [eq()](http://api.jquery.com/eq/)
+ * - [find()](http://api.jquery.com/find/) - Limited to lookups by tag name
+ * - [hasClass()](http://api.jquery.com/hasClass/)
+ * - [html()](http://api.jquery.com/html/)
+ * - [next()](http://api.jquery.com/next/) - Does not support selectors
+ * - [parent()](http://api.jquery.com/parent/) - Does not support selectors
+ * - [prepend()](http://api.jquery.com/prepend/)
+ * - [prop()](http://api.jquery.com/prop/)
+ * - [ready()](http://api.jquery.com/ready/)
+ * - [remove()](http://api.jquery.com/remove/)
+ * - [removeAttr()](http://api.jquery.com/removeAttr/)
+ * - [removeClass()](http://api.jquery.com/removeClass/)
+ * - [removeData()](http://api.jquery.com/removeData/)
+ * - [replaceWith()](http://api.jquery.com/replaceWith/)
+ * - [text()](http://api.jquery.com/text/)
+ * - [toggleClass()](http://api.jquery.com/toggleClass/)
+ * - [triggerHandler()](http://api.jquery.com/triggerHandler/) - Doesn't pass native event objects to handlers.
+ * - [unbind()](http://api.jquery.com/unbind/) - Does not support namespaces
+ * - [val()](http://api.jquery.com/val/)
+ * - [wrap()](http://api.jquery.com/wrap/)
+ *
+ * ## jQuery/jqLite Extras
+ * Angular also provides the following additional methods and events to both jQuery and jqLite:
+ *
+ * ### Events
+ * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event
+ *    on all DOM nodes being removed.  This can be used to clean up and 3rd party bindings to the DOM
+ *    element before it is removed.
+ * ### Methods
+ * - `controller(name)` - retrieves the controller of the current element or its parent. By default
+ *   retrieves controller associated with the `ngController` directive. If `name` is provided as
+ *   camelCase directive name, then the controller for this directive will be retrieved (e.g.
+ *   `'ngModel'`).
+ * - `injector()` - retrieves the injector of the current element or its parent.
+ * - `scope()` - retrieves the {@link api/ng.$rootScope.Scope scope} of the current
+ *   element or its parent.
+ * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top
+ *   parent element is reached.
+ *
+ * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.
+ * @returns {Object} jQuery object.
+ */
+
+var jqCache = JQLite.cache = {},
+    jqName = JQLite.expando = 'ng-' + new Date().getTime(),
+    jqId = 1,
+    addEventListenerFn = (window.document.addEventListener
+      ? function(element, type, fn) {element.addEventListener(type, fn, false);}
+      : function(element, type, fn) {element.attachEvent('on' + type, fn);}),
+    removeEventListenerFn = (window.document.removeEventListener
+      ? function(element, type, fn) {element.removeEventListener(type, fn, false); }
+      : function(element, type, fn) {element.detachEvent('on' + type, fn); });
+
+function jqNextId() { return ++jqId; }
+
+
+var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g;
+var MOZ_HACK_REGEXP = /^moz([A-Z])/;
+
+/**
+ * Converts snake_case to camelCase.
+ * Also there is special case for Moz prefix starting with upper case letter.
+ * @param name Name to normalize
+ */
+function camelCase(name) {
+  return name.
+    replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {
+      return offset ? letter.toUpperCase() : letter;
+    }).
+    replace(MOZ_HACK_REGEXP, 'Moz$1');
+}
+
+/////////////////////////////////////////////
+// jQuery mutation patch
+//
+// In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a
+// $destroy event on all DOM nodes being removed.
+//
+/////////////////////////////////////////////
+
+function JQLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments) {
+  var originalJqFn = jQuery.fn[name];
+  originalJqFn = originalJqFn.$original || originalJqFn;
+  removePatch.$original = originalJqFn;
+  jQuery.fn[name] = removePatch;
+
+  function removePatch(param) {
+    var list = filterElems && param ? [this.filter(param)] : [this],
+        fireEvent = dispatchThis,
+        set, setIndex, setLength,
+        element, childIndex, childLength, children;
+
+    if (!getterIfNoArguments || param != null) {
+      while(list.length) {
+        set = list.shift();
+        for(setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) {
+          element = jqLite(set[setIndex]);
+          if (fireEvent) {
+            element.triggerHandler('$destroy');
+          } else {
+            fireEvent = !fireEvent;
+          }
+          for(childIndex = 0, childLength = (children = element.children()).length;
+              childIndex < childLength;
+              childIndex++) {
+            list.push(jQuery(children[childIndex]));
+          }
+        }
+      }
+    }
+    return originalJqFn.apply(this, arguments);
+  }
+}
+
+/////////////////////////////////////////////
+function JQLite(element) {
+  if (element instanceof JQLite) {
+    return element;
+  }
+  if (!(this instanceof JQLite)) {
+    if (isString(element) && element.charAt(0) != '<') {
+      throw Error('selectors not implemented');
+    }
+    return new JQLite(element);
+  }
+
+  if (isString(element)) {
+    var div = document.createElement('div');
+    // Read about the NoScope elements here:
+    // http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx
+    div.innerHTML = '<div>&#160;</div>' + element; // IE insanity to make NoScope elements work!
+    div.removeChild(div.firstChild); // remove the superfluous div
+    JQLiteAddNodes(this, div.childNodes);
+    this.remove(); // detach the elements from the temporary DOM div.
+  } else {
+    JQLiteAddNodes(this, element);
+  }
+}
+
+function JQLiteClone(element) {
+  return element.cloneNode(true);
+}
+
+function JQLiteDealoc(element){
+  JQLiteRemoveData(element);
+  for ( var i = 0, children = element.childNodes || []; i < children.length; i++) {
+    JQLiteDealoc(children[i]);
+  }
+}
+
+function JQLiteUnbind(element, type, fn) {
+  var events = JQLiteExpandoStore(element, 'events'),
+      handle = JQLiteExpandoStore(element, 'handle');
+
+  if (!handle) return; //no listeners registered
+
+  if (isUndefined(type)) {
+    forEach(events, function(eventHandler, type) {
+      removeEventListenerFn(element, type, eventHandler);
+      delete events[type];
+    });
+  } else {
+    if (isUndefined(fn)) {
+      removeEventListenerFn(element, type, events[type]);
+      delete events[type];
+    } else {
+      arrayRemove(events[type] || [], fn);
+    }
+  }
+}
+
+function JQLiteRemoveData(element) {
+  var expandoId = element[jqName],
+      expandoStore = jqCache[expandoId];
+
+  if (expandoStore) {
+    if (expandoStore.handle) {
+      expandoStore.events.$destroy && expandoStore.handle({}, '$destroy');
+      JQLiteUnbind(element);
+    }
+    delete jqCache[expandoId];
+    element[jqName] = undefined; // ie does not allow deletion of attributes on elements.
+  }
+}
+
+function JQLiteExpandoStore(element, key, value) {
+  var expandoId = element[jqName],
+      expandoStore = jqCache[expandoId || -1];
+
+  if (isDefined(value)) {
+    if (!expandoStore) {
+      element[jqName] = expandoId = jqNextId();
+      expandoStore = jqCache[expandoId] = {};
+    }
+    expandoStore[key] = value;
+  } else {
+    return expandoStore && expandoStore[key];
+  }
+}
+
+function JQLiteData(element, key, value) {
+  var data = JQLiteExpandoStore(element, 'data'),
+      isSetter = isDefined(value),
+      keyDefined = !isSetter && isDefined(key),
+      isSimpleGetter = keyDefined && !isObject(key);
+
+  if (!data && !isSimpleGetter) {
+    JQLiteExpandoStore(element, 'data', data = {});
+  }
+
+  if (isSetter) {
+    data[key] = value;
+  } else {
+    if (keyDefined) {
+      if (isSimpleGetter) {
+        // don't create data in this case.
+        return data && data[key];
+      } else {
+        extend(data, key);
+      }
+    } else {
+      return data;
+    }
+  }
+}
+
+function JQLiteHasClass(element, selector) {
+  return ((" " + element.className + " ").replace(/[\n\t]/g, " ").
+      indexOf( " " + selector + " " ) > -1);
+}
+
+function JQLiteRemoveClass(element, cssClasses) {
+  if (cssClasses) {
+    forEach(cssClasses.split(' '), function(cssClass) {
+      element.className = trim(
+          (" " + element.className + " ")
+          .replace(/[\n\t]/g, " ")
+          .replace(" " + trim(cssClass) + " ", " ")
+      );
+    });
+  }
+}
+
+function JQLiteAddClass(element, cssClasses) {
+  if (cssClasses) {
+    forEach(cssClasses.split(' '), function(cssClass) {
+      if (!JQLiteHasClass(element, cssClass)) {
+        element.className = trim(element.className + ' ' + trim(cssClass));
+      }
+    });
+  }
+}
+
+function JQLiteAddNodes(root, elements) {
+  if (elements) {
+    elements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements))
+      ? elements
+      : [ elements ];
+    for(var i=0; i < elements.length; i++) {
+      root.push(elements[i]);
+    }
+  }
+}
+
+function JQLiteController(element, name) {
+  return JQLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller');
+}
+
+function JQLiteInheritedData(element, name, value) {
+  element = jqLite(element);
+
+  // if element is the document object work with the html element instead
+  // this makes $(document).scope() possible
+  if(element[0].nodeType == 9) {
+    element = element.find('html');
+  }
+
+  while (element.length) {
+    if (value = element.data(name)) return value;
+    element = element.parent();
+  }
+}
+
+//////////////////////////////////////////
+// Functions which are declared directly.
+//////////////////////////////////////////
+var JQLitePrototype = JQLite.prototype = {
+  ready: function(fn) {
+    var fired = false;
+
+    function trigger() {
+      if (fired) return;
+      fired = true;
+      fn();
+    }
+
+    this.bind('DOMContentLoaded', trigger); // works for modern browsers and IE9
+    // we can not use jqLite since we are not done loading and jQuery could be loaded later.
+    JQLite(window).bind('load', trigger); // fallback to window.onload for others
+  },
+  toString: function() {
+    var value = [];
+    forEach(this, function(e){ value.push('' + e);});
+    return '[' + value.join(', ') + ']';
+  },
+
+  eq: function(index) {
+      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);
+  },
+
+  length: 0,
+  push: push,
+  sort: [].sort,
+  splice: [].splice
+};
+
+//////////////////////////////////////////
+// Functions iterating getter/setters.
+// these functions return self on setter and
+// value on get.
+//////////////////////////////////////////
+var BOOLEAN_ATTR = {};
+forEach('multiple,selected,checked,disabled,readOnly,required'.split(','), function(value) {
+  BOOLEAN_ATTR[lowercase(value)] = value;
+});
+var BOOLEAN_ELEMENTS = {};
+forEach('input,select,option,textarea,button,form'.split(','), function(value) {
+  BOOLEAN_ELEMENTS[uppercase(value)] = true;
+});
+
+function getBooleanAttrName(element, name) {
+  // check dom last since we will most likely fail on name
+  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];
+
+  // booleanAttr is here twice to minimize DOM access
+  return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;
+}
+
+forEach({
+  data: JQLiteData,
+  inheritedData: JQLiteInheritedData,
+
+  scope: function(element) {
+    return JQLiteInheritedData(element, '$scope');
+  },
+
+  controller: JQLiteController ,
+
+  injector: function(element) {
+    return JQLiteInheritedData(element, '$injector');
+  },
+
+  removeAttr: function(element,name) {
+    element.removeAttribute(name);
+  },
+
+  hasClass: JQLiteHasClass,
+
+  css: function(element, name, value) {
+    name = camelCase(name);
+
+    if (isDefined(value)) {
+      element.style[name] = value;
+    } else {
+      var val;
+
+      if (msie <= 8) {
+        // this is some IE specific weirdness that jQuery 1.6.4 does not sure why
+        val = element.currentStyle && element.currentStyle[name];
+        if (val === '') val = 'auto';
+      }
+
+      val = val || element.style[name];
+
+      if (msie <= 8) {
+        // jquery weirdness :-/
+        val = (val === '') ? undefined : val;
+      }
+
+      return  val;
+    }
+  },
+
+  attr: function(element, name, value){
+    var lowercasedName = lowercase(name);
+    if (BOOLEAN_ATTR[lowercasedName]) {
+      if (isDefined(value)) {
+        if (!!value) {
+          element[name] = true;
+          element.setAttribute(name, lowercasedName);
+        } else {
+          element[name] = false;
+          element.removeAttribute(lowercasedName);
+        }
+      } else {
+        return (element[name] ||
+                 (element.attributes.getNamedItem(name)|| noop).specified)
+               ? lowercasedName
+               : undefined;
+      }
+    } else if (isDefined(value)) {
+      element.setAttribute(name, value);
+    } else if (element.getAttribute) {
+      // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code
+      // some elements (e.g. Document) don't have get attribute, so return undefined
+      var ret = element.getAttribute(name, 2);
+      // normalize non-existing attributes to undefined (as jQuery)
+      return ret === null ? undefined : ret;
+    }
+  },
+
+  prop: function(element, name, value) {
+    if (isDefined(value)) {
+      element[name] = value;
+    } else {
+      return element[name];
+    }
+  },
+
+  text: extend((msie < 9)
+      ? function(element, value) {
+        if (element.nodeType == 1 /** Element */) {
+          if (isUndefined(value))
+            return element.innerText;
+          element.innerText = value;
+        } else {
+          if (isUndefined(value))
+            return element.nodeValue;
+          element.nodeValue = value;
+        }
+      }
+      : function(element, value) {
+        if (isUndefined(value)) {
+          return element.textContent;
+        }
+        element.textContent = value;
+      }, {$dv:''}),
+
+  val: function(element, value) {
+    if (isUndefined(value)) {
+      if (nodeName_(element) === 'SELECT' && element.multiple) {
+        var result = [];
+        forEach(element.options, function (option) {
+          if (option.selected) {
+            result.push(option.value || option.text);
+          }
+        });
+        return result.length === 0 ? null : result;
+      }
+      return element.value;
+    }
+    element.value = value;
+  },
+
+  html: function(element, value) {
+    if (isUndefined(value)) {
+      return element.innerHTML;
+    }
+    for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {
+      JQLiteDealoc(childNodes[i]);
+    }
+    element.innerHTML = value;
+  }
+}, function(fn, name){
+  /**
+   * Properties: writes return selection, reads return first value
+   */
+  JQLite.prototype[name] = function(arg1, arg2) {
+    var i, key;
+
+    // JQLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it
+    // in a way that survives minification.
+    if (((fn.length == 2 && (fn !== JQLiteHasClass && fn !== JQLiteController)) ? arg1 : arg2) === undefined) {
+      if (isObject(arg1)) {
+
+        // we are a write, but the object properties are the key/values
+        for(i=0; i < this.length; i++) {
+          if (fn === JQLiteData) {
+            // data() takes the whole object in jQuery
+            fn(this[i], arg1);
+          } else {
+            for (key in arg1) {
+              fn(this[i], key, arg1[key]);
+            }
+          }
+        }
+        // return self for chaining
+        return this;
+      } else {
+        // we are a read, so read the first child.
+        if (this.length)
+          return fn(this[0], arg1, arg2);
+      }
+    } else {
+      // we are a write, so apply to all children
+      for(i=0; i < this.length; i++) {
+        fn(this[i], arg1, arg2);
+      }
+      // return self for chaining
+      return this;
+    }
+    return fn.$dv;
+  };
+});
+
+function createEventHandler(element, events) {
+  var eventHandler = function (event, type) {
+    if (!event.preventDefault) {
+      event.preventDefault = function() {
+        event.returnValue = false; //ie
+      };
+    }
+
+    if (!event.stopPropagation) {
+      event.stopPropagation = function() {
+        event.cancelBubble = true; //ie
+      };
+    }
+
+    if (!event.target) {
+      event.target = event.srcElement || document;
+    }
+
+    if (isUndefined(event.defaultPrevented)) {
+      var prevent = event.preventDefault;
+      event.preventDefault = function() {
+        event.defaultPrevented = true;
+        prevent.call(event);
+      };
+      event.defaultPrevented = false;
+    }
+
+    event.isDefaultPrevented = function() {
+      return event.defaultPrevented;
+    };
+
+    forEach(events[type || event.type], function(fn) {
+      fn.call(element, event);
+    });
+
+    // Remove monkey-patched methods (IE),
+    // as they would cause memory leaks in IE8.
+    if (msie <= 8) {
+      // IE7/8 does not allow to delete property on native object
+      event.preventDefault = null;
+      event.stopPropagation = null;
+      event.isDefaultPrevented = null;
+    } else {
+      // It shouldn't affect normal browsers (native methods are defined on prototype).
+      delete event.preventDefault;
+      delete event.stopPropagation;
+      delete event.isDefaultPrevented;
+    }
+  };
+  eventHandler.elem = element;
+  return eventHandler;
+}
+
+//////////////////////////////////////////
+// Functions iterating traversal.
+// These functions chain results into a single
+// selector.
+//////////////////////////////////////////
+forEach({
+  removeData: JQLiteRemoveData,
+
+  dealoc: JQLiteDealoc,
+
+  bind: function bindFn(element, type, fn){
+    var events = JQLiteExpandoStore(element, 'events'),
+        handle = JQLiteExpandoStore(element, 'handle');
+
+    if (!events) JQLiteExpandoStore(element, 'events', events = {});
+    if (!handle) JQLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events));
+
+    forEach(type.split(' '), function(type){
+      var eventFns = events[type];
+
+      if (!eventFns) {
+        if (type == 'mouseenter' || type == 'mouseleave') {
+          var contains = document.body.contains || document.body.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;
+            };	
+
+          events[type] = [];
+		
+		  // Refer to jQuery's implementation of mouseenter & mouseleave
+          // Read about mouseenter and mouseleave:
+          // http://www.quirksmode.org/js/events_mouse.html#link8
+          var eventmap = { mouseleave : "mouseout", mouseenter : "mouseover"}          
+          bindFn(element, eventmap[type], function(event) {
+            var ret, target = this, related = event.relatedTarget;
+            // 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 && !contains(target, related)) ){
+              handle(event, type);
+            }	
+
+          });
+
+        } else {
+          addEventListenerFn(element, type, handle);
+          events[type] = [];
+        }
+        eventFns = events[type]
+      }
+      eventFns.push(fn);
+    });
+  },
+
+  unbind: JQLiteUnbind,
+
+  replaceWith: function(element, replaceNode) {
+    var index, parent = element.parentNode;
+    JQLiteDealoc(element);
+    forEach(new JQLite(replaceNode), function(node){
+      if (index) {
+        parent.insertBefore(node, index.nextSibling);
+      } else {
+        parent.replaceChild(node, element);
+      }
+      index = node;
+    });
+  },
+
+  children: function(element) {
+    var children = [];
+    forEach(element.childNodes, function(element){
+      if (element.nodeType === 1)
+        children.push(element);
+    });
+    return children;
+  },
+
+  contents: function(element) {
+    return element.childNodes || [];
+  },
+
+  append: function(element, node) {
+    forEach(new JQLite(node), function(child){
+      if (element.nodeType === 1)
+        element.appendChild(child);
+    });
+  },
+
+  prepend: function(element, node) {
+    if (element.nodeType === 1) {
+      var index = element.firstChild;
+      forEach(new JQLite(node), function(child){
+        element.insertBefore(child, index);
+      });
+    }
+  },
+
+  wrap: function(element, wrapNode) {
+    wrapNode = jqLite(wrapNode)[0];
+    var parent = element.parentNode;
+    if (parent) {
+      parent.replaceChild(wrapNode, element);
+    }
+    wrapNode.appendChild(element);
+  },
+
+  remove: function(element) {
+    JQLiteDealoc(element);
+    var parent = element.parentNode;
+    if (parent) parent.removeChild(element);
+  },
+
+  after: function(element, newElement) {
+    var index = element, parent = element.parentNode;
+    forEach(new JQLite(newElement), function(node){
+      parent.insertBefore(node, index.nextSibling);
+      index = node;
+    });
+  },
+
+  addClass: JQLiteAddClass,
+  removeClass: JQLiteRemoveClass,
+
+  toggleClass: function(element, selector, condition) {
+    if (isUndefined(condition)) {
+      condition = !JQLiteHasClass(element, selector);
+    }
+    (condition ? JQLiteAddClass : JQLiteRemoveClass)(element, selector);
+  },
+
+  parent: function(element) {
+    var parent = element.parentNode;
+    return parent && parent.nodeType !== 11 ? parent : null;
+  },
+
+  next: function(element) {
+    if (element.nextElementSibling) {
+      return element.nextElementSibling;
+    }
+
+    // IE8 doesn't have nextElementSibling
+    var elm = element.nextSibling;
+    while (elm != null && elm.nodeType !== 1) {
+      elm = elm.nextSibling;
+    }
+    return elm;
+  },
+
+  find: function(element, selector) {
+    return element.getElementsByTagName(selector);
+  },
+
+  clone: JQLiteClone,
+
+  triggerHandler: function(element, eventName) {
+    var eventFns = (JQLiteExpandoStore(element, 'events') || {})[eventName];
+
+    forEach(eventFns, function(fn) {
+      fn.call(element, null);
+    });
+  }
+}, function(fn, name){
+  /**
+   * chaining functions
+   */
+  JQLite.prototype[name] = function(arg1, arg2) {
+    var value;
+    for(var i=0; i < this.length; i++) {
+      if (value == undefined) {
+        value = fn(this[i], arg1, arg2);
+        if (value !== undefined) {
+          // any function which returns a value needs to be wrapped
+          value = jqLite(value);
+        }
+      } else {
+        JQLiteAddNodes(value, fn(this[i], arg1, arg2));
+      }
+    }
+    return value == undefined ? this : value;
+  };
+});
+
+/**
+ * Computes a hash of an 'obj'.
+ * Hash of a:
+ *  string is string
+ *  number is number as string
+ *  object is either result of calling $$hashKey function on the object or uniquely generated id,
+ *         that is also assigned to the $$hashKey property of the object.
+ *
+ * @param obj
+ * @returns {string} hash string such that the same input will have the same hash string.
+ *         The resulting string key is in 'type:hashKey' format.
+ */
+function hashKey(obj) {
+  var objType = typeof obj,
+      key;
+
+  if (objType == 'object' && obj !== null) {
+    if (typeof (key = obj.$$hashKey) == 'function') {
+      // must invoke on object to keep the right this
+      key = obj.$$hashKey();
+    } else if (key === undefined) {
+      key = obj.$$hashKey = nextUid();
+    }
+  } else {
+    key = obj;
+  }
+
+  return objType + ':' + key;
+}
+
+/**
+ * HashMap which can use objects as keys
+ */
+function HashMap(array){
+  forEach(array, this.put, this);
+}
+HashMap.prototype = {
+  /**
+   * Store key value pair
+   * @param key key to store can be any type
+   * @param value value to store can be any type
+   */
+  put: function(key, value) {
+    this[hashKey(key)] = value;
+  },
+
+  /**
+   * @param key
+   * @returns the value for the key
+   */
+  get: function(key) {
+    return this[hashKey(key)];
+  },
+
+  /**
+   * Remove the key/value pair
+   * @param key
+   */
+  remove: function(key) {
+    var value = this[key = hashKey(key)];
+    delete this[key];
+    return value;
+  }
+};
+
+/**
+ * A map where multiple values can be added to the same key such that they form a queue.
+ * @returns {HashQueueMap}
+ */
+function HashQueueMap() {}
+HashQueueMap.prototype = {
+  /**
+   * Same as array push, but using an array as the value for the hash
+   */
+  push: function(key, value) {
+    var array = this[key = hashKey(key)];
+    if (!array) {
+      this[key] = [value];
+    } else {
+      array.push(value);
+    }
+  },
+
+  /**
+   * Same as array shift, but using an array as the value for the hash
+   */
+  shift: function(key) {
+    var array = this[key = hashKey(key)];
+    if (array) {
+      if (array.length == 1) {
+        delete this[key];
+        return array[0];
+      } else {
+        return array.shift();
+      }
+    }
+  },
+
+  /**
+   * return the first item without deleting it
+   */
+  peek: function(key) {
+    var array = this[hashKey(key)];
+    if (array) {
+    return array[0];
+    }
+  }
+};
+
+/**
+ * @ngdoc function
+ * @name angular.injector
+ * @function
+ *
+ * @description
+ * Creates an injector function that can be used for retrieving services as well as for
+ * dependency injection (see {@link guide/di dependency injection}).
+ *
+
+ * @param {Array.<string|Function>} modules A list of module functions or their aliases. See
+ *        {@link angular.module}. The `ng` module must be explicitly added.
+ * @returns {function()} Injector function. See {@link AUTO.$injector $injector}.
+ *
+ * @example
+ * Typical usage
+ * <pre>
+ *   // create an injector
+ *   var $injector = angular.injector(['ng']);
+ *
+ *   // use the injector to kick off your application
+ *   // use the type inference to auto inject arguments, or use implicit injection
+ *   $injector.invoke(function($rootScope, $compile, $document){
+ *     $compile($document)($rootScope);
+ *     $rootScope.$digest();
+ *   });
+ * </pre>
+ */
+
+
+/**
+ * @ngdoc overview
+ * @name AUTO
+ * @description
+ *
+ * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}.
+ */
+
+var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
+var FN_ARG_SPLIT = /,/;
+var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
+var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
+function annotate(fn) {
+  var $inject,
+      fnText,
+      argDecl,
+      last;
+
+  if (typeof fn == 'function') {
+    if (!($inject = fn.$inject)) {
+      $inject = [];
+      fnText = fn.toString().replace(STRIP_COMMENTS, '');
+      argDecl = fnText.match(FN_ARGS);
+      forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
+        arg.replace(FN_ARG, function(all, underscore, name){
+          $inject.push(name);
+        });
+      });
+      fn.$inject = $inject;
+    }
+  } else if (isArray(fn)) {
+    last = fn.length - 1;
+    assertArgFn(fn[last], 'fn');
+    $inject = fn.slice(0, last);
+  } else {
+    assertArgFn(fn, 'fn', true);
+  }
+  return $inject;
+}
+
+///////////////////////////////////////
+
+/**
+ * @ngdoc object
+ * @name AUTO.$injector
+ * @function
+ *
+ * @description
+ *
+ * `$injector` is used to retrieve object instances as defined by
+ * {@link AUTO.$provide provider}, instantiate types, invoke methods,
+ * and load modules.
+ *
+ * The following always holds true:
+ *
+ * <pre>
+ *   var $injector = angular.injector();
+ *   expect($injector.get('$injector')).toBe($injector);
+ *   expect($injector.invoke(function($injector){
+ *     return $injector;
+ *   }).toBe($injector);
+ * </pre>
+ *
+ * # Injection Function Annotation
+ *
+ * JavaScript does not have annotations, and annotations are needed for dependency injection. The
+ * following are all valid ways of annotating function with injection arguments and are equivalent.
+ *
+ * <pre>
+ *   // inferred (only works if code not minified/obfuscated)
+ *   $injector.invoke(function(serviceA){});
+ *
+ *   // annotated
+ *   function explicit(serviceA) {};
+ *   explicit.$inject = ['serviceA'];
+ *   $injector.invoke(explicit);
+ *
+ *   // inline
+ *   $injector.invoke(['serviceA', function(serviceA){}]);
+ * </pre>
+ *
+ * ## Inference
+ *
+ * In JavaScript calling `toString()` on a function returns the function definition. The definition can then be
+ * parsed and the function arguments can be extracted. *NOTE:* This does not work with minification, and obfuscation
+ * tools since these tools change the argument names.
+ *
+ * ## `$inject` Annotation
+ * By adding a `$inject` property onto a function the injection parameters can be specified.
+ *
+ * ## Inline
+ * As an array of injection names, where the last item in the array is the function to call.
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$injector#get
+ * @methodOf AUTO.$injector
+ *
+ * @description
+ * Return an instance of the service.
+ *
+ * @param {string} name The name of the instance to retrieve.
+ * @return {*} The instance.
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$injector#invoke
+ * @methodOf AUTO.$injector
+ *
+ * @description
+ * Invoke the method and supply the method arguments from the `$injector`.
+ *
+ * @param {!function} fn The function to invoke. The function arguments come form the function annotation.
+ * @param {Object=} self The `this` for the invoked method.
+ * @param {Object=} locals Optional object. If preset then any argument names are read from this object first, before
+ *   the `$injector` is consulted.
+ * @returns {*} the value returned by the invoked `fn` function.
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$injector#instantiate
+ * @methodOf AUTO.$injector
+ * @description
+ * Create a new instance of JS type. The method takes a constructor function invokes the new operator and supplies
+ * all of the arguments to the constructor function as specified by the constructor annotation.
+ *
+ * @param {function} Type Annotated constructor function.
+ * @param {Object=} locals Optional object. If preset then any argument names are read from this object first, before
+ *   the `$injector` is consulted.
+ * @returns {Object} new instance of `Type`.
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$injector#annotate
+ * @methodOf AUTO.$injector
+ *
+ * @description
+ * Returns an array of service names which the function is requesting for injection. This API is used by the injector
+ * to determine which services need to be injected into the function when the function is invoked. There are three
+ * ways in which the function can be annotated with the needed dependencies.
+ *
+ * # Argument names
+ *
+ * The simplest form is to extract the dependencies from the arguments of the function. This is done by converting
+ * the function into a string using `toString()` method and extracting the argument names.
+ * <pre>
+ *   // Given
+ *   function MyController($scope, $route) {
+ *     // ...
+ *   }
+ *
+ *   // Then
+ *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
+ * </pre>
+ *
+ * This method does not work with code minfication / obfuscation. For this reason the following annotation strategies
+ * are supported.
+ *
+ * # The `$inject` property
+ *
+ * If a function has an `$inject` property and its value is an array of strings, then the strings represent names of
+ * services to be injected into the function.
+ * <pre>
+ *   // Given
+ *   var MyController = function(obfuscatedScope, obfuscatedRoute) {
+ *     // ...
+ *   }
+ *   // Define function dependencies
+ *   MyController.$inject = ['$scope', '$route'];
+ *
+ *   // Then
+ *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
+ * </pre>
+ *
+ * # The array notation
+ *
+ * It is often desirable to inline Injected functions and that's when setting the `$inject` property is very
+ * inconvenient. In these situations using the array notation to specify the dependencies in a way that survives
+ * minification is a better choice:
+ *
+ * <pre>
+ *   // We wish to write this (not minification / obfuscation safe)
+ *   injector.invoke(function($compile, $rootScope) {
+ *     // ...
+ *   });
+ *
+ *   // We are forced to write break inlining
+ *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {
+ *     // ...
+ *   };
+ *   tmpFn.$inject = ['$compile', '$rootScope'];
+ *   injector.invoke(tmpFn);
+ *
+ *   // To better support inline function the inline annotation is supported
+ *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {
+ *     // ...
+ *   }]);
+ *
+ *   // Therefore
+ *   expect(injector.annotate(
+ *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])
+ *    ).toEqual(['$compile', '$rootScope']);
+ * </pre>
+ *
+ * @param {function|Array.<string|Function>} fn Function for which dependent service names need to be retrieved as described
+ *   above.
+ *
+ * @returns {Array.<string>} The names of the services which the function requires.
+ */
+
+
+
+
+/**
+ * @ngdoc object
+ * @name AUTO.$provide
+ *
+ * @description
+ *
+ * Use `$provide` to register new providers with the `$injector`. The providers are the factories for the instance.
+ * The providers share the same name as the instance they create with `Provider` suffixed to them.
+ *
+ * A provider is an object with a `$get()` method. The injector calls the `$get` method to create a new instance of
+ * a service. The Provider can have additional methods which would allow for configuration of the provider.
+ *
+ * <pre>
+ *   function GreetProvider() {
+ *     var salutation = 'Hello';
+ *
+ *     this.salutation = function(text) {
+ *       salutation = text;
+ *     };
+ *
+ *     this.$get = function() {
+ *       return function (name) {
+ *         return salutation + ' ' + name + '!';
+ *       };
+ *     };
+ *   }
+ *
+ *   describe('Greeter', function(){
+ *
+ *     beforeEach(module(function($provide) {
+ *       $provide.provider('greet', GreetProvider);
+ *     }));
+ *
+ *     it('should greet', inject(function(greet) {
+ *       expect(greet('angular')).toEqual('Hello angular!');
+ *     }));
+ *
+ *     it('should allow configuration of salutation', function() {
+ *       module(function(greetProvider) {
+ *         greetProvider.salutation('Ahoj');
+ *       });
+ *       inject(function(greet) {
+ *         expect(greet('angular')).toEqual('Ahoj angular!');
+ *       });
+ *     });
+ * </pre>
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#provider
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * Register a provider for a service. The providers can be retrieved and can have additional configuration methods.
+ *
+ * @param {string} name The name of the instance. NOTE: the provider will be available under `name + 'Provider'` key.
+ * @param {(Object|function())} provider If the provider is:
+ *
+ *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using
+ *               {@link AUTO.$injector#invoke $injector.invoke()} when an instance needs to be created.
+ *   - `Constructor`: a new instance of the provider will be created using
+ *               {@link AUTO.$injector#instantiate $injector.instantiate()}, then treated as `object`.
+ *
+ * @returns {Object} registered provider instance
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#factory
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * A short hand for configuring services if only `$get` method is required.
+ *
+ * @param {string} name The name of the instance.
+ * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand for
+ * `$provide.provider(name, {$get: $getFn})`.
+ * @returns {Object} registered provider instance
+ */
+
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#service
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * A short hand for registering service of given class.
+ *
+ * @param {string} name The name of the instance.
+ * @param {Function} constructor A class (constructor function) that will be instantiated.
+ * @returns {Object} registered provider instance
+ */
+
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#value
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * A short hand for configuring services if the `$get` method is a constant.
+ *
+ * @param {string} name The name of the instance.
+ * @param {*} value The value.
+ * @returns {Object} registered provider instance
+ */
+
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#constant
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * A constant value, but unlike {@link AUTO.$provide#value value} it can be injected
+ * into configuration function (other modules) and it is not interceptable by
+ * {@link AUTO.$provide#decorator decorator}.
+ *
+ * @param {string} name The name of the constant.
+ * @param {*} value The constant value.
+ * @returns {Object} registered instance
+ */
+
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#decorator
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * Decoration of service, allows the decorator to intercept the service instance creation. The
+ * returned instance may be the original instance, or a new instance which delegates to the
+ * original instance.
+ *
+ * @param {string} name The name of the service to decorate.
+ * @param {function()} decorator This function will be invoked when the service needs to be
+ *    instantiated. The function is called using the {@link AUTO.$injector#invoke
+ *    injector.invoke} method and is therefore fully injectable. Local injection arguments:
+ *
+ *    * `$delegate` - The original service instance, which can be monkey patched, configured,
+ *      decorated or delegated to.
+ */
+
+
+function createInjector(modulesToLoad) {
+  var INSTANTIATING = {},
+      providerSuffix = 'Provider',
+      path = [],
+      loadedModules = new HashMap(),
+      providerCache = {
+        $provide: {
+            provider: supportObject(provider),
+            factory: supportObject(factory),
+            service: supportObject(service),
+            value: supportObject(value),
+            constant: supportObject(constant),
+            decorator: decorator
+          }
+      },
+      providerInjector = createInternalInjector(providerCache, function() {
+        throw Error("Unknown provider: " + path.join(' <- '));
+      }),
+      instanceCache = {},
+      instanceInjector = (instanceCache.$injector =
+          createInternalInjector(instanceCache, function(servicename) {
+            var provider = providerInjector.get(servicename + providerSuffix);
+            return instanceInjector.invoke(provider.$get, provider);
+          }));
+
+
+  forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });
+
+  return instanceInjector;
+
+  ////////////////////////////////////
+  // $provider
+  ////////////////////////////////////
+
+  function supportObject(delegate) {
+    return function(key, value) {
+      if (isObject(key)) {
+        forEach(key, reverseParams(delegate));
+      } else {
+        return delegate(key, value);
+      }
+    }
+  }
+
+  function provider(name, provider_) {
+    if (isFunction(provider_) || isArray(provider_)) {
+      provider_ = providerInjector.instantiate(provider_);
+    }
+    if (!provider_.$get) {
+      throw Error('Provider ' + name + ' must define $get factory method.');
+    }
+    return providerCache[name + providerSuffix] = provider_;
+  }
+
+  function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }
+
+  function service(name, constructor) {
+    return factory(name, ['$injector', function($injector) {
+      return $injector.instantiate(constructor);
+    }]);
+  }
+
+  function value(name, value) { return factory(name, valueFn(value)); }
+
+  function constant(name, value) {
+    providerCache[name] = value;
+    instanceCache[name] = value;
+  }
+
+  function decorator(serviceName, decorFn) {
+    var origProvider = providerInjector.get(serviceName + providerSuffix),
+        orig$get = origProvider.$get;
+
+    origProvider.$get = function() {
+      var origInstance = instanceInjector.invoke(orig$get, origProvider);
+      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});
+    };
+  }
+
+  ////////////////////////////////////
+  // Module Loading
+  ////////////////////////////////////
+  function loadModules(modulesToLoad){
+    var runBlocks = [];
+    forEach(modulesToLoad, function(module) {
+      if (loadedModules.get(module)) return;
+      loadedModules.put(module, true);
+      if (isString(module)) {
+        var moduleFn = angularModule(module);
+        runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);
+
+        try {
+          for(var invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) {
+            var invokeArgs = invokeQueue[i],
+                provider = invokeArgs[0] == '$injector'
+                    ? providerInjector
+                    : providerInjector.get(invokeArgs[0]);
+
+            provider[invokeArgs[1]].apply(provider, invokeArgs[2]);
+          }
+        } catch (e) {
+          if (e.message) e.message += ' from ' + module;
+          throw e;
+        }
+      } else if (isFunction(module)) {
+        try {
+          runBlocks.push(providerInjector.invoke(module));
+        } catch (e) {
+          if (e.message) e.message += ' from ' + module;
+          throw e;
+        }
+      } else if (isArray(module)) {
+        try {
+          runBlocks.push(providerInjector.invoke(module));
+        } catch (e) {
+          if (e.message) e.message += ' from ' + String(module[module.length - 1]);
+          throw e;
+        }
+      } else {
+        assertArgFn(module, 'module');
+      }
+    });
+    return runBlocks;
+  }
+
+  ////////////////////////////////////
+  // internal Injector
+  ////////////////////////////////////
+
+  function createInternalInjector(cache, factory) {
+
+    function getService(serviceName) {
+      if (typeof serviceName !== 'string') {
+        throw Error('Service name expected');
+      }
+      if (cache.hasOwnProperty(serviceName)) {
+        if (cache[serviceName] === INSTANTIATING) {
+          throw Error('Circular dependency: ' + path.join(' <- '));
+        }
+        return cache[serviceName];
+      } else {
+        try {
+          path.unshift(serviceName);
+          cache[serviceName] = INSTANTIATING;
+          return cache[serviceName] = factory(serviceName);
+        } finally {
+          path.shift();
+        }
+      }
+    }
+
+    function invoke(fn, self, locals){
+      var args = [],
+          $inject = annotate(fn),
+          length, i,
+          key;
+
+      for(i = 0, length = $inject.length; i < length; i++) {
+        key = $inject[i];
+        args.push(
+          locals && locals.hasOwnProperty(key)
+          ? locals[key]
+          : getService(key)
+        );
+      }
+      if (!fn.$inject) {
+        // this means that we must be an array.
+        fn = fn[length];
+      }
+
+
+      // Performance optimization: http://jsperf.com/apply-vs-call-vs-invoke
+      switch (self ? -1 : args.length) {
+        case  0: return fn();
+        case  1: return fn(args[0]);
+        case  2: return fn(args[0], args[1]);
+        case  3: return fn(args[0], args[1], args[2]);
+        case  4: return fn(args[0], args[1], args[2], args[3]);
+        case  5: return fn(args[0], args[1], args[2], args[3], args[4]);
+        case  6: return fn(args[0], args[1], args[2], args[3], args[4], args[5]);
+        case  7: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+        case  8: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
+        case  9: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);
+        case 10: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);
+        default: return fn.apply(self, args);
+      }
+    }
+
+    function instantiate(Type, locals) {
+      var Constructor = function() {},
+          instance, returnedValue;
+
+      // Check if Type is annotated and use just the given function at n-1 as parameter
+      // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);
+      Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;
+      instance = new Constructor();
+      returnedValue = invoke(Type, instance, locals);
+
+      return isObject(returnedValue) ? returnedValue : instance;
+    }
+
+    return {
+      invoke: invoke,
+      instantiate: instantiate,
+      get: getService,
+      annotate: annotate
+    };
+  }
+}
+
+/**
+ * @ngdoc function
+ * @name ng.$anchorScroll
+ * @requires $window
+ * @requires $location
+ * @requires $rootScope
+ *
+ * @description
+ * When called, it checks current value of `$location.hash()` and scroll to related element,
+ * according to rules specified in
+ * {@link http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document Html5 spec}.
+ *
+ * It also watches the `$location.hash()` and scroll whenever it changes to match any anchor.
+ * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`.
+ */
+function $AnchorScrollProvider() {
+
+  var autoScrollingEnabled = true;
+
+  this.disableAutoScrolling = function() {
+    autoScrollingEnabled = false;
+  };
+
+  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {
+    var document = $window.document;
+
+    // helper function to get first anchor from a NodeList
+    // can't use filter.filter, as it accepts only instances of Array
+    // and IE can't convert NodeList to an array using [].slice
+    // TODO(vojta): use filter if we change it to accept lists as well
+    function getFirstAnchor(list) {
+      var result = null;
+      forEach(list, function(element) {
+        if (!result && lowercase(element.nodeName) === 'a') result = element;
+      });
+      return result;
+    }
+
+    function scroll() {
+      var hash = $location.hash(), elm;
+
+      // empty hash, scroll to the top of the page
+      if (!hash) $window.scrollTo(0, 0);
+
+      // element with given id
+      else if ((elm = document.getElementById(hash))) elm.scrollIntoView();
+
+      // first anchor with given name :-D
+      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView();
+
+      // no element and hash == 'top', scroll to the top of the page
+      else if (hash === 'top') $window.scrollTo(0, 0);
+    }
+
+    // does not scroll when user clicks on anchor link that is currently on
+    // (no url change, no $location.hash() change), browser native does scroll
+    if (autoScrollingEnabled) {
+      $rootScope.$watch(function autoScrollWatch() {return $location.hash();},
+        function autoScrollWatchAction() {
+          $rootScope.$evalAsync(scroll);
+        });
+    }
+
+    return scroll;
+  }];
+}
+
+/**
+ * ! This is a private undocumented service !
+ *
+ * @name ng.$browser
+ * @requires $log
+ * @description
+ * This object has two goals:
+ *
+ * - hide all the global state in the browser caused by the window object
+ * - abstract away all the browser specific features and inconsistencies
+ *
+ * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`
+ * service, which can be used for convenient testing of the application without the interaction with
+ * the real browser apis.
+ */
+/**
+ * @param {object} window The global window object.
+ * @param {object} document jQuery wrapped document.
+ * @param {function()} XHR XMLHttpRequest constructor.
+ * @param {object} $log console.log or an object with the same interface.
+ * @param {object} $sniffer $sniffer service
+ */
+function Browser(window, document, $log, $sniffer) {
+  var self = this,
+      rawDocument = document[0],
+      location = window.location,
+      history = window.history,
+      setTimeout = window.setTimeout,
+      clearTimeout = window.clearTimeout,
+      pendingDeferIds = {};
+
+  self.isMock = false;
+
+  var outstandingRequestCount = 0;
+  var outstandingRequestCallbacks = [];
+
+  // TODO(vojta): remove this temporary api
+  self.$$completeOutstandingRequest = completeOutstandingRequest;
+  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };
+
+  /**
+   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`
+   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.
+   */
+  function completeOutstandingRequest(fn) {
+    try {
+      fn.apply(null, sliceArgs(arguments, 1));
+    } finally {
+      outstandingRequestCount--;
+      if (outstandingRequestCount === 0) {
+        while(outstandingRequestCallbacks.length) {
+          try {
+            outstandingRequestCallbacks.pop()();
+          } catch (e) {
+            $log.error(e);
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * @private
+   * Note: this method is used only by scenario runner
+   * TODO(vojta): prefix this method with $$ ?
+   * @param {function()} callback Function that will be called when no outstanding request
+   */
+  self.notifyWhenNoOutstandingRequests = function(callback) {
+    // force browser to execute all pollFns - this is needed so that cookies and other pollers fire
+    // at some deterministic time in respect to the test runner's actions. Leaving things up to the
+    // regular poller would result in flaky tests.
+    forEach(pollFns, function(pollFn){ pollFn(); });
+
+    if (outstandingRequestCount === 0) {
+      callback();
+    } else {
+      outstandingRequestCallbacks.push(callback);
+    }
+  };
+
+  //////////////////////////////////////////////////////////////
+  // Poll Watcher API
+  //////////////////////////////////////////////////////////////
+  var pollFns = [],
+      pollTimeout;
+
+  /**
+   * @name ng.$browser#addPollFn
+   * @methodOf ng.$browser
+   *
+   * @param {function()} fn Poll function to add
+   *
+   * @description
+   * Adds a function to the list of functions that poller periodically executes,
+   * and starts polling if not started yet.
+   *
+   * @returns {function()} the added function
+   */
+  self.addPollFn = function(fn) {
+    if (isUndefined(pollTimeout)) startPoller(100, setTimeout);
+    pollFns.push(fn);
+    return fn;
+  };
+
+  /**
+   * @param {number} interval How often should browser call poll functions (ms)
+   * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.
+   *
+   * @description
+   * Configures the poller to run in the specified intervals, using the specified
+   * setTimeout fn and kicks it off.
+   */
+  function startPoller(interval, setTimeout) {
+    (function check() {
+      forEach(pollFns, function(pollFn){ pollFn(); });
+      pollTimeout = setTimeout(check, interval);
+    })();
+  }
+
+  //////////////////////////////////////////////////////////////
+  // URL API
+  //////////////////////////////////////////////////////////////
+
+  var lastBrowserUrl = location.href,
+      baseElement = document.find('base'),
+      replacedUrl = null;
+
+  /**
+   * @name ng.$browser#url
+   * @methodOf ng.$browser
+   *
+   * @description
+   * GETTER:
+   * Without any argument, this method just returns current value of location.href.
+   *
+   * SETTER:
+   * With at least one argument, this method sets url to new value.
+   * If html5 history api supported, pushState/replaceState is used, otherwise
+   * location.href/location.replace is used.
+   * Returns its own instance to allow chaining
+   *
+   * NOTE: this api is intended for use only by the $location service. Please use the
+   * {@link ng.$location $location service} to change url.
+   *
+   * @param {string} url New url (when used as setter)
+   * @param {boolean=} replace Should new url replace current history record ?
+   */
+  self.url = function(url, replace) {
+    // setter
+    if (url) {
+      if (lastBrowserUrl == url) return;
+      lastBrowserUrl = url;
+      if ($sniffer.history) {
+        if (replace) history.replaceState(null, '', url);
+        else {
+          history.pushState(null, '', url);
+          // Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462
+          baseElement.attr('href', baseElement.attr('href'));
+        }
+      } else {
+        if (replace) {
+          location.replace(url);
+          replacedUrl = url;
+        } else {
+          location.href = url;
+          replacedUrl = null;
+        }
+      }
+      return self;
+    // getter
+    } else {
+      // - the replacedUrl is a workaround for an IE8-9 issue with location.replace method that doesn't update
+      //   location.href synchronously
+      // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
+      return replacedUrl || location.href.replace(/%27/g,"'");
+    }
+  };
+
+  var urlChangeListeners = [],
+      urlChangeInit = false;
+
+  function fireUrlChange() {
+    if (lastBrowserUrl == self.url()) return;
+
+    lastBrowserUrl = self.url();
+    forEach(urlChangeListeners, function(listener) {
+      listener(self.url());
+    });
+  }
+
+  /**
+   * @name ng.$browser#onUrlChange
+   * @methodOf ng.$browser
+   * @TODO(vojta): refactor to use node's syntax for events
+   *
+   * @description
+   * Register callback function that will be called, when url changes.
+   *
+   * It's only called when the url is changed by outside of angular:
+   * - user types different url into address bar
+   * - user clicks on history (forward/back) button
+   * - user clicks on a link
+   *
+   * It's not called when url is changed by $browser.url() method
+   *
+   * The listener gets called with new url as parameter.
+   *
+   * NOTE: this api is intended for use only by the $location service. Please use the
+   * {@link ng.$location $location service} to monitor url changes in angular apps.
+   *
+   * @param {function(string)} listener Listener function to be called when url changes.
+   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.
+   */
+  self.onUrlChange = function(callback) {
+    if (!urlChangeInit) {
+      // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)
+      // don't fire popstate when user change the address bar and don't fire hashchange when url
+      // changed by push/replaceState
+
+      // html5 history api - popstate event
+      if ($sniffer.history) jqLite(window).bind('popstate', fireUrlChange);
+      // hashchange event
+      if ($sniffer.hashchange) jqLite(window).bind('hashchange', fireUrlChange);
+      // polling
+      else self.addPollFn(fireUrlChange);
+
+      urlChangeInit = true;
+    }
+
+    urlChangeListeners.push(callback);
+    return callback;
+  };
+
+  //////////////////////////////////////////////////////////////
+  // Misc API
+  //////////////////////////////////////////////////////////////
+
+  /**
+   * Returns current <base href>
+   * (always relative - without domain)
+   *
+   * @returns {string=}
+   */
+  self.baseHref = function() {
+    var href = baseElement.attr('href');
+    return href ? href.replace(/^https?\:\/\/[^\/]*/, '') : '';
+  };
+
+  //////////////////////////////////////////////////////////////
+  // Cookies API
+  //////////////////////////////////////////////////////////////
+  var lastCookies = {};
+  var lastCookieString = '';
+  var cookiePath = self.baseHref();
+
+  /**
+   * @name ng.$browser#cookies
+   * @methodOf ng.$browser
+   *
+   * @param {string=} name Cookie name
+   * @param {string=} value Cokkie value
+   *
+   * @description
+   * The cookies method provides a 'private' low level access to browser cookies.
+   * It is not meant to be used directly, use the $cookie service instead.
+   *
+   * The return values vary depending on the arguments that the method was called with as follows:
+   * <ul>
+   *   <li>cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify it</li>
+   *   <li>cookies(name, value) -> set name to value, if value is undefined delete the cookie</li>
+   *   <li>cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that way)</li>
+   * </ul>
+   *
+   * @returns {Object} Hash of all cookies (if called without any parameter)
+   */
+  self.cookies = function(name, value) {
+    var cookieLength, cookieArray, cookie, i, index;
+
+    if (name) {
+      if (value === undefined) {
+        rawDocument.cookie = escape(name) + "=;path=" + cookiePath + ";expires=Thu, 01 Jan 1970 00:00:00 GMT";
+      } else {
+        if (isString(value)) {
+          cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) + ';path=' + cookiePath).length + 1;
+
+          // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:
+          // - 300 cookies
+          // - 20 cookies per unique domain
+          // - 4096 bytes per cookie
+          if (cookieLength > 4096) {
+            $log.warn("Cookie '"+ name +"' possibly not set or overflowed because it was too large ("+
+              cookieLength + " > 4096 bytes)!");
+          }
+        }
+      }
+    } else {
+      if (rawDocument.cookie !== lastCookieString) {
+        lastCookieString = rawDocument.cookie;
+        cookieArray = lastCookieString.split("; ");
+        lastCookies = {};
+
+        for (i = 0; i < cookieArray.length; i++) {
+          cookie = cookieArray[i];
+          index = cookie.indexOf('=');
+          if (index > 0) { //ignore nameless cookies
+            var name = unescape(cookie.substring(0, index));
+            // the first value that is seen for a cookie is the most
+            // specific one.  values for the same cookie name that
+            // follow are for less specific paths.
+            if (lastCookies[name] === undefined) {
+              lastCookies[name] = unescape(cookie.substring(index + 1));
+            }
+          }
+        }
+      }
+      return lastCookies;
+    }
+  };
+
+
+  /**
+   * @name ng.$browser#defer
+   * @methodOf ng.$browser
+   * @param {function()} fn A function, who's execution should be defered.
+   * @param {number=} [delay=0] of milliseconds to defer the function execution.
+   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.
+   *
+   * @description
+   * Executes a fn asynchroniously via `setTimeout(fn, delay)`.
+   *
+   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using
+   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed
+   * via `$browser.defer.flush()`.
+   *
+   */
+  self.defer = function(fn, delay) {
+    var timeoutId;
+    outstandingRequestCount++;
+    timeoutId = setTimeout(function() {
+      delete pendingDeferIds[timeoutId];
+      completeOutstandingRequest(fn);
+    }, delay || 0);
+    pendingDeferIds[timeoutId] = true;
+    return timeoutId;
+  };
+
+
+  /**
+   * @name ng.$browser#defer.cancel
+   * @methodOf ng.$browser.defer
+   *
+   * @description
+   * Cancels a defered task identified with `deferId`.
+   *
+   * @param {*} deferId Token returned by the `$browser.defer` function.
+   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfuly canceled.
+   */
+  self.defer.cancel = function(deferId) {
+    if (pendingDeferIds[deferId]) {
+      delete pendingDeferIds[deferId];
+      clearTimeout(deferId);
+      completeOutstandingRequest(noop);
+      return true;
+    }
+    return false;
+  };
+
+}
+
+function $BrowserProvider(){
+  this.$get = ['$window', '$log', '$sniffer', '$document',
+      function( $window,   $log,   $sniffer,   $document){
+        return new Browser($window, $document, $log, $sniffer);
+      }];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$cacheFactory
+ *
+ * @description
+ * Factory that constructs cache objects and gives access to them.
+ * 
+ * <pre>
+ * 
+ *  var cache = $cacheFactory('cacheId');
+ *  expect($cacheFactory.get('cacheId')).toBe(cache);
+ *  expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();
+ *
+ *  cache.put("key", "value");
+ *  cache.put("another key", "another value");
+ * 
+ *  expect(cache.info()).toEqual({id: 'cacheId', size: 2}); // Since we've specified no options on creation
+ * 
+ * </pre>
+ *
+ *
+ * @param {string} cacheId Name or id of the newly created cache.
+ * @param {object=} options Options object that specifies the cache behavior. Properties:
+ *
+ *   - `{number=}` `capacity` — turns the cache into LRU cache.
+ *
+ * @returns {object} Newly created cache object with the following set of methods:
+ *
+ * - `{object}` `info()` — Returns id, size, and options of cache.
+ * - `{void}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache.
+ * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.
+ * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.
+ * - `{void}` `removeAll()` — Removes all cached values.
+ * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.
+ *
+ */
+function $CacheFactoryProvider() {
+
+  this.$get = function() {
+    var caches = {};
+
+    function cacheFactory(cacheId, options) {
+      if (cacheId in caches) {
+        throw Error('cacheId ' + cacheId + ' taken');
+      }
+
+      var size = 0,
+          stats = extend({}, options, {id: cacheId}),
+          data = {},
+          capacity = (options && options.capacity) || Number.MAX_VALUE,
+          lruHash = {},
+          freshEnd = null,
+          staleEnd = null;
+
+      return caches[cacheId] = {
+
+        put: function(key, value) {
+          var lruEntry = lruHash[key] || (lruHash[key] = {key: key});
+
+          refresh(lruEntry);
+
+          if (isUndefined(value)) return;
+          if (!(key in data)) size++;
+          data[key] = value;
+
+          if (size > capacity) {
+            this.remove(staleEnd.key);
+          }
+        },
+
+
+        get: function(key) {
+          var lruEntry = lruHash[key];
+
+          if (!lruEntry) return;
+
+          refresh(lruEntry);
+
+          return data[key];
+        },
+
+
+        remove: function(key) {
+          var lruEntry = lruHash[key];
+
+          if (!lruEntry) return;
+
+          if (lruEntry == freshEnd) freshEnd = lruEntry.p;
+          if (lruEntry == staleEnd) staleEnd = lruEntry.n;
+          link(lruEntry.n,lruEntry.p);
+
+          delete lruHash[key];
+          delete data[key];
+          size--;
+        },
+
+
+        removeAll: function() {
+          data = {};
+          size = 0;
+          lruHash = {};
+          freshEnd = staleEnd = null;
+        },
+
+
+        destroy: function() {
+          data = null;
+          stats = null;
+          lruHash = null;
+          delete caches[cacheId];
+        },
+
+
+        info: function() {
+          return extend({}, stats, {size: size});
+        }
+      };
+
+
+      /**
+       * makes the `entry` the freshEnd of the LRU linked list
+       */
+      function refresh(entry) {
+        if (entry != freshEnd) {
+          if (!staleEnd) {
+            staleEnd = entry;
+          } else if (staleEnd == entry) {
+            staleEnd = entry.n;
+          }
+
+          link(entry.n, entry.p);
+          link(entry, freshEnd);
+          freshEnd = entry;
+          freshEnd.n = null;
+        }
+      }
+
+
+      /**
+       * bidirectionally links two entries of the LRU linked list
+       */
+      function link(nextEntry, prevEntry) {
+        if (nextEntry != prevEntry) {
+          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify
+          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify
+        }
+      }
+    }
+
+
+  /**
+   * @ngdoc method
+   * @name ng.$cacheFactory#info
+   * @methodOf ng.$cacheFactory
+   *
+   * @description
+   * Get information about all the of the caches that have been created
+   *
+   * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`
+   */
+    cacheFactory.info = function() {
+      var info = {};
+      forEach(caches, function(cache, cacheId) {
+        info[cacheId] = cache.info();
+      });
+      return info;
+    };
+
+
+  /**
+   * @ngdoc method
+   * @name ng.$cacheFactory#get
+   * @methodOf ng.$cacheFactory
+   *
+   * @description
+   * Get access to a cache object by the `cacheId` used when it was created.
+   *
+   * @param {string} cacheId Name or id of a cache to access.
+   * @returns {object} Cache object identified by the cacheId or undefined if no such cache.
+   */
+    cacheFactory.get = function(cacheId) {
+      return caches[cacheId];
+    };
+
+
+    return cacheFactory;
+  };
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$templateCache
+ *
+ * @description
+ * The first time a template is used, it is loaded in the template cache for quick retrieval.  You can 
+ * load templates directly into the cache in a `script` tag, or by consuming the `$templateCache` 
+ * service directly.
+ * 
+ * Adding via the `script` tag:
+ * <pre>
+ * <html ng-app>
+ * <head>
+ * <script type="text/ng-template" id="templateId.html">
+ *   This is the content of the template
+ * </script>
+ * </head>
+ *   ...
+ * </html>
+ * </pre>
+ * 
+ * **Note:** the `script` tag containing the template does not need to be included in the `head` of the document, but 
+ * it must be below the `ng-app` definition.
+ * 
+ * Adding via the $templateCache service:
+ * 
+ * <pre>
+ * var myApp = angular.module('myApp', []);
+ * myApp.run(function($templateCache) {
+ *   $templateCache.put('templateId.html', 'This is the content of the template');
+ * });
+ * </pre>
+ * 
+ * To retrieve the template later, simply use it in your HTML:
+ * <pre>
+ * <div ng-include=" 'templateId.html' "></div>
+ * </pre>
+ * 
+ * or get it via Javascript:
+ * <pre>
+ * $templateCache.get('templateId.html')
+ * </pre>
+ * 
+ * See {@link ng.$cacheFactory $cacheFactory}.
+ *
+ */
+function $TemplateCacheProvider() {
+  this.$get = ['$cacheFactory', function($cacheFactory) {
+    return $cacheFactory('templates');
+  }];
+}
+
+/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!
+ *
+ * DOM-related variables:
+ *
+ * - "node" - DOM Node
+ * - "element" - DOM Element or Node
+ * - "$node" or "$element" - jqLite-wrapped node or element
+ *
+ *
+ * Compiler related stuff:
+ *
+ * - "linkFn" - linking fn of a single directive
+ * - "nodeLinkFn" - function that aggregates all linking fns for a particular node
+ * - "childLinkFn" -  function that aggregates all linking fns for child nodes of a particular node
+ * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList)
+ */
+
+
+var NON_ASSIGNABLE_MODEL_EXPRESSION = 'Non-assignable model expression: ';
+
+
+/**
+ * @ngdoc function
+ * @name ng.$compile
+ * @function
+ *
+ * @description
+ * Compiles a piece of HTML string or DOM into a template and produces a template function, which
+ * can then be used to link {@link ng.$rootScope.Scope scope} and the template together.
+ *
+ * The compilation is a process of walking the DOM tree and trying to match DOM elements to
+ * {@link ng.$compileProvider#directive directives}. For each match it
+ * executes corresponding template function and collects the
+ * instance functions into a single template function which is then returned.
+ *
+ * The template function can then be used once to produce the view or as it is the case with
+ * {@link ng.directive:ngRepeat repeater} many-times, in which
+ * case each call results in a view that is a DOM clone of the original template.
+ *
+ <doc:example module="compile">
+   <doc:source>
+    <script>
+      // declare a new module, and inject the $compileProvider
+      angular.module('compile', [], function($compileProvider) {
+        // configure new 'compile' directive by passing a directive
+        // factory function. The factory function injects the '$compile'
+        $compileProvider.directive('compile', function($compile) {
+          // directive factory creates a link function
+          return function(scope, element, attrs) {
+            scope.$watch(
+              function(scope) {
+                 // watch the 'compile' expression for changes
+                return scope.$eval(attrs.compile);
+              },
+              function(value) {
+                // when the 'compile' expression changes
+                // assign it into the current DOM
+                element.html(value);
+
+                // compile the new DOM and link it to the current
+                // scope.
+                // NOTE: we only compile .childNodes so that
+                // we don't get into infinite loop compiling ourselves
+                $compile(element.contents())(scope);
+              }
+            );
+          };
+        })
+      });
+
+      function Ctrl($scope) {
+        $scope.name = 'Angular';
+        $scope.html = 'Hello {{name}}';
+      }
+    </script>
+    <div ng-controller="Ctrl">
+      <input ng-model="name"> <br>
+      <textarea ng-model="html"></textarea> <br>
+      <div compile="html"></div>
+    </div>
+   </doc:source>
+   <doc:scenario>
+     it('should auto compile', function() {
+       expect(element('div[compile]').text()).toBe('Hello Angular');
+       input('html').enter('{{name}}!');
+       expect(element('div[compile]').text()).toBe('Angular!');
+     });
+   </doc:scenario>
+ </doc:example>
+
+ *
+ *
+ * @param {string|DOMElement} element Element or HTML string to compile into a template function.
+ * @param {function(angular.Scope[, cloneAttachFn]} transclude function available to directives.
+ * @param {number} maxPriority only apply directives lower then given priority (Only effects the
+ *                 root element(s), not their children)
+ * @returns {function(scope[, cloneAttachFn])} a link function which is used to bind template
+ * (a DOM element/tree) to a scope. Where:
+ *
+ *  * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.
+ *  * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the
+ *               `template` and call the `cloneAttachFn` function allowing the caller to attach the
+ *               cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is
+ *               called as: <br> `cloneAttachFn(clonedElement, scope)` where:
+ *
+ *      * `clonedElement` - is a clone of the original `element` passed into the compiler.
+ *      * `scope` - is the current scope with which the linking function is working with.
+ *
+ * Calling the linking function returns the element of the template. It is either the original element
+ * passed in, or the clone of the element if the `cloneAttachFn` is provided.
+ *
+ * After linking the view is not updated until after a call to $digest which typically is done by
+ * Angular automatically.
+ *
+ * If you need access to the bound view, there are two ways to do it:
+ *
+ * - If you are not asking the linking function to clone the template, create the DOM element(s)
+ *   before you send them to the compiler and keep this reference around.
+ *   <pre>
+ *     var element = $compile('<p>{{total}}</p>')(scope);
+ *   </pre>
+ *
+ * - if on the other hand, you need the element to be cloned, the view reference from the original
+ *   example would not point to the clone, but rather to the original template that was cloned. In
+ *   this case, you can access the clone via the cloneAttachFn:
+ *   <pre>
+ *     var templateHTML = angular.element('<p>{{total}}</p>'),
+ *         scope = ....;
+ *
+ *     var clonedElement = $compile(templateHTML)(scope, function(clonedElement, scope) {
+ *       //attach the clone to DOM document at the right place
+ *     });
+ *
+ *     //now we have reference to the cloned DOM via `clone`
+ *   </pre>
+ *
+ *
+ * For information on how the compiler works, see the
+ * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.
+ */
+
+
+/**
+ * @ngdoc service
+ * @name ng.$compileProvider
+ * @function
+ *
+ * @description
+ */
+$CompileProvider.$inject = ['$provide'];
+function $CompileProvider($provide) {
+  var hasDirectives = {},
+      Suffix = 'Directive',
+      COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,
+      CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/,
+      MULTI_ROOT_TEMPLATE_ERROR = 'Template must have exactly one root element. was: ',
+      urlSanitizationWhitelist = /^\s*(https?|ftp|mailto|file):/;
+
+
+  /**
+   * @ngdoc function
+   * @name ng.$compileProvider#directive
+   * @methodOf ng.$compileProvider
+   * @function
+   *
+   * @description
+   * Register a new directive with the compiler.
+   *
+   * @param {string} name Name of the directive in camel-case. (ie <code>ngBind</code> which will match as
+   *                <code>ng-bind</code>).
+   * @param {function|Array} directiveFactory An injectable directive factory function. See {@link guide/directive} for more
+   *                info.
+   * @returns {ng.$compileProvider} Self for chaining.
+   */
+   this.directive = function registerDirective(name, directiveFactory) {
+    if (isString(name)) {
+      assertArg(directiveFactory, 'directive');
+      if (!hasDirectives.hasOwnProperty(name)) {
+        hasDirectives[name] = [];
+        $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',
+          function($injector, $exceptionHandler) {
+            var directives = [];
+            forEach(hasDirectives[name], function(directiveFactory) {
+              try {
+                var directive = $injector.invoke(directiveFactory);
+                if (isFunction(directive)) {
+                  directive = { compile: valueFn(directive) };
+                } else if (!directive.compile && directive.link) {
+                  directive.compile = valueFn(directive.link);
+                }
+                directive.priority = directive.priority || 0;
+                directive.name = directive.name || name;
+                directive.require = directive.require || (directive.controller && directive.name);
+                directive.restrict = directive.restrict || 'A';
+                directives.push(directive);
+              } catch (e) {
+                $exceptionHandler(e);
+              }
+            });
+            return directives;
+          }]);
+      }
+      hasDirectives[name].push(directiveFactory);
+    } else {
+      forEach(name, reverseParams(registerDirective));
+    }
+    return this;
+  };
+
+
+  /**
+   * @ngdoc function
+   * @name ng.$compileProvider#urlSanitizationWhitelist
+   * @methodOf ng.$compileProvider
+   * @function
+   *
+   * @description
+   * Retrieves or overrides the default regular expression that is used for whitelisting of safe
+   * urls during a[href] sanitization.
+   *
+   * The sanitization is a security measure aimed at prevent XSS attacks via html links.
+   *
+   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into an
+   * absolute url. Afterwards the url is matched against the `urlSanitizationWhitelist` regular
+   * expression. If a match is found the original url is written into the dom. Otherwise the
+   * absolute url is prefixed with `'unsafe:'` string and only then it is written into the DOM.
+   *
+   * @param {RegExp=} regexp New regexp to whitelist urls with.
+   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
+   *    chaining otherwise.
+   */
+  this.urlSanitizationWhitelist = function(regexp) {
+    if (isDefined(regexp)) {
+      urlSanitizationWhitelist = regexp;
+      return this;
+    }
+    return urlSanitizationWhitelist;
+  };
+
+
+  this.$get = [
+            '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse',
+            '$controller', '$rootScope', '$document',
+    function($injector,   $interpolate,   $exceptionHandler,   $http,   $templateCache,   $parse,
+             $controller,   $rootScope,   $document) {
+
+    var Attributes = function(element, attr) {
+      this.$$element = element;
+      this.$attr = attr || {};
+    };
+
+    Attributes.prototype = {
+      $normalize: directiveNormalize,
+
+
+      /**
+       * Set a normalized attribute on the element in a way such that all directives
+       * can share the attribute. This function properly handles boolean attributes.
+       * @param {string} key Normalized key. (ie ngAttribute)
+       * @param {string|boolean} value The value to set. If `null` attribute will be deleted.
+       * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.
+       *     Defaults to true.
+       * @param {string=} attrName Optional none normalized name. Defaults to key.
+       */
+      $set: function(key, value, writeAttr, attrName) {
+        var booleanKey = getBooleanAttrName(this.$$element[0], key),
+            $$observers = this.$$observers,
+            normalizedVal;
+
+        if (booleanKey) {
+          this.$$element.prop(key, value);
+          attrName = booleanKey;
+        }
+
+        this[key] = value;
+
+        // translate normalized key to actual key
+        if (attrName) {
+          this.$attr[key] = attrName;
+        } else {
+          attrName = this.$attr[key];
+          if (!attrName) {
+            this.$attr[key] = attrName = snake_case(key, '-');
+          }
+        }
+
+
+        // sanitize a[href] values
+        if (nodeName_(this.$$element[0]) === 'A' && key === 'href') {
+          urlSanitizationNode.setAttribute('href', value);
+
+          // href property always returns normalized absolute url, so we can match against that
+          normalizedVal = urlSanitizationNode.href;
+          if (normalizedVal !== '' && !normalizedVal.match(urlSanitizationWhitelist)) {
+            this[key] = value = 'unsafe:' + normalizedVal;
+          }
+        }
+
+
+        if (writeAttr !== false) {
+          if (value === null || value === undefined) {
+            this.$$element.removeAttr(attrName);
+          } else {
+            this.$$element.attr(attrName, value);
+          }
+        }
+
+        // fire observers
+        $$observers && forEach($$observers[key], function(fn) {
+          try {
+            fn(value);
+          } catch (e) {
+            $exceptionHandler(e);
+          }
+        });
+      },
+
+
+      /**
+       * Observe an interpolated attribute.
+       * The observer will never be called, if given attribute is not interpolated.
+       *
+       * @param {string} key Normalized key. (ie ngAttribute) .
+       * @param {function(*)} fn Function that will be called whenever the attribute value changes.
+       * @returns {function(*)} the `fn` Function passed in.
+       */
+      $observe: function(key, fn) {
+        var attrs = this,
+            $$observers = (attrs.$$observers || (attrs.$$observers = {})),
+            listeners = ($$observers[key] || ($$observers[key] = []));
+
+        listeners.push(fn);
+        $rootScope.$evalAsync(function() {
+          if (!listeners.$$inter) {
+            // no one registered attribute interpolation function, so lets call it manually
+            fn(attrs[key]);
+          }
+        });
+        return fn;
+      }
+    };
+
+    var urlSanitizationNode = $document[0].createElement('a'),
+        startSymbol = $interpolate.startSymbol(),
+        endSymbol = $interpolate.endSymbol(),
+        denormalizeTemplate = (startSymbol == '{{' || endSymbol  == '}}')
+            ? identity
+            : function denormalizeTemplate(template) {
+              return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol);
+            };
+
+
+    return compile;
+
+    //================================
+
+    function compile($compileNodes, transcludeFn, maxPriority) {
+      if (!($compileNodes instanceof jqLite)) {
+        // jquery always rewraps, whereas we need to preserve the original selector so that we can modify it.
+        $compileNodes = jqLite($compileNodes);
+      }
+      // We can not compile top level text elements since text nodes can be merged and we will
+      // not be able to attach scope data to them, so we will wrap them in <span>
+      forEach($compileNodes, function(node, index){
+        if (node.nodeType == 3 /* text node */ && node.nodeValue.match(/\S+/) /* non-empty */ ) {
+          $compileNodes[index] = jqLite(node).wrap('<span></span>').parent()[0];
+        }
+      });
+      var compositeLinkFn = compileNodes($compileNodes, transcludeFn, $compileNodes, maxPriority);
+      return function publicLinkFn(scope, cloneConnectFn){
+        assertArg(scope, 'scope');
+        // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart
+        // and sometimes changes the structure of the DOM.
+        var $linkNode = cloneConnectFn
+          ? JQLitePrototype.clone.call($compileNodes) // IMPORTANT!!!
+          : $compileNodes;
+
+        // Attach scope only to non-text nodes.
+        for(var i = 0, ii = $linkNode.length; i<ii; i++) {
+          var node = $linkNode[i];
+          if (node.nodeType == 1 /* element */ || node.nodeType == 9 /* document */) {
+            $linkNode.eq(i).data('$scope', scope);
+          }
+        }
+        safeAddClass($linkNode, 'ng-scope');
+        if (cloneConnectFn) cloneConnectFn($linkNode, scope);
+        if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode);
+        return $linkNode;
+      };
+    }
+
+    function wrongMode(localName, mode) {
+      throw Error("Unsupported '" + mode + "' for '" + localName + "'.");
+    }
+
+    function safeAddClass($element, className) {
+      try {
+        $element.addClass(className);
+      } catch(e) {
+        // ignore, since it means that we are trying to set class on
+        // SVG element, where class name is read-only.
+      }
+    }
+
+    /**
+     * Compile function matches each node in nodeList against the directives. Once all directives
+     * for a particular node are collected their compile functions are executed. The compile
+     * functions return values - the linking functions - are combined into a composite linking
+     * function, which is the a linking function for the node.
+     *
+     * @param {NodeList} nodeList an array of nodes or NodeList to compile
+     * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the
+     *        scope argument is auto-generated to the new child of the transcluded parent scope.
+     * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then the
+     *        rootElement must be set the jqLite collection of the compile root. This is
+     *        needed so that the jqLite collection items can be replaced with widgets.
+     * @param {number=} max directive priority
+     * @returns {?function} A composite linking function of all of the matched directives or null.
+     */
+    function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority) {
+      var linkFns = [],
+          nodeLinkFn, childLinkFn, directives, attrs, linkFnFound;
+
+      for(var i = 0; i < nodeList.length; i++) {
+        attrs = new Attributes();
+
+        // we must always refer to nodeList[i] since the nodes can be replaced underneath us.
+        directives = collectDirectives(nodeList[i], [], attrs, maxPriority);
+
+        nodeLinkFn = (directives.length)
+            ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement)
+            : null;
+
+        childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || !nodeList[i].childNodes || !nodeList[i].childNodes.length)
+            ? null
+            : compileNodes(nodeList[i].childNodes,
+                 nodeLinkFn ? nodeLinkFn.transclude : transcludeFn);
+
+        linkFns.push(nodeLinkFn);
+        linkFns.push(childLinkFn);
+        linkFnFound = (linkFnFound || nodeLinkFn || childLinkFn);
+      }
+
+      // return a linking function if we have found anything, null otherwise
+      return linkFnFound ? compositeLinkFn : null;
+
+      function compositeLinkFn(scope, nodeList, $rootElement, boundTranscludeFn) {
+        var nodeLinkFn, childLinkFn, node, childScope, childTranscludeFn, i, ii, n;
+
+        // copy nodeList so that linking doesn't break due to live list updates.
+        var stableNodeList = [];
+        for (i = 0, ii = nodeList.length; i < ii; i++) {
+          stableNodeList.push(nodeList[i]);
+        }
+
+        for(i = 0, n = 0, ii = linkFns.length; i < ii; n++) {
+          node = stableNodeList[n];
+          nodeLinkFn = linkFns[i++];
+          childLinkFn = linkFns[i++];
+
+          if (nodeLinkFn) {
+            if (nodeLinkFn.scope) {
+              childScope = scope.$new(isObject(nodeLinkFn.scope));
+              jqLite(node).data('$scope', childScope);
+            } else {
+              childScope = scope;
+            }
+            childTranscludeFn = nodeLinkFn.transclude;
+            if (childTranscludeFn || (!boundTranscludeFn && transcludeFn)) {
+              nodeLinkFn(childLinkFn, childScope, node, $rootElement,
+                  (function(transcludeFn) {
+                    return function(cloneFn) {
+                      var transcludeScope = scope.$new();
+                      transcludeScope.$$transcluded = true;
+
+                      return transcludeFn(transcludeScope, cloneFn).
+                          bind('$destroy', bind(transcludeScope, transcludeScope.$destroy));
+                    };
+                  })(childTranscludeFn || transcludeFn)
+              );
+            } else {
+              nodeLinkFn(childLinkFn, childScope, node, undefined, boundTranscludeFn);
+            }
+          } else if (childLinkFn) {
+            childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn);
+          }
+        }
+      }
+    }
+
+
+    /**
+     * Looks for directives on the given node and adds them to the directive collection which is
+     * sorted.
+     *
+     * @param node Node to search.
+     * @param directives An array to which the directives are added to. This array is sorted before
+     *        the function returns.
+     * @param attrs The shared attrs object which is used to populate the normalized attributes.
+     * @param {number=} maxPriority Max directive priority.
+     */
+    function collectDirectives(node, directives, attrs, maxPriority) {
+      var nodeType = node.nodeType,
+          attrsMap = attrs.$attr,
+          match,
+          className;
+
+      switch(nodeType) {
+        case 1: /* Element */
+          // use the node name: <directive>
+          addDirective(directives,
+              directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority);
+
+          // iterate over the attributes
+          for (var attr, name, nName, value, nAttrs = node.attributes,
+                   j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
+            attr = nAttrs[j];
+            if (!msie || msie >= 8 || attr.specified) {
+              name = attr.name;
+              nName = directiveNormalize(name.toLowerCase());
+              attrsMap[nName] = name;
+              attrs[nName] = value = trim((msie && name == 'href')
+                ? decodeURIComponent(node.getAttribute(name, 2))
+                : attr.value);
+              if (getBooleanAttrName(node, nName)) {
+                attrs[nName] = true; // presence means true
+              }
+              addAttrInterpolateDirective(node, directives, value, nName);
+              addDirective(directives, nName, 'A', maxPriority);
+            }
+          }
+
+          // use class as directive
+          className = node.className;
+          if (isString(className) && className !== '') {
+            while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {
+              nName = directiveNormalize(match[2]);
+              if (addDirective(directives, nName, 'C', maxPriority)) {
+                attrs[nName] = trim(match[3]);
+              }
+              className = className.substr(match.index + match[0].length);
+            }
+          }
+          break;
+        case 3: /* Text Node */
+          addTextInterpolateDirective(directives, node.nodeValue);
+          break;
+        case 8: /* Comment */
+          try {
+            match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);
+            if (match) {
+              nName = directiveNormalize(match[1]);
+              if (addDirective(directives, nName, 'M', maxPriority)) {
+                attrs[nName] = trim(match[2]);
+              }
+            }
+          } catch (e) {
+            // turns out that under some circumstances IE9 throws errors when one attempts to read comment's node value.
+            // Just ignore it and continue. (Can't seem to reproduce in test case.)
+          }
+          break;
+      }
+
+      directives.sort(byPriority);
+      return directives;
+    }
+
+
+    /**
+     * Once the directives have been collected, their compile functions are executed. This method
+     * is responsible for inlining directive templates as well as terminating the application
+     * of the directives if the terminal directive has been reached.
+     *
+     * @param {Array} directives Array of collected directives to execute their compile function.
+     *        this needs to be pre-sorted by priority order.
+     * @param {Node} compileNode The raw DOM node to apply the compile functions to
+     * @param {Object} templateAttrs The shared attribute function
+     * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the
+     *        scope argument is auto-generated to the new child of the transcluded parent scope.
+     * @param {JQLite} jqCollection If we are working on the root of the compile tree then this
+     *        argument has the root jqLite array so that we can replace nodes on it.
+     * @returns linkFn
+     */
+    function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, jqCollection) {
+      var terminalPriority = -Number.MAX_VALUE,
+          preLinkFns = [],
+          postLinkFns = [],
+          newScopeDirective = null,
+          newIsolateScopeDirective = null,
+          templateDirective = null,
+          $compileNode = templateAttrs.$$element = jqLite(compileNode),
+          directive,
+          directiveName,
+          $template,
+          transcludeDirective,
+          childTranscludeFn = transcludeFn,
+          controllerDirectives,
+          linkFn,
+          directiveValue;
+
+      // executes all directives on the current element
+      for(var i = 0, ii = directives.length; i < ii; i++) {
+        directive = directives[i];
+        $template = undefined;
+
+        if (terminalPriority > directive.priority) {
+          break; // prevent further processing of directives
+        }
+
+        if (directiveValue = directive.scope) {
+          assertNoDuplicate('isolated scope', newIsolateScopeDirective, directive, $compileNode);
+          if (isObject(directiveValue)) {
+            safeAddClass($compileNode, 'ng-isolate-scope');
+            newIsolateScopeDirective = directive;
+          }
+          safeAddClass($compileNode, 'ng-scope');
+          newScopeDirective = newScopeDirective || directive;
+        }
+
+        directiveName = directive.name;
+
+        if (directiveValue = directive.controller) {
+          controllerDirectives = controllerDirectives || {};
+          assertNoDuplicate("'" + directiveName + "' controller",
+              controllerDirectives[directiveName], directive, $compileNode);
+          controllerDirectives[directiveName] = directive;
+        }
+
+        if (directiveValue = directive.transclude) {
+          assertNoDuplicate('transclusion', transcludeDirective, directive, $compileNode);
+          transcludeDirective = directive;
+          terminalPriority = directive.priority;
+          if (directiveValue == 'element') {
+            $template = jqLite(compileNode);
+            $compileNode = templateAttrs.$$element =
+                jqLite(document.createComment(' ' + directiveName + ': ' + templateAttrs[directiveName] + ' '));
+            compileNode = $compileNode[0];
+            replaceWith(jqCollection, jqLite($template[0]), compileNode);
+            childTranscludeFn = compile($template, transcludeFn, terminalPriority);
+          } else {
+            $template = jqLite(JQLiteClone(compileNode)).contents();
+            $compileNode.html(''); // clear contents
+            childTranscludeFn = compile($template, transcludeFn);
+          }
+        }
+
+        if ((directiveValue = directive.template)) {
+          assertNoDuplicate('template', templateDirective, directive, $compileNode);
+          templateDirective = directive;
+          directiveValue = denormalizeTemplate(directiveValue);
+
+          if (directive.replace) {
+            $template = jqLite('<div>' +
+                                 trim(directiveValue) +
+                               '</div>').contents();
+            compileNode = $template[0];
+
+            if ($template.length != 1 || compileNode.nodeType !== 1) {
+              throw new Error(MULTI_ROOT_TEMPLATE_ERROR + directiveValue);
+            }
+
+            replaceWith(jqCollection, $compileNode, compileNode);
+
+            var newTemplateAttrs = {$attr: {}};
+
+            // combine directives from the original node and from the template:
+            // - take the array of directives for this element
+            // - split it into two parts, those that were already applied and those that weren't
+            // - collect directives from the template, add them to the second group and sort them
+            // - append the second group with new directives to the first group
+            directives = directives.concat(
+                collectDirectives(
+                    compileNode,
+                    directives.splice(i + 1, directives.length - (i + 1)),
+                    newTemplateAttrs
+                )
+            );
+            mergeTemplateAttributes(templateAttrs, newTemplateAttrs);
+
+            ii = directives.length;
+          } else {
+            $compileNode.html(directiveValue);
+          }
+        }
+
+        if (directive.templateUrl) {
+          assertNoDuplicate('template', templateDirective, directive, $compileNode);
+          templateDirective = directive;
+          nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i),
+              nodeLinkFn, $compileNode, templateAttrs, jqCollection, directive.replace,
+              childTranscludeFn);
+          ii = directives.length;
+        } else if (directive.compile) {
+          try {
+            linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);
+            if (isFunction(linkFn)) {
+              addLinkFns(null, linkFn);
+            } else if (linkFn) {
+              addLinkFns(linkFn.pre, linkFn.post);
+            }
+          } catch (e) {
+            $exceptionHandler(e, startingTag($compileNode));
+          }
+        }
+
+        if (directive.terminal) {
+          nodeLinkFn.terminal = true;
+          terminalPriority = Math.max(terminalPriority, directive.priority);
+        }
+
+      }
+
+      nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope;
+      nodeLinkFn.transclude = transcludeDirective && childTranscludeFn;
+
+      // might be normal or delayed nodeLinkFn depending on if templateUrl is present
+      return nodeLinkFn;
+
+      ////////////////////
+
+      function addLinkFns(pre, post) {
+        if (pre) {
+          pre.require = directive.require;
+          preLinkFns.push(pre);
+        }
+        if (post) {
+          post.require = directive.require;
+          postLinkFns.push(post);
+        }
+      }
+
+
+      function getControllers(require, $element) {
+        var value, retrievalMethod = 'data', optional = false;
+        if (isString(require)) {
+          while((value = require.charAt(0)) == '^' || value == '?') {
+            require = require.substr(1);
+            if (value == '^') {
+              retrievalMethod = 'inheritedData';
+            }
+            optional = optional || value == '?';
+          }
+          value = $element[retrievalMethod]('$' + require + 'Controller');
+          if (!value && !optional) {
+            throw Error("No controller: " + require);
+          }
+          return value;
+        } else if (isArray(require)) {
+          value = [];
+          forEach(require, function(require) {
+            value.push(getControllers(require, $element));
+          });
+        }
+        return value;
+      }
+
+
+      function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {
+        var attrs, $element, i, ii, linkFn, controller;
+
+        if (compileNode === linkNode) {
+          attrs = templateAttrs;
+        } else {
+          attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));
+        }
+        $element = attrs.$$element;
+
+        if (newIsolateScopeDirective) {
+          var LOCAL_REGEXP = /^\s*([@=&])\s*(\w*)\s*$/;
+
+          var parentScope = scope.$parent || scope;
+
+          forEach(newIsolateScopeDirective.scope, function(definiton, scopeName) {
+            var match = definiton.match(LOCAL_REGEXP) || [],
+                attrName = match[2]|| scopeName,
+                mode = match[1], // @, =, or &
+                lastValue,
+                parentGet, parentSet;
+
+            scope.$$isolateBindings[scopeName] = mode + attrName;
+
+            switch (mode) {
+
+              case '@': {
+                attrs.$observe(attrName, function(value) {
+                  scope[scopeName] = value;
+                });
+                attrs.$$observers[attrName].$$scope = parentScope;
+                break;
+              }
+
+              case '=': {
+                parentGet = $parse(attrs[attrName]);
+                parentSet = parentGet.assign || function() {
+                  // reset the change, or we will throw this exception on every $digest
+                  lastValue = scope[scopeName] = parentGet(parentScope);
+                  throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + attrs[attrName] +
+                      ' (directive: ' + newIsolateScopeDirective.name + ')');
+                };
+                lastValue = scope[scopeName] = parentGet(parentScope);
+                scope.$watch(function parentValueWatch() {
+                  var parentValue = parentGet(parentScope);
+
+                  if (parentValue !== scope[scopeName]) {
+                    // we are out of sync and need to copy
+                    if (parentValue !== lastValue) {
+                      // parent changed and it has precedence
+                      lastValue = scope[scopeName] = parentValue;
+                    } else {
+                      // if the parent can be assigned then do so
+                      parentSet(parentScope, parentValue = lastValue = scope[scopeName]);
+                    }
+                  }
+                  return parentValue;
+                });
+                break;
+              }
+
+              case '&': {
+                parentGet = $parse(attrs[attrName]);
+                scope[scopeName] = function(locals) {
+                  return parentGet(parentScope, locals);
+                };
+                break;
+              }
+
+              default: {
+                throw Error('Invalid isolate scope definition for directive ' +
+                    newIsolateScopeDirective.name + ': ' + definiton);
+              }
+            }
+          });
+        }
+
+        if (controllerDirectives) {
+          forEach(controllerDirectives, function(directive) {
+            var locals = {
+              $scope: scope,
+              $element: $element,
+              $attrs: attrs,
+              $transclude: boundTranscludeFn
+            };
+
+            controller = directive.controller;
+            if (controller == '@') {
+              controller = attrs[directive.name];
+            }
+
+            $element.data(
+                '$' + directive.name + 'Controller',
+                $controller(controller, locals));
+          });
+        }
+
+        // PRELINKING
+        for(i = 0, ii = preLinkFns.length; i < ii; i++) {
+          try {
+            linkFn = preLinkFns[i];
+            linkFn(scope, $element, attrs,
+                linkFn.require && getControllers(linkFn.require, $element));
+          } catch (e) {
+            $exceptionHandler(e, startingTag($element));
+          }
+        }
+
+        // RECURSION
+        childLinkFn && childLinkFn(scope, linkNode.childNodes, undefined, boundTranscludeFn);
+
+        // POSTLINKING
+        for(i = 0, ii = postLinkFns.length; i < ii; i++) {
+          try {
+            linkFn = postLinkFns[i];
+            linkFn(scope, $element, attrs,
+                linkFn.require && getControllers(linkFn.require, $element));
+          } catch (e) {
+            $exceptionHandler(e, startingTag($element));
+          }
+        }
+      }
+    }
+
+
+    /**
+     * looks up the directive and decorates it with exception handling and proper parameters. We
+     * call this the boundDirective.
+     *
+     * @param {string} name name of the directive to look up.
+     * @param {string} location The directive must be found in specific format.
+     *   String containing any of theses characters:
+     *
+     *   * `E`: element name
+     *   * `A': attribute
+     *   * `C`: class
+     *   * `M`: comment
+     * @returns true if directive was added.
+     */
+    function addDirective(tDirectives, name, location, maxPriority) {
+      var match = false;
+      if (hasDirectives.hasOwnProperty(name)) {
+        for(var directive, directives = $injector.get(name + Suffix),
+            i = 0, ii = directives.length; i<ii; i++) {
+          try {
+            directive = directives[i];
+            if ( (maxPriority === undefined || maxPriority > directive.priority) &&
+                 directive.restrict.indexOf(location) != -1) {
+              tDirectives.push(directive);
+              match = true;
+            }
+          } catch(e) { $exceptionHandler(e); }
+        }
+      }
+      return match;
+    }
+
+
+    /**
+     * When the element is replaced with HTML template then the new attributes
+     * on the template need to be merged with the existing attributes in the DOM.
+     * The desired effect is to have both of the attributes present.
+     *
+     * @param {object} dst destination attributes (original DOM)
+     * @param {object} src source attributes (from the directive template)
+     */
+    function mergeTemplateAttributes(dst, src) {
+      var srcAttr = src.$attr,
+          dstAttr = dst.$attr,
+          $element = dst.$$element;
+
+      // reapply the old attributes to the new element
+      forEach(dst, function(value, key) {
+        if (key.charAt(0) != '$') {
+          if (src[key]) {
+            value += (key === 'style' ? ';' : ' ') + src[key];
+          }
+          dst.$set(key, value, true, srcAttr[key]);
+        }
+      });
+
+      // copy the new attributes on the old attrs object
+      forEach(src, function(value, key) {
+        if (key == 'class') {
+          safeAddClass($element, value);
+          dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;
+        } else if (key == 'style') {
+          $element.attr('style', $element.attr('style') + ';' + value);
+        } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {
+          dst[key] = value;
+          dstAttr[key] = srcAttr[key];
+        }
+      });
+    }
+
+
+    function compileTemplateUrl(directives, beforeTemplateNodeLinkFn, $compileNode, tAttrs,
+        $rootElement, replace, childTranscludeFn) {
+      var linkQueue = [],
+          afterTemplateNodeLinkFn,
+          afterTemplateChildLinkFn,
+          beforeTemplateCompileNode = $compileNode[0],
+          origAsyncDirective = directives.shift(),
+          // The fact that we have to copy and patch the directive seems wrong!
+          derivedSyncDirective = extend({}, origAsyncDirective, {
+            controller: null, templateUrl: null, transclude: null, scope: null
+          });
+
+      $compileNode.html('');
+
+      $http.get(origAsyncDirective.templateUrl, {cache: $templateCache}).
+        success(function(content) {
+          var compileNode, tempTemplateAttrs, $template;
+
+          content = denormalizeTemplate(content);
+
+          if (replace) {
+            $template = jqLite('<div>' + trim(content) + '</div>').contents();
+            compileNode = $template[0];
+
+            if ($template.length != 1 || compileNode.nodeType !== 1) {
+              throw new Error(MULTI_ROOT_TEMPLATE_ERROR + content);
+            }
+
+            tempTemplateAttrs = {$attr: {}};
+            replaceWith($rootElement, $compileNode, compileNode);
+            collectDirectives(compileNode, directives, tempTemplateAttrs);
+            mergeTemplateAttributes(tAttrs, tempTemplateAttrs);
+          } else {
+            compileNode = beforeTemplateCompileNode;
+            $compileNode.html(content);
+          }
+
+          directives.unshift(derivedSyncDirective);
+          afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, childTranscludeFn);
+          afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);
+
+
+          while(linkQueue.length) {
+            var controller = linkQueue.pop(),
+                linkRootElement = linkQueue.pop(),
+                beforeTemplateLinkNode = linkQueue.pop(),
+                scope = linkQueue.pop(),
+                linkNode = compileNode;
+
+            if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {
+              // it was cloned therefore we have to clone as well.
+              linkNode = JQLiteClone(compileNode);
+              replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);
+            }
+
+            afterTemplateNodeLinkFn(function() {
+              beforeTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, controller);
+            }, scope, linkNode, $rootElement, controller);
+          }
+          linkQueue = null;
+        }).
+        error(function(response, code, headers, config) {
+          throw Error('Failed to load template: ' + config.url);
+        });
+
+      return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, controller) {
+        if (linkQueue) {
+          linkQueue.push(scope);
+          linkQueue.push(node);
+          linkQueue.push(rootElement);
+          linkQueue.push(controller);
+        } else {
+          afterTemplateNodeLinkFn(function() {
+            beforeTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, controller);
+          }, scope, node, rootElement, controller);
+        }
+      };
+    }
+
+
+    /**
+     * Sorting function for bound directives.
+     */
+    function byPriority(a, b) {
+      return b.priority - a.priority;
+    }
+
+
+    function assertNoDuplicate(what, previousDirective, directive, element) {
+      if (previousDirective) {
+        throw Error('Multiple directives [' + previousDirective.name + ', ' +
+          directive.name + '] asking for ' + what + ' on: ' +  startingTag(element));
+      }
+    }
+
+
+    function addTextInterpolateDirective(directives, text) {
+      var interpolateFn = $interpolate(text, true);
+      if (interpolateFn) {
+        directives.push({
+          priority: 0,
+          compile: valueFn(function textInterpolateLinkFn(scope, node) {
+            var parent = node.parent(),
+                bindings = parent.data('$binding') || [];
+            bindings.push(interpolateFn);
+            safeAddClass(parent.data('$binding', bindings), 'ng-binding');
+            scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {
+              node[0].nodeValue = value;
+            });
+          })
+        });
+      }
+    }
+
+
+    function addAttrInterpolateDirective(node, directives, value, name) {
+      var interpolateFn = $interpolate(value, true);
+
+      // no interpolation found -> ignore
+      if (!interpolateFn) return;
+
+
+      directives.push({
+        priority: 100,
+        compile: valueFn(function attrInterpolateLinkFn(scope, element, attr) {
+          var $$observers = (attr.$$observers || (attr.$$observers = {}));
+
+          if (name === 'class') {
+            // we need to interpolate classes again, in the case the element was replaced
+            // and therefore the two class attrs got merged - we want to interpolate the result
+            interpolateFn = $interpolate(attr[name], true);
+          }
+
+          attr[name] = undefined;
+          ($$observers[name] || ($$observers[name] = [])).$$inter = true;
+          (attr.$$observers && attr.$$observers[name].$$scope || scope).
+            $watch(interpolateFn, function interpolateFnWatchAction(value) {
+              attr.$set(name, value);
+            });
+        })
+      });
+    }
+
+
+    /**
+     * This is a special jqLite.replaceWith, which can replace items which
+     * have no parents, provided that the containing jqLite collection is provided.
+     *
+     * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes
+     *    in the root of the tree.
+     * @param {JqLite} $element The jqLite element which we are going to replace. We keep the shell,
+     *    but replace its DOM node reference.
+     * @param {Node} newNode The new DOM node.
+     */
+    function replaceWith($rootElement, $element, newNode) {
+      var oldNode = $element[0],
+          parent = oldNode.parentNode,
+          i, ii;
+
+      if ($rootElement) {
+        for(i = 0, ii = $rootElement.length; i < ii; i++) {
+          if ($rootElement[i] == oldNode) {
+            $rootElement[i] = newNode;
+            break;
+          }
+        }
+      }
+
+      if (parent) {
+        parent.replaceChild(newNode, oldNode);
+      }
+
+      newNode[jqLite.expando] = oldNode[jqLite.expando];
+      $element[0] = newNode;
+    }
+  }];
+}
+
+var PREFIX_REGEXP = /^(x[\:\-_]|data[\:\-_])/i;
+/**
+ * Converts all accepted directives format into proper directive name.
+ * All of these will become 'myDirective':
+ *   my:DiRective
+ *   my-directive
+ *   x-my-directive
+ *   data-my:directive
+ *
+ * Also there is special case for Moz prefix starting with upper case letter.
+ * @param name Name to normalize
+ */
+function directiveNormalize(name) {
+  return camelCase(name.replace(PREFIX_REGEXP, ''));
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$compile.directive.Attributes
+ * @description
+ *
+ * A shared object between directive compile / linking functions which contains normalized DOM element
+ * attributes. The the values reflect current binding state `{{ }}`. The normalization is needed
+ * since all of these are treated as equivalent in Angular:
+ *
+ *          <span ng:bind="a" ng-bind="a" data-ng-bind="a" x-ng-bind="a">
+ */
+
+/**
+ * @ngdoc property
+ * @name ng.$compile.directive.Attributes#$attr
+ * @propertyOf ng.$compile.directive.Attributes
+ * @returns {object} A map of DOM element attribute names to the normalized name. This is
+ *          needed to do reverse lookup from normalized name back to actual name.
+ */
+
+
+/**
+ * @ngdoc function
+ * @name ng.$compile.directive.Attributes#$set
+ * @methodOf ng.$compile.directive.Attributes
+ * @function
+ *
+ * @description
+ * Set DOM element attribute value.
+ *
+ *
+ * @param {string} name Normalized element attribute name of the property to modify. The name is
+ *          revers translated using the {@link ng.$compile.directive.Attributes#$attr $attr}
+ *          property to the original name.
+ * @param {string} value Value to set the attribute to.
+ */
+
+
+
+/**
+ * Closure compiler type information
+ */
+
+function nodesetLinkingFn(
+  /* angular.Scope */ scope,
+  /* NodeList */ nodeList,
+  /* Element */ rootElement,
+  /* function(Function) */ boundTranscludeFn
+){}
+
+function directiveLinkingFn(
+  /* nodesetLinkingFn */ nodesetLinkingFn,
+  /* angular.Scope */ scope,
+  /* Node */ node,
+  /* Element */ rootElement,
+  /* function(Function) */ boundTranscludeFn
+){}
+
+/**
+ * @ngdoc object
+ * @name ng.$controllerProvider
+ * @description
+ * The {@link ng.$controller $controller service} is used by Angular to create new
+ * controllers.
+ *
+ * This provider allows controller registration via the
+ * {@link ng.$controllerProvider#register register} method.
+ */
+function $ControllerProvider() {
+  var controllers = {};
+
+
+  /**
+   * @ngdoc function
+   * @name ng.$controllerProvider#register
+   * @methodOf ng.$controllerProvider
+   * @param {string} name Controller name
+   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI
+   *    annotations in the array notation).
+   */
+  this.register = function(name, constructor) {
+    if (isObject(name)) {
+      extend(controllers, name)
+    } else {
+      controllers[name] = constructor;
+    }
+  };
+
+
+  this.$get = ['$injector', '$window', function($injector, $window) {
+
+    /**
+     * @ngdoc function
+     * @name ng.$controller
+     * @requires $injector
+     *
+     * @param {Function|string} constructor If called with a function then it's considered to be the
+     *    controller constructor function. Otherwise it's considered to be a string which is used
+     *    to retrieve the controller constructor using the following steps:
+     *
+     *    * check if a controller with given name is registered via `$controllerProvider`
+     *    * check if evaluating the string on the current scope returns a constructor
+     *    * check `window[constructor]` on the global `window` object
+     *
+     * @param {Object} locals Injection locals for Controller.
+     * @return {Object} Instance of given controller.
+     *
+     * @description
+     * `$controller` service is responsible for instantiating controllers.
+     *
+     * It's just a simple call to {@link AUTO.$injector $injector}, but extracted into
+     * a service, so that one can override this service with {@link https://gist.github.com/1649788
+     * BC version}.
+     */
+    return function(constructor, locals) {
+      if(isString(constructor)) {
+        var name = constructor;
+        constructor = controllers.hasOwnProperty(name)
+            ? controllers[name]
+            : getter(locals.$scope, name, true) || getter($window, name, true);
+
+        assertArgFn(constructor, name, true);
+      }
+
+      return $injector.instantiate(constructor, locals);
+    };
+  }];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$document
+ * @requires $window
+ *
+ * @description
+ * A {@link angular.element jQuery (lite)}-wrapped reference to the browser's `window.document`
+ * element.
+ */
+function $DocumentProvider(){
+  this.$get = ['$window', function(window){
+    return jqLite(window.document);
+  }];
+}
+
+/**
+ * @ngdoc function
+ * @name ng.$exceptionHandler
+ * @requires $log
+ *
+ * @description
+ * Any uncaught exception in angular expressions is delegated to this service.
+ * The default implementation simply delegates to `$log.error` which logs it into
+ * the browser console.
+ *
+ * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by
+ * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.
+ *
+ * @param {Error} exception Exception associated with the error.
+ * @param {string=} cause optional information about the context in which
+ *       the error was thrown.
+ *
+ */
+function $ExceptionHandlerProvider() {
+  this.$get = ['$log', function($log) {
+    return function(exception, cause) {
+      $log.error.apply($log, arguments);
+    };
+  }];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$interpolateProvider
+ * @function
+ *
+ * @description
+ *
+ * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.
+ */
+function $InterpolateProvider() {
+  var startSymbol = '{{';
+  var endSymbol = '}}';
+
+  /**
+   * @ngdoc method
+   * @name ng.$interpolateProvider#startSymbol
+   * @methodOf ng.$interpolateProvider
+   * @description
+   * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.
+   *
+   * @param {string=} value new value to set the starting symbol to.
+   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.
+   */
+  this.startSymbol = function(value){
+    if (value) {
+      startSymbol = value;
+      return this;
+    } else {
+      return startSymbol;
+    }
+  };
+
+  /**
+   * @ngdoc method
+   * @name ng.$interpolateProvider#endSymbol
+   * @methodOf ng.$interpolateProvider
+   * @description
+   * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.
+   *
+   * @param {string=} value new value to set the ending symbol to.
+   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.
+   */
+  this.endSymbol = function(value){
+    if (value) {
+      endSymbol = value;
+      return this;
+    } else {
+      return endSymbol;
+    }
+  };
+
+
+  this.$get = ['$parse', function($parse) {
+    var startSymbolLength = startSymbol.length,
+        endSymbolLength = endSymbol.length;
+
+    /**
+     * @ngdoc function
+     * @name ng.$interpolate
+     * @function
+     *
+     * @requires $parse
+     *
+     * @description
+     *
+     * Compiles a string with markup into an interpolation function. This service is used by the
+     * HTML {@link ng.$compile $compile} service for data binding. See
+     * {@link ng.$interpolateProvider $interpolateProvider} for configuring the
+     * interpolation markup.
+     *
+     *
+       <pre>
+         var $interpolate = ...; // injected
+         var exp = $interpolate('Hello {{name}}!');
+         expect(exp({name:'Angular'}).toEqual('Hello Angular!');
+       </pre>
+     *
+     *
+     * @param {string} text The text with markup to interpolate.
+     * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have
+     *    embedded expression in order to return an interpolation function. Strings with no
+     *    embedded expression will return null for the interpolation function.
+     * @returns {function(context)} an interpolation function which is used to compute the interpolated
+     *    string. The function has these parameters:
+     *
+     *    * `context`: an object against which any expressions embedded in the strings are evaluated
+     *      against.
+     *
+     */
+    function $interpolate(text, mustHaveExpression) {
+      var startIndex,
+          endIndex,
+          index = 0,
+          parts = [],
+          length = text.length,
+          hasInterpolation = false,
+          fn,
+          exp,
+          concat = [];
+
+      while(index < length) {
+        if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) &&
+             ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) {
+          (index != startIndex) && parts.push(text.substring(index, startIndex));
+          parts.push(fn = $parse(exp = text.substring(startIndex + startSymbolLength, endIndex)));
+          fn.exp = exp;
+          index = endIndex + endSymbolLength;
+          hasInterpolation = true;
+        } else {
+          // we did not find anything, so we have to add the remainder to the parts array
+          (index != length) && parts.push(text.substring(index));
+          index = length;
+        }
+      }
+
+      if (!(length = parts.length)) {
+        // we added, nothing, must have been an empty string.
+        parts.push('');
+        length = 1;
+      }
+
+      if (!mustHaveExpression  || hasInterpolation) {
+        concat.length = length;
+        fn = function(context) {
+          for(var i = 0, ii = length, part; i<ii; i++) {
+            if (typeof (part = parts[i]) == 'function') {
+              part = part(context);
+              if (part == null || part == undefined) {
+                part = '';
+              } else if (typeof part != 'string') {
+                part = toJson(part);
+              }
+            }
+            concat[i] = part;
+          }
+          return concat.join('');
+        };
+        fn.exp = text;
+        fn.parts = parts;
+        return fn;
+      }
+    }
+
+
+    /**
+     * @ngdoc method
+     * @name ng.$interpolate#startSymbol
+     * @methodOf ng.$interpolate
+     * @description
+     * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.
+     *
+     * Use {@link ng.$interpolateProvider#startSymbol $interpolateProvider#startSymbol} to change
+     * the symbol.
+     *
+     * @returns {string} start symbol.
+     */
+    $interpolate.startSymbol = function() {
+      return startSymbol;
+    }
+
+
+    /**
+     * @ngdoc method
+     * @name ng.$interpolate#endSymbol
+     * @methodOf ng.$interpolate
+     * @description
+     * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.
+     *
+     * Use {@link ng.$interpolateProvider#endSymbol $interpolateProvider#endSymbol} to change
+     * the symbol.
+     *
+     * @returns {string} start symbol.
+     */
+    $interpolate.endSymbol = function() {
+      return endSymbol;
+    }
+
+    return $interpolate;
+  }];
+}
+
+var URL_MATCH = /^([^:]+):\/\/(\w+:{0,1}\w*@)?(\{?[\w\.-]*\}?)(:([0-9]+))?(\/[^\?#]*)?(\?([^#]*))?(#(.*))?$/,
+    PATH_MATCH = /^([^\?#]*)?(\?([^#]*))?(#(.*))?$/,
+    HASH_MATCH = PATH_MATCH,
+    DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};
+
+
+/**
+ * Encode path using encodeUriSegment, ignoring forward slashes
+ *
+ * @param {string} path Path to encode
+ * @returns {string}
+ */
+function encodePath(path) {
+  var segments = path.split('/'),
+      i = segments.length;
+
+  while (i--) {
+    segments[i] = encodeUriSegment(segments[i]);
+  }
+
+  return segments.join('/');
+}
+
+function stripHash(url) {
+  return url.split('#')[0];
+}
+
+
+function matchUrl(url, obj) {
+  var match = URL_MATCH.exec(url);
+
+  match = {
+      protocol: match[1],
+      host: match[3],
+      port: int(match[5]) || DEFAULT_PORTS[match[1]] || null,
+      path: match[6] || '/',
+      search: match[8],
+      hash: match[10]
+    };
+
+  if (obj) {
+    obj.$$protocol = match.protocol;
+    obj.$$host = match.host;
+    obj.$$port = match.port;
+  }
+
+  return match;
+}
+
+
+function composeProtocolHostPort(protocol, host, port) {
+  return protocol + '://' + host + (port == DEFAULT_PORTS[protocol] ? '' : ':' + port);
+}
+
+
+function pathPrefixFromBase(basePath) {
+  return basePath.substr(0, basePath.lastIndexOf('/'));
+}
+
+
+function convertToHtml5Url(url, basePath, hashPrefix) {
+  var match = matchUrl(url);
+
+  // already html5 url
+  if (decodeURIComponent(match.path) != basePath || isUndefined(match.hash) ||
+      match.hash.indexOf(hashPrefix) !== 0) {
+    return url;
+  // convert hashbang url -> html5 url
+  } else {
+    return composeProtocolHostPort(match.protocol, match.host, match.port) +
+           pathPrefixFromBase(basePath) + match.hash.substr(hashPrefix.length);
+  }
+}
+
+
+function convertToHashbangUrl(url, basePath, hashPrefix) {
+  var match = matchUrl(url);
+
+  // already hashbang url
+  if (decodeURIComponent(match.path) == basePath && !isUndefined(match.hash) &&
+      match.hash.indexOf(hashPrefix) === 0) {
+    return url;
+  // convert html5 url -> hashbang url
+  } else {
+    var search = match.search && '?' + match.search || '',
+        hash = match.hash && '#' + match.hash || '',
+        pathPrefix = pathPrefixFromBase(basePath),
+        path = match.path.substr(pathPrefix.length);
+
+    if (match.path.indexOf(pathPrefix) !== 0) {
+      throw Error('Invalid url "' + url + '", missing path prefix "' + pathPrefix + '" !');
+    }
+
+    return composeProtocolHostPort(match.protocol, match.host, match.port) + basePath +
+           '#' + hashPrefix + path + search + hash;
+  }
+}
+
+
+/**
+ * LocationUrl represents an url
+ * This object is exposed as $location service when HTML5 mode is enabled and supported
+ *
+ * @constructor
+ * @param {string} url HTML5 url
+ * @param {string} pathPrefix
+ */
+function LocationUrl(url, pathPrefix, appBaseUrl) {
+  pathPrefix = pathPrefix || '';
+
+  /**
+   * Parse given html5 (regular) url string into properties
+   * @param {string} newAbsoluteUrl HTML5 url
+   * @private
+   */
+  this.$$parse = function(newAbsoluteUrl) {
+    var match = matchUrl(newAbsoluteUrl, this);
+
+    if (match.path.indexOf(pathPrefix) !== 0) {
+      throw Error('Invalid url "' + newAbsoluteUrl + '", missing path prefix "' + pathPrefix + '" !');
+    }
+
+    this.$$path = decodeURIComponent(match.path.substr(pathPrefix.length));
+    this.$$search = parseKeyValue(match.search);
+    this.$$hash = match.hash && decodeURIComponent(match.hash) || '';
+
+    this.$$compose();
+  };
+
+  /**
+   * Compose url and update `absUrl` property
+   * @private
+   */
+  this.$$compose = function() {
+    var search = toKeyValue(this.$$search),
+        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
+
+    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
+    this.$$absUrl = composeProtocolHostPort(this.$$protocol, this.$$host, this.$$port) +
+                    pathPrefix + this.$$url;
+  };
+
+
+  this.$$rewriteAppUrl = function(absoluteLinkUrl) {
+    if(absoluteLinkUrl.indexOf(appBaseUrl) == 0) {
+      return absoluteLinkUrl;
+    }
+  }
+
+
+  this.$$parse(url);
+}
+
+
+/**
+ * LocationHashbangUrl represents url
+ * This object is exposed as $location service when html5 history api is disabled or not supported
+ *
+ * @constructor
+ * @param {string} url Legacy url
+ * @param {string} hashPrefix Prefix for hash part (containing path and search)
+ */
+function LocationHashbangUrl(url, hashPrefix, appBaseUrl) {
+  var basePath;
+
+  /**
+   * Parse given hashbang url into properties
+   * @param {string} url Hashbang url
+   * @private
+   */
+  this.$$parse = function(url) {
+    var match = matchUrl(url, this);
+
+
+    if (match.hash && match.hash.indexOf(hashPrefix) !== 0) {
+      throw Error('Invalid url "' + url + '", missing hash prefix "' + hashPrefix + '" !');
+    }
+
+    basePath = match.path + (match.search ? '?' + match.search : '');
+    match = HASH_MATCH.exec((match.hash || '').substr(hashPrefix.length));
+    if (match[1]) {
+      this.$$path = (match[1].charAt(0) == '/' ? '' : '/') + decodeURIComponent(match[1]);
+    } else {
+      this.$$path = '';
+    }
+
+    this.$$search = parseKeyValue(match[3]);
+    this.$$hash = match[5] && decodeURIComponent(match[5]) || '';
+
+    this.$$compose();
+  };
+
+  /**
+   * Compose hashbang url and update `absUrl` property
+   * @private
+   */
+  this.$$compose = function() {
+    var search = toKeyValue(this.$$search),
+        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
+
+    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
+    this.$$absUrl = composeProtocolHostPort(this.$$protocol, this.$$host, this.$$port) +
+                    basePath + (this.$$url ? '#' + hashPrefix + this.$$url : '');
+  };
+
+  this.$$rewriteAppUrl = function(absoluteLinkUrl) {
+    if(absoluteLinkUrl.indexOf(appBaseUrl) == 0) {
+      return absoluteLinkUrl;
+    }
+  }
+
+
+  this.$$parse(url);
+}
+
+
+LocationUrl.prototype = {
+
+  /**
+   * Has any change been replacing ?
+   * @private
+   */
+  $$replace: false,
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#absUrl
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter only.
+   *
+   * Return full url representation with all segments encoded according to rules specified in
+   * {@link http://www.ietf.org/rfc/rfc3986.txt RFC 3986}.
+   *
+   * @return {string} full url
+   */
+  absUrl: locationGetter('$$absUrl'),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#url
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter / setter.
+   *
+   * Return url (e.g. `/path?a=b#hash`) when called without any parameter.
+   *
+   * Change path, search and hash, when called with parameter and return `$location`.
+   *
+   * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)
+   * @return {string} url
+   */
+  url: function(url, replace) {
+    if (isUndefined(url))
+      return this.$$url;
+
+    var match = PATH_MATCH.exec(url);
+    if (match[1]) this.path(decodeURIComponent(match[1]));
+    if (match[2] || match[1]) this.search(match[3] || '');
+    this.hash(match[5] || '', replace);
+
+    return this;
+  },
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#protocol
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter only.
+   *
+   * Return protocol of current url.
+   *
+   * @return {string} protocol of current url
+   */
+  protocol: locationGetter('$$protocol'),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#host
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter only.
+   *
+   * Return host of current url.
+   *
+   * @return {string} host of current url.
+   */
+  host: locationGetter('$$host'),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#port
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter only.
+   *
+   * Return port of current url.
+   *
+   * @return {Number} port
+   */
+  port: locationGetter('$$port'),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#path
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter / setter.
+   *
+   * Return path of current url when called without any parameter.
+   *
+   * Change path when called with parameter and return `$location`.
+   *
+   * Note: Path should always begin with forward slash (/), this method will add the forward slash
+   * if it is missing.
+   *
+   * @param {string=} path New path
+   * @return {string} path
+   */
+  path: locationGetterSetter('$$path', function(path) {
+    return path.charAt(0) == '/' ? path : '/' + path;
+  }),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#search
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter / setter.
+   *
+   * Return search part (as object) of current url when called without any parameter.
+   *
+   * Change search part when called with parameter and return `$location`.
+   *
+   * @param {string|object<string,string>=} search New search params - string or hash object
+   * @param {string=} paramValue If `search` is a string, then `paramValue` will override only a
+   *    single search parameter. If the value is `null`, the parameter will be deleted.
+   *
+   * @return {string} search
+   */
+  search: function(search, paramValue) {
+    if (isUndefined(search))
+      return this.$$search;
+
+    if (isDefined(paramValue)) {
+      if (paramValue === null) {
+        delete this.$$search[search];
+      } else {
+        this.$$search[search] = paramValue;
+      }
+    } else {
+      this.$$search = isString(search) ? parseKeyValue(search) : search;
+    }
+
+    this.$$compose();
+    return this;
+  },
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#hash
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter / setter.
+   *
+   * Return hash fragment when called without any parameter.
+   *
+   * Change hash fragment when called with parameter and return `$location`.
+   *
+   * @param {string=} hash New hash fragment
+   * @return {string} hash
+   */
+  hash: locationGetterSetter('$$hash', identity),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#replace
+   * @methodOf ng.$location
+   *
+   * @description
+   * If called, all changes to $location during current `$digest` will be replacing current history
+   * record, instead of adding new one.
+   */
+  replace: function() {
+    this.$$replace = true;
+    return this;
+  }
+};
+
+LocationHashbangUrl.prototype = inherit(LocationUrl.prototype);
+
+function LocationHashbangInHtml5Url(url, hashPrefix, appBaseUrl, baseExtra) {
+  LocationHashbangUrl.apply(this, arguments);
+
+
+  this.$$rewriteAppUrl = function(absoluteLinkUrl) {
+    if (absoluteLinkUrl.indexOf(appBaseUrl) == 0) {
+      return appBaseUrl + baseExtra + '#' + hashPrefix  + absoluteLinkUrl.substr(appBaseUrl.length);
+    }
+  }
+}
+
+LocationHashbangInHtml5Url.prototype = inherit(LocationHashbangUrl.prototype);
+
+function locationGetter(property) {
+  return function() {
+    return this[property];
+  };
+}
+
+
+function locationGetterSetter(property, preprocess) {
+  return function(value) {
+    if (isUndefined(value))
+      return this[property];
+
+    this[property] = preprocess(value);
+    this.$$compose();
+
+    return this;
+  };
+}
+
+
+/**
+ * @ngdoc object
+ * @name ng.$location
+ *
+ * @requires $browser
+ * @requires $sniffer
+ * @requires $rootElement
+ *
+ * @description
+ * The $location service parses the URL in the browser address bar (based on the
+ * {@link https://developer.mozilla.org/en/window.location window.location}) and makes the URL
+ * available to your application. Changes to the URL in the address bar are reflected into
+ * $location service and changes to $location are reflected into the browser address bar.
+ *
+ * **The $location service:**
+ *
+ * - Exposes the current URL in the browser address bar, so you can
+ *   - Watch and observe the URL.
+ *   - Change the URL.
+ * - Synchronizes the URL with the browser when the user
+ *   - Changes the address bar.
+ *   - Clicks the back or forward button (or clicks a History link).
+ *   - Clicks on a link.
+ * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).
+ *
+ * For more information see {@link guide/dev_guide.services.$location Developer Guide: Angular
+ * Services: Using $location}
+ */
+
+/**
+ * @ngdoc object
+ * @name ng.$locationProvider
+ * @description
+ * Use the `$locationProvider` to configure how the application deep linking paths are stored.
+ */
+function $LocationProvider(){
+  var hashPrefix = '',
+      html5Mode = false;
+
+  /**
+   * @ngdoc property
+   * @name ng.$locationProvider#hashPrefix
+   * @methodOf ng.$locationProvider
+   * @description
+   * @param {string=} prefix Prefix for hash part (containing path and search)
+   * @returns {*} current value if used as getter or itself (chaining) if used as setter
+   */
+  this.hashPrefix = function(prefix) {
+    if (isDefined(prefix)) {
+      hashPrefix = prefix;
+      return this;
+    } else {
+      return hashPrefix;
+    }
+  };
+
+  /**
+   * @ngdoc property
+   * @name ng.$locationProvider#html5Mode
+   * @methodOf ng.$locationProvider
+   * @description
+   * @param {string=} mode Use HTML5 strategy if available.
+   * @returns {*} current value if used as getter or itself (chaining) if used as setter
+   */
+  this.html5Mode = function(mode) {
+    if (isDefined(mode)) {
+      html5Mode = mode;
+      return this;
+    } else {
+      return html5Mode;
+    }
+  };
+
+  this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',
+      function( $rootScope,   $browser,   $sniffer,   $rootElement) {
+    var $location,
+        basePath,
+        pathPrefix,
+        initUrl = $browser.url(),
+        initUrlParts = matchUrl(initUrl),
+        appBaseUrl;
+
+    if (html5Mode) {
+      basePath = $browser.baseHref() || '/';
+      pathPrefix = pathPrefixFromBase(basePath);
+      appBaseUrl =
+          composeProtocolHostPort(initUrlParts.protocol, initUrlParts.host, initUrlParts.port) +
+          pathPrefix + '/';
+
+      if ($sniffer.history) {
+        $location = new LocationUrl(
+          convertToHtml5Url(initUrl, basePath, hashPrefix),
+          pathPrefix, appBaseUrl);
+      } else {
+        $location = new LocationHashbangInHtml5Url(
+          convertToHashbangUrl(initUrl, basePath, hashPrefix),
+          hashPrefix, appBaseUrl, basePath.substr(pathPrefix.length + 1));
+      }
+    } else {
+      appBaseUrl =
+          composeProtocolHostPort(initUrlParts.protocol, initUrlParts.host, initUrlParts.port) +
+          (initUrlParts.path || '') +
+          (initUrlParts.search ? ('?' + initUrlParts.search) : '') +
+          '#' + hashPrefix + '/';
+
+      $location = new LocationHashbangUrl(initUrl, hashPrefix, appBaseUrl);
+    }
+
+    $rootElement.bind('click', function(event) {
+      // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
+      // currently we open nice url link and redirect then
+
+      if (event.ctrlKey || event.metaKey || event.which == 2) return;
+
+      var elm = jqLite(event.target);
+
+      // traverse the DOM up to find first A tag
+      while (lowercase(elm[0].nodeName) !== 'a') {
+        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)
+        if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;
+      }
+
+      var absHref = elm.prop('href'),
+          rewrittenUrl = $location.$$rewriteAppUrl(absHref);
+
+      if (absHref && !elm.attr('target') && rewrittenUrl) {
+        // update location manually
+        $location.$$parse(rewrittenUrl);
+        $rootScope.$apply();
+        event.preventDefault();
+        // hack to work around FF6 bug 684208 when scenario runner clicks on links
+        window.angular['ff-684208-preventDefault'] = true;
+      }
+    });
+
+
+    // rewrite hashbang url <> html5 url
+    if ($location.absUrl() != initUrl) {
+      $browser.url($location.absUrl(), true);
+    }
+
+    // update $location when $browser url changes
+    $browser.onUrlChange(function(newUrl) {
+      if ($location.absUrl() != newUrl) {
+        if ($rootScope.$broadcast('$locationChangeStart', newUrl, $location.absUrl()).defaultPrevented) {
+          $browser.url($location.absUrl());
+          return;
+        }
+        $rootScope.$evalAsync(function() {
+          var oldUrl = $location.absUrl();
+
+          $location.$$parse(newUrl);
+          afterLocationChange(oldUrl);
+        });
+        if (!$rootScope.$$phase) $rootScope.$digest();
+      }
+    });
+
+    // update browser
+    var changeCounter = 0;
+    $rootScope.$watch(function $locationWatch() {
+      var oldUrl = $browser.url();
+      var currentReplace = $location.$$replace;
+
+      if (!changeCounter || oldUrl != $location.absUrl()) {
+        changeCounter++;
+        $rootScope.$evalAsync(function() {
+          if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).
+              defaultPrevented) {
+            $location.$$parse(oldUrl);
+          } else {
+            $browser.url($location.absUrl(), currentReplace);
+            afterLocationChange(oldUrl);
+          }
+        });
+      }
+      $location.$$replace = false;
+
+      return changeCounter;
+    });
+
+    return $location;
+
+    function afterLocationChange(oldUrl) {
+      $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl);
+    }
+}];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$log
+ * @requires $window
+ *
+ * @description
+ * Simple service for logging. Default implementation writes the message
+ * into the browser's console (if present).
+ *
+ * The main purpose of this service is to simplify debugging and troubleshooting.
+ *
+ * @example
+   <example>
+     <file name="script.js">
+       function LogCtrl($scope, $log) {
+         $scope.$log = $log;
+         $scope.message = 'Hello World!';
+       }
+     </file>
+     <file name="index.html">
+       <div ng-controller="LogCtrl">
+         <p>Reload this page with open console, enter text and hit the log button...</p>
+         Message:
+         <input type="text" ng-model="message"/>
+         <button ng-click="$log.log(message)">log</button>
+         <button ng-click="$log.warn(message)">warn</button>
+         <button ng-click="$log.info(message)">info</button>
+         <button ng-click="$log.error(message)">error</button>
+       </div>
+     </file>
+   </example>
+ */
+
+function $LogProvider(){
+  this.$get = ['$window', function($window){
+    return {
+      /**
+       * @ngdoc method
+       * @name ng.$log#log
+       * @methodOf ng.$log
+       *
+       * @description
+       * Write a log message
+       */
+      log: consoleLog('log'),
+
+      /**
+       * @ngdoc method
+       * @name ng.$log#warn
+       * @methodOf ng.$log
+       *
+       * @description
+       * Write a warning message
+       */
+      warn: consoleLog('warn'),
+
+      /**
+       * @ngdoc method
+       * @name ng.$log#info
+       * @methodOf ng.$log
+       *
+       * @description
+       * Write an information message
+       */
+      info: consoleLog('info'),
+
+      /**
+       * @ngdoc method
+       * @name ng.$log#error
+       * @methodOf ng.$log
+       *
+       * @description
+       * Write an error message
+       */
+      error: consoleLog('error')
+    };
+
+    function formatError(arg) {
+      if (arg instanceof Error) {
+        if (arg.stack) {
+          arg = (arg.message && arg.stack.indexOf(arg.message) === -1)
+              ? 'Error: ' + arg.message + '\n' + arg.stack
+              : arg.stack;
+        } else if (arg.sourceURL) {
+          arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line;
+        }
+      }
+      return arg;
+    }
+
+    function consoleLog(type) {
+      var console = $window.console || {},
+          logFn = console[type] || console.log || noop;
+
+      if (logFn.apply) {
+        return function() {
+          var args = [];
+          forEach(arguments, function(arg) {
+            args.push(formatError(arg));
+          });
+          return logFn.apply(console, args);
+        };
+      }
+
+      // we are IE which either doesn't have window.console => this is noop and we do nothing,
+      // or we are IE where console.log doesn't have apply so we log at least first 2 args
+      return function(arg1, arg2) {
+        logFn(arg1, arg2);
+      }
+    }
+  }];
+}
+
+var OPERATORS = {
+    'null':function(){return null;},
+    'true':function(){return true;},
+    'false':function(){return false;},
+    undefined:noop,
+    '+':function(self, locals, a,b){
+      a=a(self, locals); b=b(self, locals);
+      if (isDefined(a)) {
+        if (isDefined(b)) {
+          return a + b;
+        }
+        return a;
+      }
+      return isDefined(b)?b:undefined;},
+    '-':function(self, locals, a,b){a=a(self, locals); b=b(self, locals); return (isDefined(a)?a:0)-(isDefined(b)?b:0);},
+    '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);},
+    '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);},
+    '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);},
+    '^':function(self, locals, a,b){return a(self, locals)^b(self, locals);},
+    '=':noop,
+    '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);},
+    '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);},
+    '<':function(self, locals, a,b){return a(self, locals)<b(self, locals);},
+    '>':function(self, locals, a,b){return a(self, locals)>b(self, locals);},
+    '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);},
+    '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);},
+    '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);},
+    '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);},
+    '&':function(self, locals, a,b){return a(self, locals)&b(self, locals);},
+//    '|':function(self, locals, a,b){return a|b;},
+    '|':function(self, locals, a,b){return b(self, locals)(self, locals, a(self, locals));},
+    '!':function(self, locals, a){return !a(self, locals);}
+};
+var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'};
+
+function lex(text, csp){
+  var tokens = [],
+      token,
+      index = 0,
+      json = [],
+      ch,
+      lastCh = ':'; // can start regexp
+
+  while (index < text.length) {
+    ch = text.charAt(index);
+    if (is('"\'')) {
+      readString(ch);
+    } else if (isNumber(ch) || is('.') && isNumber(peek())) {
+      readNumber();
+    } else if (isIdent(ch)) {
+      readIdent();
+      // identifiers can only be if the preceding char was a { or ,
+      if (was('{,') && json[0]=='{' &&
+         (token=tokens[tokens.length-1])) {
+        token.json = token.text.indexOf('.') == -1;
+      }
+    } else if (is('(){}[].,;:')) {
+      tokens.push({
+        index:index,
+        text:ch,
+        json:(was(':[,') && is('{[')) || is('}]:,')
+      });
+      if (is('{[')) json.unshift(ch);
+      if (is('}]')) json.shift();
+      index++;
+    } else if (isWhitespace(ch)) {
+      index++;
+      continue;
+    } else {
+      var ch2 = ch + peek(),
+          fn = OPERATORS[ch],
+          fn2 = OPERATORS[ch2];
+      if (fn2) {
+        tokens.push({index:index, text:ch2, fn:fn2});
+        index += 2;
+      } else if (fn) {
+        tokens.push({index:index, text:ch, fn:fn, json: was('[,:') && is('+-')});
+        index += 1;
+      } else {
+        throwError("Unexpected next character ", index, index+1);
+      }
+    }
+    lastCh = ch;
+  }
+  return tokens;
+
+  function is(chars) {
+    return chars.indexOf(ch) != -1;
+  }
+
+  function was(chars) {
+    return chars.indexOf(lastCh) != -1;
+  }
+
+  function peek() {
+    return index + 1 < text.length ? text.charAt(index + 1) : false;
+  }
+  function isNumber(ch) {
+    return '0' <= ch && ch <= '9';
+  }
+  function isWhitespace(ch) {
+    return ch == ' ' || ch == '\r' || ch == '\t' ||
+           ch == '\n' || ch == '\v' || ch == '\u00A0'; // IE treats non-breaking space as \u00A0
+  }
+  function isIdent(ch) {
+    return 'a' <= ch && ch <= 'z' ||
+           'A' <= ch && ch <= 'Z' ||
+           '_' == ch || ch == '$';
+  }
+  function isExpOperator(ch) {
+    return ch == '-' || ch == '+' || isNumber(ch);
+  }
+
+  function throwError(error, start, end) {
+    end = end || index;
+    throw Error("Lexer Error: " + error + " at column" +
+        (isDefined(start)
+            ? "s " + start +  "-" + index + " [" + text.substring(start, end) + "]"
+            : " " + end) +
+        " in expression [" + text + "].");
+  }
+
+  function readNumber() {
+    var number = "";
+    var start = index;
+    while (index < text.length) {
+      var ch = lowercase(text.charAt(index));
+      if (ch == '.' || isNumber(ch)) {
+        number += ch;
+      } else {
+        var peekCh = peek();
+        if (ch == 'e' && isExpOperator(peekCh)) {
+          number += ch;
+        } else if (isExpOperator(ch) &&
+            peekCh && isNumber(peekCh) &&
+            number.charAt(number.length - 1) == 'e') {
+          number += ch;
+        } else if (isExpOperator(ch) &&
+            (!peekCh || !isNumber(peekCh)) &&
+            number.charAt(number.length - 1) == 'e') {
+          throwError('Invalid exponent');
+        } else {
+          break;
+        }
+      }
+      index++;
+    }
+    number = 1 * number;
+    tokens.push({index:start, text:number, json:true,
+      fn:function() {return number;}});
+  }
+  function readIdent() {
+    var ident = "",
+        start = index,
+        lastDot, peekIndex, methodName, ch;
+
+    while (index < text.length) {
+      ch = text.charAt(index);
+      if (ch == '.' || isIdent(ch) || isNumber(ch)) {
+        if (ch == '.') lastDot = index;
+        ident += ch;
+      } else {
+        break;
+      }
+      index++;
+    }
+
+    //check if this is not a method invocation and if it is back out to last dot
+    if (lastDot) {
+      peekIndex = index;
+      while(peekIndex < text.length) {
+        ch = text.charAt(peekIndex);
+        if (ch == '(') {
+          methodName = ident.substr(lastDot - start + 1);
+          ident = ident.substr(0, lastDot - start);
+          index = peekIndex;
+          break;
+        }
+        if(isWhitespace(ch)) {
+          peekIndex++;
+        } else {
+          break;
+        }
+      }
+    }
+
+
+    var token = {
+      index:start,
+      text:ident
+    };
+
+    if (OPERATORS.hasOwnProperty(ident)) {
+      token.fn = token.json = OPERATORS[ident];
+    } else {
+      var getter = getterFn(ident, csp);
+      token.fn = extend(function(self, locals) {
+        return (getter(self, locals));
+      }, {
+        assign: function(self, value) {
+          return setter(self, ident, value);
+        }
+      });
+    }
+
+    tokens.push(token);
+
+    if (methodName) {
+      tokens.push({
+        index:lastDot,
+        text: '.',
+        json: false
+      });
+      tokens.push({
+        index: lastDot + 1,
+        text: methodName,
+        json: false
+      });
+    }
+  }
+
+  function readString(quote) {
+    var start = index;
+    index++;
+    var string = "";
+    var rawString = quote;
+    var escape = false;
+    while (index < text.length) {
+      var ch = text.charAt(index);
+      rawString += ch;
+      if (escape) {
+        if (ch == 'u') {
+          var hex = text.substring(index + 1, index + 5);
+          if (!hex.match(/[\da-f]{4}/i))
+            throwError( "Invalid unicode escape [\\u" + hex + "]");
+          index += 4;
+          string += String.fromCharCode(parseInt(hex, 16));
+        } else {
+          var rep = ESCAPE[ch];
+          if (rep) {
+            string += rep;
+          } else {
+            string += ch;
+          }
+        }
+        escape = false;
+      } else if (ch == '\\') {
+        escape = true;
+      } else if (ch == quote) {
+        index++;
+        tokens.push({
+          index:start,
+          text:rawString,
+          string:string,
+          json:true,
+          fn:function() { return string; }
+        });
+        return;
+      } else {
+        string += ch;
+      }
+      index++;
+    }
+    throwError("Unterminated quote", start);
+  }
+}
+
+/////////////////////////////////////////
+
+function parser(text, json, $filter, csp){
+  var ZERO = valueFn(0),
+      value,
+      tokens = lex(text, csp),
+      assignment = _assignment,
+      functionCall = _functionCall,
+      fieldAccess = _fieldAccess,
+      objectIndex = _objectIndex,
+      filterChain = _filterChain;
+
+  if(json){
+    // The extra level of aliasing is here, just in case the lexer misses something, so that
+    // we prevent any accidental execution in JSON.
+    assignment = logicalOR;
+    functionCall =
+      fieldAccess =
+      objectIndex =
+      filterChain =
+        function() { throwError("is not valid json", {text:text, index:0}); };
+    value = primary();
+  } else {
+    value = statements();
+  }
+  if (tokens.length !== 0) {
+    throwError("is an unexpected token", tokens[0]);
+  }
+  return value;
+
+  ///////////////////////////////////
+  function throwError(msg, token) {
+    throw Error("Syntax Error: Token '" + token.text +
+      "' " + msg + " at column " +
+      (token.index + 1) + " of the expression [" +
+      text + "] starting at [" + text.substring(token.index) + "].");
+  }
+
+  function peekToken() {
+    if (tokens.length === 0)
+      throw Error("Unexpected end of expression: " + text);
+    return tokens[0];
+  }
+
+  function peek(e1, e2, e3, e4) {
+    if (tokens.length > 0) {
+      var token = tokens[0];
+      var t = token.text;
+      if (t==e1 || t==e2 || t==e3 || t==e4 ||
+          (!e1 && !e2 && !e3 && !e4)) {
+        return token;
+      }
+    }
+    return false;
+  }
+
+  function expect(e1, e2, e3, e4){
+    var token = peek(e1, e2, e3, e4);
+    if (token) {
+      if (json && !token.json) {
+        throwError("is not valid json", token);
+      }
+      tokens.shift();
+      return token;
+    }
+    return false;
+  }
+
+  function consume(e1){
+    if (!expect(e1)) {
+      throwError("is unexpected, expecting [" + e1 + "]", peek());
+    }
+  }
+
+  function unaryFn(fn, right) {
+    return function(self, locals) {
+      return fn(self, locals, right);
+    };
+  }
+
+  function binaryFn(left, fn, right) {
+    return function(self, locals) {
+      return fn(self, locals, left, right);
+    };
+  }
+
+  function statements() {
+    var statements = [];
+    while(true) {
+      if (tokens.length > 0 && !peek('}', ')', ';', ']'))
+        statements.push(filterChain());
+      if (!expect(';')) {
+        // optimize for the common case where there is only one statement.
+        // TODO(size): maybe we should not support multiple statements?
+        return statements.length == 1
+          ? statements[0]
+          : function(self, locals){
+            var value;
+            for ( var i = 0; i < statements.length; i++) {
+              var statement = statements[i];
+              if (statement)
+                value = statement(self, locals);
+            }
+            return value;
+          };
+      }
+    }
+  }
+
+  function _filterChain() {
+    var left = expression();
+    var token;
+    while(true) {
+      if ((token = expect('|'))) {
+        left = binaryFn(left, token.fn, filter());
+      } else {
+        return left;
+      }
+    }
+  }
+
+  function filter() {
+    var token = expect();
+    var fn = $filter(token.text);
+    var argsFn = [];
+    while(true) {
+      if ((token = expect(':'))) {
+        argsFn.push(expression());
+      } else {
+        var fnInvoke = function(self, locals, input){
+          var args = [input];
+          for ( var i = 0; i < argsFn.length; i++) {
+            args.push(argsFn[i](self, locals));
+          }
+          return fn.apply(self, args);
+        };
+        return function() {
+          return fnInvoke;
+        };
+      }
+    }
+  }
+
+  function expression() {
+    return assignment();
+  }
+
+  function _assignment() {
+    var left = logicalOR();
+    var right;
+    var token;
+    if ((token = expect('='))) {
+      if (!left.assign) {
+        throwError("implies assignment but [" +
+          text.substring(0, token.index) + "] can not be assigned to", token);
+      }
+      right = logicalOR();
+      return function(scope, locals){
+        return left.assign(scope, right(scope, locals), locals);
+      };
+    } else {
+      return left;
+    }
+  }
+
+  function logicalOR() {
+    var left = logicalAND();
+    var token;
+    while(true) {
+      if ((token = expect('||'))) {
+        left = binaryFn(left, token.fn, logicalAND());
+      } else {
+        return left;
+      }
+    }
+  }
+
+  function logicalAND() {
+    var left = equality();
+    var token;
+    if ((token = expect('&&'))) {
+      left = binaryFn(left, token.fn, logicalAND());
+    }
+    return left;
+  }
+
+  function equality() {
+    var left = relational();
+    var token;
+    if ((token = expect('==','!='))) {
+      left = binaryFn(left, token.fn, equality());
+    }
+    return left;
+  }
+
+  function relational() {
+    var left = additive();
+    var token;
+    if ((token = expect('<', '>', '<=', '>='))) {
+      left = binaryFn(left, token.fn, relational());
+    }
+    return left;
+  }
+
+  function additive() {
+    var left = multiplicative();
+    var token;
+    while ((token = expect('+','-'))) {
+      left = binaryFn(left, token.fn, multiplicative());
+    }
+    return left;
+  }
+
+  function multiplicative() {
+    var left = unary();
+    var token;
+    while ((token = expect('*','/','%'))) {
+      left = binaryFn(left, token.fn, unary());
+    }
+    return left;
+  }
+
+  function unary() {
+    var token;
+    if (expect('+')) {
+      return primary();
+    } else if ((token = expect('-'))) {
+      return binaryFn(ZERO, token.fn, unary());
+    } else if ((token = expect('!'))) {
+      return unaryFn(token.fn, unary());
+    } else {
+      return primary();
+    }
+  }
+
+
+  function primary() {
+    var primary;
+    if (expect('(')) {
+      primary = filterChain();
+      consume(')');
+    } else if (expect('[')) {
+      primary = arrayDeclaration();
+    } else if (expect('{')) {
+      primary = object();
+    } else {
+      var token = expect();
+      primary = token.fn;
+      if (!primary) {
+        throwError("not a primary expression", token);
+      }
+    }
+
+    var next, context;
+    while ((next = expect('(', '[', '.'))) {
+      if (next.text === '(') {
+        primary = functionCall(primary, context);
+        context = null;
+      } else if (next.text === '[') {
+        context = primary;
+        primary = objectIndex(primary);
+      } else if (next.text === '.') {
+        context = primary;
+        primary = fieldAccess(primary);
+      } else {
+        throwError("IMPOSSIBLE");
+      }
+    }
+    return primary;
+  }
+
+  function _fieldAccess(object) {
+    var field = expect().text;
+    var getter = getterFn(field, csp);
+    return extend(
+        function(scope, locals, self) {
+          return getter(self || object(scope, locals), locals);
+        },
+        {
+          assign:function(scope, value, locals) {
+            return setter(object(scope, locals), field, value);
+          }
+        }
+    );
+  }
+
+  function _objectIndex(obj) {
+    var indexFn = expression();
+    consume(']');
+    return extend(
+      function(self, locals){
+        var o = obj(self, locals),
+            i = indexFn(self, locals),
+            v, p;
+
+        if (!o) return undefined;
+        v = o[i];
+        if (v && v.then) {
+          p = v;
+          if (!('$$v' in v)) {
+            p.$$v = undefined;
+            p.then(function(val) { p.$$v = val; });
+          }
+          v = v.$$v;
+        }
+        return v;
+      }, {
+        assign:function(self, value, locals){
+          return obj(self, locals)[indexFn(self, locals)] = value;
+        }
+      });
+  }
+
+  function _functionCall(fn, contextGetter) {
+    var argsFn = [];
+    if (peekToken().text != ')') {
+      do {
+        argsFn.push(expression());
+      } while (expect(','));
+    }
+    consume(')');
+    return function(scope, locals){
+      var args = [],
+          context = contextGetter ? contextGetter(scope, locals) : scope;
+
+      for ( var i = 0; i < argsFn.length; i++) {
+        args.push(argsFn[i](scope, locals));
+      }
+      var fnPtr = fn(scope, locals, context) || noop;
+      // IE stupidity!
+      return fnPtr.apply
+          ? fnPtr.apply(context, args)
+          : fnPtr(args[0], args[1], args[2], args[3], args[4]);
+    };
+  }
+
+  // This is used with json array declaration
+  function arrayDeclaration () {
+    var elementFns = [];
+    if (peekToken().text != ']') {
+      do {
+        elementFns.push(expression());
+      } while (expect(','));
+    }
+    consume(']');
+    return function(self, locals){
+      var array = [];
+      for ( var i = 0; i < elementFns.length; i++) {
+        array.push(elementFns[i](self, locals));
+      }
+      return array;
+    };
+  }
+
+  function object () {
+    var keyValues = [];
+    if (peekToken().text != '}') {
+      do {
+        var token = expect(),
+        key = token.string || token.text;
+        consume(":");
+        var value = expression();
+        keyValues.push({key:key, value:value});
+      } while (expect(','));
+    }
+    consume('}');
+    return function(self, locals){
+      var object = {};
+      for ( var i = 0; i < keyValues.length; i++) {
+        var keyValue = keyValues[i];
+        object[keyValue.key] = keyValue.value(self, locals);
+      }
+      return object;
+    };
+  }
+}
+
+//////////////////////////////////////////////////
+// Parser helper functions
+//////////////////////////////////////////////////
+
+function setter(obj, path, setValue) {
+  var element = path.split('.');
+  for (var i = 0; element.length > 1; i++) {
+    var key = element.shift();
+    var propertyObj = obj[key];
+    if (!propertyObj) {
+      propertyObj = {};
+      obj[key] = propertyObj;
+    }
+    obj = propertyObj;
+  }
+  obj[element.shift()] = setValue;
+  return setValue;
+}
+
+var getterFnCache = {};
+
+/**
+ * Implementation of the "Black Hole" variant from:
+ * - http://jsperf.com/angularjs-parse-getter/4
+ * - http://jsperf.com/path-evaluation-simplified/7
+ */
+function cspSafeGetterFn(key0, key1, key2, key3, key4) {
+  return function(scope, locals) {
+    var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope,
+        promise;
+
+    if (pathVal === null || pathVal === undefined) return pathVal;
+
+    pathVal = pathVal[key0];
+    if (pathVal && pathVal.then) {
+      if (!("$$v" in pathVal)) {
+        promise = pathVal;
+        promise.$$v = undefined;
+        promise.then(function(val) { promise.$$v = val; });
+      }
+      pathVal = pathVal.$$v;
+    }
+    if (!key1 || pathVal === null || pathVal === undefined) return pathVal;
+
+    pathVal = pathVal[key1];
+    if (pathVal && pathVal.then) {
+      if (!("$$v" in pathVal)) {
+        promise = pathVal;
+        promise.$$v = undefined;
+        promise.then(function(val) { promise.$$v = val; });
+      }
+      pathVal = pathVal.$$v;
+    }
+    if (!key2 || pathVal === null || pathVal === undefined) return pathVal;
+
+    pathVal = pathVal[key2];
+    if (pathVal && pathVal.then) {
+      if (!("$$v" in pathVal)) {
+        promise = pathVal;
+        promise.$$v = undefined;
+        promise.then(function(val) { promise.$$v = val; });
+      }
+      pathVal = pathVal.$$v;
+    }
+    if (!key3 || pathVal === null || pathVal === undefined) return pathVal;
+
+    pathVal = pathVal[key3];
+    if (pathVal && pathVal.then) {
+      if (!("$$v" in pathVal)) {
+        promise = pathVal;
+        promise.$$v = undefined;
+        promise.then(function(val) { promise.$$v = val; });
+      }
+      pathVal = pathVal.$$v;
+    }
+    if (!key4 || pathVal === null || pathVal === undefined) return pathVal;
+
+    pathVal = pathVal[key4];
+    if (pathVal && pathVal.then) {
+      if (!("$$v" in pathVal)) {
+        promise = pathVal;
+        promise.$$v = undefined;
+        promise.then(function(val) { promise.$$v = val; });
+      }
+      pathVal = pathVal.$$v;
+    }
+    return pathVal;
+  };
+}
+
+function getterFn(path, csp) {
+  if (getterFnCache.hasOwnProperty(path)) {
+    return getterFnCache[path];
+  }
+
+  var pathKeys = path.split('.'),
+      pathKeysLength = pathKeys.length,
+      fn;
+
+  if (csp) {
+    fn = (pathKeysLength < 6)
+        ? cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4])
+        : function(scope, locals) {
+          var i = 0, val;
+          do {
+            val = cspSafeGetterFn(
+                    pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++]
+                  )(scope, locals);
+
+            locals = undefined; // clear after first iteration
+            scope = val;
+          } while (i < pathKeysLength);
+          return val;
+        }
+  } else {
+    var code = 'var l, fn, p;\n';
+    forEach(pathKeys, function(key, index) {
+      code += 'if(s === null || s === undefined) return s;\n' +
+              'l=s;\n' +
+              's='+ (index
+                      // we simply dereference 's' on any .dot notation
+                      ? 's'
+                      // but if we are first then we check locals first, and if so read it first
+                      : '((k&&k.hasOwnProperty("' + key + '"))?k:s)') + '["' + key + '"]' + ';\n' +
+              'if (s && s.then) {\n' +
+                ' if (!("$$v" in s)) {\n' +
+                  ' p=s;\n' +
+                  ' p.$$v = undefined;\n' +
+                  ' p.then(function(v) {p.$$v=v;});\n' +
+                  '}\n' +
+                ' s=s.$$v\n' +
+              '}\n';
+    });
+    code += 'return s;';
+    fn = Function('s', 'k', code); // s=scope, k=locals
+    fn.toString = function() { return code; };
+  }
+
+  return getterFnCache[path] = fn;
+}
+
+///////////////////////////////////
+
+/**
+ * @ngdoc function
+ * @name ng.$parse
+ * @function
+ *
+ * @description
+ *
+ * Converts Angular {@link guide/expression expression} into a function.
+ *
+ * <pre>
+ *   var getter = $parse('user.name');
+ *   var setter = getter.assign;
+ *   var context = {user:{name:'angular'}};
+ *   var locals = {user:{name:'local'}};
+ *
+ *   expect(getter(context)).toEqual('angular');
+ *   setter(context, 'newValue');
+ *   expect(context.user.name).toEqual('newValue');
+ *   expect(getter(context, locals)).toEqual('local');
+ * </pre>
+ *
+ *
+ * @param {string} expression String expression to compile.
+ * @returns {function(context, locals)} a function which represents the compiled expression:
+ *
+ *    * `context` – `{object}` – an object against which any expressions embedded in the strings
+ *      are evaluated against (tipically a scope object).
+ *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
+ *      `context`.
+ *
+ *    The return function also has an `assign` property, if the expression is assignable, which
+ *    allows one to set values to expressions.
+ *
+ */
+function $ParseProvider() {
+  var cache = {};
+  this.$get = ['$filter', '$sniffer', function($filter, $sniffer) {
+    return function(exp) {
+      switch(typeof exp) {
+        case 'string':
+          return cache.hasOwnProperty(exp)
+            ? cache[exp]
+            : cache[exp] =  parser(exp, false, $filter, $sniffer.csp);
+        case 'function':
+          return exp;
+        default:
+          return noop;
+      }
+    };
+  }];
+}
+
+/**
+ * @ngdoc service
+ * @name ng.$q
+ * @requires $rootScope
+ *
+ * @description
+ * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).
+ *
+ * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an
+ * interface for interacting with an object that represents the result of an action that is
+ * performed asynchronously, and may or may not be finished at any given point in time.
+ *
+ * From the perspective of dealing with error handling, deferred and promise APIs are to
+ * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.
+ *
+ * <pre>
+ *   // for the purpose of this example let's assume that variables `$q` and `scope` are
+ *   // available in the current lexical scope (they could have been injected or passed in).
+ *
+ *   function asyncGreet(name) {
+ *     var deferred = $q.defer();
+ *
+ *     setTimeout(function() {
+ *       // since this fn executes async in a future turn of the event loop, we need to wrap
+ *       // our code into an $apply call so that the model changes are properly observed.
+ *       scope.$apply(function() {
+ *         if (okToGreet(name)) {
+ *           deferred.resolve('Hello, ' + name + '!');
+ *         } else {
+ *           deferred.reject('Greeting ' + name + ' is not allowed.');
+ *         }
+ *       });
+ *     }, 1000);
+ *
+ *     return deferred.promise;
+ *   }
+ *
+ *   var promise = asyncGreet('Robin Hood');
+ *   promise.then(function(greeting) {
+ *     alert('Success: ' + greeting);
+ *   }, function(reason) {
+ *     alert('Failed: ' + reason);
+ *   });
+ * </pre>
+ *
+ * At first it might not be obvious why this extra complexity is worth the trouble. The payoff
+ * comes in the way of
+ * [guarantees that promise and deferred APIs make](https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md).
+ *
+ * Additionally the promise api allows for composition that is very hard to do with the
+ * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.
+ * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the
+ * section on serial or parallel joining of promises.
+ *
+ *
+ * # The Deferred API
+ *
+ * A new instance of deferred is constructed by calling `$q.defer()`.
+ *
+ * The purpose of the deferred object is to expose the associated Promise instance as well as APIs
+ * that can be used for signaling the successful or unsuccessful completion of the task.
+ *
+ * **Methods**
+ *
+ * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection
+ *   constructed via `$q.reject`, the promise will be rejected instead.
+ * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to
+ *   resolving it with a rejection constructed via `$q.reject`.
+ *
+ * **Properties**
+ *
+ * - promise – `{Promise}` – promise object associated with this deferred.
+ *
+ *
+ * # The Promise API
+ *
+ * A new promise instance is created when a deferred instance is created and can be retrieved by
+ * calling `deferred.promise`.
+ *
+ * The purpose of the promise object is to allow for interested parties to get access to the result
+ * of the deferred task when it completes.
+ *
+ * **Methods**
+ *
+ * - `then(successCallback, errorCallback)` – regardless of when the promise was or will be resolved
+ *   or rejected, `then` calls one of the success or error callbacks asynchronously as soon as the result
+ *   is available. The callbacks are called with a single argument: the result or rejection reason.
+ *
+ *   This method *returns a new promise* which is resolved or rejected via the return value of the
+ *   `successCallback` or `errorCallback`.
+ *
+ *
+ * # Chaining promises
+ *
+ * Because calling the `then` method of a promise returns a new derived promise, it is easily possible
+ * to create a chain of promises:
+ *
+ * <pre>
+ *   promiseB = promiseA.then(function(result) {
+ *     return result + 1;
+ *   });
+ *
+ *   // promiseB will be resolved immediately after promiseA is resolved and its value
+ *   // will be the result of promiseA incremented by 1
+ * </pre>
+ *
+ * It is possible to create chains of any length and since a promise can be resolved with another
+ * promise (which will defer its resolution further), it is possible to pause/defer resolution of
+ * the promises at any point in the chain. This makes it possible to implement powerful APIs like
+ * $http's response interceptors.
+ *
+ *
+ * # Differences between Kris Kowal's Q and $q
+ *
+ *  There are three main differences:
+ *
+ * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation
+ *   mechanism in angular, which means faster propagation of resolution or rejection into your
+ *   models and avoiding unnecessary browser repaints, which would result in flickering UI.
+ * - $q promises are recognized by the templating engine in angular, which means that in templates
+ *   you can treat promises attached to a scope as if they were the resulting values.
+ * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains
+ *   all the important functionality needed for common async tasks.
+ * 
+ *  # Testing
+ * 
+ *  <pre>
+ *    it('should simulate promise', inject(function($q, $rootScope) {
+ *      var deferred = $q.defer();
+ *      var promise = deferred.promise;
+ *      var resolvedValue;
+ * 
+ *      promise.then(function(value) { resolvedValue = value; });
+ *      expect(resolvedValue).toBeUndefined();
+ * 
+ *      // Simulate resolving of promise
+ *      deferred.resolve(123);
+ *      // Note that the 'then' function does not get called synchronously.
+ *      // This is because we want the promise API to always be async, whether or not
+ *      // it got called synchronously or asynchronously.
+ *      expect(resolvedValue).toBeUndefined();
+ * 
+ *      // Propagate promise resolution to 'then' functions using $apply().
+ *      $rootScope.$apply();
+ *      expect(resolvedValue).toEqual(123);
+ *    });
+ *  </pre>
+ */
+function $QProvider() {
+
+  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {
+    return qFactory(function(callback) {
+      $rootScope.$evalAsync(callback);
+    }, $exceptionHandler);
+  }];
+}
+
+
+/**
+ * Constructs a promise manager.
+ *
+ * @param {function(function)} nextTick Function for executing functions in the next turn.
+ * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for
+ *     debugging purposes.
+ * @returns {object} Promise manager.
+ */
+function qFactory(nextTick, exceptionHandler) {
+
+  /**
+   * @ngdoc
+   * @name ng.$q#defer
+   * @methodOf ng.$q
+   * @description
+   * Creates a `Deferred` object which represents a task which will finish in the future.
+   *
+   * @returns {Deferred} Returns a new instance of deferred.
+   */
+  var defer = function() {
+    var pending = [],
+        value, deferred;
+
+    deferred = {
+
+      resolve: function(val) {
+        if (pending) {
+          var callbacks = pending;
+          pending = undefined;
+          value = ref(val);
+
+          if (callbacks.length) {
+            nextTick(function() {
+              var callback;
+              for (var i = 0, ii = callbacks.length; i < ii; i++) {
+                callback = callbacks[i];
+                value.then(callback[0], callback[1]);
+              }
+            });
+          }
+        }
+      },
+
+
+      reject: function(reason) {
+        deferred.resolve(reject(reason));
+      },
+
+
+      promise: {
+        then: function(callback, errback) {
+          var result = defer();
+
+          var wrappedCallback = function(value) {
+            try {
+              result.resolve((callback || defaultCallback)(value));
+            } catch(e) {
+              result.reject(e);
+              exceptionHandler(e);
+            }
+          };
+
+          var wrappedErrback = function(reason) {
+            try {
+              result.resolve((errback || defaultErrback)(reason));
+            } catch(e) {
+              result.reject(e);
+              exceptionHandler(e);
+            }
+          };
+
+          if (pending) {
+            pending.push([wrappedCallback, wrappedErrback]);
+          } else {
+            value.then(wrappedCallback, wrappedErrback);
+          }
+
+          return result.promise;
+        }
+      }
+    };
+
+    return deferred;
+  };
+
+
+  var ref = function(value) {
+    if (value && value.then) return value;
+    return {
+      then: function(callback) {
+        var result = defer();
+        nextTick(function() {
+          result.resolve(callback(value));
+        });
+        return result.promise;
+      }
+    };
+  };
+
+
+  /**
+   * @ngdoc
+   * @name ng.$q#reject
+   * @methodOf ng.$q
+   * @description
+   * Creates a promise that is resolved as rejected with the specified `reason`. This api should be
+   * used to forward rejection in a chain of promises. If you are dealing with the last promise in
+   * a promise chain, you don't need to worry about it.
+   *
+   * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of
+   * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via
+   * a promise error callback and you want to forward the error to the promise derived from the
+   * current promise, you have to "rethrow" the error by returning a rejection constructed via
+   * `reject`.
+   *
+   * <pre>
+   *   promiseB = promiseA.then(function(result) {
+   *     // success: do something and resolve promiseB
+   *     //          with the old or a new result
+   *     return result;
+   *   }, function(reason) {
+   *     // error: handle the error if possible and
+   *     //        resolve promiseB with newPromiseOrValue,
+   *     //        otherwise forward the rejection to promiseB
+   *     if (canHandle(reason)) {
+   *      // handle the error and recover
+   *      return newPromiseOrValue;
+   *     }
+   *     return $q.reject(reason);
+   *   });
+   * </pre>
+   *
+   * @param {*} reason Constant, message, exception or an object representing the rejection reason.
+   * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.
+   */
+  var reject = function(reason) {
+    return {
+      then: function(callback, errback) {
+        var result = defer();
+        nextTick(function() {
+          result.resolve((errback || defaultErrback)(reason));
+        });
+        return result.promise;
+      }
+    };
+  };
+
+
+  /**
+   * @ngdoc
+   * @name ng.$q#when
+   * @methodOf ng.$q
+   * @description
+   * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.
+   * This is useful when you are dealing with an object that might or might not be a promise, or if
+   * the promise comes from a source that can't be trusted.
+   *
+   * @param {*} value Value or a promise
+   * @returns {Promise} Returns a promise of the passed value or promise
+   */
+  var when = function(value, callback, errback) {
+    var result = defer(),
+        done;
+
+    var wrappedCallback = function(value) {
+      try {
+        return (callback || defaultCallback)(value);
+      } catch (e) {
+        exceptionHandler(e);
+        return reject(e);
+      }
+    };
+
+    var wrappedErrback = function(reason) {
+      try {
+        return (errback || defaultErrback)(reason);
+      } catch (e) {
+        exceptionHandler(e);
+        return reject(e);
+      }
+    };
+
+    nextTick(function() {
+      ref(value).then(function(value) {
+        if (done) return;
+        done = true;
+        result.resolve(ref(value).then(wrappedCallback, wrappedErrback));
+      }, function(reason) {
+        if (done) return;
+        done = true;
+        result.resolve(wrappedErrback(reason));
+      });
+    });
+
+    return result.promise;
+  };
+
+
+  function defaultCallback(value) {
+    return value;
+  }
+
+
+  function defaultErrback(reason) {
+    return reject(reason);
+  }
+
+
+  /**
+   * @ngdoc
+   * @name ng.$q#all
+   * @methodOf ng.$q
+   * @description
+   * Combines multiple promises into a single promise that is resolved when all of the input
+   * promises are resolved.
+   *
+   * @param {Array.<Promise>} promises An array of promises.
+   * @returns {Promise} Returns a single promise that will be resolved with an array of values,
+   *   each value corresponding to the promise at the same index in the `promises` array. If any of
+   *   the promises is resolved with a rejection, this resulting promise will be resolved with the
+   *   same rejection.
+   */
+  function all(promises) {
+    var deferred = defer(),
+        counter = promises.length,
+        results = [];
+
+    if (counter) {
+      forEach(promises, function(promise, index) {
+        ref(promise).then(function(value) {
+          if (index in results) return;
+          results[index] = value;
+          if (!(--counter)) deferred.resolve(results);
+        }, function(reason) {
+          if (index in results) return;
+          deferred.reject(reason);
+        });
+      });
+    } else {
+      deferred.resolve(results);
+    }
+
+    return deferred.promise;
+  }
+
+  return {
+    defer: defer,
+    reject: reject,
+    when: when,
+    all: all
+  };
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$routeProvider
+ * @function
+ *
+ * @description
+ *
+ * Used for configuring routes. See {@link ng.$route $route} for an example.
+ */
+function $RouteProvider(){
+  var routes = {};
+
+  /**
+   * @ngdoc method
+   * @name ng.$routeProvider#when
+   * @methodOf ng.$routeProvider
+   *
+   * @param {string} path Route path (matched against `$location.path`). If `$location.path`
+   *    contains redundant trailing slash or is missing one, the route will still match and the
+   *    `$location.path` will be updated to add or drop the trailing slash to exactly match the
+   *    route definition.
+   *
+   *    `path` can contain named groups starting with a colon (`:name`). All characters up to the
+   *    next slash are matched and stored in `$routeParams` under the given `name` after the route
+   *    is resolved.
+   *
+   * @param {Object} route Mapping information to be assigned to `$route.current` on route
+   *    match.
+   *
+   *    Object properties:
+   *
+   *    - `controller` – `{(string|function()=}` – Controller fn that should be associated with newly
+   *      created scope or the name of a {@link angular.Module#controller registered controller}
+   *      if passed as a string.
+   *    - `template` – `{string=}` –  html template as a string that should be used by
+   *      {@link ng.directive:ngView ngView} or
+   *      {@link ng.directive:ngInclude ngInclude} directives.
+   *      this property takes precedence over `templateUrl`.
+   *    - `templateUrl` – `{string=}` – path to an html template that should be used by
+   *      {@link ng.directive:ngView ngView}.
+   *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should
+   *      be injected into the controller. If any of these dependencies are promises, they will be
+   *      resolved and converted to a value before the controller is instantiated and the
+   *      `$routeChangeSuccess` event is fired. The map object is:
+   *
+   *      - `key` – `{string}`: a name of a dependency to be injected into the controller.
+   *      - `factory` - `{string|function}`: If `string` then it is an alias for a service.
+   *        Otherwise if function, then it is {@link api/AUTO.$injector#invoke injected}
+   *        and the return value is treated as the dependency. If the result is a promise, it is resolved
+   *        before its value is injected into the controller. Be aware that `ngRoute.$routeParams` will
+   *        still refer to the previous route within these resolve functions.  Use `$route.current.params`
+   *        to access the new route parameters, instead.
+   *
+   *    - `redirectTo` – {(string|function())=} – value to update
+   *      {@link ng.$location $location} path with and trigger route redirection.
+   *
+   *      If `redirectTo` is a function, it will be called with the following parameters:
+   *
+   *      - `{Object.<string>}` - route parameters extracted from the current
+   *        `$location.path()` by applying the current route templateUrl.
+   *      - `{string}` - current `$location.path()`
+   *      - `{Object}` - current `$location.search()`
+   *
+   *      The custom `redirectTo` function is expected to return a string which will be used
+   *      to update `$location.path()` and `$location.search()`.
+   *
+   *    - `[reloadOnSearch=true]` - {boolean=} - reload route when only $location.search()
+   *    changes.
+   *
+   *      If the option is set to `false` and url in the browser changes, then
+   *      `$routeUpdate` event is broadcasted on the root scope.
+   *
+   * @returns {Object} self
+   *
+   * @description
+   * Adds a new route definition to the `$route` service.
+   */
+  this.when = function(path, route) {
+    routes[path] = extend({reloadOnSearch: true}, route);
+
+    // create redirection for trailing slashes
+    if (path) {
+      var redirectPath = (path[path.length-1] == '/')
+          ? path.substr(0, path.length-1)
+          : path +'/';
+
+      routes[redirectPath] = {redirectTo: path};
+    }
+
+    return this;
+  };
+
+  /**
+   * @ngdoc method
+   * @name ng.$routeProvider#otherwise
+   * @methodOf ng.$routeProvider
+   *
+   * @description
+   * Sets route definition that will be used on route change when no other route definition
+   * is matched.
+   *
+   * @param {Object} params Mapping information to be assigned to `$route.current`.
+   * @returns {Object} self
+   */
+  this.otherwise = function(params) {
+    this.when(null, params);
+    return this;
+  };
+
+
+  this.$get = ['$rootScope', '$location', '$routeParams', '$q', '$injector', '$http', '$templateCache',
+      function( $rootScope,   $location,   $routeParams,   $q,   $injector,   $http,   $templateCache) {
+
+    /**
+     * @ngdoc object
+     * @name ng.$route
+     * @requires $location
+     * @requires $routeParams
+     *
+     * @property {Object} current Reference to the current route definition.
+     * The route definition contains:
+     *
+     *   - `controller`: The controller constructor as define in route definition.
+     *   - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for
+     *     controller instantiation. The `locals` contain
+     *     the resolved values of the `resolve` map. Additionally the `locals` also contain:
+     *
+     *     - `$scope` - The current route scope.
+     *     - `$template` - The current route template HTML.
+     *
+     * @property {Array.<Object>} routes Array of all configured routes.
+     *
+     * @description
+     * Is used for deep-linking URLs to controllers and views (HTML partials).
+     * It watches `$location.url()` and tries to map the path to an existing route definition.
+     *
+     * You can define routes through {@link ng.$routeProvider $routeProvider}'s API.
+     *
+     * The `$route` service is typically used in conjunction with {@link ng.directive:ngView ngView}
+     * directive and the {@link ng.$routeParams $routeParams} service.
+     *
+     * @example
+       This example shows how changing the URL hash causes the `$route` to match a route against the
+       URL, and the `ngView` pulls in the partial.
+
+       Note that this example is using {@link ng.directive:script inlined templates}
+       to get it working on jsfiddle as well.
+
+     <example module="ngView">
+       <file name="index.html">
+         <div ng-controller="MainCntl">
+           Choose:
+           <a href="Book/Moby">Moby</a> |
+           <a href="Book/Moby/ch/1">Moby: Ch1</a> |
+           <a href="Book/Gatsby">Gatsby</a> |
+           <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
+           <a href="Book/Scarlet">Scarlet Letter</a><br/>
+
+           <div ng-view></div>
+           <hr />
+
+           <pre>$location.path() = {{$location.path()}}</pre>
+           <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>
+           <pre>$route.current.params = {{$route.current.params}}</pre>
+           <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>
+           <pre>$routeParams = {{$routeParams}}</pre>
+         </div>
+       </file>
+
+       <file name="book.html">
+         controller: {{name}}<br />
+         Book Id: {{params.bookId}}<br />
+       </file>
+
+       <file name="chapter.html">
+         controller: {{name}}<br />
+         Book Id: {{params.bookId}}<br />
+         Chapter Id: {{params.chapterId}}
+       </file>
+
+       <file name="script.js">
+         angular.module('ngView', [], function($routeProvider, $locationProvider) {
+           $routeProvider.when('/Book/:bookId', {
+             templateUrl: 'book.html',
+             controller: BookCntl,
+             resolve: {
+               // I will cause a 1 second delay
+               delay: function($q, $timeout) {
+                 var delay = $q.defer();
+                 $timeout(delay.resolve, 1000);
+                 return delay.promise;
+               }
+             }
+           });
+           $routeProvider.when('/Book/:bookId/ch/:chapterId', {
+             templateUrl: 'chapter.html',
+             controller: ChapterCntl
+           });
+
+           // configure html5 to get links working on jsfiddle
+           $locationProvider.html5Mode(true);
+         });
+
+         function MainCntl($scope, $route, $routeParams, $location) {
+           $scope.$route = $route;
+           $scope.$location = $location;
+           $scope.$routeParams = $routeParams;
+         }
+
+         function BookCntl($scope, $routeParams) {
+           $scope.name = "BookCntl";
+           $scope.params = $routeParams;
+         }
+
+         function ChapterCntl($scope, $routeParams) {
+           $scope.name = "ChapterCntl";
+           $scope.params = $routeParams;
+         }
+       </file>
+
+       <file name="scenario.js">
+         it('should load and compile correct template', function() {
+           element('a:contains("Moby: Ch1")').click();
+           var content = element('.doc-example-live [ng-view]').text();
+           expect(content).toMatch(/controller\: ChapterCntl/);
+           expect(content).toMatch(/Book Id\: Moby/);
+           expect(content).toMatch(/Chapter Id\: 1/);
+
+           element('a:contains("Scarlet")').click();
+           sleep(2); // promises are not part of scenario waiting
+           content = element('.doc-example-live [ng-view]').text();
+           expect(content).toMatch(/controller\: BookCntl/);
+           expect(content).toMatch(/Book Id\: Scarlet/);
+         });
+       </file>
+     </example>
+     */
+
+    /**
+     * @ngdoc event
+     * @name ng.$route#$routeChangeStart
+     * @eventOf ng.$route
+     * @eventType broadcast on root scope
+     * @description
+     * Broadcasted before a route change. At this  point the route services starts
+     * resolving all of the dependencies needed for the route change to occurs.
+     * Typically this involves fetching the view template as well as any dependencies
+     * defined in `resolve` route property. Once  all of the dependencies are resolved
+     * `$routeChangeSuccess` is fired.
+     *
+     * @param {Route} next Future route information.
+     * @param {Route} current Current route information.
+     */
+
+    /**
+     * @ngdoc event
+     * @name ng.$route#$routeChangeSuccess
+     * @eventOf ng.$route
+     * @eventType broadcast on root scope
+     * @description
+     * Broadcasted after a route dependencies are resolved.
+     * {@link ng.directive:ngView ngView} listens for the directive
+     * to instantiate the controller and render the view.
+     *
+     * @param {Object} angularEvent Synthetic event object.
+     * @param {Route} current Current route information.
+     * @param {Route|Undefined} previous Previous route information, or undefined if current is first route entered.
+     */
+
+    /**
+     * @ngdoc event
+     * @name ng.$route#$routeChangeError
+     * @eventOf ng.$route
+     * @eventType broadcast on root scope
+     * @description
+     * Broadcasted if any of the resolve promises are rejected.
+     *
+     * @param {Route} current Current route information.
+     * @param {Route} previous Previous route information.
+     * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.
+     */
+
+    /**
+     * @ngdoc event
+     * @name ng.$route#$routeUpdate
+     * @eventOf ng.$route
+     * @eventType broadcast on root scope
+     * @description
+     *
+     * The `reloadOnSearch` property has been set to false, and we are reusing the same
+     * instance of the Controller.
+     */
+
+    var forceReload = false,
+        $route = {
+          routes: routes,
+
+          /**
+           * @ngdoc method
+           * @name ng.$route#reload
+           * @methodOf ng.$route
+           *
+           * @description
+           * Causes `$route` service to reload the current route even if
+           * {@link ng.$location $location} hasn't changed.
+           *
+           * As a result of that, {@link ng.directive:ngView ngView}
+           * creates new scope, reinstantiates the controller.
+           */
+          reload: function() {
+            forceReload = true;
+            $rootScope.$evalAsync(updateRoute);
+          }
+        };
+
+    $rootScope.$on('$locationChangeSuccess', updateRoute);
+
+    return $route;
+
+    /////////////////////////////////////////////////////
+
+    /**
+     * @param on {string} current url
+     * @param when {string} route when template to match the url against
+     * @return {?Object}
+     */
+    function switchRouteMatcher(on, when) {
+      // TODO(i): this code is convoluted and inefficient, we should construct the route matching
+      //   regex only once and then reuse it
+
+      // Escape regexp special characters.
+      when = '^' + when.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&") + '$';
+      var regex = '',
+          params = [],
+          dst = {};
+
+      var re = /:(\w+)/g,
+          paramMatch,
+          lastMatchedIndex = 0;
+
+      while ((paramMatch = re.exec(when)) !== null) {
+        // Find each :param in `when` and replace it with a capturing group.
+        // Append all other sections of when unchanged.
+        regex += when.slice(lastMatchedIndex, paramMatch.index);
+        regex += '([^\\/]*)';
+        params.push(paramMatch[1]);
+        lastMatchedIndex = re.lastIndex;
+      }
+      // Append trailing path part.
+      regex += when.substr(lastMatchedIndex);
+
+      var match = on.match(new RegExp(regex));
+      if (match) {
+        forEach(params, function(name, index) {
+          dst[name] = match[index + 1];
+        });
+      }
+      return match ? dst : null;
+    }
+
+    function updateRoute() {
+      var next = parseRoute(),
+          last = $route.current;
+
+      if (next && last && next.$$route === last.$$route
+          && equals(next.pathParams, last.pathParams) && !next.reloadOnSearch && !forceReload) {
+        last.params = next.params;
+        copy(last.params, $routeParams);
+        $rootScope.$broadcast('$routeUpdate', last);
+      } else if (next || last) {
+        forceReload = false;
+        $rootScope.$broadcast('$routeChangeStart', next, last);
+        $route.current = next;
+        if (next) {
+          if (next.redirectTo) {
+            if (isString(next.redirectTo)) {
+              $location.path(interpolate(next.redirectTo, next.params)).search(next.params)
+                       .replace();
+            } else {
+              $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search()))
+                       .replace();
+            }
+          }
+        }
+
+        $q.when(next).
+          then(function() {
+            if (next) {
+              var keys = [],
+                  values = [],
+                  template;
+
+              forEach(next.resolve || {}, function(value, key) {
+                keys.push(key);
+                values.push(isString(value) ? $injector.get(value) : $injector.invoke(value));
+              });
+              if (isDefined(template = next.template)) {
+              } else if (isDefined(template = next.templateUrl)) {
+                template = $http.get(template, {cache: $templateCache}).
+                    then(function(response) { return response.data; });
+              }
+              if (isDefined(template)) {
+                keys.push('$template');
+                values.push(template);
+              }
+              return $q.all(values).then(function(values) {
+                var locals = {};
+                forEach(values, function(value, index) {
+                  locals[keys[index]] = value;
+                });
+                return locals;
+              });
+            }
+          }).
+          // after route change
+          then(function(locals) {
+            if (next == $route.current) {
+              if (next) {
+                next.locals = locals;
+                copy(next.params, $routeParams);
+              }
+              $rootScope.$broadcast('$routeChangeSuccess', next, last);
+            }
+          }, function(error) {
+            if (next == $route.current) {
+              $rootScope.$broadcast('$routeChangeError', next, last, error);
+            }
+          });
+      }
+    }
+
+
+    /**
+     * @returns the current active route, by matching it against the URL
+     */
+    function parseRoute() {
+      // Match a route
+      var params, match;
+      forEach(routes, function(route, path) {
+        if (!match && (params = switchRouteMatcher($location.path(), path))) {
+          match = inherit(route, {
+            params: extend({}, $location.search(), params),
+            pathParams: params});
+          match.$$route = route;
+        }
+      });
+      // No route matched; fallback to "otherwise" route
+      return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});
+    }
+
+    /**
+     * @returns interpolation of the redirect path with the parametrs
+     */
+    function interpolate(string, params) {
+      var result = [];
+      forEach((string||'').split(':'), function(segment, i) {
+        if (i == 0) {
+          result.push(segment);
+        } else {
+          var segmentMatch = segment.match(/(\w+)(.*)/);
+          var key = segmentMatch[1];
+          result.push(params[key]);
+          result.push(segmentMatch[2] || '');
+          delete params[key];
+        }
+      });
+      return result.join('');
+    }
+  }];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$routeParams
+ * @requires $route
+ *
+ * @description
+ * Current set of route parameters. The route parameters are a combination of the
+ * {@link ng.$location $location} `search()`, and `path()`. The `path` parameters
+ * are extracted when the {@link ng.$route $route} path is matched.
+ *
+ * In case of parameter name collision, `path` params take precedence over `search` params.
+ *
+ * The service guarantees that the identity of the `$routeParams` object will remain unchanged
+ * (but its properties will likely change) even when a route change occurs.
+ *
+ * Note that the `$routeParams` are only updated *after* a route change completes successfully.
+ * This means that you cannot rely on `$routeParams` being correct in route resolve functions.
+ * Instead you can use `$route.current.params` to access the new route's parameters.
+ *
+ * @example
+ * <pre>
+ *  // Given:
+ *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
+ *  // Route: /Chapter/:chapterId/Section/:sectionId
+ *  //
+ *  // Then
+ *  $routeParams ==> {chapterId:1, sectionId:2, search:'moby'}
+ * </pre>
+ */
+function $RouteParamsProvider() {
+  this.$get = valueFn({});
+}
+
+/**
+ * DESIGN NOTES
+ *
+ * The design decisions behind the scope are heavily favored for speed and memory consumption.
+ *
+ * The typical use of scope is to watch the expressions, which most of the time return the same
+ * value as last time so we optimize the operation.
+ *
+ * Closures construction is expensive in terms of speed as well as memory:
+ *   - No closures, instead use prototypical inheritance for API
+ *   - Internal state needs to be stored on scope directly, which means that private state is
+ *     exposed as $$____ properties
+ *
+ * Loop operations are optimized by using while(count--) { ... }
+ *   - this means that in order to keep the same order of execution as addition we have to add
+ *     items to the array at the beginning (shift) instead of at the end (push)
+ *
+ * Child scopes are created and removed often
+ *   - Using an array would be slow since inserts in middle are expensive so we use linked list
+ *
+ * There are few watches then a lot of observers. This is why you don't want the observer to be
+ * implemented in the same way as watch. Watch requires return of initialization function which
+ * are expensive to construct.
+ */
+
+
+/**
+ * @ngdoc object
+ * @name ng.$rootScopeProvider
+ * @description
+ *
+ * Provider for the $rootScope service.
+ */
+
+/**
+ * @ngdoc function
+ * @name ng.$rootScopeProvider#digestTtl
+ * @methodOf ng.$rootScopeProvider
+ * @description
+ *
+ * Sets the number of digest iterations the scope should attempt to execute before giving up and
+ * assuming that the model is unstable.
+ *
+ * The current default is 10 iterations.
+ *
+ * @param {number} limit The number of digest iterations.
+ */
+
+
+/**
+ * @ngdoc object
+ * @name ng.$rootScope
+ * @description
+ *
+ * Every application has a single root {@link ng.$rootScope.Scope scope}.
+ * All other scopes are child scopes of the root scope. Scopes provide mechanism for watching the model and provide
+ * event processing life-cycle. See {@link guide/scope developer guide on scopes}.
+ */
+function $RootScopeProvider(){
+  var TTL = 10;
+
+  this.digestTtl = function(value) {
+    if (arguments.length) {
+      TTL = value;
+    }
+    return TTL;
+  };
+
+  this.$get = ['$injector', '$exceptionHandler', '$parse',
+      function( $injector,   $exceptionHandler,   $parse) {
+
+    /**
+     * @ngdoc function
+     * @name ng.$rootScope.Scope
+     *
+     * @description
+     * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the
+     * {@link AUTO.$injector $injector}. Child scopes are created using the
+     * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when
+     * compiled HTML template is executed.)
+     *
+     * Here is a simple scope snippet to show how you can interact with the scope.
+     * <pre>
+        angular.injector(['ng']).invoke(function($rootScope) {
+           var scope = $rootScope.$new();
+           scope.salutation = 'Hello';
+           scope.name = 'World';
+
+           expect(scope.greeting).toEqual(undefined);
+
+           scope.$watch('name', function() {
+             scope.greeting = scope.salutation + ' ' + scope.name + '!';
+           }); // initialize the watch
+
+           expect(scope.greeting).toEqual(undefined);
+           scope.name = 'Misko';
+           // still old value, since watches have not been called yet
+           expect(scope.greeting).toEqual(undefined);
+
+           scope.$digest(); // fire all  the watches
+           expect(scope.greeting).toEqual('Hello Misko!');
+        });
+     * </pre>
+     *
+     * # Inheritance
+     * A scope can inherit from a parent scope, as in this example:
+     * <pre>
+         var parent = $rootScope;
+         var child = parent.$new();
+
+         parent.salutation = "Hello";
+         child.name = "World";
+         expect(child.salutation).toEqual('Hello');
+
+         child.salutation = "Welcome";
+         expect(child.salutation).toEqual('Welcome');
+         expect(parent.salutation).toEqual('Hello');
+     * </pre>
+     *
+     *
+     * @param {Object.<string, function()>=} providers Map of service factory which need to be provided
+     *     for the current scope. Defaults to {@link ng}.
+     * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should
+     *     append/override services provided by `providers`. This is handy when unit-testing and having
+     *     the need to override a default service.
+     * @returns {Object} Newly created scope.
+     *
+     */
+    function Scope() {
+      this.$id = nextUid();
+      this.$$phase = this.$parent = this.$$watchers =
+                     this.$$nextSibling = this.$$prevSibling =
+                     this.$$childHead = this.$$childTail = null;
+      this['this'] = this.$root =  this;
+      this.$$destroyed = false;
+      this.$$asyncQueue = [];
+      this.$$listeners = {};
+      this.$$isolateBindings = {};
+    }
+
+    /**
+     * @ngdoc property
+     * @name ng.$rootScope.Scope#$id
+     * @propertyOf ng.$rootScope.Scope
+     * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for
+     *   debugging.
+     */
+
+
+    Scope.prototype = {
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$new
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Creates a new child {@link ng.$rootScope.Scope scope}.
+       *
+       * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} and
+       * {@link ng.$rootScope.Scope#$digest $digest()} events. The scope can be removed from the scope
+       * hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.
+       *
+       * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is desired for
+       * the scope and its child scopes to be permanently detached from the parent and thus stop
+       * participating in model change detection and listener notification by invoking.
+       *
+       * @param {boolean} isolate if true then the scope does not prototypically inherit from the
+       *         parent scope. The scope is isolated, as it can not see parent scope properties.
+       *         When creating widgets it is useful for the widget to not accidentally read parent
+       *         state.
+       *
+       * @returns {Object} The newly created child scope.
+       *
+       */
+      $new: function(isolate) {
+        var Child,
+            child;
+
+        if (isFunction(isolate)) {
+          // TODO: remove at some point
+          throw Error('API-CHANGE: Use $controller to instantiate controllers.');
+        }
+        if (isolate) {
+          child = new Scope();
+          child.$root = this.$root;
+        } else {
+          Child = function() {}; // should be anonymous; This is so that when the minifier munges
+            // the name it does not become random set of chars. These will then show up as class
+            // name in the debugger.
+          Child.prototype = this;
+          child = new Child();
+          child.$id = nextUid();
+        }
+        child['this'] = child;
+        child.$$listeners = {};
+        child.$parent = this;
+        child.$$asyncQueue = [];
+        child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null;
+        child.$$prevSibling = this.$$childTail;
+        if (this.$$childHead) {
+          this.$$childTail.$$nextSibling = child;
+          this.$$childTail = child;
+        } else {
+          this.$$childHead = this.$$childTail = child;
+        }
+        return child;
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$watch
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Registers a `listener` callback to be executed whenever the `watchExpression` changes.
+       *
+       * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest $digest()} and
+       *   should return the value which will be watched. (Since {@link ng.$rootScope.Scope#$digest $digest()}
+       *   reruns when it detects changes the `watchExpression` can execute multiple times per
+       *   {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)
+       * - The `listener` is called only when the value from the current `watchExpression` and the
+       *   previous call to `watchExpression` are not equal (with the exception of the initial run,
+       *   see below). The inequality is determined according to
+       *   {@link angular.equals} function. To save the value of the object for later comparison, the
+       *   {@link angular.copy} function is used. It also means that watching complex options will
+       *   have adverse memory and performance implications.
+       * - The watch `listener` may change the model, which may trigger other `listener`s to fire. This
+       *   is achieved by rerunning the watchers until no changes are detected. The rerun iteration
+       *   limit is 10 to prevent an infinite loop deadlock.
+       *
+       *
+       * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,
+       * you can register a `watchExpression` function with no `listener`. (Since `watchExpression`
+       * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a change is
+       * detected, be prepared for multiple calls to your listener.)
+       *
+       * After a watcher is registered with the scope, the `listener` fn is called asynchronously
+       * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the
+       * watcher. In rare cases, this is undesirable because the listener is called when the result
+       * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you
+       * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the
+       * listener was called due to initialization.
+       *
+       *
+       * # Example
+       * <pre>
+           // let's assume that scope was dependency injected as the $rootScope
+           var scope = $rootScope;
+           scope.name = 'misko';
+           scope.counter = 0;
+
+           expect(scope.counter).toEqual(0);
+           scope.$watch('name', function(newValue, oldValue) { scope.counter = scope.counter + 1; });
+           expect(scope.counter).toEqual(0);
+
+           scope.$digest();
+           // no variable change
+           expect(scope.counter).toEqual(0);
+
+           scope.name = 'adam';
+           scope.$digest();
+           expect(scope.counter).toEqual(1);
+       * </pre>
+       *
+       *
+       *
+       * @param {(function()|string)} watchExpression Expression that is evaluated on each
+       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers a
+       *    call to the `listener`.
+       *
+       *    - `string`: Evaluated as {@link guide/expression expression}
+       *    - `function(scope)`: called with current `scope` as a parameter.
+       * @param {(function()|string)=} listener Callback called whenever the return value of
+       *   the `watchExpression` changes.
+       *
+       *    - `string`: Evaluated as {@link guide/expression expression}
+       *    - `function(newValue, oldValue, scope)`: called with current and previous values as parameters.
+       *
+       * @param {boolean=} objectEquality Compare object for equality rather than for reference.
+       * @returns {function()} Returns a deregistration function for this listener.
+       */
+      $watch: function(watchExp, listener, objectEquality) {
+        var scope = this,
+            get = compileToFn(watchExp, 'watch'),
+            array = scope.$$watchers,
+            watcher = {
+              fn: listener,
+              last: initWatchVal,
+              get: get,
+              exp: watchExp,
+              eq: !!objectEquality
+            };
+
+        // in the case user pass string, we need to compile it, do we really need this ?
+        if (!isFunction(listener)) {
+          var listenFn = compileToFn(listener || noop, 'listener');
+          watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);};
+        }
+
+        if (!array) {
+          array = scope.$$watchers = [];
+        }
+        // we use unshift since we use a while loop in $digest for speed.
+        // the while loop reads in reverse order.
+        array.unshift(watcher);
+
+        return function() {
+          arrayRemove(array, watcher);
+        };
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$digest
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and its children.
+       * Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change the model, the
+       * `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} until no more listeners are
+       * firing. This means that it is possible to get into an infinite loop. This function will throw
+       * `'Maximum iteration limit exceeded.'` if the number of iterations exceeds 10.
+       *
+       * Usually you don't call `$digest()` directly in
+       * {@link ng.directive:ngController controllers} or in
+       * {@link ng.$compileProvider#directive directives}.
+       * Instead a call to {@link ng.$rootScope.Scope#$apply $apply()} (typically from within a
+       * {@link ng.$compileProvider#directive directives}) will force a `$digest()`.
+       *
+       * If you want to be notified whenever `$digest()` is called,
+       * you can register a `watchExpression` function  with {@link ng.$rootScope.Scope#$watch $watch()}
+       * with no `listener`.
+       *
+       * You may have a need to call `$digest()` from within unit-tests, to simulate the scope
+       * life-cycle.
+       *
+       * # Example
+       * <pre>
+           var scope = ...;
+           scope.name = 'misko';
+           scope.counter = 0;
+
+           expect(scope.counter).toEqual(0);
+           scope.$watch('name', function(newValue, oldValue) {
+             scope.counter = scope.counter + 1;
+           });
+           expect(scope.counter).toEqual(0);
+
+           scope.$digest();
+           // no variable change
+           expect(scope.counter).toEqual(0);
+
+           scope.name = 'adam';
+           scope.$digest();
+           expect(scope.counter).toEqual(1);
+       * </pre>
+       *
+       */
+      $digest: function() {
+        var watch, value, last,
+            watchers,
+            asyncQueue,
+            length,
+            dirty, ttl = TTL,
+            next, current, target = this,
+            watchLog = [],
+            logIdx, logMsg;
+
+        beginPhase('$digest');
+
+        do {
+          dirty = false;
+          current = target;
+          do {
+            asyncQueue = current.$$asyncQueue;
+            while(asyncQueue.length) {
+              try {
+                current.$eval(asyncQueue.shift());
+              } catch (e) {
+                $exceptionHandler(e);
+              }
+            }
+            if ((watchers = current.$$watchers)) {
+              // process our watches
+              length = watchers.length;
+              while (length--) {
+                try {
+                  watch = watchers[length];
+                  // Most common watches are on primitives, in which case we can short
+                  // circuit it with === operator, only when === fails do we use .equals
+                  if (watch && (value = watch.get(current)) !== (last = watch.last) &&
+                      !(watch.eq
+                          ? equals(value, last)
+                          : (typeof value == 'number' && typeof last == 'number'
+                             && isNaN(value) && isNaN(last)))) {
+                    dirty = true;
+                    watch.last = watch.eq ? copy(value) : value;
+                    watch.fn(value, ((last === initWatchVal) ? value : last), current);
+                    if (ttl < 5) {
+                      logIdx = 4 - ttl;
+                      if (!watchLog[logIdx]) watchLog[logIdx] = [];
+                      logMsg = (isFunction(watch.exp))
+                          ? 'fn: ' + (watch.exp.name || watch.exp.toString())
+                          : watch.exp;
+                      logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);
+                      watchLog[logIdx].push(logMsg);
+                    }
+                  }
+                } catch (e) {
+                  $exceptionHandler(e);
+                }
+              }
+            }
+
+            // Insanity Warning: scope depth-first traversal
+            // yes, this code is a bit crazy, but it works and we have tests to prove it!
+            // this piece should be kept in sync with the traversal in $broadcast
+            if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {
+              while(current !== target && !(next = current.$$nextSibling)) {
+                current = current.$parent;
+              }
+            }
+          } while ((current = next));
+
+          if(dirty && !(ttl--)) {
+            clearPhase();
+            throw Error(TTL + ' $digest() iterations reached. Aborting!\n' +
+                'Watchers fired in the last 5 iterations: ' + toJson(watchLog));
+          }
+        } while (dirty || asyncQueue.length);
+
+        clearPhase();
+      },
+
+
+      /**
+       * @ngdoc event
+       * @name ng.$rootScope.Scope#$destroy
+       * @eventOf ng.$rootScope.Scope
+       * @eventType broadcast on scope being destroyed
+       *
+       * @description
+       * Broadcasted when a scope and its children are being destroyed.
+       * 
+       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to
+       * clean up DOM bindings before an element is removed from the DOM.
+       */
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$destroy
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Removes the current scope (and all of its children) from the parent scope. Removal implies
+       * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer
+       * propagate to the current scope and its children. Removal also implies that the current
+       * scope is eligible for garbage collection.
+       *
+       * The `$destroy()` is usually used by directives such as
+       * {@link ng.directive:ngRepeat ngRepeat} for managing the
+       * unrolling of the loop.
+       *
+       * Just before a scope is destroyed a `$destroy` event is broadcasted on this scope.
+       * Application code can register a `$destroy` event handler that will give it chance to
+       * perform any necessary cleanup.
+       * 
+       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to
+       * clean up DOM bindings before an element is removed from the DOM.
+       */
+      $destroy: function() {
+        // we can't destroy the root scope or a scope that has been already destroyed
+        if ($rootScope == this || this.$$destroyed) return;
+        var parent = this.$parent;
+
+        this.$broadcast('$destroy');
+        this.$$destroyed = true;
+
+        if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;
+        if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;
+        if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;
+        if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;
+
+        // This is bogus code that works around Chrome's GC leak
+        // see: https://github.com/angular/angular.js/issues/1313#issuecomment-10378451
+        this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead =
+            this.$$childTail = null;
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$eval
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Executes the `expression` on the current scope returning the result. Any exceptions in the
+       * expression are propagated (uncaught). This is useful when evaluating Angular expressions.
+       *
+       * # Example
+       * <pre>
+           var scope = ng.$rootScope.Scope();
+           scope.a = 1;
+           scope.b = 2;
+
+           expect(scope.$eval('a+b')).toEqual(3);
+           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);
+       * </pre>
+       *
+       * @param {(string|function())=} expression An angular expression to be executed.
+       *
+       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.
+       *    - `function(scope)`: execute the function with the current `scope` parameter.
+       *
+       * @returns {*} The result of evaluating the expression.
+       */
+      $eval: function(expr, locals) {
+        return $parse(expr)(this, locals);
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$evalAsync
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Executes the expression on the current scope at a later point in time.
+       *
+       * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only that:
+       *
+       *   - it will execute in the current script execution context (before any DOM rendering).
+       *   - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after
+       *     `expression` execution.
+       *
+       * Any exceptions from the execution of the expression are forwarded to the
+       * {@link ng.$exceptionHandler $exceptionHandler} service.
+       *
+       * @param {(string|function())=} expression An angular expression to be executed.
+       *
+       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.
+       *    - `function(scope)`: execute the function with the current `scope` parameter.
+       *
+       */
+      $evalAsync: function(expr) {
+        this.$$asyncQueue.push(expr);
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$apply
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * `$apply()` is used to execute an expression in angular from outside of the angular framework.
+       * (For example from browser DOM events, setTimeout, XHR or third party libraries).
+       * Because we are calling into the angular framework we need to perform proper scope life-cycle
+       * of {@link ng.$exceptionHandler exception handling},
+       * {@link ng.$rootScope.Scope#$digest executing watches}.
+       *
+       * ## Life cycle
+       *
+       * # Pseudo-Code of `$apply()`
+       * <pre>
+           function $apply(expr) {
+             try {
+               return $eval(expr);
+             } catch (e) {
+               $exceptionHandler(e);
+             } finally {
+               $root.$digest();
+             }
+           }
+       * </pre>
+       *
+       *
+       * Scope's `$apply()` method transitions through the following stages:
+       *
+       * 1. The {@link guide/expression expression} is executed using the
+       *    {@link ng.$rootScope.Scope#$eval $eval()} method.
+       * 2. Any exceptions from the execution of the expression are forwarded to the
+       *    {@link ng.$exceptionHandler $exceptionHandler} service.
+       * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the expression
+       *    was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.
+       *
+       *
+       * @param {(string|function())=} exp An angular expression to be executed.
+       *
+       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.
+       *    - `function(scope)`: execute the function with current `scope` parameter.
+       *
+       * @returns {*} The result of evaluating the expression.
+       */
+      $apply: function(expr) {
+        try {
+          beginPhase('$apply');
+          return this.$eval(expr);
+        } catch (e) {
+          $exceptionHandler(e);
+        } finally {
+          clearPhase();
+          try {
+            $rootScope.$digest();
+          } catch (e) {
+            $exceptionHandler(e);
+            throw e;
+          }
+        }
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$on
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for discussion of
+       * event life cycle.
+       *
+       * The event listener function format is: `function(event, args...)`. The `event` object
+       * passed into the listener has the following attributes:
+       *
+       *   - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or `$broadcast`-ed.
+       *   - `currentScope` - `{Scope}`: the current scope which is handling the event.
+       *   - `name` - `{string}`: Name of the event.
+       *   - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel further event
+       *     propagation (available only for events that were `$emit`-ed).
+       *   - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag to true.
+       *   - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.
+       *
+       * @param {string} name Event name to listen on.
+       * @param {function(event, args...)} listener Function to call when the event is emitted.
+       * @returns {function()} Returns a deregistration function for this listener.
+       */
+      $on: function(name, listener) {
+        var namedListeners = this.$$listeners[name];
+        if (!namedListeners) {
+          this.$$listeners[name] = namedListeners = [];
+        }
+        namedListeners.push(listener);
+
+        return function() {
+          namedListeners[indexOf(namedListeners, listener)] = null;
+        };
+      },
+
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$emit
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Dispatches an event `name` upwards through the scope hierarchy notifying the
+       * registered {@link ng.$rootScope.Scope#$on} listeners.
+       *
+       * The event life cycle starts at the scope on which `$emit` was called. All
+       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get notified.
+       * Afterwards, the event traverses upwards toward the root scope and calls all registered
+       * listeners along the way. The event will stop propagating if one of the listeners cancels it.
+       *
+       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed
+       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.
+       *
+       * @param {string} name Event name to emit.
+       * @param {...*} args Optional set of arguments which will be passed onto the event listeners.
+       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}
+       */
+      $emit: function(name, args) {
+        var empty = [],
+            namedListeners,
+            scope = this,
+            stopPropagation = false,
+            event = {
+              name: name,
+              targetScope: scope,
+              stopPropagation: function() {stopPropagation = true;},
+              preventDefault: function() {
+                event.defaultPrevented = true;
+              },
+              defaultPrevented: false
+            },
+            listenerArgs = concat([event], arguments, 1),
+            i, length;
+
+        do {
+          namedListeners = scope.$$listeners[name] || empty;
+          event.currentScope = scope;
+          for (i=0, length=namedListeners.length; i<length; i++) {
+
+            // if listeners were deregistered, defragment the array
+            if (!namedListeners[i]) {
+              namedListeners.splice(i, 1);
+              i--;
+              length--;
+              continue;
+            }
+            try {
+              namedListeners[i].apply(null, listenerArgs);
+              if (stopPropagation) return event;
+            } catch (e) {
+              $exceptionHandler(e);
+            }
+          }
+          //traverse upwards
+          scope = scope.$parent;
+        } while (scope);
+
+        return event;
+      },
+
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$broadcast
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Dispatches an event `name` downwards to all child scopes (and their children) notifying the
+       * registered {@link ng.$rootScope.Scope#$on} listeners.
+       *
+       * The event life cycle starts at the scope on which `$broadcast` was called. All
+       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get notified.
+       * Afterwards, the event propagates to all direct and indirect scopes of the current scope and
+       * calls all registered listeners along the way. The event cannot be canceled.
+       *
+       * Any exception emmited from the {@link ng.$rootScope.Scope#$on listeners} will be passed
+       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.
+       *
+       * @param {string} name Event name to broadcast.
+       * @param {...*} args Optional set of arguments which will be passed onto the event listeners.
+       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}
+       */
+      $broadcast: function(name, args) {
+        var target = this,
+            current = target,
+            next = target,
+            event = {
+              name: name,
+              targetScope: target,
+              preventDefault: function() {
+                event.defaultPrevented = true;
+              },
+              defaultPrevented: false
+            },
+            listenerArgs = concat([event], arguments, 1),
+            listeners, i, length;
+
+        //down while you can, then up and next sibling or up and next sibling until back at root
+        do {
+          current = next;
+          event.currentScope = current;
+          listeners = current.$$listeners[name] || [];
+          for (i=0, length = listeners.length; i<length; i++) {
+            // if listeners were deregistered, defragment the array
+            if (!listeners[i]) {
+              listeners.splice(i, 1);
+              i--;
+              length--;
+              continue;
+            }
+
+            try {
+              listeners[i].apply(null, listenerArgs);
+            } catch(e) {
+              $exceptionHandler(e);
+            }
+          }
+
+          // Insanity Warning: scope depth-first traversal
+          // yes, this code is a bit crazy, but it works and we have tests to prove it!
+          // this piece should be kept in sync with the traversal in $digest
+          if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {
+            while(current !== target && !(next = current.$$nextSibling)) {
+              current = current.$parent;
+            }
+          }
+        } while ((current = next));
+
+        return event;
+      }
+    };
+
+    var $rootScope = new Scope();
+
+    return $rootScope;
+
+
+    function beginPhase(phase) {
+      if ($rootScope.$$phase) {
+        throw Error($rootScope.$$phase + ' already in progress');
+      }
+
+      $rootScope.$$phase = phase;
+    }
+
+    function clearPhase() {
+      $rootScope.$$phase = null;
+    }
+
+    function compileToFn(exp, name) {
+      var fn = $parse(exp);
+      assertArgFn(fn, name);
+      return fn;
+    }
+
+    /**
+     * function used as an initial value for watchers.
+     * because it's unique we can easily tell it apart from other values
+     */
+    function initWatchVal() {}
+  }];
+}
+
+/**
+ * !!! This is an undocumented "private" service !!!
+ *
+ * @name ng.$sniffer
+ * @requires $window
+ *
+ * @property {boolean} history Does the browser support html5 history api ?
+ * @property {boolean} hashchange Does the browser support hashchange event ?
+ *
+ * @description
+ * This is very simple implementation of testing browser's features.
+ */
+function $SnifferProvider() {
+  this.$get = ['$window', function($window) {
+    var eventSupport = {},
+        android = int((/android (\d+)/.exec(lowercase($window.navigator.userAgent)) || [])[1]);
+
+    return {
+      // Android has history.pushState, but it does not update location correctly
+      // so let's not use the history API at all.
+      // http://code.google.com/p/android/issues/detail?id=17471
+      // https://github.com/angular/angular.js/issues/904
+      history: !!($window.history && $window.history.pushState && !(android < 4)),
+      hashchange: 'onhashchange' in $window &&
+                  // IE8 compatible mode lies
+                  (!$window.document.documentMode || $window.document.documentMode > 7),
+      hasEvent: function(event) {
+        // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have
+        // it. In particular the event is not fired when backspace or delete key are pressed or
+        // when cut operation is performed.
+        if (event == 'input' && msie == 9) return false;
+
+        if (isUndefined(eventSupport[event])) {
+          var divElm = $window.document.createElement('div');
+          eventSupport[event] = 'on' + event in divElm;
+        }
+
+        return eventSupport[event];
+      },
+      // TODO(i): currently there is no way to feature detect CSP without triggering alerts
+      csp: false
+    };
+  }];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$window
+ *
+ * @description
+ * A reference to the browser's `window` object. While `window`
+ * is globally available in JavaScript, it causes testability problems, because
+ * it is a global variable. In angular we always refer to it through the
+ * `$window` service, so it may be overriden, removed or mocked for testing.
+ *
+ * Expressions, like the one defined for the `ngClick` directive in the example
+ * below, are evaluated with respect to the current scope.  Therefore, there is
+ * no risk of inadvertently coding in a dependency on a global value in such an
+ * expression.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope, $window) {
+           $scope.$window = $window;
+           $scope.greeting = 'Hello, World!';
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         <input type="text" ng-model="greeting" />
+         <button ng-click="$window.alert(greeting)">ALERT</button>
+       </div>
+     </doc:source>
+     <doc:scenario>
+      it('should display the greeting in the input box', function() {
+       input('greeting').enter('Hello, E2E Tests');
+       // If we click the button it will block the test runner
+       // element(':button').click();
+      });
+     </doc:scenario>
+   </doc:example>
+ */
+function $WindowProvider(){
+  this.$get = valueFn(window);
+}
+
+/**
+ * Parse headers into key value object
+ *
+ * @param {string} headers Raw headers as a string
+ * @returns {Object} Parsed headers as key value object
+ */
+function parseHeaders(headers) {
+  var parsed = {}, key, val, i;
+
+  if (!headers) return parsed;
+
+  forEach(headers.split('\n'), function(line) {
+    i = line.indexOf(':');
+    key = lowercase(trim(line.substr(0, i)));
+    val = trim(line.substr(i + 1));
+
+    if (key) {
+      if (parsed[key]) {
+        parsed[key] += ', ' + val;
+      } else {
+        parsed[key] = val;
+      }
+    }
+  });
+
+  return parsed;
+}
+
+
+/**
+ * Returns a function that provides access to parsed headers.
+ *
+ * Headers are lazy parsed when first requested.
+ * @see parseHeaders
+ *
+ * @param {(string|Object)} headers Headers to provide access to.
+ * @returns {function(string=)} Returns a getter function which if called with:
+ *
+ *   - if called with single an argument returns a single header value or null
+ *   - if called with no arguments returns an object containing all headers.
+ */
+function headersGetter(headers) {
+  var headersObj = isObject(headers) ? headers : undefined;
+
+  return function(name) {
+    if (!headersObj) headersObj =  parseHeaders(headers);
+
+    if (name) {
+      return headersObj[lowercase(name)] || null;
+    }
+
+    return headersObj;
+  };
+}
+
+
+/**
+ * Chain all given functions
+ *
+ * This function is used for both request and response transforming
+ *
+ * @param {*} data Data to transform.
+ * @param {function(string=)} headers Http headers getter fn.
+ * @param {(function|Array.<function>)} fns Function or an array of functions.
+ * @returns {*} Transformed data.
+ */
+function transformData(data, headers, fns) {
+  if (isFunction(fns))
+    return fns(data, headers);
+
+  forEach(fns, function(fn) {
+    data = fn(data, headers);
+  });
+
+  return data;
+}
+
+
+function isSuccess(status) {
+  return 200 <= status && status < 300;
+}
+
+
+function $HttpProvider() {
+  var JSON_START = /^\s*(\[|\{[^\{])/,
+      JSON_END = /[\}\]]\s*$/,
+      PROTECTION_PREFIX = /^\)\]\}',?\n/;
+
+  var $config = this.defaults = {
+    // transform incoming response data
+    transformResponse: [function(data) {
+      if (isString(data)) {
+        // strip json vulnerability protection prefix
+        data = data.replace(PROTECTION_PREFIX, '');
+        if (JSON_START.test(data) && JSON_END.test(data))
+          data = fromJson(data, true);
+      }
+      return data;
+    }],
+
+    // transform outgoing request data
+    transformRequest: [function(d) {
+      return isObject(d) && !isFile(d) ? toJson(d) : d;
+    }],
+
+    // default headers
+    headers: {
+      common: {
+        'Accept': 'application/json, text/plain, */*',
+        'X-Requested-With': 'XMLHttpRequest'
+      },
+      post: {'Content-Type': 'application/json;charset=utf-8'},
+      put:  {'Content-Type': 'application/json;charset=utf-8'}
+    }
+  };
+
+  var providerResponseInterceptors = this.responseInterceptors = [];
+
+  this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',
+      function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {
+
+    var defaultCache = $cacheFactory('$http'),
+        responseInterceptors = [];
+
+    forEach(providerResponseInterceptors, function(interceptor) {
+      responseInterceptors.push(
+          isString(interceptor)
+              ? $injector.get(interceptor)
+              : $injector.invoke(interceptor)
+      );
+    });
+
+
+    /**
+     * @ngdoc function
+     * @name ng.$http
+     * @requires $httpBackend
+     * @requires $browser
+     * @requires $cacheFactory
+     * @requires $rootScope
+     * @requires $q
+     * @requires $injector
+     *
+     * @description
+     * The `$http` service is a core Angular service that facilitates communication with the remote
+     * HTTP servers via the browser's {@link https://developer.mozilla.org/en/xmlhttprequest
+     * XMLHttpRequest} object or via {@link http://en.wikipedia.org/wiki/JSONP JSONP}.
+     *
+     * For unit testing applications that use `$http` service, see
+     * {@link ngMock.$httpBackend $httpBackend mock}.
+     *
+     * For a higher level of abstraction, please check out the {@link ngResource.$resource
+     * $resource} service.
+     *
+     * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by
+     * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage
+     * it is important to familiarize yourself with these APIs and the guarantees they provide.
+     *
+     *
+     * # General usage
+     * The `$http` service is a function which takes a single argument — a configuration object —
+     * that is used to generate an HTTP request and returns  a {@link ng.$q promise}
+     * with two $http specific methods: `success` and `error`.
+     *
+     * <pre>
+     *   $http({method: 'GET', url: '/someUrl'}).
+     *     success(function(data, status, headers, config) {
+     *       // this callback will be called asynchronously
+     *       // when the response is available
+     *     }).
+     *     error(function(data, status, headers, config) {
+     *       // called asynchronously if an error occurs
+     *       // or server returns response with an error status.
+     *     });
+     * </pre>
+     *
+     * Since the returned value of calling the $http function is a `promise`, you can also use
+     * the `then` method to register callbacks, and these callbacks will receive a single argument –
+     * an object representing the response. See the API signature and type info below for more
+     * details.
+     *
+     * A response status code between 200 and 299 is considered a success status and
+     * will result in the success callback being called. Note that if the response is a redirect,
+     * XMLHttpRequest will transparently follow it, meaning that the error callback will not be
+     * called for such responses.
+     *
+     * # Shortcut methods
+     *
+     * Since all invocations of the $http service require passing in an HTTP method and URL, and
+     * POST/PUT requests require request data to be provided as well, shortcut methods
+     * were created:
+     *
+     * <pre>
+     *   $http.get('/someUrl').success(successCallback);
+     *   $http.post('/someUrl', data).success(successCallback);
+     * </pre>
+     *
+     * Complete list of shortcut methods:
+     *
+     * - {@link ng.$http#get $http.get}
+     * - {@link ng.$http#head $http.head}
+     * - {@link ng.$http#post $http.post}
+     * - {@link ng.$http#put $http.put}
+     * - {@link ng.$http#delete $http.delete}
+     * - {@link ng.$http#jsonp $http.jsonp}
+     *
+     *
+     * # Setting HTTP Headers
+     *
+     * The $http service will automatically add certain HTTP headers to all requests. These defaults
+     * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration
+     * object, which currently contains this default configuration:
+     *
+     * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):
+     *   - `Accept: application/json, text/plain, * / *`
+     *   - `X-Requested-With: XMLHttpRequest`
+     * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)
+     *   - `Content-Type: application/json`
+     * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)
+     *   - `Content-Type: application/json`
+     *
+     * To add or overwrite these defaults, simply add or remove a property from these configuration
+     * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object
+     * with the lowercased HTTP method name as the key, e.g.
+     * `$httpProvider.defaults.headers.get['My-Header']='value'`.
+     *
+     * Additionally, the defaults can be set at runtime via the `$http.defaults` object in the same
+     * fashion.
+     *
+     *
+     * # Transforming Requests and Responses
+     *
+     * Both requests and responses can be transformed using transform functions. By default, Angular
+     * applies these transformations:
+     *
+     * Request transformations:
+     *
+     * - If the `data` property of the request configuration object contains an object, serialize it into
+     *   JSON format.
+     *
+     * Response transformations:
+     *
+     *  - If XSRF prefix is detected, strip it (see Security Considerations section below).
+     *  - If JSON response is detected, deserialize it using a JSON parser.
+     *
+     * To globally augment or override the default transforms, modify the `$httpProvider.defaults.transformRequest` and
+     * `$httpProvider.defaults.transformResponse` properties. These properties are by default an
+     * array of transform functions, which allows you to `push` or `unshift` a new transformation function into the
+     * transformation chain. You can also decide to completely override any default transformations by assigning your
+     * transformation functions to these properties directly without the array wrapper.
+     *
+     * Similarly, to locally override the request/response transforms, augment the `transformRequest` and/or
+     * `transformResponse` properties of the configuration object passed into `$http`.
+     *
+     *
+     * # Caching
+     *
+     * To enable caching, set the configuration property `cache` to `true`. When the cache is
+     * enabled, `$http` stores the response from the server in local cache. Next time the
+     * response is served from the cache without sending a request to the server.
+     *
+     * Note that even if the response is served from cache, delivery of the data is asynchronous in
+     * the same way that real requests are.
+     *
+     * If there are multiple GET requests for the same URL that should be cached using the same
+     * cache, but the cache is not populated yet, only one request to the server will be made and
+     * the remaining requests will be fulfilled using the response from the first request.
+     *
+     *
+     * # Response interceptors
+     *
+     * Before you start creating interceptors, be sure to understand the
+     * {@link ng.$q $q and deferred/promise APIs}.
+     *
+     * For purposes of global error handling, authentication or any kind of synchronous or
+     * asynchronous preprocessing of received responses, it is desirable to be able to intercept
+     * responses for http requests before they are handed over to the application code that
+     * initiated these requests. The response interceptors leverage the {@link ng.$q
+     * promise apis} to fulfil this need for both synchronous and asynchronous preprocessing.
+     *
+     * The interceptors are service factories that are registered with the $httpProvider by
+     * adding them to the `$httpProvider.responseInterceptors` array. The factory is called and
+     * injected with dependencies (if specified) and returns the interceptor  — a function that
+     * takes a {@link ng.$q promise} and returns the original or a new promise.
+     *
+     * <pre>
+     *   // register the interceptor as a service
+     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
+     *     return function(promise) {
+     *       return promise.then(function(response) {
+     *         // do something on success
+     *         return response;
+     *       }, function(response) {
+     *         // do something on error
+     *         if (canRecover(response)) {
+     *           return responseOrNewPromise
+     *         }
+     *         return $q.reject(response);
+     *       });
+     *     }
+     *   });
+     *
+     *   $httpProvider.responseInterceptors.push('myHttpInterceptor');
+     *
+     *
+     *   // register the interceptor via an anonymous factory
+     *   $httpProvider.responseInterceptors.push(function($q, dependency1, dependency2) {
+     *     return function(promise) {
+     *       // same as above
+     *     }
+     *   });
+     * </pre>
+     *
+     *
+     * # Security Considerations
+     *
+     * When designing web applications, consider security threats from:
+     *
+     * - {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
+     *   JSON vulnerability}
+     * - {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF}
+     *
+     * Both server and the client must cooperate in order to eliminate these threats. Angular comes
+     * pre-configured with strategies that address these issues, but for this to work backend server
+     * cooperation is required.
+     *
+     * ## JSON Vulnerability Protection
+     *
+     * A {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
+     * JSON vulnerability} allows third party website to turn your JSON resource URL into
+     * {@link http://en.wikipedia.org/wiki/JSONP JSONP} request under some conditions. To
+     * counter this your server can prefix all JSON requests with following string `")]}',\n"`.
+     * Angular will automatically strip the prefix before processing it as JSON.
+     *
+     * For example if your server needs to return:
+     * <pre>
+     * ['one','two']
+     * </pre>
+     *
+     * which is vulnerable to attack, your server can return:
+     * <pre>
+     * )]}',
+     * ['one','two']
+     * </pre>
+     *
+     * Angular will strip the prefix, before processing the JSON.
+     *
+     *
+     * ## Cross Site Request Forgery (XSRF) Protection
+     *
+     * {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF} is a technique by which
+     * an unauthorized site can gain your user's private data. Angular provides a mechanism
+     * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie
+     * called `XSRF-TOKEN` and sets it as the HTTP header `X-XSRF-TOKEN`. Since only JavaScript that
+     * runs on your domain could read the cookie, your server can be assured that the XHR came from
+     * JavaScript running on your domain.
+     *
+     * To take advantage of this, your server needs to set a token in a JavaScript readable session
+     * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the
+     * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure
+     * that only JavaScript running on your domain could have sent the request. The token must be
+     * unique for each user and must be verifiable by the server (to prevent the JavaScript from making
+     * up its own tokens). We recommend that the token is a digest of your site's authentication
+     * cookie with a {@link https://en.wikipedia.org/wiki/Salt_(cryptography) salt} for added security.
+     *
+     *
+     * @param {object} config Object describing the request to be made and how it should be
+     *    processed. The object has following properties:
+     *
+     *    - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)
+     *    - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.
+     *    - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be turned to
+     *      `?key1=value1&key2=value2` after the url. If the value is not a string, it will be JSONified.
+     *    - **data** – `{string|Object}` – Data to be sent as the request message data.
+     *    - **headers** – `{Object}` – Map of strings representing HTTP headers to send to the server.
+     *    - **transformRequest** – `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
+     *      transform function or an array of such functions. The transform function takes the http
+     *      request body and headers and returns its transformed (typically serialized) version.
+     *    - **transformResponse** – `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
+     *      transform function or an array of such functions. The transform function takes the http
+     *      response body and headers and returns its transformed (typically deserialized) version.
+     *    - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
+     *      GET request, otherwise if a cache instance built with
+     *      {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
+     *      caching.
+     *    - **timeout** – `{number}` – timeout in milliseconds.
+     *    - **withCredentials** - `{boolean}` - whether to to set the `withCredentials` flag on the
+     *      XHR object. See {@link https://developer.mozilla.org/en/http_access_control#section_5
+     *      requests with credentials} for more information.
+     *
+     * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the
+     *   standard `then` method and two http specific methods: `success` and `error`. The `then`
+     *   method takes two arguments a success and an error callback which will be called with a
+     *   response object. The `success` and `error` methods take a single argument - a function that
+     *   will be called when the request succeeds or fails respectively. The arguments passed into
+     *   these functions are destructured representation of the response object passed into the
+     *   `then` method. The response object has these properties:
+     *
+     *   - **data** – `{string|Object}` – The response body transformed with the transform functions.
+     *   - **status** – `{number}` – HTTP status code of the response.
+     *   - **headers** – `{function([headerName])}` – Header getter function.
+     *   - **config** – `{Object}` – The configuration object that was used to generate the request.
+     *
+     * @property {Array.<Object>} pendingRequests Array of config objects for currently pending
+     *   requests. This is primarily meant to be used for debugging purposes.
+     *
+     *
+     * @example
+      <example>
+        <file name="index.html">
+          <div ng-controller="FetchCtrl">
+            <select ng-model="method">
+              <option>GET</option>
+              <option>JSONP</option>
+            </select>
+            <input type="text" ng-model="url" size="80"/>
+            <button ng-click="fetch()">fetch</button><br>
+            <button ng-click="updateModel('GET', 'http-hello.html')">Sample GET</button>
+            <button ng-click="updateModel('JSONP', 'http://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')">Sample JSONP</button>
+            <button ng-click="updateModel('JSONP', 'http://angularjs.org/doesntexist&callback=JSON_CALLBACK')">Invalid JSONP</button>
+            <pre>http status code: {{status}}</pre>
+            <pre>http response data: {{data}}</pre>
+          </div>
+        </file>
+        <file name="script.js">
+          function FetchCtrl($scope, $http, $templateCache) {
+            $scope.method = 'GET';
+            $scope.url = 'http-hello.html';
+
+            $scope.fetch = function() {
+              $scope.code = null;
+              $scope.response = null;
+
+              $http({method: $scope.method, url: $scope.url, cache: $templateCache}).
+                success(function(data, status) {
+                  $scope.status = status;
+                  $scope.data = data;
+                }).
+                error(function(data, status) {
+                  $scope.data = data || "Request failed";
+                  $scope.status = status;
+              });
+            };
+
+            $scope.updateModel = function(method, url) {
+              $scope.method = method;
+              $scope.url = url;
+            };
+          }
+        </file>
+        <file name="http-hello.html">
+          Hello, $http!
+        </file>
+        <file name="scenario.js">
+          it('should make an xhr GET request', function() {
+            element(':button:contains("Sample GET")').click();
+            element(':button:contains("fetch")').click();
+            expect(binding('status')).toBe('200');
+            expect(binding('data')).toMatch(/Hello, \$http!/);
+          });
+
+          it('should make a JSONP request to angularjs.org', function() {
+            element(':button:contains("Sample JSONP")').click();
+            element(':button:contains("fetch")').click();
+            expect(binding('status')).toBe('200');
+            expect(binding('data')).toMatch(/Super Hero!/);
+          });
+
+          it('should make JSONP request to invalid URL and invoke the error handler',
+              function() {
+            element(':button:contains("Invalid JSONP")').click();
+            element(':button:contains("fetch")').click();
+            expect(binding('status')).toBe('0');
+            expect(binding('data')).toBe('Request failed');
+          });
+        </file>
+      </example>
+     */
+    function $http(config) {
+      config.method = uppercase(config.method);
+
+      var reqTransformFn = config.transformRequest || $config.transformRequest,
+          respTransformFn = config.transformResponse || $config.transformResponse,
+          reqHeaders = extend({}, config.headers),
+          defHeaders = extend(
+            {'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']},
+            $config.headers.common,
+            $config.headers[lowercase(config.method)]
+          ),
+          reqData,
+          defHeaderName, lowercaseDefHeaderName, headerName,
+          promise;
+
+      // using for-in instead of forEach to avoid unecessary iteration after header has been found
+      defaultHeadersIteration:
+      for(defHeaderName in defHeaders) {
+        lowercaseDefHeaderName = lowercase(defHeaderName);
+        for(headerName in config.headers) {
+          if (lowercase(headerName) === lowercaseDefHeaderName) {
+            continue defaultHeadersIteration;
+          }
+        }
+        reqHeaders[defHeaderName] = defHeaders[defHeaderName];
+      }
+
+      // strip content-type if data is undefined
+      if (isUndefined(config.data)) {
+        for(var header in reqHeaders) {
+          if (lowercase(header) === 'content-type') {
+            delete reqHeaders[header];
+            break;
+          }
+        }
+      }
+
+      reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn);
+
+      // send request
+      promise = sendReq(config, reqData, reqHeaders);
+
+
+      // transform future response
+      promise = promise.then(transformResponse, transformResponse);
+
+      // apply interceptors
+      forEach(responseInterceptors, function(interceptor) {
+        promise = interceptor(promise);
+      });
+
+      promise.success = function(fn) {
+        promise.then(function(response) {
+          fn(response.data, response.status, response.headers, config);
+        });
+        return promise;
+      };
+
+      promise.error = function(fn) {
+        promise.then(null, function(response) {
+          fn(response.data, response.status, response.headers, config);
+        });
+        return promise;
+      };
+
+      return promise;
+
+      function transformResponse(response) {
+        // make a copy since the response must be cacheable
+        var resp = extend({}, response, {
+          data: transformData(response.data, response.headers, respTransformFn)
+        });
+        return (isSuccess(response.status))
+          ? resp
+          : $q.reject(resp);
+      }
+    }
+
+    $http.pendingRequests = [];
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#get
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `GET` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#delete
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `DELETE` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#head
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `HEAD` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#jsonp
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `JSONP` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request.
+     *                     Should contain `JSON_CALLBACK` string.
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+    createShortMethods('get', 'delete', 'head', 'jsonp');
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#post
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `POST` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request
+     * @param {*} data Request content
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#put
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `PUT` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request
+     * @param {*} data Request content
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+    createShortMethodsWithData('post', 'put');
+
+        /**
+         * @ngdoc property
+         * @name ng.$http#defaults
+         * @propertyOf ng.$http
+         *
+         * @description
+         * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of
+         * default headers as well as request and response transformations.
+         *
+         * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above.
+         */
+    $http.defaults = $config;
+
+
+    return $http;
+
+
+    function createShortMethods(names) {
+      forEach(arguments, function(name) {
+        $http[name] = function(url, config) {
+          return $http(extend(config || {}, {
+            method: name,
+            url: url
+          }));
+        };
+      });
+    }
+
+
+    function createShortMethodsWithData(name) {
+      forEach(arguments, function(name) {
+        $http[name] = function(url, data, config) {
+          return $http(extend(config || {}, {
+            method: name,
+            url: url,
+            data: data
+          }));
+        };
+      });
+    }
+
+
+    /**
+     * Makes the request.
+     *
+     * !!! ACCESSES CLOSURE VARS:
+     * $httpBackend, $config, $log, $rootScope, defaultCache, $http.pendingRequests
+     */
+    function sendReq(config, reqData, reqHeaders) {
+      var deferred = $q.defer(),
+          promise = deferred.promise,
+          cache,
+          cachedResp,
+          url = buildUrl(config.url, config.params);
+
+      $http.pendingRequests.push(config);
+      promise.then(removePendingReq, removePendingReq);
+
+
+      if (config.cache && config.method == 'GET') {
+        cache = isObject(config.cache) ? config.cache : defaultCache;
+      }
+
+      if (cache) {
+        cachedResp = cache.get(url);
+        if (cachedResp) {
+          if (cachedResp.then) {
+            // cached request has already been sent, but there is no response yet
+            cachedResp.then(removePendingReq, removePendingReq);
+            return cachedResp;
+          } else {
+            // serving from cache
+            if (isArray(cachedResp)) {
+              resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2]));
+            } else {
+              resolvePromise(cachedResp, 200, {});
+            }
+          }
+        } else {
+          // put the promise for the non-transformed response into cache as a placeholder
+          cache.put(url, promise);
+        }
+      }
+
+      // if we won't have the response in cache, send the request to the backend
+      if (!cachedResp) {
+        $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,
+            config.withCredentials);
+      }
+
+      return promise;
+
+
+      /**
+       * Callback registered to $httpBackend():
+       *  - caches the response if desired
+       *  - resolves the raw $http promise
+       *  - calls $apply
+       */
+      function done(status, response, headersString) {
+        if (cache) {
+          if (isSuccess(status)) {
+            cache.put(url, [status, response, parseHeaders(headersString)]);
+          } else {
+            // remove promise from the cache
+            cache.remove(url);
+          }
+        }
+
+        resolvePromise(response, status, headersString);
+        $rootScope.$apply();
+      }
+
+
+      /**
+       * Resolves the raw $http promise.
+       */
+      function resolvePromise(response, status, headers) {
+        // normalize internal statuses to 0
+        status = Math.max(status, 0);
+
+        (isSuccess(status) ? deferred.resolve : deferred.reject)({
+          data: response,
+          status: status,
+          headers: headersGetter(headers),
+          config: config
+        });
+      }
+
+
+      function removePendingReq() {
+        var idx = indexOf($http.pendingRequests, config);
+        if (idx !== -1) $http.pendingRequests.splice(idx, 1);
+      }
+    }
+
+
+    function buildUrl(url, params) {
+          if (!params) return url;
+          var parts = [];
+          forEachSorted(params, function(value, key) {
+            if (value == null || value == undefined) return;
+            if (isObject(value)) {
+              value = toJson(value);
+            }
+            parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
+          });
+          return url + ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
+        }
+
+
+  }];
+}
+
+var XHR = window.XMLHttpRequest || function() {
+  try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e1) {}
+  try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e2) {}
+  try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e3) {}
+  throw new Error("This browser does not support XMLHttpRequest.");
+};
+
+
+/**
+ * @ngdoc object
+ * @name ng.$httpBackend
+ * @requires $browser
+ * @requires $window
+ * @requires $document
+ *
+ * @description
+ * HTTP backend used by the {@link ng.$http service} that delegates to
+ * XMLHttpRequest object or JSONP and deals with browser incompatibilities.
+ *
+ * You should never need to use this service directly, instead use the higher-level abstractions:
+ * {@link ng.$http $http} or {@link ngResource.$resource $resource}.
+ *
+ * During testing this implementation is swapped with {@link ngMock.$httpBackend mock
+ * $httpBackend} which can be trained with responses.
+ */
+function $HttpBackendProvider() {
+  this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {
+    return createHttpBackend($browser, XHR, $browser.defer, $window.angular.callbacks,
+        $document[0], $window.location.protocol.replace(':', ''));
+  }];
+}
+
+function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument, locationProtocol) {
+  // TODO(vojta): fix the signature
+  return function(method, url, post, callback, headers, timeout, withCredentials) {
+    $browser.$$incOutstandingRequestCount();
+    url = url || $browser.url();
+
+    if (lowercase(method) == 'jsonp') {
+      var callbackId = '_' + (callbacks.counter++).toString(36);
+      callbacks[callbackId] = function(data) {
+        callbacks[callbackId].data = data;
+      };
+
+      jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),
+          function() {
+        if (callbacks[callbackId].data) {
+          completeRequest(callback, 200, callbacks[callbackId].data);
+        } else {
+          completeRequest(callback, -2);
+        }
+        delete callbacks[callbackId];
+      });
+    } else {
+      var xhr = new XHR();
+      xhr.open(method, url, true);
+      forEach(headers, function(value, key) {
+        if (value) xhr.setRequestHeader(key, value);
+      });
+
+      var status;
+
+      // In IE6 and 7, this might be called synchronously when xhr.send below is called and the
+      // response is in the cache. the promise api will ensure that to the app code the api is
+      // always async
+      xhr.onreadystatechange = function() {
+        if (xhr.readyState == 4) {
+          var responseHeaders = xhr.getAllResponseHeaders();
+
+          // TODO(vojta): remove once Firefox 21 gets released.
+          // begin: workaround to overcome Firefox CORS http response headers bug
+          // https://bugzilla.mozilla.org/show_bug.cgi?id=608735
+          // Firefox already patched in nightly. Should land in Firefox 21.
+
+          // CORS "simple response headers" http://www.w3.org/TR/cors/
+          var value,
+              simpleHeaders = ["Cache-Control", "Content-Language", "Content-Type",
+                                  "Expires", "Last-Modified", "Pragma"];
+          if (!responseHeaders) {
+            responseHeaders = "";
+            forEach(simpleHeaders, function (header) {
+              var value = xhr.getResponseHeader(header);
+              if (value) {
+                  responseHeaders += header + ": " + value + "\n";
+              }
+            });
+          }
+          // end of the workaround.
+
+          completeRequest(callback, status || xhr.status, xhr.responseText,
+                          responseHeaders);
+        }
+      };
+
+      if (withCredentials) {
+        xhr.withCredentials = true;
+      }
+
+      xhr.send(post || '');
+
+      if (timeout > 0) {
+        $browserDefer(function() {
+          status = -1;
+          xhr.abort();
+        }, timeout);
+      }
+    }
+
+
+    function completeRequest(callback, status, response, headersString) {
+      // URL_MATCH is defined in src/service/location.js
+      var protocol = (url.match(URL_MATCH) || ['', locationProtocol])[1];
+
+      // fix status code for file protocol (it's always 0)
+      status = (protocol == 'file') ? (response ? 200 : 404) : status;
+
+      // normalize IE bug (http://bugs.jquery.com/ticket/1450)
+      status = status == 1223 ? 204 : status;
+
+      callback(status, response, headersString);
+      $browser.$$completeOutstandingRequest(noop);
+    }
+  };
+
+  function jsonpReq(url, done) {
+    // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:
+    // - fetches local scripts via XHR and evals them
+    // - adds and immediately removes script elements from the document
+    var script = rawDocument.createElement('script'),
+        doneWrapper = function() {
+          rawDocument.body.removeChild(script);
+          if (done) done();
+        };
+
+    script.type = 'text/javascript';
+    script.src = url;
+
+    if (msie) {
+      script.onreadystatechange = function() {
+        if (/loaded|complete/.test(script.readyState)) doneWrapper();
+      };
+    } else {
+      script.onload = script.onerror = doneWrapper;
+    }
+
+    rawDocument.body.appendChild(script);
+  }
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$locale
+ *
+ * @description
+ * $locale service provides localization rules for various Angular components. As of right now the
+ * only public api is:
+ *
+ * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)
+ */
+function $LocaleProvider(){
+  this.$get = function() {
+    return {
+      id: 'en-us',
+
+      NUMBER_FORMATS: {
+        DECIMAL_SEP: '.',
+        GROUP_SEP: ',',
+        PATTERNS: [
+          { // Decimal Pattern
+            minInt: 1,
+            minFrac: 0,
+            maxFrac: 3,
+            posPre: '',
+            posSuf: '',
+            negPre: '-',
+            negSuf: '',
+            gSize: 3,
+            lgSize: 3
+          },{ //Currency Pattern
+            minInt: 1,
+            minFrac: 2,
+            maxFrac: 2,
+            posPre: '\u00A4',
+            posSuf: '',
+            negPre: '(\u00A4',
+            negSuf: ')',
+            gSize: 3,
+            lgSize: 3
+          }
+        ],
+        CURRENCY_SYM: '$'
+      },
+
+      DATETIME_FORMATS: {
+        MONTH: 'January,February,March,April,May,June,July,August,September,October,November,December'
+                .split(','),
+        SHORTMONTH:  'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),
+        DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),
+        SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),
+        AMPMS: ['AM','PM'],
+        medium: 'MMM d, y h:mm:ss a',
+        short: 'M/d/yy h:mm a',
+        fullDate: 'EEEE, MMMM d, y',
+        longDate: 'MMMM d, y',
+        mediumDate: 'MMM d, y',
+        shortDate: 'M/d/yy',
+        mediumTime: 'h:mm:ss a',
+        shortTime: 'h:mm a'
+      },
+
+      pluralCat: function(num) {
+        if (num === 1) {
+          return 'one';
+        }
+        return 'other';
+      }
+    };
+  };
+}
+
+function $TimeoutProvider() {
+  this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler',
+       function($rootScope,   $browser,   $q,   $exceptionHandler) {
+    var deferreds = {};
+
+
+     /**
+      * @ngdoc function
+      * @name ng.$timeout
+      * @requires $browser
+      *
+      * @description
+      * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch
+      * block and delegates any exceptions to
+      * {@link ng.$exceptionHandler $exceptionHandler} service.
+      *
+      * The return value of registering a timeout function is a promise, which will be resolved when
+      * the timeout is reached and the timeout function is executed.
+      *
+      * To cancel a timeout request, call `$timeout.cancel(promise)`.
+      *
+      * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to
+      * synchronously flush the queue of deferred functions.
+      *
+      * @param {function()} fn A function, whose execution should be delayed.
+      * @param {number=} [delay=0] Delay in milliseconds.
+      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
+      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.
+      * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this
+      *   promise will be resolved with is the return value of the `fn` function.
+      */
+    function timeout(fn, delay, invokeApply) {
+      var deferred = $q.defer(),
+          promise = deferred.promise,
+          skipApply = (isDefined(invokeApply) && !invokeApply),
+          timeoutId, cleanup;
+
+      timeoutId = $browser.defer(function() {
+        try {
+          deferred.resolve(fn());
+        } catch(e) {
+          deferred.reject(e);
+          $exceptionHandler(e);
+        }
+        finally {
+          delete deferreds[promise.$$timeoutId];
+        }
+
+        if (!skipApply) $rootScope.$apply();
+      }, delay);
+
+      promise.$$timeoutId = timeoutId;
+      deferreds[timeoutId] = deferred;
+
+      return promise;
+    }
+
+
+     /**
+      * @ngdoc function
+      * @name ng.$timeout#cancel
+      * @methodOf ng.$timeout
+      *
+      * @description
+      * Cancels a task associated with the `promise`. As a result of this, the promise will be
+      * resolved with a rejection.
+      *
+      * @param {Promise=} promise Promise returned by the `$timeout` function.
+      * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully
+      *   canceled.
+      */
+    timeout.cancel = function(promise) {
+      if (promise && promise.$$timeoutId in deferreds) {
+        deferreds[promise.$$timeoutId].reject('canceled');
+        delete deferreds[promise.$$timeoutId];
+        return $browser.defer.cancel(promise.$$timeoutId);
+      }
+      return false;
+    };
+
+    return timeout;
+  }];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$filterProvider
+ * @description
+ *
+ * Filters are just functions which transform input to an output. However filters need to be Dependency Injected. To
+ * achieve this a filter definition consists of a factory function which is annotated with dependencies and is
+ * responsible for creating a filter function.
+ *
+ * <pre>
+ *   // Filter registration
+ *   function MyModule($provide, $filterProvider) {
+ *     // create a service to demonstrate injection (not always needed)
+ *     $provide.value('greet', function(name){
+ *       return 'Hello ' + name + '!';
+ *     });
+ *
+ *     // register a filter factory which uses the
+ *     // greet service to demonstrate DI.
+ *     $filterProvider.register('greet', function(greet){
+ *       // return the filter function which uses the greet service
+ *       // to generate salutation
+ *       return function(text) {
+ *         // filters need to be forgiving so check input validity
+ *         return text && greet(text) || text;
+ *       };
+ *     });
+ *   }
+ * </pre>
+ *
+ * The filter function is registered with the `$injector` under the filter name suffixe with `Filter`.
+ * <pre>
+ *   it('should be the same instance', inject(
+ *     function($filterProvider) {
+ *       $filterProvider.register('reverse', function(){
+ *         return ...;
+ *       });
+ *     },
+ *     function($filter, reverseFilter) {
+ *       expect($filter('reverse')).toBe(reverseFilter);
+ *     });
+ * </pre>
+ *
+ *
+ * For more information about how angular filters work, and how to create your own filters, see
+ * {@link guide/dev_guide.templates.filters Understanding Angular Filters} in the angular Developer
+ * Guide.
+ */
+/**
+ * @ngdoc method
+ * @name ng.$filterProvider#register
+ * @methodOf ng.$filterProvider
+ * @description
+ * Register filter factory function.
+ *
+ * @param {String} name Name of the filter.
+ * @param {function} fn The filter factory function which is injectable.
+ */
+
+
+/**
+ * @ngdoc function
+ * @name ng.$filter
+ * @function
+ * @description
+ * Filters are used for formatting data displayed to the user.
+ *
+ * The general syntax in templates is as follows:
+ *
+ *         {{ expression [| filter_name[:parameter_value] ... ] }}
+ *
+ * @param {String} name Name of the filter function to retrieve
+ * @return {Function} the filter function
+ */
+$FilterProvider.$inject = ['$provide'];
+function $FilterProvider($provide) {
+  var suffix = 'Filter';
+
+  function register(name, factory) {
+    return $provide.factory(name + suffix, factory);
+  }
+  this.register = register;
+
+  this.$get = ['$injector', function($injector) {
+    return function(name) {
+      return $injector.get(name + suffix);
+    }
+  }];
+
+  ////////////////////////////////////////
+
+  register('currency', currencyFilter);
+  register('date', dateFilter);
+  register('filter', filterFilter);
+  register('json', jsonFilter);
+  register('limitTo', limitToFilter);
+  register('lowercase', lowercaseFilter);
+  register('number', numberFilter);
+  register('orderBy', orderByFilter);
+  register('uppercase', uppercaseFilter);
+}
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:filter
+ * @function
+ *
+ * @description
+ * Selects a subset of items from `array` and returns it as a new array.
+ *
+ * Note: This function is used to augment the `Array` type in Angular expressions. See
+ * {@link ng.$filter} for more information about Angular arrays.
+ *
+ * @param {Array} array The source array.
+ * @param {string|Object|function()} expression The predicate to be used for selecting items from
+ *   `array`.
+ *
+ *   Can be one of:
+ *
+ *   - `string`: Predicate that results in a substring match using the value of `expression`
+ *     string. All strings or objects with string properties in `array` that contain this string
+ *     will be returned. The predicate can be negated by prefixing the string with `!`.
+ *
+ *   - `Object`: A pattern object can be used to filter specific properties on objects contained
+ *     by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items
+ *     which have property `name` containing "M" and property `phone` containing "1". A special
+ *     property name `$` can be used (as in `{$:"text"}`) to accept a match against any
+ *     property of the object. That's equivalent to the simple substring match with a `string`
+ *     as described above.
+ *
+ *   - `function`: A predicate function can be used to write arbitrary filters. The function is
+ *     called for each element of `array`. The final result is an array of those elements that
+ *     the predicate returned true for.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <div ng-init="friends = [{name:'John', phone:'555-1276'},
+                                {name:'Mary', phone:'800-BIG-MARY'},
+                                {name:'Mike', phone:'555-4321'},
+                                {name:'Adam', phone:'555-5678'},
+                                {name:'Julie', phone:'555-8765'}]"></div>
+
+       Search: <input ng-model="searchText">
+       <table id="searchTextResults">
+         <tr><th>Name</th><th>Phone</th></tr>
+         <tr ng-repeat="friend in friends | filter:searchText">
+           <td>{{friend.name}}</td>
+           <td>{{friend.phone}}</td>
+         </tr>
+       </table>
+       <hr>
+       Any: <input ng-model="search.$"> <br>
+       Name only <input ng-model="search.name"><br>
+       Phone only <input ng-model="search.phone"><br>
+       <table id="searchObjResults">
+         <tr><th>Name</th><th>Phone</th></tr>
+         <tr ng-repeat="friend in friends | filter:search">
+           <td>{{friend.name}}</td>
+           <td>{{friend.phone}}</td>
+         </tr>
+       </table>
+     </doc:source>
+     <doc:scenario>
+       it('should search across all fields when filtering with a string', function() {
+         input('searchText').enter('m');
+         expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')).
+           toEqual(['Mary', 'Mike', 'Adam']);
+
+         input('searchText').enter('76');
+         expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')).
+           toEqual(['John', 'Julie']);
+       });
+
+       it('should search in specific fields when filtering with a predicate object', function() {
+         input('search.$').enter('i');
+         expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')).
+           toEqual(['Mary', 'Mike', 'Julie']);
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+function filterFilter() {
+  return function(array, expression) {
+    if (!isArray(array)) return array;
+    var predicates = [];
+    predicates.check = function(value) {
+      for (var j = 0; j < predicates.length; j++) {
+        if(!predicates[j](value)) {
+          return false;
+        }
+      }
+      return true;
+    };
+    var search = function(obj, text){
+      if (text.charAt(0) === '!') {
+        return !search(obj, text.substr(1));
+      }
+      switch (typeof obj) {
+        case "boolean":
+        case "number":
+        case "string":
+          return ('' + obj).toLowerCase().indexOf(text) > -1;
+        case "object":
+          for ( var objKey in obj) {
+            if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
+              return true;
+            }
+          }
+          return false;
+        case "array":
+          for ( var i = 0; i < obj.length; i++) {
+            if (search(obj[i], text)) {
+              return true;
+            }
+          }
+          return false;
+        default:
+          return false;
+      }
+    };
+    switch (typeof expression) {
+      case "boolean":
+      case "number":
+      case "string":
+        expression = {$:expression};
+      case "object":
+        for (var key in expression) {
+          if (key == '$') {
+            (function() {
+              var text = (''+expression[key]).toLowerCase();
+              if (!text) return;
+              predicates.push(function(value) {
+                return search(value, text);
+              });
+            })();
+          } else {
+            (function() {
+              var path = key;
+              var text = (''+expression[key]).toLowerCase();
+              if (!text) return;
+              predicates.push(function(value) {
+                return search(getter(value, path), text);
+              });
+            })();
+          }
+        }
+        break;
+      case 'function':
+        predicates.push(expression);
+        break;
+      default:
+        return array;
+    }
+    var filtered = [];
+    for ( var j = 0; j < array.length; j++) {
+      var value = array[j];
+      if (predicates.check(value)) {
+        filtered.push(value);
+      }
+    }
+    return filtered;
+  }
+}
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:currency
+ * @function
+ *
+ * @description
+ * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default
+ * symbol for current locale is used.
+ *
+ * @param {number} amount Input to filter.
+ * @param {string=} symbol Currency symbol or identifier to be displayed.
+ * @returns {string} Formatted number.
+ *
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.amount = 1234.56;
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         <input type="number" ng-model="amount"> <br>
+         default currency symbol ($): {{amount | currency}}<br>
+         custom currency identifier (USD$): {{amount | currency:"USD$"}}
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should init with 1234.56', function() {
+         expect(binding('amount | currency')).toBe('$1,234.56');
+         expect(binding('amount | currency:"USD$"')).toBe('USD$1,234.56');
+       });
+       it('should update', function() {
+         input('amount').enter('-1234');
+         expect(binding('amount | currency')).toBe('($1,234.00)');
+         expect(binding('amount | currency:"USD$"')).toBe('(USD$1,234.00)');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+currencyFilter.$inject = ['$locale'];
+function currencyFilter($locale) {
+  var formats = $locale.NUMBER_FORMATS;
+  return function(amount, currencySymbol){
+    if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM;
+    return formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2).
+                replace(/\u00A4/g, currencySymbol);
+  };
+}
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:number
+ * @function
+ *
+ * @description
+ * Formats a number as text.
+ *
+ * If the input is not a number an empty string is returned.
+ *
+ * @param {number|string} number Number to format.
+ * @param {(number|string)=} fractionSize Number of decimal places to round the number to.
+ * If this is not provided then the fraction size is computed from the current locale's number
+ * formatting pattern. In the case of the default locale, it will be 3.
+ * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.val = 1234.56789;
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         Enter number: <input ng-model='val'><br>
+         Default formatting: {{val | number}}<br>
+         No fractions: {{val | number:0}}<br>
+         Negative number: {{-val | number:4}}
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should format numbers', function() {
+         expect(binding('val | number')).toBe('1,234.568');
+         expect(binding('val | number:0')).toBe('1,235');
+         expect(binding('-val | number:4')).toBe('-1,234.5679');
+       });
+
+       it('should update', function() {
+         input('val').enter('3374.333');
+         expect(binding('val | number')).toBe('3,374.333');
+         expect(binding('val | number:0')).toBe('3,374');
+         expect(binding('-val | number:4')).toBe('-3,374.3330');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+
+
+numberFilter.$inject = ['$locale'];
+function numberFilter($locale) {
+  var formats = $locale.NUMBER_FORMATS;
+  return function(number, fractionSize) {
+    return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,
+      fractionSize);
+  };
+}
+
+var DECIMAL_SEP = '.';
+function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
+  if (isNaN(number) || !isFinite(number)) return '';
+
+  var isNegative = number < 0;
+  number = Math.abs(number);
+  var numStr = number + '',
+      formatedText = '',
+      parts = [];
+
+  var hasExponent = false;
+  if (numStr.indexOf('e') !== -1) {
+    var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
+    if (match && match[2] == '-' && match[3] > fractionSize + 1) {
+      numStr = '0';
+    } else {
+      formatedText = numStr;
+      hasExponent = true;
+    }
+  }
+
+  if (!hasExponent) {
+    var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;
+
+    // determine fractionSize if it is not specified
+    if (isUndefined(fractionSize)) {
+      fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);
+    }
+
+    var pow = Math.pow(10, fractionSize);
+    number = Math.round(number * pow) / pow;
+    var fraction = ('' + number).split(DECIMAL_SEP);
+    var whole = fraction[0];
+    fraction = fraction[1] || '';
+
+    var pos = 0,
+        lgroup = pattern.lgSize,
+        group = pattern.gSize;
+
+    if (whole.length >= (lgroup + group)) {
+      pos = whole.length - lgroup;
+      for (var i = 0; i < pos; i++) {
+        if ((pos - i)%group === 0 && i !== 0) {
+          formatedText += groupSep;
+        }
+        formatedText += whole.charAt(i);
+      }
+    }
+
+    for (i = pos; i < whole.length; i++) {
+      if ((whole.length - i)%lgroup === 0 && i !== 0) {
+        formatedText += groupSep;
+      }
+      formatedText += whole.charAt(i);
+    }
+
+    // format fraction part.
+    while(fraction.length < fractionSize) {
+      fraction += '0';
+    }
+
+    if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize);
+  } else {
+
+    if (fractionSize > 0 && number > -1 && number < 1) {
+      formatedText = number.toFixed(fractionSize);
+    }
+  }
+
+  parts.push(isNegative ? pattern.negPre : pattern.posPre);
+  parts.push(formatedText);
+  parts.push(isNegative ? pattern.negSuf : pattern.posSuf);
+  return parts.join('');
+}
+
+function padNumber(num, digits, trim) {
+  var neg = '';
+  if (num < 0) {
+    neg =  '-';
+    num = -num;
+  }
+  num = '' + num;
+  while(num.length < digits) num = '0' + num;
+  if (trim)
+    num = num.substr(num.length - digits);
+  return neg + num;
+}
+
+
+function dateGetter(name, size, offset, trim) {
+  offset = offset || 0;
+  return function(date) {
+    var value = date['get' + name]();
+    if (offset > 0 || value > -offset)
+      value += offset;
+    if (value === 0 && offset == -12 ) value = 12;
+    return padNumber(value, size, trim);
+  };
+}
+
+function dateStrGetter(name, shortForm) {
+  return function(date, formats) {
+    var value = date['get' + name]();
+    var get = uppercase(shortForm ? ('SHORT' + name) : name);
+
+    return formats[get][value];
+  };
+}
+
+function timeZoneGetter(date) {
+  var zone = -1 * date.getTimezoneOffset();
+  var paddedZone = (zone >= 0) ? "+" : "";
+
+  paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +
+                padNumber(Math.abs(zone % 60), 2);
+
+  return paddedZone;
+}
+
+function ampmGetter(date, formats) {
+  return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];
+}
+
+var DATE_FORMATS = {
+  yyyy: dateGetter('FullYear', 4),
+    yy: dateGetter('FullYear', 2, 0, true),
+     y: dateGetter('FullYear', 1),
+  MMMM: dateStrGetter('Month'),
+   MMM: dateStrGetter('Month', true),
+    MM: dateGetter('Month', 2, 1),
+     M: dateGetter('Month', 1, 1),
+    dd: dateGetter('Date', 2),
+     d: dateGetter('Date', 1),
+    HH: dateGetter('Hours', 2),
+     H: dateGetter('Hours', 1),
+    hh: dateGetter('Hours', 2, -12),
+     h: dateGetter('Hours', 1, -12),
+    mm: dateGetter('Minutes', 2),
+     m: dateGetter('Minutes', 1),
+    ss: dateGetter('Seconds', 2),
+     s: dateGetter('Seconds', 1),
+  EEEE: dateStrGetter('Day'),
+   EEE: dateStrGetter('Day', true),
+     a: ampmGetter,
+     Z: timeZoneGetter
+};
+
+var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,
+    NUMBER_STRING = /^\d+$/;
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:date
+ * @function
+ *
+ * @description
+ *   Formats `date` to a string based on the requested `format`.
+ *
+ *   `format` string can be composed of the following elements:
+ *
+ *   * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)
+ *   * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)
+ *   * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)
+ *   * `'MMMM'`: Month in year (January-December)
+ *   * `'MMM'`: Month in year (Jan-Dec)
+ *   * `'MM'`: Month in year, padded (01-12)
+ *   * `'M'`: Month in year (1-12)
+ *   * `'dd'`: Day in month, padded (01-31)
+ *   * `'d'`: Day in month (1-31)
+ *   * `'EEEE'`: Day in Week,(Sunday-Saturday)
+ *   * `'EEE'`: Day in Week, (Sun-Sat)
+ *   * `'HH'`: Hour in day, padded (00-23)
+ *   * `'H'`: Hour in day (0-23)
+ *   * `'hh'`: Hour in am/pm, padded (01-12)
+ *   * `'h'`: Hour in am/pm, (1-12)
+ *   * `'mm'`: Minute in hour, padded (00-59)
+ *   * `'m'`: Minute in hour (0-59)
+ *   * `'ss'`: Second in minute, padded (00-59)
+ *   * `'s'`: Second in minute (0-59)
+ *   * `'a'`: am/pm marker
+ *   * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)
+ *
+ *   `format` string can also be one of the following predefined
+ *   {@link guide/i18n localizable formats}:
+ *
+ *   * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale
+ *     (e.g. Sep 3, 2010 12:05:08 pm)
+ *   * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US  locale (e.g. 9/3/10 12:05 pm)
+ *   * `'fullDate'`: equivalent to `'EEEE, MMMM d,y'` for en_US  locale
+ *     (e.g. Friday, September 3, 2010)
+ *   * `'longDate'`: equivalent to `'MMMM d, y'` for en_US  locale (e.g. September 3, 2010)
+ *   * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US  locale (e.g. Sep 3, 2010)
+ *   * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)
+ *   * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm)
+ *   * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm)
+ *
+ *   `format` string can contain literal values. These need to be quoted with single quotes (e.g.
+ *   `"h 'in the morning'"`). In order to output single quote, use two single quotes in a sequence
+ *   (e.g. `"h 'o''clock'"`).
+ *
+ * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or
+ *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and its
+ *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is
+ *    specified in the string input, the time is considered to be in the local timezone.
+ * @param {string=} format Formatting rules (see Description). If not specified,
+ *    `mediumDate` is used.
+ * @returns {string} Formatted string or the input if input is not recognized as date/millis.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:
+           {{1288323623006 | date:'medium'}}<br>
+       <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:
+          {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}<br>
+       <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:
+          {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}<br>
+     </doc:source>
+     <doc:scenario>
+       it('should format date', function() {
+         expect(binding("1288323623006 | date:'medium'")).
+            toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/);
+         expect(binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).
+            toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/);
+         expect(binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).
+            toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/);
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+dateFilter.$inject = ['$locale'];
+function dateFilter($locale) {
+
+
+  var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
+  function jsonStringToDate(string){
+    var match;
+    if (match = string.match(R_ISO8601_STR)) {
+      var date = new Date(0),
+          tzHour = 0,
+          tzMin  = 0;
+      if (match[9]) {
+        tzHour = int(match[9] + match[10]);
+        tzMin = int(match[9] + match[11]);
+      }
+      date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
+      date.setUTCHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0));
+      return date;
+    }
+    return string;
+  }
+
+
+  return function(date, format) {
+    var text = '',
+        parts = [],
+        fn, match;
+
+    format = format || 'mediumDate';
+    format = $locale.DATETIME_FORMATS[format] || format;
+    if (isString(date)) {
+      if (NUMBER_STRING.test(date)) {
+        date = int(date);
+      } else {
+        date = jsonStringToDate(date);
+      }
+    }
+
+    if (isNumber(date)) {
+      date = new Date(date);
+    }
+
+    if (!isDate(date)) {
+      return date;
+    }
+
+    while(format) {
+      match = DATE_FORMATS_SPLIT.exec(format);
+      if (match) {
+        parts = concat(parts, match, 1);
+        format = parts.pop();
+      } else {
+        parts.push(format);
+        format = null;
+      }
+    }
+
+    forEach(parts, function(value){
+      fn = DATE_FORMATS[value];
+      text += fn ? fn(date, $locale.DATETIME_FORMATS)
+                 : value.replace(/(^'|'$)/g, '').replace(/''/g, "'");
+    });
+
+    return text;
+  };
+}
+
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:json
+ * @function
+ *
+ * @description
+ *   Allows you to convert a JavaScript object into JSON string.
+ *
+ *   This filter is mostly useful for debugging. When using the double curly {{value}} notation
+ *   the binding is automatically converted to JSON.
+ *
+ * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.
+ * @returns {string} JSON string.
+ *
+ *
+ * @example:
+   <doc:example>
+     <doc:source>
+       <pre>{{ {'name':'value'} | json }}</pre>
+     </doc:source>
+     <doc:scenario>
+       it('should jsonify filtered objects', function() {
+         expect(binding("{'name':'value'}")).toMatch(/\{\n  "name": ?"value"\n}/);
+       });
+     </doc:scenario>
+   </doc:example>
+ *
+ */
+function jsonFilter() {
+  return function(object) {
+    return toJson(object, true);
+  };
+}
+
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:lowercase
+ * @function
+ * @description
+ * Converts string to lowercase.
+ * @see angular.lowercase
+ */
+var lowercaseFilter = valueFn(lowercase);
+
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:uppercase
+ * @function
+ * @description
+ * Converts string to uppercase.
+ * @see angular.uppercase
+ */
+var uppercaseFilter = valueFn(uppercase);
+
+/**
+ * @ngdoc function
+ * @name ng.filter:limitTo
+ * @function
+ *
+ * @description
+ * Creates a new array containing only a specified number of elements in an array. The elements
+ * are taken from either the beginning or the end of the source array, as specified by the
+ * value and sign (positive or negative) of `limit`.
+ *
+ * Note: This function is used to augment the `Array` type in Angular expressions. See
+ * {@link ng.$filter} for more information about Angular arrays.
+ *
+ * @param {Array} array Source array to be limited.
+ * @param {string|Number} limit The length of the returned array. If the `limit` number is
+ *     positive, `limit` number of items from the beginning of the source array are copied.
+ *     If the number is negative, `limit` number  of items from the end of the source array are
+ *     copied. The `limit` will be trimmed if it exceeds `array.length`
+ * @returns {Array} A new sub-array of length `limit` or less if input array had less than `limit`
+ *     elements.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.numbers = [1,2,3,4,5,6,7,8,9];
+           $scope.limit = 3;
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         Limit {{numbers}} to: <input type="integer" ng-model="limit">
+         <p>Output: {{ numbers | limitTo:limit }}</p>
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should limit the numer array to first three items', function() {
+         expect(element('.doc-example-live input[ng-model=limit]').val()).toBe('3');
+         expect(binding('numbers | limitTo:limit')).toEqual('[1,2,3]');
+       });
+
+       it('should update the output when -3 is entered', function() {
+         input('limit').enter(-3);
+         expect(binding('numbers | limitTo:limit')).toEqual('[7,8,9]');
+       });
+
+       it('should not exceed the maximum size of input array', function() {
+         input('limit').enter(100);
+         expect(binding('numbers | limitTo:limit')).toEqual('[1,2,3,4,5,6,7,8,9]');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+function limitToFilter(){
+  return function(array, limit) {
+    if (!(array instanceof Array)) return array;
+    limit = int(limit);
+    var out = [],
+      i, n;
+
+    // check that array is iterable
+    if (!array || !(array instanceof Array))
+      return out;
+
+    // if abs(limit) exceeds maximum length, trim it
+    if (limit > array.length)
+      limit = array.length;
+    else if (limit < -array.length)
+      limit = -array.length;
+
+    if (limit > 0) {
+      i = 0;
+      n = limit;
+    } else {
+      i = array.length + limit;
+      n = array.length;
+    }
+
+    for (; i<n; i++) {
+      out.push(array[i]);
+    }
+
+    return out;
+  }
+}
+
+/**
+ * @ngdoc function
+ * @name ng.filter:orderBy
+ * @function
+ *
+ * @description
+ * Orders a specified `array` by the `expression` predicate.
+ *
+ * Note: this function is used to augment the `Array` type in Angular expressions. See
+ * {@link ng.$filter} for more informaton about Angular arrays.
+ *
+ * @param {Array} array The array to sort.
+ * @param {function(*)|string|Array.<(function(*)|string)>} expression A predicate to be
+ *    used by the comparator to determine the order of elements.
+ *
+ *    Can be one of:
+ *
+ *    - `function`: Getter function. The result of this function will be sorted using the
+ *      `<`, `=`, `>` operator.
+ *    - `string`: An Angular expression which evaluates to an object to order by, such as 'name'
+ *      to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control
+ *      ascending or descending sort order (for example, +name or -name).
+ *    - `Array`: An array of function or string predicates. The first predicate in the array
+ *      is used for sorting, but when two items are equivalent, the next predicate is used.
+ *
+ * @param {boolean=} reverse Reverse the order the array.
+ * @returns {Array} Sorted copy of the source array.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.friends =
+               [{name:'John', phone:'555-1212', age:10},
+                {name:'Mary', phone:'555-9876', age:19},
+                {name:'Mike', phone:'555-4321', age:21},
+                {name:'Adam', phone:'555-5678', age:35},
+                {name:'Julie', phone:'555-8765', age:29}]
+           $scope.predicate = '-age';
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
+         <hr/>
+         [ <a href="" ng-click="predicate=''">unsorted</a> ]
+         <table class="friend">
+           <tr>
+             <th><a href="" ng-click="predicate = 'name'; reverse=false">Name</a>
+                 (<a href ng-click="predicate = '-name'; reverse=false">^</a>)</th>
+             <th><a href="" ng-click="predicate = 'phone'; reverse=!reverse">Phone Number</a></th>
+             <th><a href="" ng-click="predicate = 'age'; reverse=!reverse">Age</a></th>
+           </tr>
+           <tr ng-repeat="friend in friends | orderBy:predicate:reverse">
+             <td>{{friend.name}}</td>
+             <td>{{friend.phone}}</td>
+             <td>{{friend.age}}</td>
+           </tr>
+         </table>
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should be reverse ordered by aged', function() {
+         expect(binding('predicate')).toBe('-age');
+         expect(repeater('table.friend', 'friend in friends').column('friend.age')).
+           toEqual(['35', '29', '21', '19', '10']);
+         expect(repeater('table.friend', 'friend in friends').column('friend.name')).
+           toEqual(['Adam', 'Julie', 'Mike', 'Mary', 'John']);
+       });
+
+       it('should reorder the table when user selects different predicate', function() {
+         element('.doc-example-live a:contains("Name")').click();
+         expect(repeater('table.friend', 'friend in friends').column('friend.name')).
+           toEqual(['Adam', 'John', 'Julie', 'Mary', 'Mike']);
+         expect(repeater('table.friend', 'friend in friends').column('friend.age')).
+           toEqual(['35', '10', '29', '19', '21']);
+
+         element('.doc-example-live a:contains("Phone")').click();
+         expect(repeater('table.friend', 'friend in friends').column('friend.phone')).
+           toEqual(['555-9876', '555-8765', '555-5678', '555-4321', '555-1212']);
+         expect(repeater('table.friend', 'friend in friends').column('friend.name')).
+           toEqual(['Mary', 'Julie', 'Adam', 'Mike', 'John']);
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+orderByFilter.$inject = ['$parse'];
+function orderByFilter($parse){
+  return function(array, sortPredicate, reverseOrder) {
+    if (!isArray(array)) return array;
+    if (!sortPredicate) return array;
+    sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];
+    sortPredicate = map(sortPredicate, function(predicate){
+      var descending = false, get = predicate || identity;
+      if (isString(predicate)) {
+        if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {
+          descending = predicate.charAt(0) == '-';
+          predicate = predicate.substring(1);
+        }
+        get = $parse(predicate);
+      }
+      return reverseComparator(function(a,b){
+        return compare(get(a),get(b));
+      }, descending);
+    });
+    var arrayCopy = [];
+    for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }
+    return arrayCopy.sort(reverseComparator(comparator, reverseOrder));
+
+    function comparator(o1, o2){
+      for ( var i = 0; i < sortPredicate.length; i++) {
+        var comp = sortPredicate[i](o1, o2);
+        if (comp !== 0) return comp;
+      }
+      return 0;
+    }
+    function reverseComparator(comp, descending) {
+      return toBoolean(descending)
+          ? function(a,b){return comp(b,a);}
+          : comp;
+    }
+    function compare(v1, v2){
+      var t1 = typeof v1;
+      var t2 = typeof v2;
+      if (t1 == t2) {
+        if (t1 == "string") {
+           v1 = v1.toLowerCase();
+           v2 = v2.toLowerCase();
+        }
+        if (v1 === v2) return 0;
+        return v1 < v2 ? -1 : 1;
+      } else {
+        return t1 < t2 ? -1 : 1;
+      }
+    }
+  }
+}
+
+function ngDirective(directive) {
+  if (isFunction(directive)) {
+    directive = {
+      link: directive
+    }
+  }
+  directive.restrict = directive.restrict || 'AC';
+  return valueFn(directive);
+}
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:a
+ * @restrict E
+ *
+ * @description
+ * Modifies the default behavior of html A tag, so that the default action is prevented when href
+ * attribute is empty.
+ *
+ * The reasoning for this change is to allow easy creation of action links with `ngClick` directive
+ * without changing the location or causing page reloads, e.g.:
+ * `<a href="" ng-click="model.$save()">Save</a>`
+ */
+var htmlAnchorDirective = valueFn({
+  restrict: 'E',
+  compile: function(element, attr) {
+
+    if (msie <= 8) {
+
+      // turn <a href ng-click="..">link</a> into a stylable link in IE
+      // but only if it doesn't have name attribute, in which case it's an anchor
+      if (!attr.href && !attr.name) {
+        attr.$set('href', '');
+      }
+
+      // add a comment node to anchors to workaround IE bug that causes element content to be reset
+      // to new attribute content if attribute is updated with value containing @ and element also
+      // contains value with @
+      // see issue #1949
+      element.append(document.createComment('IE fix'));
+    }
+
+    return function(scope, element) {
+      element.bind('click', function(event){
+        // if we have no href url, then don't navigate anywhere.
+        if (!element.attr('href')) {
+          event.preventDefault();
+        }
+      });
+    }
+  }
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngHref
+ * @restrict A
+ *
+ * @description
+ * Using Angular markup like {{hash}} in an href attribute makes
+ * the page open to a wrong URL, if the user clicks that link before
+ * angular has a chance to replace the {{hash}} with actual URL, the
+ * link will be broken and will most likely return a 404 error.
+ * The `ngHref` directive solves this problem.
+ *
+ * The buggy way to write it:
+ * <pre>
+ * <a href="http://www.gravatar.com/avatar/{{hash}}"/>
+ * </pre>
+ *
+ * The correct way to write it:
+ * <pre>
+ * <a ng-href="http://www.gravatar.com/avatar/{{hash}}"/>
+ * </pre>
+ *
+ * @element A
+ * @param {template} ngHref any string which can contain `{{}}` markup.
+ *
+ * @example
+ * This example uses `link` variable inside `href` attribute:
+    <doc:example>
+      <doc:source>
+        <input ng-model="value" /><br />
+        <a id="link-1" href ng-click="value = 1">link 1</a> (link, don't reload)<br />
+        <a id="link-2" href="" ng-click="value = 2">link 2</a> (link, don't reload)<br />
+        <a id="link-3" ng-href="/{{'123'}}">link 3</a> (link, reload!)<br />
+        <a id="link-4" href="" name="xx" ng-click="value = 4">anchor</a> (link, don't reload)<br />
+        <a id="link-5" name="xxx" ng-click="value = 5">anchor</a> (no link)<br />
+        <a id="link-6" ng-href="{{value}}">link</a> (link, change location)
+      </doc:source>
+      <doc:scenario>
+        it('should execute ng-click but not reload when href without value', function() {
+          element('#link-1').click();
+          expect(input('value').val()).toEqual('1');
+          expect(element('#link-1').attr('href')).toBe("");
+        });
+
+        it('should execute ng-click but not reload when href empty string', function() {
+          element('#link-2').click();
+          expect(input('value').val()).toEqual('2');
+          expect(element('#link-2').attr('href')).toBe("");
+        });
+
+        it('should execute ng-click and change url when ng-href specified', function() {
+          expect(element('#link-3').attr('href')).toBe("/123");
+
+          element('#link-3').click();
+          expect(browser().window().path()).toEqual('/123');
+        });
+
+        it('should execute ng-click but not reload when href empty string and name specified', function() {
+          element('#link-4').click();
+          expect(input('value').val()).toEqual('4');
+          expect(element('#link-4').attr('href')).toBe('');
+        });
+
+        it('should execute ng-click but not reload when no href but name specified', function() {
+          element('#link-5').click();
+          expect(input('value').val()).toEqual('5');
+          expect(element('#link-5').attr('href')).toBe(undefined);
+        });
+
+        it('should only change url when only ng-href', function() {
+          input('value').enter('6');
+          expect(element('#link-6').attr('href')).toBe('6');
+
+          element('#link-6').click();
+          expect(browser().location().url()).toEqual('/6');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngSrc
+ * @restrict A
+ *
+ * @description
+ * Using Angular markup like `{{hash}}` in a `src` attribute doesn't
+ * work right: The browser will fetch from the URL with the literal
+ * text `{{hash}}` until Angular replaces the expression inside
+ * `{{hash}}`. The `ngSrc` directive solves this problem.
+ *
+ * The buggy way to write it:
+ * <pre>
+ * <img src="http://www.gravatar.com/avatar/{{hash}}"/>
+ * </pre>
+ *
+ * The correct way to write it:
+ * <pre>
+ * <img ng-src="http://www.gravatar.com/avatar/{{hash}}"/>
+ * </pre>
+ *
+ * @element IMG
+ * @param {template} ngSrc any string which can contain `{{}}` markup.
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngDisabled
+ * @restrict A
+ *
+ * @description
+ *
+ * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:
+ * <pre>
+ * <div ng-init="scope = { isDisabled: false }">
+ *  <button disabled="{{scope.isDisabled}}">Disabled</button>
+ * </div>
+ * </pre>
+ *
+ * The HTML specs do not require browsers to preserve the special attributes such as disabled.
+ * (The presence of them means true and absence means false)
+ * This prevents the angular compiler from correctly retrieving the binding expression.
+ * To solve this problem, we introduce the `ngDisabled` directive.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+        Click me to toggle: <input type="checkbox" ng-model="checked"><br/>
+        <button ng-model="button" ng-disabled="checked">Button</button>
+      </doc:source>
+      <doc:scenario>
+        it('should toggle button', function() {
+          expect(element('.doc-example-live :button').prop('disabled')).toBeFalsy();
+          input('checked').check();
+          expect(element('.doc-example-live :button').prop('disabled')).toBeTruthy();
+        });
+      </doc:scenario>
+    </doc:example>
+ *
+ * @element INPUT
+ * @param {expression} ngDisabled Angular expression that will be evaluated.
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngChecked
+ * @restrict A
+ *
+ * @description
+ * The HTML specs do not require browsers to preserve the special attributes such as checked.
+ * (The presence of them means true and absence means false)
+ * This prevents the angular compiler from correctly retrieving the binding expression.
+ * To solve this problem, we introduce the `ngChecked` directive.
+ * @example
+    <doc:example>
+      <doc:source>
+        Check me to check both: <input type="checkbox" ng-model="master"><br/>
+        <input id="checkSlave" type="checkbox" ng-checked="master">
+      </doc:source>
+      <doc:scenario>
+        it('should check both checkBoxes', function() {
+          expect(element('.doc-example-live #checkSlave').prop('checked')).toBeFalsy();
+          input('master').check();
+          expect(element('.doc-example-live #checkSlave').prop('checked')).toBeTruthy();
+        });
+      </doc:scenario>
+    </doc:example>
+ *
+ * @element INPUT
+ * @param {expression} ngChecked Angular expression that will be evaluated.
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMultiple
+ * @restrict A
+ *
+ * @description
+ * The HTML specs do not require browsers to preserve the special attributes such as multiple.
+ * (The presence of them means true and absence means false)
+ * This prevents the angular compiler from correctly retrieving the binding expression.
+ * To solve this problem, we introduce the `ngMultiple` directive.
+ *
+ * @example
+     <doc:example>
+       <doc:source>
+         Check me check multiple: <input type="checkbox" ng-model="checked"><br/>
+         <select id="select" ng-multiple="checked">
+           <option>Misko</option>
+           <option>Igor</option>
+           <option>Vojta</option>
+           <option>Di</option>
+         </select>
+       </doc:source>
+       <doc:scenario>
+         it('should toggle multiple', function() {
+           expect(element('.doc-example-live #select').prop('multiple')).toBeFalsy();
+           input('checked').check();
+           expect(element('.doc-example-live #select').prop('multiple')).toBeTruthy();
+         });
+       </doc:scenario>
+     </doc:example>
+ *
+ * @element SELECT
+ * @param {expression} ngMultiple Angular expression that will be evaluated.
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngReadonly
+ * @restrict A
+ *
+ * @description
+ * The HTML specs do not require browsers to preserve the special attributes such as readonly.
+ * (The presence of them means true and absence means false)
+ * This prevents the angular compiler from correctly retrieving the binding expression.
+ * To solve this problem, we introduce the `ngReadonly` directive.
+ * @example
+    <doc:example>
+      <doc:source>
+        Check me to make text readonly: <input type="checkbox" ng-model="checked"><br/>
+        <input type="text" ng-readonly="checked" value="I'm Angular"/>
+      </doc:source>
+      <doc:scenario>
+        it('should toggle readonly attr', function() {
+          expect(element('.doc-example-live :text').prop('readonly')).toBeFalsy();
+          input('checked').check();
+          expect(element('.doc-example-live :text').prop('readonly')).toBeTruthy();
+        });
+      </doc:scenario>
+    </doc:example>
+ *
+ * @element INPUT
+ * @param {string} expression Angular expression that will be evaluated.
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngSelected
+ * @restrict A
+ *
+ * @description
+ * The HTML specs do not require browsers to preserve the special attributes such as selected.
+ * (The presence of them means true and absence means false)
+ * This prevents the angular compiler from correctly retrieving the binding expression.
+ * To solve this problem, we introduced the `ngSelected` directive.
+ * @example
+    <doc:example>
+      <doc:source>
+        Check me to select: <input type="checkbox" ng-model="selected"><br/>
+        <select>
+          <option>Hello!</option>
+          <option id="greet" ng-selected="selected">Greetings!</option>
+        </select>
+      </doc:source>
+      <doc:scenario>
+        it('should select Greetings!', function() {
+          expect(element('.doc-example-live #greet').prop('selected')).toBeFalsy();
+          input('selected').check();
+          expect(element('.doc-example-live #greet').prop('selected')).toBeTruthy();
+        });
+      </doc:scenario>
+    </doc:example>
+ *
+ * @element OPTION
+ * @param {string} expression Angular expression that will be evaluated.
+ */
+
+
+var ngAttributeAliasDirectives = {};
+
+
+// boolean attrs are evaluated
+forEach(BOOLEAN_ATTR, function(propName, attrName) {
+  var normalized = directiveNormalize('ng-' + attrName);
+  ngAttributeAliasDirectives[normalized] = function() {
+    return {
+      priority: 100,
+      compile: function() {
+        return function(scope, element, attr) {
+          scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {
+            attr.$set(attrName, !!value);
+          });
+        };
+      }
+    };
+  };
+});
+
+
+// ng-src, ng-href are interpolated
+forEach(['src', 'href'], function(attrName) {
+  var normalized = directiveNormalize('ng-' + attrName);
+  ngAttributeAliasDirectives[normalized] = function() {
+    return {
+      priority: 99, // it needs to run after the attributes are interpolated
+      link: function(scope, element, attr) {
+        attr.$observe(normalized, function(value) {
+          if (!value)
+             return;
+
+          attr.$set(attrName, value);
+
+          // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist
+          // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need
+          // to set the property as well to achieve the desired effect.
+          // we use attr[attrName] value since $set can sanitize the url.
+          if (msie) element.prop(attrName, attr[attrName]);
+        });
+      }
+    };
+  };
+});
+
+var nullFormCtrl = {
+  $addControl: noop,
+  $removeControl: noop,
+  $setValidity: noop,
+  $setDirty: noop
+};
+
+/**
+ * @ngdoc object
+ * @name ng.directive:form.FormController
+ *
+ * @property {boolean} $pristine True if user has not interacted with the form yet.
+ * @property {boolean} $dirty True if user has already interacted with the form.
+ * @property {boolean} $valid True if all of the containing forms and controls are valid.
+ * @property {boolean} $invalid True if at least one containing control or form is invalid.
+ *
+ * @property {Object} $error Is an object hash, containing references to all invalid controls or
+ *  forms, where:
+ *
+ *  - keys are validation tokens (error names) — such as `required`, `url` or `email`),
+ *  - values are arrays of controls or forms that are invalid with given error.
+ *
+ * @description
+ * `FormController` keeps track of all its controls and nested forms as well as state of them,
+ * such as being valid/invalid or dirty/pristine.
+ *
+ * Each {@link ng.directive:form form} directive creates an instance
+ * of `FormController`.
+ *
+ */
+//asks for $scope to fool the BC controller module
+FormController.$inject = ['$element', '$attrs', '$scope'];
+function FormController(element, attrs) {
+  var form = this,
+      parentForm = element.parent().controller('form') || nullFormCtrl,
+      invalidCount = 0, // used to easily determine if we are valid
+      errors = form.$error = {};
+
+  // init state
+  form.$name = attrs.name || attrs.ngForm;
+  form.$dirty = false;
+  form.$pristine = true;
+  form.$valid = true;
+  form.$invalid = false;
+
+  parentForm.$addControl(form);
+
+  // Setup initial state of the control
+  element.addClass(PRISTINE_CLASS);
+  toggleValidCss(true);
+
+  // convenience method for easy toggling of classes
+  function toggleValidCss(isValid, validationErrorKey) {
+    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
+    element.
+      removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).
+      addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);
+  }
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:form.FormController#$addControl
+   * @methodOf ng.directive:form.FormController
+   *
+   * @description
+   * Register a control with the form.
+   *
+   * Input elements using ngModelController do this automatically when they are linked.
+   */
+  form.$addControl = function(control) {
+    if (control.$name && !form.hasOwnProperty(control.$name)) {
+      form[control.$name] = control;
+    }
+  };
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:form.FormController#$removeControl
+   * @methodOf ng.directive:form.FormController
+   *
+   * @description
+   * Deregister a control from the form.
+   *
+   * Input elements using ngModelController do this automatically when they are destroyed.
+   */
+  form.$removeControl = function(control) {
+    if (control.$name && form[control.$name] === control) {
+      delete form[control.$name];
+    }
+    forEach(errors, function(queue, validationToken) {
+      form.$setValidity(validationToken, true, control);
+    });
+  };
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:form.FormController#$setValidity
+   * @methodOf ng.directive:form.FormController
+   *
+   * @description
+   * Sets the validity of a form control.
+   *
+   * This method will also propagate to parent forms.
+   */
+  form.$setValidity = function(validationToken, isValid, control) {
+    var queue = errors[validationToken];
+
+    if (isValid) {
+      if (queue) {
+        arrayRemove(queue, control);
+        if (!queue.length) {
+          invalidCount--;
+          if (!invalidCount) {
+            toggleValidCss(isValid);
+            form.$valid = true;
+            form.$invalid = false;
+          }
+          errors[validationToken] = false;
+          toggleValidCss(true, validationToken);
+          parentForm.$setValidity(validationToken, true, form);
+        }
+      }
+
+    } else {
+      if (!invalidCount) {
+        toggleValidCss(isValid);
+      }
+      if (queue) {
+        if (includes(queue, control)) return;
+      } else {
+        errors[validationToken] = queue = [];
+        invalidCount++;
+        toggleValidCss(false, validationToken);
+        parentForm.$setValidity(validationToken, false, form);
+      }
+      queue.push(control);
+
+      form.$valid = false;
+      form.$invalid = true;
+    }
+  };
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:form.FormController#$setDirty
+   * @methodOf ng.directive:form.FormController
+   *
+   * @description
+   * Sets the form to a dirty state.
+   *
+   * This method can be called to add the 'ng-dirty' class and set the form to a dirty
+   * state (ng-dirty class). This method will also propagate to parent forms.
+   */
+  form.$setDirty = function() {
+    element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS);
+    form.$dirty = true;
+    form.$pristine = false;
+    parentForm.$setDirty();
+  };
+
+}
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngForm
+ * @restrict EAC
+ *
+ * @description
+ * Nestable alias of {@link ng.directive:form `form`} directive. HTML
+ * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a
+ * sub-group of controls needs to be determined.
+ *
+ * @param {string=} name|ngForm Name of the form. If specified, the form controller will be published into
+ *                       related scope, under this name.
+ *
+ */
+
+ /**
+ * @ngdoc directive
+ * @name ng.directive:form
+ * @restrict E
+ *
+ * @description
+ * Directive that instantiates
+ * {@link ng.directive:form.FormController FormController}.
+ *
+ * If `name` attribute is specified, the form controller is published onto the current scope under
+ * this name.
+ *
+ * # Alias: {@link ng.directive:ngForm `ngForm`}
+ *
+ * In angular forms can be nested. This means that the outer form is valid when all of the child
+ * forms are valid as well. However browsers do not allow nesting of `<form>` elements, for this
+ * reason angular provides {@link ng.directive:ngForm `ngForm`} alias
+ * which behaves identical to `<form>` but allows form nesting.
+ *
+ *
+ * # CSS classes
+ *  - `ng-valid` Is set if the form is valid.
+ *  - `ng-invalid` Is set if the form is invalid.
+ *  - `ng-pristine` Is set if the form is pristine.
+ *  - `ng-dirty` Is set if the form is dirty.
+ *
+ *
+ * # Submitting a form and preventing default action
+ *
+ * Since the role of forms in client-side Angular applications is different than in classical
+ * roundtrip apps, it is desirable for the browser not to translate the form submission into a full
+ * page reload that sends the data to the server. Instead some javascript logic should be triggered
+ * to handle the form submission in application specific way.
+ *
+ * For this reason, Angular prevents the default action (form submission to the server) unless the
+ * `<form>` element has an `action` attribute specified.
+ *
+ * You can use one of the following two ways to specify what javascript method should be called when
+ * a form is submitted:
+ *
+ * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element
+ * - {@link ng.directive:ngClick ngClick} directive on the first
+  *  button or input field of type submit (input[type=submit])
+ *
+ * To prevent double execution of the handler, use only one of ngSubmit or ngClick directives. This
+ * is because of the following form submission rules coming from the html spec:
+ *
+ * - If a form has only one input field then hitting enter in this field triggers form submit
+ * (`ngSubmit`)
+ * - if a form has has 2+ input fields and no buttons or input[type=submit] then hitting enter
+ * doesn't trigger submit
+ * - if a form has one or more input fields and one or more buttons or input[type=submit] then
+ * hitting enter in any of the input fields will trigger the click handler on the *first* button or
+ * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)
+ *
+ * @param {string=} name Name of the form. If specified, the form controller will be published into
+ *                       related scope, under this name.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.userType = 'guest';
+         }
+       </script>
+       <form name="myForm" ng-controller="Ctrl">
+         userType: <input name="input" ng-model="userType" required>
+         <span class="error" ng-show="myForm.input.$error.required">Required!</span><br>
+         <tt>userType = {{userType}}</tt><br>
+         <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>
+         <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>
+         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>
+         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>
+        </form>
+      </doc:source>
+      <doc:scenario>
+        it('should initialize to model', function() {
+         expect(binding('userType')).toEqual('guest');
+         expect(binding('myForm.input.$valid')).toEqual('true');
+        });
+
+        it('should be invalid if empty', function() {
+         input('userType').enter('');
+         expect(binding('userType')).toEqual('');
+         expect(binding('myForm.input.$valid')).toEqual('false');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+var formDirectiveFactory = function(isNgForm) {
+  return ['$timeout', function($timeout) {
+    var formDirective = {
+      name: 'form',
+      restrict: 'E',
+      controller: FormController,
+      compile: function() {
+        return {
+          pre: function(scope, formElement, attr, controller) {
+            if (!attr.action) {
+              // we can't use jq events because if a form is destroyed during submission the default
+              // action is not prevented. see #1238
+              //
+              // IE 9 is not affected because it doesn't fire a submit event and try to do a full
+              // page reload if the form was destroyed by submission of the form via a click handler
+              // on a button in the form. Looks like an IE9 specific bug.
+              var preventDefaultListener = function(event) {
+                event.preventDefault
+                  ? event.preventDefault()
+                  : event.returnValue = false; // IE
+              };
+
+              addEventListenerFn(formElement[0], 'submit', preventDefaultListener);
+
+              // unregister the preventDefault listener so that we don't not leak memory but in a
+              // way that will achieve the prevention of the default action.
+              formElement.bind('$destroy', function() {
+                $timeout(function() {
+                  removeEventListenerFn(formElement[0], 'submit', preventDefaultListener);
+                }, 0, false);
+              });
+            }
+
+            var parentFormCtrl = formElement.parent().controller('form'),
+                alias = attr.name || attr.ngForm;
+
+            if (alias) {
+              scope[alias] = controller;
+            }
+            if (parentFormCtrl) {
+              formElement.bind('$destroy', function() {
+                parentFormCtrl.$removeControl(controller);
+                if (alias) {
+                  scope[alias] = undefined;
+                }
+                extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
+              });
+            }
+          }
+        };
+      }
+    };
+
+    return isNgForm ? extend(copy(formDirective), {restrict: 'EAC'}) : formDirective;
+  }];
+};
+
+var formDirective = formDirectiveFactory();
+var ngFormDirective = formDirectiveFactory(true);
+
+var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
+var EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/;
+var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/;
+
+var inputType = {
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.text
+   *
+   * @description
+   * Standard HTML text input with angular data binding.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} required Adds `required` validation error key if the value is not entered.
+   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+   *    `required` when you want to data-bind to the `required` attribute.
+   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+   *    minlength.
+   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+   *    maxlength.
+   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+   *    patterns defined as scope expressions.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.text = 'guest';
+             $scope.word = /^\w*$/;
+           }
+         </script>
+         <form name="myForm" ng-controller="Ctrl">
+           Single word: <input type="text" name="input" ng-model="text"
+                               ng-pattern="word" required>
+           <span class="error" ng-show="myForm.input.$error.required">
+             Required!</span>
+           <span class="error" ng-show="myForm.input.$error.pattern">
+             Single word only!</span>
+
+           <tt>text = {{text}}</tt><br/>
+           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+          </form>
+        </doc:source>
+        <doc:scenario>
+          it('should initialize to model', function() {
+            expect(binding('text')).toEqual('guest');
+            expect(binding('myForm.input.$valid')).toEqual('true');
+          });
+
+          it('should be invalid if empty', function() {
+            input('text').enter('');
+            expect(binding('text')).toEqual('');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+
+          it('should be invalid if multi word', function() {
+            input('text').enter('hello world');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'text': textInputType,
+
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.number
+   *
+   * @description
+   * Text input with number validation and transformation. Sets the `number` validation
+   * error if not a valid number.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
+   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.
+   * @param {string=} required Sets `required` validation error key if the value is not entered.
+   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+   *    `required` when you want to data-bind to the `required` attribute.
+   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+   *    minlength.
+   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+   *    maxlength.
+   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+   *    patterns defined as scope expressions.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.value = 12;
+           }
+         </script>
+         <form name="myForm" ng-controller="Ctrl">
+           Number: <input type="number" name="input" ng-model="value"
+                          min="0" max="99" required>
+           <span class="error" ng-show="myForm.input.$error.required">
+             Required!</span>
+           <span class="error" ng-show="myForm.input.$error.number">
+             Not valid number!</span>
+           <tt>value = {{value}}</tt><br/>
+           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+          </form>
+        </doc:source>
+        <doc:scenario>
+          it('should initialize to model', function() {
+           expect(binding('value')).toEqual('12');
+           expect(binding('myForm.input.$valid')).toEqual('true');
+          });
+
+          it('should be invalid if empty', function() {
+           input('value').enter('');
+           expect(binding('value')).toEqual('');
+           expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+
+          it('should be invalid if over max', function() {
+           input('value').enter('123');
+           expect(binding('value')).toEqual('');
+           expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'number': numberInputType,
+
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.url
+   *
+   * @description
+   * Text input with URL validation. Sets the `url` validation error key if the content is not a
+   * valid URL.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} required Sets `required` validation error key if the value is not entered.
+   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+   *    `required` when you want to data-bind to the `required` attribute.
+   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+   *    minlength.
+   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+   *    maxlength.
+   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+   *    patterns defined as scope expressions.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.text = 'http://google.com';
+           }
+         </script>
+         <form name="myForm" ng-controller="Ctrl">
+           URL: <input type="url" name="input" ng-model="text" required>
+           <span class="error" ng-show="myForm.input.$error.required">
+             Required!</span>
+           <span class="error" ng-show="myForm.input.$error.url">
+             Not valid url!</span>
+           <tt>text = {{text}}</tt><br/>
+           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+           <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>
+          </form>
+        </doc:source>
+        <doc:scenario>
+          it('should initialize to model', function() {
+            expect(binding('text')).toEqual('http://google.com');
+            expect(binding('myForm.input.$valid')).toEqual('true');
+          });
+
+          it('should be invalid if empty', function() {
+            input('text').enter('');
+            expect(binding('text')).toEqual('');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+
+          it('should be invalid if not url', function() {
+            input('text').enter('xxx');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'url': urlInputType,
+
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.email
+   *
+   * @description
+   * Text input with email validation. Sets the `email` validation error key if not a valid email
+   * address.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} required Sets `required` validation error key if the value is not entered.
+   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+   *    `required` when you want to data-bind to the `required` attribute.
+   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+   *    minlength.
+   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+   *    maxlength.
+   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+   *    patterns defined as scope expressions.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.text = 'me@example.com';
+           }
+         </script>
+           <form name="myForm" ng-controller="Ctrl">
+             Email: <input type="email" name="input" ng-model="text" required>
+             <span class="error" ng-show="myForm.input.$error.required">
+               Required!</span>
+             <span class="error" ng-show="myForm.input.$error.email">
+               Not valid email!</span>
+             <tt>text = {{text}}</tt><br/>
+             <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+             <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+             <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+             <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+             <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>
+           </form>
+        </doc:source>
+        <doc:scenario>
+          it('should initialize to model', function() {
+            expect(binding('text')).toEqual('me@example.com');
+            expect(binding('myForm.input.$valid')).toEqual('true');
+          });
+
+          it('should be invalid if empty', function() {
+            input('text').enter('');
+            expect(binding('text')).toEqual('');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+
+          it('should be invalid if not email', function() {
+            input('text').enter('xxx');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'email': emailInputType,
+
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.radio
+   *
+   * @description
+   * HTML radio button.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string} value The value to which the expression should be set when selected.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.color = 'blue';
+           }
+         </script>
+         <form name="myForm" ng-controller="Ctrl">
+           <input type="radio" ng-model="color" value="red">  Red <br/>
+           <input type="radio" ng-model="color" value="green"> Green <br/>
+           <input type="radio" ng-model="color" value="blue"> Blue <br/>
+           <tt>color = {{color}}</tt><br/>
+          </form>
+        </doc:source>
+        <doc:scenario>
+          it('should change state', function() {
+            expect(binding('color')).toEqual('blue');
+
+            input('color').select('red');
+            expect(binding('color')).toEqual('red');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'radio': radioInputType,
+
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.checkbox
+   *
+   * @description
+   * HTML checkbox.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} ngTrueValue The value to which the expression should be set when selected.
+   * @param {string=} ngFalseValue The value to which the expression should be set when not selected.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.value1 = true;
+             $scope.value2 = 'YES'
+           }
+         </script>
+         <form name="myForm" ng-controller="Ctrl">
+           Value1: <input type="checkbox" ng-model="value1"> <br/>
+           Value2: <input type="checkbox" ng-model="value2"
+                          ng-true-value="YES" ng-false-value="NO"> <br/>
+           <tt>value1 = {{value1}}</tt><br/>
+           <tt>value2 = {{value2}}</tt><br/>
+          </form>
+        </doc:source>
+        <doc:scenario>
+          it('should change state', function() {
+            expect(binding('value1')).toEqual('true');
+            expect(binding('value2')).toEqual('YES');
+
+            input('value1').check();
+            input('value2').check();
+            expect(binding('value1')).toEqual('false');
+            expect(binding('value2')).toEqual('NO');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'checkbox': checkboxInputType,
+
+  'hidden': noop,
+  'button': noop,
+  'submit': noop,
+  'reset': noop
+};
+
+
+function isEmpty(value) {
+  return isUndefined(value) || value === '' || value === null || value !== value;
+}
+
+
+function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+
+  var listener = function() {
+    var value = trim(element.val());
+
+    if (ctrl.$viewValue !== value) {
+      scope.$apply(function() {
+        ctrl.$setViewValue(value);
+      });
+    }
+  };
+
+  // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the
+  // input event on backspace, delete or cut
+  if ($sniffer.hasEvent('input')) {
+    element.bind('input', listener);
+  } else {
+    var timeout;
+
+    var deferListener = function() {
+      if (!timeout) {
+        timeout = $browser.defer(function() {
+          listener();
+          timeout = null;
+        });
+      }
+    };
+
+    element.bind('keydown', function(event) {
+      var key = event.keyCode;
+
+      // ignore
+      //    command            modifiers                   arrows
+      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;
+
+      deferListener();
+    });
+
+    // if user paste into input using mouse, we need "change" event to catch it
+    element.bind('change', listener);
+
+    // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it
+    if ($sniffer.hasEvent('paste')) {
+      element.bind('paste cut', deferListener);
+    }
+  }
+
+
+  ctrl.$render = function() {
+    element.val(isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);
+  };
+
+  // pattern validator
+  var pattern = attr.ngPattern,
+      patternValidator;
+
+  var validate = function(regexp, value) {
+    if (isEmpty(value) || regexp.test(value)) {
+      ctrl.$setValidity('pattern', true);
+      return value;
+    } else {
+      ctrl.$setValidity('pattern', false);
+      return undefined;
+    }
+  };
+
+  if (pattern) {
+    if (pattern.match(/^\/(.*)\/$/)) {
+      pattern = new RegExp(pattern.substr(1, pattern.length - 2));
+      patternValidator = function(value) {
+        return validate(pattern, value)
+      };
+    } else {
+      patternValidator = function(value) {
+        var patternObj = scope.$eval(pattern);
+
+        if (!patternObj || !patternObj.test) {
+          throw new Error('Expected ' + pattern + ' to be a RegExp but was ' + patternObj);
+        }
+        return validate(patternObj, value);
+      };
+    }
+
+    ctrl.$formatters.push(patternValidator);
+    ctrl.$parsers.push(patternValidator);
+  }
+
+  // min length validator
+  if (attr.ngMinlength) {
+    var minlength = int(attr.ngMinlength);
+    var minLengthValidator = function(value) {
+      if (!isEmpty(value) && value.length < minlength) {
+        ctrl.$setValidity('minlength', false);
+        return undefined;
+      } else {
+        ctrl.$setValidity('minlength', true);
+        return value;
+      }
+    };
+
+    ctrl.$parsers.push(minLengthValidator);
+    ctrl.$formatters.push(minLengthValidator);
+  }
+
+  // max length validator
+  if (attr.ngMaxlength) {
+    var maxlength = int(attr.ngMaxlength);
+    var maxLengthValidator = function(value) {
+      if (!isEmpty(value) && value.length > maxlength) {
+        ctrl.$setValidity('maxlength', false);
+        return undefined;
+      } else {
+        ctrl.$setValidity('maxlength', true);
+        return value;
+      }
+    };
+
+    ctrl.$parsers.push(maxLengthValidator);
+    ctrl.$formatters.push(maxLengthValidator);
+  }
+}
+
+function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+  textInputType(scope, element, attr, ctrl, $sniffer, $browser);
+
+  ctrl.$parsers.push(function(value) {
+    var empty = isEmpty(value);
+    if (empty || NUMBER_REGEXP.test(value)) {
+      ctrl.$setValidity('number', true);
+      return value === '' ? null : (empty ? value : parseFloat(value));
+    } else {
+      ctrl.$setValidity('number', false);
+      return undefined;
+    }
+  });
+
+  ctrl.$formatters.push(function(value) {
+    return isEmpty(value) ? '' : '' + value;
+  });
+
+  if (attr.min) {
+    var min = parseFloat(attr.min);
+    var minValidator = function(value) {
+      if (!isEmpty(value) && value < min) {
+        ctrl.$setValidity('min', false);
+        return undefined;
+      } else {
+        ctrl.$setValidity('min', true);
+        return value;
+      }
+    };
+
+    ctrl.$parsers.push(minValidator);
+    ctrl.$formatters.push(minValidator);
+  }
+
+  if (attr.max) {
+    var max = parseFloat(attr.max);
+    var maxValidator = function(value) {
+      if (!isEmpty(value) && value > max) {
+        ctrl.$setValidity('max', false);
+        return undefined;
+      } else {
+        ctrl.$setValidity('max', true);
+        return value;
+      }
+    };
+
+    ctrl.$parsers.push(maxValidator);
+    ctrl.$formatters.push(maxValidator);
+  }
+
+  ctrl.$formatters.push(function(value) {
+
+    if (isEmpty(value) || isNumber(value)) {
+      ctrl.$setValidity('number', true);
+      return value;
+    } else {
+      ctrl.$setValidity('number', false);
+      return undefined;
+    }
+  });
+}
+
+function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+  textInputType(scope, element, attr, ctrl, $sniffer, $browser);
+
+  var urlValidator = function(value) {
+    if (isEmpty(value) || URL_REGEXP.test(value)) {
+      ctrl.$setValidity('url', true);
+      return value;
+    } else {
+      ctrl.$setValidity('url', false);
+      return undefined;
+    }
+  };
+
+  ctrl.$formatters.push(urlValidator);
+  ctrl.$parsers.push(urlValidator);
+}
+
+function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+  textInputType(scope, element, attr, ctrl, $sniffer, $browser);
+
+  var emailValidator = function(value) {
+    if (isEmpty(value) || EMAIL_REGEXP.test(value)) {
+      ctrl.$setValidity('email', true);
+      return value;
+    } else {
+      ctrl.$setValidity('email', false);
+      return undefined;
+    }
+  };
+
+  ctrl.$formatters.push(emailValidator);
+  ctrl.$parsers.push(emailValidator);
+}
+
+function radioInputType(scope, element, attr, ctrl) {
+  // make the name unique, if not defined
+  if (isUndefined(attr.name)) {
+    element.attr('name', nextUid());
+  }
+
+  element.bind('click', function() {
+    if (element[0].checked) {
+      scope.$apply(function() {
+        ctrl.$setViewValue(attr.value);
+      });
+    }
+  });
+
+  ctrl.$render = function() {
+    var value = attr.value;
+    element[0].checked = (value == ctrl.$viewValue);
+  };
+
+  attr.$observe('value', ctrl.$render);
+}
+
+function checkboxInputType(scope, element, attr, ctrl) {
+  var trueValue = attr.ngTrueValue,
+      falseValue = attr.ngFalseValue;
+
+  if (!isString(trueValue)) trueValue = true;
+  if (!isString(falseValue)) falseValue = false;
+
+  element.bind('click', function() {
+    scope.$apply(function() {
+      ctrl.$setViewValue(element[0].checked);
+    });
+  });
+
+  ctrl.$render = function() {
+    element[0].checked = ctrl.$viewValue;
+  };
+
+  ctrl.$formatters.push(function(value) {
+    return value === trueValue;
+  });
+
+  ctrl.$parsers.push(function(value) {
+    return value ? trueValue : falseValue;
+  });
+}
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:textarea
+ * @restrict E
+ *
+ * @description
+ * HTML textarea element control with angular data-binding. The data-binding and validation
+ * properties of this element are exactly the same as those of the
+ * {@link ng.directive:input input element}.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ *    `required` when you want to data-bind to the `required` attribute.
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+ *    minlength.
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+ *    maxlength.
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+ *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+ *    patterns defined as scope expressions.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ *    interaction with the input element.
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:input
+ * @restrict E
+ *
+ * @description
+ * HTML input element control with angular data-binding. Input control follows HTML5 input types
+ * and polyfills the HTML5 validation behavior for older browsers.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {boolean=} ngRequired Sets `required` attribute if set to true
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+ *    minlength.
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+ *    maxlength.
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+ *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+ *    patterns defined as scope expressions.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ *    interaction with the input element.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.user = {name: 'guest', last: 'visitor'};
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         <form name="myForm">
+           User name: <input type="text" name="userName" ng-model="user.name" required>
+           <span class="error" ng-show="myForm.userName.$error.required">
+             Required!</span><br>
+           Last name: <input type="text" name="lastName" ng-model="user.last"
+             ng-minlength="3" ng-maxlength="10">
+           <span class="error" ng-show="myForm.lastName.$error.minlength">
+             Too short!</span>
+           <span class="error" ng-show="myForm.lastName.$error.maxlength">
+             Too long!</span><br>
+         </form>
+         <hr>
+         <tt>user = {{user}}</tt><br/>
+         <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br>
+         <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br>
+         <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br>
+         <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br>
+         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>
+         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>
+         <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br>
+         <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>
+       </div>
+      </doc:source>
+      <doc:scenario>
+        it('should initialize to model', function() {
+          expect(binding('user')).toEqual('{"name":"guest","last":"visitor"}');
+          expect(binding('myForm.userName.$valid')).toEqual('true');
+          expect(binding('myForm.$valid')).toEqual('true');
+        });
+
+        it('should be invalid if empty when required', function() {
+          input('user.name').enter('');
+          expect(binding('user')).toEqual('{"last":"visitor"}');
+          expect(binding('myForm.userName.$valid')).toEqual('false');
+          expect(binding('myForm.$valid')).toEqual('false');
+        });
+
+        it('should be valid if empty when min length is set', function() {
+          input('user.last').enter('');
+          expect(binding('user')).toEqual('{"name":"guest","last":""}');
+          expect(binding('myForm.lastName.$valid')).toEqual('true');
+          expect(binding('myForm.$valid')).toEqual('true');
+        });
+
+        it('should be invalid if less than required min length', function() {
+          input('user.last').enter('xx');
+          expect(binding('user')).toEqual('{"name":"guest"}');
+          expect(binding('myForm.lastName.$valid')).toEqual('false');
+          expect(binding('myForm.lastName.$error')).toMatch(/minlength/);
+          expect(binding('myForm.$valid')).toEqual('false');
+        });
+
+        it('should be invalid if longer than max length', function() {
+          input('user.last').enter('some ridiculously long name');
+          expect(binding('user'))
+            .toEqual('{"name":"guest"}');
+          expect(binding('myForm.lastName.$valid')).toEqual('false');
+          expect(binding('myForm.lastName.$error')).toMatch(/maxlength/);
+          expect(binding('myForm.$valid')).toEqual('false');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+var inputDirective = ['$browser', '$sniffer', function($browser, $sniffer) {
+  return {
+    restrict: 'E',
+    require: '?ngModel',
+    link: function(scope, element, attr, ctrl) {
+      if (ctrl) {
+        (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrl, $sniffer,
+                                                            $browser);
+      }
+    }
+  };
+}];
+
+var VALID_CLASS = 'ng-valid',
+    INVALID_CLASS = 'ng-invalid',
+    PRISTINE_CLASS = 'ng-pristine',
+    DIRTY_CLASS = 'ng-dirty';
+
+/**
+ * @ngdoc object
+ * @name ng.directive:ngModel.NgModelController
+ *
+ * @property {string} $viewValue Actual string value in the view.
+ * @property {*} $modelValue The value in the model, that the control is bound to.
+ * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever
+       the control reads value from the DOM.  Each function is called, in turn, passing the value
+       through to the next. Used to sanitize / convert the value as well as validation.
+
+       For validation, the parsers should update the validity state using
+       {@link ng.directive:ngModel.NgModelController#$setValidity $setValidity()},
+       and return `undefined` for invalid values.
+ *
+ * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever
+ *     the model value changes. Each function is called, in turn, passing the value through to the
+ *     next. Used to format / convert values for display in the control and validation.
+ *      <pre>
+ *      function formatter(value) {
+ *        if (value) {
+ *          return value.toUpperCase();
+ *        }
+ *      }
+ *      ngModel.$formatters.push(formatter);
+ *      </pre>
+ * @property {Object} $error An bject hash with all errors as keys.
+ *
+ * @property {boolean} $pristine True if user has not interacted with the control yet.
+ * @property {boolean} $dirty True if user has already interacted with the control.
+ * @property {boolean} $valid True if there is no error.
+ * @property {boolean} $invalid True if at least one error on the control.
+ *
+ * @description
+ *
+ * `NgModelController` provides API for the `ng-model` directive. The controller contains
+ * services for data-binding, validation, CSS update, value formatting and parsing. It
+ * specifically does not contain any logic which deals with DOM rendering or listening to
+ * DOM events. The `NgModelController` is meant to be extended by other directives where, the
+ * directive provides DOM manipulation and the `NgModelController` provides the data-binding.
+ * Note that you cannot use `NgModelController` in a directive with an isolated scope,
+ * as, in that case, the `ng-model` value gets put into the isolated scope and does not get
+ * propogated to the parent scope.
+ *
+ *
+ * This example shows how to use `NgModelController` with a custom control to achieve
+ * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)
+ * collaborate together to achieve the desired result.
+ *
+ * <example module="customControl">
+    <file name="style.css">
+      [contenteditable] {
+        border: 1px solid black;
+        background-color: white;
+        min-height: 20px;
+      }
+
+      .ng-invalid {
+        border: 1px solid red;
+      }
+
+    </file>
+    <file name="script.js">
+      angular.module('customControl', []).
+        directive('contenteditable', function() {
+          return {
+            restrict: 'A', // only activate on element attribute
+            require: '?ngModel', // get a hold of NgModelController
+            link: function(scope, element, attrs, ngModel) {
+              if(!ngModel) return; // do nothing if no ng-model
+
+              // Specify how UI should be updated
+              ngModel.$render = function() {
+                element.html(ngModel.$viewValue || '');
+              };
+
+              // Listen for change events to enable binding
+              element.bind('blur keyup change', function() {
+                scope.$apply(read);
+              });
+              read(); // initialize
+
+              // Write data to the model
+              function read() {
+                var html = element.html();
+                // When we clear the content editable the browser leaves a <br> behind
+                // If strip-br attribute is provided then we strip this out
+                if( attrs.stripBr && html == '<br>' ) {
+                  html = '';
+                }
+                ngModel.$setViewValue(html);
+              }
+            }
+          };
+        });
+    </file>
+    <file name="index.html">
+      <form name="myForm">
+       <div contenteditable
+            name="myWidget" ng-model="userContent"
+            strip-br="true"
+            required>Change me!</div>
+        <span ng-show="myForm.myWidget.$error.required">Required!</span>
+       <hr>
+       <textarea ng-model="userContent"></textarea>
+      </form>
+    </file>
+    <file name="scenario.js">
+      it('should data-bind and become invalid', function() {
+        var contentEditable = element('[contenteditable]');
+
+        expect(contentEditable.text()).toEqual('Change me!');
+        input('userContent').enter('');
+        expect(contentEditable.text()).toEqual('');
+        expect(contentEditable.prop('className')).toMatch(/ng-invalid-required/);
+      });
+    </file>
+ * </example>
+ *
+ */
+var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse',
+    function($scope, $exceptionHandler, $attr, $element, $parse) {
+  this.$viewValue = Number.NaN;
+  this.$modelValue = Number.NaN;
+  this.$parsers = [];
+  this.$formatters = [];
+  this.$viewChangeListeners = [];
+  this.$pristine = true;
+  this.$dirty = false;
+  this.$valid = true;
+  this.$invalid = false;
+  this.$name = $attr.name;
+
+  var ngModelGet = $parse($attr.ngModel),
+      ngModelSet = ngModelGet.assign;
+
+  if (!ngModelSet) {
+    throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + $attr.ngModel +
+        ' (' + startingTag($element) + ')');
+  }
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:ngModel.NgModelController#$render
+   * @methodOf ng.directive:ngModel.NgModelController
+   *
+   * @description
+   * Called when the view needs to be updated. It is expected that the user of the ng-model
+   * directive will implement this method.
+   */
+  this.$render = noop;
+
+  var parentForm = $element.inheritedData('$formController') || nullFormCtrl,
+      invalidCount = 0, // used to easily determine if we are valid
+      $error = this.$error = {}; // keep invalid keys here
+
+
+  // Setup initial state of the control
+  $element.addClass(PRISTINE_CLASS);
+  toggleValidCss(true);
+
+  // convenience method for easy toggling of classes
+  function toggleValidCss(isValid, validationErrorKey) {
+    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
+    $element.
+      removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).
+      addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);
+  }
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:ngModel.NgModelController#$setValidity
+   * @methodOf ng.directive:ngModel.NgModelController
+   *
+   * @description
+   * Change the validity state, and notifies the form when the control changes validity. (i.e. it
+   * does not notify form if given validator is already marked as invalid).
+   *
+   * This method should be called by validators - i.e. the parser or formatter functions.
+   *
+   * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign
+   *        to `$error[validationErrorKey]=isValid` so that it is available for data-binding.
+   *        The `validationErrorKey` should be in camelCase and will get converted into dash-case
+   *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`
+   *        class and can be bound to as  `{{someForm.someControl.$error.myError}}` .
+   * @param {boolean} isValid Whether the current state is valid (true) or invalid (false).
+   */
+  this.$setValidity = function(validationErrorKey, isValid) {
+    if ($error[validationErrorKey] === !isValid) return;
+
+    if (isValid) {
+      if ($error[validationErrorKey]) invalidCount--;
+      if (!invalidCount) {
+        toggleValidCss(true);
+        this.$valid = true;
+        this.$invalid = false;
+      }
+    } else {
+      toggleValidCss(false);
+      this.$invalid = true;
+      this.$valid = false;
+      invalidCount++;
+    }
+
+    $error[validationErrorKey] = !isValid;
+    toggleValidCss(isValid, validationErrorKey);
+
+    parentForm.$setValidity(validationErrorKey, isValid, this);
+  };
+
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:ngModel.NgModelController#$setViewValue
+   * @methodOf ng.directive:ngModel.NgModelController
+   *
+   * @description
+   * Read a value from view.
+   *
+   * This method should be called from within a DOM event handler.
+   * For example {@link ng.directive:input input} or
+   * {@link ng.directive:select select} directives call it.
+   *
+   * It internally calls all `$parsers` (including validators) and updates the `$modelValue` and the actual model path.
+   * Lastly it calls all registered change listeners.
+   *
+   * @param {string} value Value from the view.
+   */
+  this.$setViewValue = function(value) {
+    this.$viewValue = value;
+
+    // change to dirty
+    if (this.$pristine) {
+      this.$dirty = true;
+      this.$pristine = false;
+      $element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS);
+      parentForm.$setDirty();
+    }
+
+    forEach(this.$parsers, function(fn) {
+      value = fn(value);
+    });
+
+    if (this.$modelValue !== value) {
+      this.$modelValue = value;
+      ngModelSet($scope, value);
+      forEach(this.$viewChangeListeners, function(listener) {
+        try {
+          listener();
+        } catch(e) {
+          $exceptionHandler(e);
+        }
+      })
+    }
+  };
+
+  // model -> value
+  var ctrl = this;
+
+  $scope.$watch(function ngModelWatch() {
+    var value = ngModelGet($scope);
+
+    // if scope model value and ngModel value are out of sync
+    if (ctrl.$modelValue !== value) {
+
+      var formatters = ctrl.$formatters,
+          idx = formatters.length;
+
+      ctrl.$modelValue = value;
+      while(idx--) {
+        value = formatters[idx](value);
+      }
+
+      if (ctrl.$viewValue !== value) {
+        ctrl.$viewValue = value;
+        ctrl.$render();
+      }
+    }
+  });
+}];
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngModel
+ *
+ * @element input
+ *
+ * @description
+ * Is a directive that tells Angular to do two-way data binding. It works together with `input`,
+ * `select`, `textarea`. You can easily write your own directives to use `ngModel` as well.
+ *
+ * `ngModel` is responsible for:
+ *
+ * - binding the view into the model, which other directives such as `input`, `textarea` or `select`
+ *   require,
+ * - providing validation behavior (i.e. required, number, email, url),
+ * - keeping state of the control (valid/invalid, dirty/pristine, validation errors),
+ * - setting related css class onto the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`),
+ * - register the control with parent {@link ng.directive:form form}.
+ *
+ * Note: `ngModel` will try to bind to the property given by evaluating the expression on the
+ * current scope. If the property doesn't already exist on this scope, it will be created
+ * implicitly and added to the scope.
+ *
+ * For basic examples, how to use `ngModel`, see:
+ *
+ *  - {@link ng.directive:input input}
+ *    - {@link ng.directive:input.text text}
+ *    - {@link ng.directive:input.checkbox checkbox}
+ *    - {@link ng.directive:input.radio radio}
+ *    - {@link ng.directive:input.number number}
+ *    - {@link ng.directive:input.email email}
+ *    - {@link ng.directive:input.url url}
+ *  - {@link ng.directive:select select}
+ *  - {@link ng.directive:textarea textarea}
+ *
+ */
+var ngModelDirective = function() {
+  return {
+    require: ['ngModel', '^?form'],
+    controller: NgModelController,
+    link: function(scope, element, attr, ctrls) {
+      // notify others, especially parent forms
+
+      var modelCtrl = ctrls[0],
+          formCtrl = ctrls[1] || nullFormCtrl;
+
+      formCtrl.$addControl(modelCtrl);
+
+      element.bind('$destroy', function() {
+        formCtrl.$removeControl(modelCtrl);
+      });
+    }
+  };
+};
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngChange
+ * @restrict E
+ *
+ * @description
+ * Evaluate given expression when user changes the input.
+ * The expression is not evaluated when the value change is coming from the model.
+ *
+ * Note, this directive requires `ngModel` to be present.
+ *
+ * @element input
+ *
+ * @example
+ * <doc:example>
+ *   <doc:source>
+ *     <script>
+ *       function Controller($scope) {
+ *         $scope.counter = 0;
+ *         $scope.change = function() {
+ *           $scope.counter++;
+ *         };
+ *       }
+ *     </script>
+ *     <div ng-controller="Controller">
+ *       <input type="checkbox" ng-model="confirmed" ng-change="change()" id="ng-change-example1" />
+ *       <input type="checkbox" ng-model="confirmed" id="ng-change-example2" />
+ *       <label for="ng-change-example2">Confirmed</label><br />
+ *       debug = {{confirmed}}<br />
+ *       counter = {{counter}}
+ *     </div>
+ *   </doc:source>
+ *   <doc:scenario>
+ *     it('should evaluate the expression if changing from view', function() {
+ *       expect(binding('counter')).toEqual('0');
+ *       element('#ng-change-example1').click();
+ *       expect(binding('counter')).toEqual('1');
+ *       expect(binding('confirmed')).toEqual('true');
+ *     });
+ *
+ *     it('should not evaluate the expression if changing from model', function() {
+ *       element('#ng-change-example2').click();
+ *       expect(binding('counter')).toEqual('0');
+ *       expect(binding('confirmed')).toEqual('true');
+ *     });
+ *   </doc:scenario>
+ * </doc:example>
+ */
+var ngChangeDirective = valueFn({
+  require: 'ngModel',
+  link: function(scope, element, attr, ctrl) {
+    ctrl.$viewChangeListeners.push(function() {
+      scope.$eval(attr.ngChange);
+    });
+  }
+});
+
+
+var requiredDirective = function() {
+  return {
+    require: '?ngModel',
+    link: function(scope, elm, attr, ctrl) {
+      if (!ctrl) return;
+      attr.required = true; // force truthy in case we are on non input element
+
+      var validator = function(value) {
+        if (attr.required && (isEmpty(value) || value === false)) {
+          ctrl.$setValidity('required', false);
+          return;
+        } else {
+          ctrl.$setValidity('required', true);
+          return value;
+        }
+      };
+
+      ctrl.$formatters.push(validator);
+      ctrl.$parsers.unshift(validator);
+
+      attr.$observe('required', function() {
+        validator(ctrl.$viewValue);
+      });
+    }
+  };
+};
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngList
+ *
+ * @description
+ * Text input that converts between comma-separated string into an array of strings.
+ *
+ * @element input
+ * @param {string=} ngList optional delimiter that should be used to split the value. If
+ *   specified in form `/something/` then the value will be converted into a regular expression.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.names = ['igor', 'misko', 'vojta'];
+         }
+       </script>
+       <form name="myForm" ng-controller="Ctrl">
+         List: <input name="namesInput" ng-model="names" ng-list required>
+         <span class="error" ng-show="myForm.namesInput.$error.required">
+           Required!</span>
+         <br>
+         <tt>names = {{names}}</tt><br/>
+         <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>
+         <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>
+         <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+        </form>
+      </doc:source>
+      <doc:scenario>
+        it('should initialize to model', function() {
+          expect(binding('names')).toEqual('["igor","misko","vojta"]');
+          expect(binding('myForm.namesInput.$valid')).toEqual('true');
+          expect(element('span.error').css('display')).toBe('none');
+        });
+
+        it('should be invalid if empty', function() {
+          input('names').enter('');
+          expect(binding('names')).toEqual('[]');
+          expect(binding('myForm.namesInput.$valid')).toEqual('false');
+          expect(element('span.error').css('display')).not().toBe('none');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+var ngListDirective = function() {
+  return {
+    require: 'ngModel',
+    link: function(scope, element, attr, ctrl) {
+      var match = /\/(.*)\//.exec(attr.ngList),
+          separator = match && new RegExp(match[1]) || attr.ngList || ',';
+
+      var parse = function(viewValue) {
+        var list = [];
+
+        if (viewValue) {
+          forEach(viewValue.split(separator), function(value) {
+            if (value) list.push(trim(value));
+          });
+        }
+
+        return list;
+      };
+
+      ctrl.$parsers.push(parse);
+      ctrl.$formatters.push(function(value) {
+        if (isArray(value)) {
+          return value.join(', ');
+        }
+
+        return undefined;
+      });
+    }
+  };
+};
+
+
+var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
+
+var ngValueDirective = function() {
+  return {
+    priority: 100,
+    compile: function(tpl, tplAttr) {
+      if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {
+        return function(scope, elm, attr) {
+          attr.$set('value', scope.$eval(attr.ngValue));
+        };
+      } else {
+        return function(scope, elm, attr) {
+          scope.$watch(attr.ngValue, function valueWatchAction(value) {
+            attr.$set('value', value);
+          });
+        };
+      }
+    }
+  };
+};
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngBind
+ *
+ * @description
+ * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element
+ * with the value of a given expression, and to update the text content when the value of that
+ * expression changes.
+ *
+ * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like
+ * `{{ expression }}` which is similar but less verbose.
+ *
+ * It is preferrable to use `ngBind` instead of `{{ expression }}` when a template is momentarily 
+ * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an 
+ * element attribute, it makes the bindings invisible to the user while the page is loading.
+ *
+ * An alternative solution to this problem would be using the
+ * {@link ng.directive:ngCloak ngCloak} directive.
+ *
+ *
+ * @element ANY
+ * @param {expression} ngBind {@link guide/expression Expression} to evaluate.
+ *
+ * @example
+ * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.name = 'Whirled';
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         Enter name: <input type="text" ng-model="name"><br>
+         Hello <span ng-bind="name"></span>!
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should check ng-bind', function() {
+         expect(using('.doc-example-live').binding('name')).toBe('Whirled');
+         using('.doc-example-live').input('name').enter('world');
+         expect(using('.doc-example-live').binding('name')).toBe('world');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+var ngBindDirective = ngDirective(function(scope, element, attr) {
+  element.addClass('ng-binding').data('$binding', attr.ngBind);
+  scope.$watch(attr.ngBind, function ngBindWatchAction(value) {
+    element.text(value == undefined ? '' : value);
+  });
+});
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngBindTemplate
+ *
+ * @description
+ * The `ngBindTemplate` directive specifies that the element
+ * text content should be replaced with the interpolation of the template
+ * in the `ngBindTemplate` attribute.
+ * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`
+ * expressions. This directive is needed since some HTML elements
+ * (such as TITLE and OPTION) cannot contain SPAN elements.
+ *
+ * @element ANY
+ * @param {string} ngBindTemplate template of form
+ *   <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.
+ *
+ * @example
+ * Try it here: enter text in text box and watch the greeting change.
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.salutation = 'Hello';
+           $scope.name = 'World';
+         }
+       </script>
+       <div ng-controller="Ctrl">
+        Salutation: <input type="text" ng-model="salutation"><br>
+        Name: <input type="text" ng-model="name"><br>
+        <pre ng-bind-template="{{salutation}} {{name}}!"></pre>
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should check ng-bind', function() {
+         expect(using('.doc-example-live').binding('salutation')).
+           toBe('Hello');
+         expect(using('.doc-example-live').binding('name')).
+           toBe('World');
+         using('.doc-example-live').input('salutation').enter('Greetings');
+         using('.doc-example-live').input('name').enter('user');
+         expect(using('.doc-example-live').binding('salutation')).
+           toBe('Greetings');
+         expect(using('.doc-example-live').binding('name')).
+           toBe('user');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
+  return function(scope, element, attr) {
+    // TODO: move this to scenario runner
+    var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));
+    element.addClass('ng-binding').data('$binding', interpolateFn);
+    attr.$observe('ngBindTemplate', function(value) {
+      element.text(value);
+    });
+  }
+}];
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngBindHtmlUnsafe
+ *
+ * @description
+ * Creates a binding that will innerHTML the result of evaluating the `expression` into the current
+ * element. *The innerHTML-ed content will not be sanitized!* You should use this directive only if
+ * {@link ngSanitize.directive:ngBindHtml ngBindHtml} directive is too
+ * restrictive and when you absolutely trust the source of the content you are binding to.
+ *
+ * See {@link ngSanitize.$sanitize $sanitize} docs for examples.
+ *
+ * @element ANY
+ * @param {expression} ngBindHtmlUnsafe {@link guide/expression Expression} to evaluate.
+ */
+var ngBindHtmlUnsafeDirective = [function() {
+  return function(scope, element, attr) {
+    element.addClass('ng-binding').data('$binding', attr.ngBindHtmlUnsafe);
+    scope.$watch(attr.ngBindHtmlUnsafe, function ngBindHtmlUnsafeWatchAction(value) {
+      element.html(value || '');
+    });
+  };
+}];
+
+function classDirective(name, selector) {
+  name = 'ngClass' + name;
+  return ngDirective(function(scope, element, attr) {
+    var oldVal = undefined;
+
+    scope.$watch(attr[name], ngClassWatchAction, true);
+
+    attr.$observe('class', function(value) {
+      var ngClass = scope.$eval(attr[name]);
+      ngClassWatchAction(ngClass, ngClass);
+    });
+
+
+    if (name !== 'ngClass') {
+      scope.$watch('$index', function($index, old$index) {
+        var mod = $index & 1;
+        if (mod !== old$index & 1) {
+          if (mod === selector) {
+            addClass(scope.$eval(attr[name]));
+          } else {
+            removeClass(scope.$eval(attr[name]));
+          }
+        }
+      });
+    }
+
+
+    function ngClassWatchAction(newVal) {
+      if (selector === true || scope.$index % 2 === selector) {
+        if (oldVal && !equals(newVal,oldVal)) {
+          removeClass(oldVal);
+        }
+        addClass(newVal);
+      }
+      oldVal = copy(newVal);
+    }
+
+
+    function removeClass(classVal) {
+      if (isObject(classVal) && !isArray(classVal)) {
+        classVal = map(classVal, function(v, k) { if (v) return k });
+      }
+      element.removeClass(isArray(classVal) ? classVal.join(' ') : classVal);
+    }
+
+
+    function addClass(classVal) {
+      if (isObject(classVal) && !isArray(classVal)) {
+        classVal = map(classVal, function(v, k) { if (v) return k });
+      }
+      if (classVal) {
+        element.addClass(isArray(classVal) ? classVal.join(' ') : classVal);
+      }
+    }
+  });
+}
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngClass
+ *
+ * @description
+ * The `ngClass` allows you to set CSS classes on HTML an element, dynamically, by databinding
+ * an expression that represents all classes to be added.
+ *
+ * The directive won't add duplicate classes if a particular class was already set.
+ *
+ * When the expression changes, the previously added classes are removed and only then the
+ * new classes are added.
+ *
+ * @element ANY
+ * @param {expression} ngClass {@link guide/expression Expression} to eval. The result
+ *   of the evaluation can be a string representing space delimited class
+ *   names, an array, or a map of class names to boolean values. In the case of a map, the
+ *   names of the properties whose values are truthy will be added as css classes to the
+ *   element.
+ *
+ * @example
+   <example>
+     <file name="index.html">
+      <input type="button" value="set" ng-click="myVar='my-class'">
+      <input type="button" value="clear" ng-click="myVar=''">
+      <br>
+      <span ng-class="myVar">Sample Text</span>
+     </file>
+     <file name="style.css">
+       .my-class {
+         color: red;
+       }
+     </file>
+     <file name="scenario.js">
+       it('should check ng-class', function() {
+         expect(element('.doc-example-live span').prop('className')).not().
+           toMatch(/my-class/);
+
+         using('.doc-example-live').element(':button:first').click();
+
+         expect(element('.doc-example-live span').prop('className')).
+           toMatch(/my-class/);
+
+         using('.doc-example-live').element(':button:last').click();
+
+         expect(element('.doc-example-live span').prop('className')).not().
+           toMatch(/my-class/);
+       });
+     </file>
+   </example>
+ */
+var ngClassDirective = classDirective('', true);
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngClassOdd
+ *
+ * @description
+ * The `ngClassOdd` and `ngClassEven` directives work exactly as
+ * {@link ng.directive:ngClass ngClass}, except it works in
+ * conjunction with `ngRepeat` and takes affect only on odd (even) rows.
+ *
+ * This directive can be applied only within a scope of an
+ * {@link ng.directive:ngRepeat ngRepeat}.
+ *
+ * @element ANY
+ * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result
+ *   of the evaluation can be a string representing space delimited class names or an array.
+ *
+ * @example
+   <example>
+     <file name="index.html">
+        <ol ng-init="names=['John', 'Mary', 'Cate', 'Suz']">
+          <li ng-repeat="name in names">
+           <span ng-class-odd="'odd'" ng-class-even="'even'">
+             {{name}}
+           </span>
+          </li>
+        </ol>
+     </file>
+     <file name="style.css">
+       .odd {
+         color: red;
+       }
+       .even {
+         color: blue;
+       }
+     </file>
+     <file name="scenario.js">
+       it('should check ng-class-odd and ng-class-even', function() {
+         expect(element('.doc-example-live li:first span').prop('className')).
+           toMatch(/odd/);
+         expect(element('.doc-example-live li:last span').prop('className')).
+           toMatch(/even/);
+       });
+     </file>
+   </example>
+ */
+var ngClassOddDirective = classDirective('Odd', 0);
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngClassEven
+ *
+ * @description
+ * The `ngClassOdd` and `ngClassEven` directives work exactly as
+ * {@link ng.directive:ngClass ngClass}, except it works in
+ * conjunction with `ngRepeat` and takes affect only on odd (even) rows.
+ *
+ * This directive can be applied only within a scope of an
+ * {@link ng.directive:ngRepeat ngRepeat}.
+ *
+ * @element ANY
+ * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The
+ *   result of the evaluation can be a string representing space delimited class names or an array.
+ *
+ * @example
+   <example>
+     <file name="index.html">
+        <ol ng-init="names=['John', 'Mary', 'Cate', 'Suz']">
+          <li ng-repeat="name in names">
+           <span ng-class-odd="'odd'" ng-class-even="'even'">
+             {{name}} &nbsp; &nbsp; &nbsp;
+           </span>
+          </li>
+        </ol>
+     </file>
+     <file name="style.css">
+       .odd {
+         color: red;
+       }
+       .even {
+         color: blue;
+       }
+     </file>
+     <file name="scenario.js">
+       it('should check ng-class-odd and ng-class-even', function() {
+         expect(element('.doc-example-live li:first span').prop('className')).
+           toMatch(/odd/);
+         expect(element('.doc-example-live li:last span').prop('className')).
+           toMatch(/even/);
+       });
+     </file>
+   </example>
+ */
+var ngClassEvenDirective = classDirective('Even', 1);
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngCloak
+ *
+ * @description
+ * The `ngCloak` directive is used to prevent the Angular html template from being briefly
+ * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this
+ * directive to avoid the undesirable flicker effect caused by the html template display.
+ *
+ * The directive can be applied to the `<body>` element, but typically a fine-grained application is
+ * prefered in order to benefit from progressive rendering of the browser view.
+ *
+ * `ngCloak` works in cooperation with a css rule that is embedded within `angular.js` and
+ *  `angular.min.js` files. Following is the css rule:
+ *
+ * <pre>
+ * [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
+ *   display: none !important;
+ * }
+ * </pre>
+ *
+ * When this css rule is loaded by the browser, all html elements (including their children) that
+ * are tagged with the `ng-cloak` directive are hidden. When Angular comes across this directive
+ * during the compilation of the template it deletes the `ngCloak` element attribute, which
+ * makes the compiled element visible.
+ *
+ * For the best result, `angular.js` script must be loaded in the head section of the html file;
+ * alternatively, the css rule (above) must be included in the external stylesheet of the
+ * application.
+ *
+ * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they
+ * cannot match the `[ng\:cloak]` selector. To work around this limitation, you must add the css
+ * class `ngCloak` in addition to `ngCloak` directive as shown in the example below.
+ *
+ * @element ANY
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+        <div id="template1" ng-cloak>{{ 'hello' }}</div>
+        <div id="template2" ng-cloak class="ng-cloak">{{ 'hello IE7' }}</div>
+     </doc:source>
+     <doc:scenario>
+       it('should remove the template directive and css class', function() {
+         expect(element('.doc-example-live #template1').attr('ng-cloak')).
+           not().toBeDefined();
+         expect(element('.doc-example-live #template2').attr('ng-cloak')).
+           not().toBeDefined();
+       });
+     </doc:scenario>
+   </doc:example>
+ *
+ */
+var ngCloakDirective = ngDirective({
+  compile: function(element, attr) {
+    attr.$set('ngCloak', undefined);
+    element.removeClass('ng-cloak');
+  }
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngController
+ *
+ * @description
+ * The `ngController` directive assigns behavior to a scope. This is a key aspect of how angular
+ * supports the principles behind the Model-View-Controller design pattern.
+ *
+ * MVC components in angular:
+ *
+ * * Model — The Model is data in scope properties; scopes are attached to the DOM.
+ * * View — The template (HTML with data bindings) is rendered into the View.
+ * * Controller — The `ngController` directive specifies a Controller class; the class has
+ *   methods that typically express the business logic behind the application.
+ *
+ * Note that an alternative way to define controllers is via the {@link ng.$route $route} service.
+ *
+ * @element ANY
+ * @scope
+ * @param {expression} ngController Name of a globally accessible constructor function or an
+ *     {@link guide/expression expression} that on the current scope evaluates to a
+ *     constructor function.
+ *
+ * @example
+ * Here is a simple form for editing user contact information. Adding, removing, clearing, and
+ * greeting are methods declared on the $scope by the controller (see source tab). These methods can
+ * easily be called from the angular markup. Notice that any changes to the data are automatically
+ * reflected in the View without the need for a manual update.
+   <doc:example>
+     <doc:source>
+      <script>
+        function SettingsController($scope) {
+          $scope.name = "John Smith";
+          $scope.contacts = [
+            {type:'phone', value:'408 555 1212'},
+            {type:'email', value:'john.smith@example.org'} ];
+
+          $scope.greet = function() {
+           alert(this.name);
+          };
+
+          $scope.addContact = function() {
+           this.contacts.push({type:'email', value:'yourname@example.org'});
+          };
+
+          $scope.removeContact = function(contactToRemove) {
+           var index = this.contacts.indexOf(contactToRemove);
+           this.contacts.splice(index, 1);
+          };
+
+          $scope.clearContact = function(contact) {
+           contact.type = 'phone';
+           contact.value = '';
+          };
+        }
+      </script>
+      <div ng-controller="SettingsController">
+        Name: <input type="text" ng-model="name"/>
+        [ <a href="" ng-click="greet()">greet</a> ]<br/>
+        Contact:
+        <ul>
+          <li ng-repeat="contact in contacts">
+            <select ng-model="contact.type">
+               <option>phone</option>
+               <option>email</option>
+            </select>
+            <input type="text" ng-model="contact.value"/>
+            [ <a href="" ng-click="clearContact(contact)">clear</a>
+            | <a href="" ng-click="removeContact(contact)">X</a> ]
+          </li>
+          <li>[ <a href="" ng-click="addContact()">add</a> ]</li>
+       </ul>
+      </div>
+     </doc:source>
+     <doc:scenario>
+       it('should check controller', function() {
+         expect(element('.doc-example-live div>:input').val()).toBe('John Smith');
+         expect(element('.doc-example-live li:nth-child(1) input').val())
+           .toBe('408 555 1212');
+         expect(element('.doc-example-live li:nth-child(2) input').val())
+           .toBe('john.smith@example.org');
+
+         element('.doc-example-live li:first a:contains("clear")').click();
+         expect(element('.doc-example-live li:first input').val()).toBe('');
+
+         element('.doc-example-live li:last a:contains("add")').click();
+         expect(element('.doc-example-live li:nth-child(3) input').val())
+           .toBe('yourname@example.org');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+var ngControllerDirective = [function() {
+  return {
+    scope: true,
+    controller: '@'
+  };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngCsp
+ * @priority 1000
+ *
+ * @element html
+ * @description
+ * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.
+ * 
+ * This is necessary when developing things like Google Chrome Extensions.
+ * 
+ * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).
+ * For us to be compatible, we just need to implement the "getterFn" in $parse without violating
+ * any of these restrictions.
+ * 
+ * AngularJS uses `Function(string)` generated functions as a speed optimization. By applying `ngCsp`
+ * it is be possible to opt into the CSP compatible mode. When this mode is on AngularJS will
+ * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will
+ * be raised.
+ * 
+ * In order to use this feature put `ngCsp` directive on the root element of the application.
+ * 
+ * @example
+ * This example shows how to apply the `ngCsp` directive to the `html` tag.
+   <pre>
+     <!doctype html>
+     <html ng-app ng-csp>
+     ...
+     ...
+     </html>
+   </pre>
+ */
+
+var ngCspDirective = ['$sniffer', function($sniffer) {
+  return {
+    priority: 1000,
+    compile: function() {
+      $sniffer.csp = true;
+    }
+  };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngClick
+ *
+ * @description
+ * The ngClick allows you to specify custom behavior when
+ * element is clicked.
+ *
+ * @element ANY
+ * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon
+ * click. (Event object is available as `$event`)
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+      <button ng-click="count = count + 1" ng-init="count=0">
+        Increment
+      </button>
+      count: {{count}}
+     </doc:source>
+     <doc:scenario>
+       it('should check ng-click', function() {
+         expect(binding('count')).toBe('0');
+         element('.doc-example-live :button').click();
+         expect(binding('count')).toBe('1');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+/*
+ * A directive that allows creation of custom onclick handlers that are defined as angular
+ * expressions and are compiled and executed within the current scope.
+ *
+ * Events that are handled via these handler are always configured not to propagate further.
+ */
+var ngEventDirectives = {};
+forEach(
+  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave submit'.split(' '),
+  function(name) {
+    var directiveName = directiveNormalize('ng-' + name);
+    ngEventDirectives[directiveName] = ['$parse', function($parse) {
+      return function(scope, element, attr) {
+        var fn = $parse(attr[directiveName]);
+        element.bind(lowercase(name), function(event) {
+          scope.$apply(function() {
+            fn(scope, {$event:event});
+          });
+        });
+      };
+    }];
+  }
+);
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngDblclick
+ *
+ * @description
+ * The `ngDblclick` directive allows you to specify custom behavior on dblclick event.
+ *
+ * @element ANY
+ * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon
+ * dblclick. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMousedown
+ *
+ * @description
+ * The ngMousedown directive allows you to specify custom behavior on mousedown event.
+ *
+ * @element ANY
+ * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon
+ * mousedown. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMouseup
+ *
+ * @description
+ * Specify custom behavior on mouseup event.
+ *
+ * @element ANY
+ * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon
+ * mouseup. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMouseover
+ *
+ * @description
+ * Specify custom behavior on mouseover event.
+ *
+ * @element ANY
+ * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon
+ * mouseover. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMouseenter
+ *
+ * @description
+ * Specify custom behavior on mouseenter event.
+ *
+ * @element ANY
+ * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon
+ * mouseenter. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMouseleave
+ *
+ * @description
+ * Specify custom behavior on mouseleave event.
+ *
+ * @element ANY
+ * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon
+ * mouseleave. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMousemove
+ *
+ * @description
+ * Specify custom behavior on mousemove event.
+ *
+ * @element ANY
+ * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon
+ * mousemove. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngKeydown
+ *
+ * @description
+ * Specify custom behavior on keydown event.
+ *
+ * @element ANY
+ * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon
+ * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngKeyup
+ *
+ * @description
+ * Specify custom behavior on keyup event.
+ *
+ * @element ANY
+ * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon
+ * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngKeypress
+ *
+ * @description
+ * Specify custom behavior on keypress event.
+ *
+ * @element ANY
+ * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon
+ * keypress. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngSubmit
+ *
+ * @description
+ * Enables binding angular expressions to onsubmit events.
+ *
+ * Additionally it prevents the default action (which for form means sending the request to the
+ * server and reloading the current page) **but only if the form does not contain an `action`
+ * attribute**.
+ *
+ * @element form
+ * @param {expression} ngSubmit {@link guide/expression Expression} to eval. (Event object is available as `$event`)
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+      <script>
+        function Ctrl($scope) {
+          $scope.list = [];
+          $scope.text = 'hello';
+          $scope.submit = function() {
+            if (this.text) {
+              this.list.push(this.text);
+              this.text = '';
+            }
+          };
+        }
+      </script>
+      <form ng-submit="submit()" ng-controller="Ctrl">
+        Enter text and hit enter:
+        <input type="text" ng-model="text" name="text" />
+        <input type="submit" id="submit" value="Submit" />
+        <pre>list={{list}}</pre>
+      </form>
+     </doc:source>
+     <doc:scenario>
+       it('should check ng-submit', function() {
+         expect(binding('list')).toBe('[]');
+         element('.doc-example-live #submit').click();
+         expect(binding('list')).toBe('["hello"]');
+         expect(input('text').val()).toBe('');
+       });
+       it('should ignore empty strings', function() {
+         expect(binding('list')).toBe('[]');
+         element('.doc-example-live #submit').click();
+         element('.doc-example-live #submit').click();
+         expect(binding('list')).toBe('["hello"]');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngInclude
+ * @restrict ECA
+ *
+ * @description
+ * Fetches, compiles and includes an external HTML fragment.
+ *
+ * Keep in mind that Same Origin Policy applies to included resources
+ * (e.g. ngInclude won't work for cross-domain requests on all browsers and for
+ *  file:// access on some browsers).
+ *
+ * @scope
+ *
+ * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,
+ *                 make sure you wrap it in quotes, e.g. `src="'myPartialTemplate.html'"`.
+ * @param {string=} onload Expression to evaluate when a new partial is loaded.
+ *
+ * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll
+ *                  $anchorScroll} to scroll the viewport after the content is loaded.
+ *
+ *                  - If the attribute is not set, disable scrolling.
+ *                  - If the attribute is set without value, enable scrolling.
+ *                  - Otherwise enable scrolling only if the expression evaluates to truthy value.
+ *
+ * @example
+  <example>
+    <file name="index.html">
+     <div ng-controller="Ctrl">
+       <select ng-model="template" ng-options="t.name for t in templates">
+        <option value="">(blank)</option>
+       </select>
+       url of the template: <tt>{{template.url}}</tt>
+       <hr/>
+       <div ng-include src="template.url"></div>
+     </div>
+    </file>
+    <file name="script.js">
+      function Ctrl($scope) {
+        $scope.templates =
+          [ { name: 'template1.html', url: 'template1.html'}
+          , { name: 'template2.html', url: 'template2.html'} ];
+        $scope.template = $scope.templates[0];
+      }
+     </file>
+    <file name="template1.html">
+      Content of template1.html
+    </file>
+    <file name="template2.html">
+      Content of template2.html
+    </file>
+    <file name="scenario.js">
+      it('should load template1.html', function() {
+       expect(element('.doc-example-live [ng-include]').text()).
+         toMatch(/Content of template1.html/);
+      });
+      it('should load template2.html', function() {
+       select('template').option('1');
+       expect(element('.doc-example-live [ng-include]').text()).
+         toMatch(/Content of template2.html/);
+      });
+      it('should change to blank', function() {
+       select('template').option('');
+       expect(element('.doc-example-live [ng-include]').text()).toEqual('');
+      });
+    </file>
+  </example>
+ */
+
+
+/**
+ * @ngdoc event
+ * @name ng.directive:ngInclude#$includeContentLoaded
+ * @eventOf ng.directive:ngInclude
+ * @eventType emit on the current ngInclude scope
+ * @description
+ * Emitted every time the ngInclude content is reloaded.
+ */
+var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile',
+                  function($http,   $templateCache,   $anchorScroll,   $compile) {
+  return {
+    restrict: 'ECA',
+    terminal: true,
+    compile: function(element, attr) {
+      var srcExp = attr.ngInclude || attr.src,
+          onloadExp = attr.onload || '',
+          autoScrollExp = attr.autoscroll;
+
+      return function(scope, element) {
+        var changeCounter = 0,
+            childScope;
+
+        var clearContent = function() {
+          if (childScope) {
+            childScope.$destroy();
+            childScope = null;
+          }
+
+          element.html('');
+        };
+
+        scope.$watch(srcExp, function ngIncludeWatchAction(src) {
+          var thisChangeId = ++changeCounter;
+
+          if (src) {
+            $http.get(src, {cache: $templateCache}).success(function(response) {
+              if (thisChangeId !== changeCounter) return;
+
+              if (childScope) childScope.$destroy();
+              childScope = scope.$new();
+
+              element.html(response);
+              $compile(element.contents())(childScope);
+
+              if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {
+                $anchorScroll();
+              }
+
+              childScope.$emit('$includeContentLoaded');
+              scope.$eval(onloadExp);
+            }).error(function() {
+              if (thisChangeId === changeCounter) clearContent();
+            });
+          } else clearContent();
+        });
+      };
+    }
+  };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngInit
+ *
+ * @description
+ * The `ngInit` directive specifies initialization tasks to be executed
+ *  before the template enters execution mode during bootstrap.
+ *
+ * @element ANY
+ * @param {expression} ngInit {@link guide/expression Expression} to eval.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+    <div ng-init="greeting='Hello'; person='World'">
+      {{greeting}} {{person}}!
+    </div>
+     </doc:source>
+     <doc:scenario>
+       it('should check greeting', function() {
+         expect(binding('greeting')).toBe('Hello');
+         expect(binding('person')).toBe('World');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+var ngInitDirective = ngDirective({
+  compile: function() {
+    return {
+      pre: function(scope, element, attrs) {
+        scope.$eval(attrs.ngInit);
+      }
+    }
+  }
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngNonBindable
+ * @priority 1000
+ *
+ * @description
+ * Sometimes it is necessary to write code which looks like bindings but which should be left alone
+ * by angular. Use `ngNonBindable` to make angular ignore a chunk of HTML.
+ *
+ * @element ANY
+ *
+ * @example
+ * In this example there are two location where a simple binding (`{{}}`) is present, but the one
+ * wrapped in `ngNonBindable` is left alone.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+        <div>Normal: {{1 + 2}}</div>
+        <div ng-non-bindable>Ignored: {{1 + 2}}</div>
+      </doc:source>
+      <doc:scenario>
+       it('should check ng-non-bindable', function() {
+         expect(using('.doc-example-live').binding('1 + 2')).toBe('3');
+         expect(using('.doc-example-live').element('div:last').text()).
+           toMatch(/1 \+ 2/);
+       });
+      </doc:scenario>
+    </doc:example>
+ */
+var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngPluralize
+ * @restrict EA
+ *
+ * @description
+ * # Overview
+ * `ngPluralize` is a directive that displays messages according to en-US localization rules.
+ * These rules are bundled with angular.js, but can be overridden
+ * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive
+ * by specifying the mappings between
+ * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
+ * plural categories} and the strings to be displayed.
+ *
+ * # Plural categories and explicit number rules
+ * There are two
+ * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
+ * plural categories} in Angular's default en-US locale: "one" and "other".
+ *
+ * While a pural category may match many numbers (for example, in en-US locale, "other" can match
+ * any number that is not 1), an explicit number rule can only match one number. For example, the
+ * explicit number rule for "3" matches the number 3. There are examples of plural categories
+ * and explicit number rules throughout the rest of this documentation.
+ *
+ * # Configuring ngPluralize
+ * You configure ngPluralize by providing 2 attributes: `count` and `when`.
+ * You can also provide an optional attribute, `offset`.
+ *
+ * The value of the `count` attribute can be either a string or an {@link guide/expression
+ * Angular expression}; these are evaluated on the current scope for its bound value.
+ *
+ * The `when` attribute specifies the mappings between plural categories and the actual
+ * string to be displayed. The value of the attribute should be a JSON object.
+ *
+ * The following example shows how to configure ngPluralize:
+ *
+ * <pre>
+ * <ng-pluralize count="personCount"
+                 when="{'0': 'Nobody is viewing.',
+ *                      'one': '1 person is viewing.',
+ *                      'other': '{} people are viewing.'}">
+ * </ng-pluralize>
+ *</pre>
+ *
+ * In the example, `"0: Nobody is viewing."` is an explicit number rule. If you did not
+ * specify this rule, 0 would be matched to the "other" category and "0 people are viewing"
+ * would be shown instead of "Nobody is viewing". You can specify an explicit number rule for
+ * other numbers, for example 12, so that instead of showing "12 people are viewing", you can
+ * show "a dozen people are viewing".
+ *
+ * You can use a set of closed braces(`{}`) as a placeholder for the number that you want substituted
+ * into pluralized strings. In the previous example, Angular will replace `{}` with
+ * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder
+ * for <span ng-non-bindable>{{numberExpression}}</span>.
+ *
+ * # Configuring ngPluralize with offset
+ * The `offset` attribute allows further customization of pluralized text, which can result in
+ * a better user experience. For example, instead of the message "4 people are viewing this document",
+ * you might display "John, Kate and 2 others are viewing this document".
+ * The offset attribute allows you to offset a number by any desired value.
+ * Let's take a look at an example:
+ *
+ * <pre>
+ * <ng-pluralize count="personCount" offset=2
+ *               when="{'0': 'Nobody is viewing.',
+ *                      '1': '{{person1}} is viewing.',
+ *                      '2': '{{person1}} and {{person2}} are viewing.',
+ *                      'one': '{{person1}}, {{person2}} and one other person are viewing.',
+ *                      'other': '{{person1}}, {{person2}} and {} other people are viewing.'}">
+ * </ng-pluralize>
+ * </pre>
+ *
+ * Notice that we are still using two plural categories(one, other), but we added
+ * three explicit number rules 0, 1 and 2.
+ * When one person, perhaps John, views the document, "John is viewing" will be shown.
+ * When three people view the document, no explicit number rule is found, so
+ * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.
+ * In this case, plural category 'one' is matched and "John, Marry and one other person are viewing"
+ * is shown.
+ *
+ * Note that when you specify offsets, you must provide explicit number rules for
+ * numbers from 0 up to and including the offset. If you use an offset of 3, for example,
+ * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for
+ * plural categories "one" and "other".
+ *
+ * @param {string|expression} count The variable to be bounded to.
+ * @param {string} when The mapping between plural category to its correspoding strings.
+ * @param {number=} offset Offset to deduct from the total number.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+        <script>
+          function Ctrl($scope) {
+            $scope.person1 = 'Igor';
+            $scope.person2 = 'Misko';
+            $scope.personCount = 1;
+          }
+        </script>
+        <div ng-controller="Ctrl">
+          Person 1:<input type="text" ng-model="person1" value="Igor" /><br/>
+          Person 2:<input type="text" ng-model="person2" value="Misko" /><br/>
+          Number of People:<input type="text" ng-model="personCount" value="1" /><br/>
+
+          <!--- Example with simple pluralization rules for en locale --->
+          Without Offset:
+          <ng-pluralize count="personCount"
+                        when="{'0': 'Nobody is viewing.',
+                               'one': '1 person is viewing.',
+                               'other': '{} people are viewing.'}">
+          </ng-pluralize><br>
+
+          <!--- Example with offset --->
+          With Offset(2):
+          <ng-pluralize count="personCount" offset=2
+                        when="{'0': 'Nobody is viewing.',
+                               '1': '{{person1}} is viewing.',
+                               '2': '{{person1}} and {{person2}} are viewing.',
+                               'one': '{{person1}}, {{person2}} and one other person are viewing.',
+                               'other': '{{person1}}, {{person2}} and {} other people are viewing.'}">
+          </ng-pluralize>
+        </div>
+      </doc:source>
+      <doc:scenario>
+        it('should show correct pluralized string', function() {
+          expect(element('.doc-example-live ng-pluralize:first').text()).
+                                             toBe('1 person is viewing.');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+                                                toBe('Igor is viewing.');
+
+          using('.doc-example-live').input('personCount').enter('0');
+          expect(element('.doc-example-live ng-pluralize:first').text()).
+                                               toBe('Nobody is viewing.');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+                                              toBe('Nobody is viewing.');
+
+          using('.doc-example-live').input('personCount').enter('2');
+          expect(element('.doc-example-live ng-pluralize:first').text()).
+                                            toBe('2 people are viewing.');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+                              toBe('Igor and Misko are viewing.');
+
+          using('.doc-example-live').input('personCount').enter('3');
+          expect(element('.doc-example-live ng-pluralize:first').text()).
+                                            toBe('3 people are viewing.');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+                              toBe('Igor, Misko and one other person are viewing.');
+
+          using('.doc-example-live').input('personCount').enter('4');
+          expect(element('.doc-example-live ng-pluralize:first').text()).
+                                            toBe('4 people are viewing.');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+                              toBe('Igor, Misko and 2 other people are viewing.');
+        });
+
+        it('should show data-binded names', function() {
+          using('.doc-example-live').input('personCount').enter('4');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+              toBe('Igor, Misko and 2 other people are viewing.');
+
+          using('.doc-example-live').input('person1').enter('Di');
+          using('.doc-example-live').input('person2').enter('Vojta');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+              toBe('Di, Vojta and 2 other people are viewing.');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {
+  var BRACE = /{}/g;
+  return {
+    restrict: 'EA',
+    link: function(scope, element, attr) {
+      var numberExp = attr.count,
+          whenExp = element.attr(attr.$attr.when), // this is because we have {{}} in attrs
+          offset = attr.offset || 0,
+          whens = scope.$eval(whenExp),
+          whensExpFns = {},
+          startSymbol = $interpolate.startSymbol(),
+          endSymbol = $interpolate.endSymbol();
+
+      forEach(whens, function(expression, key) {
+        whensExpFns[key] =
+          $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' +
+            offset + endSymbol));
+      });
+
+      scope.$watch(function ngPluralizeWatch() {
+        var value = parseFloat(scope.$eval(numberExp));
+
+        if (!isNaN(value)) {
+          //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise,
+          //check it against pluralization rules in $locale service
+          if (!(value in whens)) value = $locale.pluralCat(value - offset);
+           return whensExpFns[value](scope, element, true);
+        } else {
+          return '';
+        }
+      }, function ngPluralizeWatchAction(newVal) {
+        element.text(newVal);
+      });
+    }
+  };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngRepeat
+ *
+ * @description
+ * The `ngRepeat` directive instantiates a template once per item from a collection. Each template
+ * instance gets its own scope, where the given loop variable is set to the current collection item,
+ * and `$index` is set to the item index or key.
+ *
+ * Special properties are exposed on the local scope of each template instance, including:
+ *
+ *   * `$index` – `{number}` – iterator offset of the repeated element (0..length-1)
+ *   * `$first` – `{boolean}` – true if the repeated element is first in the iterator.
+ *   * `$middle` – `{boolean}` – true if the repeated element is between the first and last in the iterator.
+ *   * `$last` – `{boolean}` – true if the repeated element is last in the iterator.
+ *
+ *
+ * @element ANY
+ * @scope
+ * @priority 1000
+ * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. Two
+ *   formats are currently supported:
+ *
+ *   * `variable in expression` – where variable is the user defined loop variable and `expression`
+ *     is a scope expression giving the collection to enumerate.
+ *
+ *     For example: `track in cd.tracks`.
+ *
+ *   * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,
+ *     and `expression` is the scope expression giving the collection to enumerate.
+ *
+ *     For example: `(name, age) in {'adam':10, 'amalie':12}`.
+ *
+ * @example
+ * This example initializes the scope to a list of names and
+ * then uses `ngRepeat` to display every person:
+    <doc:example>
+      <doc:source>
+        <div ng-init="friends = [{name:'John', age:25}, {name:'Mary', age:28}]">
+          I have {{friends.length}} friends. They are:
+          <ul>
+            <li ng-repeat="friend in friends">
+              [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
+            </li>
+          </ul>
+        </div>
+      </doc:source>
+      <doc:scenario>
+         it('should check ng-repeat', function() {
+           var r = using('.doc-example-live').repeater('ul li');
+           expect(r.count()).toBe(2);
+           expect(r.row(0)).toEqual(["1","John","25"]);
+           expect(r.row(1)).toEqual(["2","Mary","28"]);
+         });
+      </doc:scenario>
+    </doc:example>
+ */
+var ngRepeatDirective = ngDirective({
+  transclude: 'element',
+  priority: 1000,
+  terminal: true,
+  compile: function(element, attr, linker) {
+    return function(scope, iterStartElement, attr){
+      var expression = attr.ngRepeat;
+      var match = expression.match(/^\s*(.+)\s+in\s+(.*)\s*$/),
+        lhs, rhs, valueIdent, keyIdent;
+      if (! match) {
+        throw Error("Expected ngRepeat in form of '_item_ in _collection_' but got '" +
+          expression + "'.");
+      }
+      lhs = match[1];
+      rhs = match[2];
+      match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);
+      if (!match) {
+        throw Error("'item' in 'item in collection' should be identifier or (key, value) but got '" +
+            lhs + "'.");
+      }
+      valueIdent = match[3] || match[1];
+      keyIdent = match[2];
+
+      // Store a list of elements from previous run. This is a hash where key is the item from the
+      // iterator, and the value is an array of objects with following properties.
+      //   - scope: bound scope
+      //   - element: previous element.
+      //   - index: position
+      // We need an array of these objects since the same object can be returned from the iterator.
+      // We expect this to be a rare case.
+      var lastOrder = new HashQueueMap();
+
+      scope.$watch(function ngRepeatWatch(scope){
+        var index, length,
+            collection = scope.$eval(rhs),
+            cursor = iterStartElement,     // current position of the node
+            // Same as lastOrder but it has the current state. It will become the
+            // lastOrder on the next iteration.
+            nextOrder = new HashQueueMap(),
+            arrayBound,
+            childScope,
+            key, value, // key/value of iteration
+            array,
+            last;       // last object information {scope, element, index}
+
+
+
+        if (!isArray(collection)) {
+          // if object, extract keys, sort them and use to determine order of iteration over obj props
+          array = [];
+          for(key in collection) {
+            if (collection.hasOwnProperty(key) && key.charAt(0) != '$') {
+              array.push(key);
+            }
+          }
+          array.sort();
+        } else {
+          array = collection || [];
+        }
+
+        arrayBound = array.length-1;
+
+        // we are not using forEach for perf reasons (trying to avoid #call)
+        for (index = 0, length = array.length; index < length; index++) {
+          key = (collection === array) ? index : array[index];
+          value = collection[key];
+
+          last = lastOrder.shift(value);
+
+          if (last) {
+            // if we have already seen this object, then we need to reuse the
+            // associated scope/element
+            childScope = last.scope;
+            nextOrder.push(value, last);
+
+            if (index === last.index) {
+              // do nothing
+              cursor = last.element;
+            } else {
+              // existing item which got moved
+              last.index = index;
+              // This may be a noop, if the element is next, but I don't know of a good way to
+              // figure this out,  since it would require extra DOM access, so let's just hope that
+              // the browsers realizes that it is noop, and treats it as such.
+              cursor.after(last.element);
+              cursor = last.element;
+            }
+          } else {
+            // new item which we don't know about
+            childScope = scope.$new();
+          }
+
+          childScope[valueIdent] = value;
+          if (keyIdent) childScope[keyIdent] = key;
+          childScope.$index = index;
+
+          childScope.$first = (index === 0);
+          childScope.$last = (index === arrayBound);
+          childScope.$middle = !(childScope.$first || childScope.$last);
+
+          if (!last) {
+            linker(childScope, function(clone){
+              cursor.after(clone);
+              last = {
+                  scope: childScope,
+                  element: (cursor = clone),
+                  index: index
+                };
+              nextOrder.push(value, last);
+            });
+          }
+        }
+
+        //shrink children
+        for (key in lastOrder) {
+          if (lastOrder.hasOwnProperty(key)) {
+            array = lastOrder[key];
+            while(array.length) {
+              value = array.pop();
+              value.element.remove();
+              value.scope.$destroy();
+            }
+          }
+        }
+
+        lastOrder = nextOrder;
+      });
+    };
+  }
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngShow
+ *
+ * @description
+ * The `ngShow` and `ngHide` directives show or hide a portion of the DOM tree (HTML)
+ * conditionally.
+ *
+ * @element ANY
+ * @param {expression} ngShow If the {@link guide/expression expression} is truthy
+ *     then the element is shown or hidden respectively.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+        Click me: <input type="checkbox" ng-model="checked"><br/>
+        Show: <span ng-show="checked">I show up when your checkbox is checked.</span> <br/>
+        Hide: <span ng-hide="checked">I hide when your checkbox is checked.</span>
+     </doc:source>
+     <doc:scenario>
+       it('should check ng-show / ng-hide', function() {
+         expect(element('.doc-example-live span:first:hidden').count()).toEqual(1);
+         expect(element('.doc-example-live span:last:visible').count()).toEqual(1);
+
+         input('checked').check();
+
+         expect(element('.doc-example-live span:first:visible').count()).toEqual(1);
+         expect(element('.doc-example-live span:last:hidden').count()).toEqual(1);
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+//TODO(misko): refactor to remove element from the DOM
+var ngShowDirective = ngDirective(function(scope, element, attr){
+  scope.$watch(attr.ngShow, function ngShowWatchAction(value){
+    element.css('display', toBoolean(value) ? '' : 'none');
+  });
+});
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngHide
+ *
+ * @description
+ * The `ngHide` and `ngShow` directives hide or show a portion of the DOM tree (HTML)
+ * conditionally.
+ *
+ * @element ANY
+ * @param {expression} ngHide If the {@link guide/expression expression} is truthy then
+ *     the element is shown or hidden respectively.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+        Click me: <input type="checkbox" ng-model="checked"><br/>
+        Show: <span ng-show="checked">I show up when you checkbox is checked?</span> <br/>
+        Hide: <span ng-hide="checked">I hide when you checkbox is checked?</span>
+     </doc:source>
+     <doc:scenario>
+       it('should check ng-show / ng-hide', function() {
+         expect(element('.doc-example-live span:first:hidden').count()).toEqual(1);
+         expect(element('.doc-example-live span:last:visible').count()).toEqual(1);
+
+         input('checked').check();
+
+         expect(element('.doc-example-live span:first:visible').count()).toEqual(1);
+         expect(element('.doc-example-live span:last:hidden').count()).toEqual(1);
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+//TODO(misko): refactor to remove element from the DOM
+var ngHideDirective = ngDirective(function(scope, element, attr){
+  scope.$watch(attr.ngHide, function ngHideWatchAction(value){
+    element.css('display', toBoolean(value) ? 'none' : '');
+  });
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngStyle
+ *
+ * @description
+ * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.
+ *
+ * @element ANY
+ * @param {expression} ngStyle {@link guide/expression Expression} which evals to an
+ *      object whose keys are CSS style names and values are corresponding values for those CSS
+ *      keys.
+ *
+ * @example
+   <example>
+     <file name="index.html">
+        <input type="button" value="set" ng-click="myStyle={color:'red'}">
+        <input type="button" value="clear" ng-click="myStyle={}">
+        <br/>
+        <span ng-style="myStyle">Sample Text</span>
+        <pre>myStyle={{myStyle}}</pre>
+     </file>
+     <file name="style.css">
+       span {
+         color: black;
+       }
+     </file>
+     <file name="scenario.js">
+       it('should check ng-style', function() {
+         expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)');
+         element('.doc-example-live :button[value=set]').click();
+         expect(element('.doc-example-live span').css('color')).toBe('rgb(255, 0, 0)');
+         element('.doc-example-live :button[value=clear]').click();
+         expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)');
+       });
+     </file>
+   </example>
+ */
+var ngStyleDirective = ngDirective(function(scope, element, attr) {
+  scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {
+    if (oldStyles && (newStyles !== oldStyles)) {
+      forEach(oldStyles, function(val, style) { element.css(style, '');});
+    }
+    if (newStyles) element.css(newStyles);
+  }, true);
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngSwitch
+ * @restrict EA
+ *
+ * @description
+ * Conditionally change the DOM structure.
+ *
+ * @usage
+ * <ANY ng-switch="expression">
+ *   <ANY ng-switch-when="matchValue1">...</ANY>
+ *   <ANY ng-switch-when="matchValue2">...</ANY>
+ *   ...
+ *   <ANY ng-switch-default>...</ANY>
+ * </ANY>
+ *
+ * @scope
+ * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.
+ * @paramDescription
+ * On child elments add:
+ *
+ * * `ngSwitchWhen`: the case statement to match against. If match then this
+ *   case will be displayed.
+ * * `ngSwitchDefault`: the default case when no other casses match.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+        <script>
+          function Ctrl($scope) {
+            $scope.items = ['settings', 'home', 'other'];
+            $scope.selection = $scope.items[0];
+          }
+        </script>
+        <div ng-controller="Ctrl">
+          <select ng-model="selection" ng-options="item for item in items">
+          </select>
+          <tt>selection={{selection}}</tt>
+          <hr/>
+          <div ng-switch on="selection" >
+            <div ng-switch-when="settings">Settings Div</div>
+            <span ng-switch-when="home">Home Span</span>
+            <span ng-switch-default>default</span>
+          </div>
+        </div>
+      </doc:source>
+      <doc:scenario>
+        it('should start in settings', function() {
+         expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Settings Div/);
+        });
+        it('should change to home', function() {
+         select('selection').option('home');
+         expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Home Span/);
+        });
+        it('should select deafault', function() {
+         select('selection').option('other');
+         expect(element('.doc-example-live [ng-switch]').text()).toMatch(/default/);
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+var NG_SWITCH = 'ng-switch';
+var ngSwitchDirective = valueFn({
+  restrict: 'EA',
+  require: 'ngSwitch',
+  // asks for $scope to fool the BC controller module
+  controller: ['$scope', function ngSwitchController() {
+    this.cases = {};
+  }],
+  link: function(scope, element, attr, ctrl) {
+    var watchExpr = attr.ngSwitch || attr.on,
+        selectedTransclude,
+        selectedElement,
+        selectedScope;
+
+    scope.$watch(watchExpr, function ngSwitchWatchAction(value) {
+      if (selectedElement) {
+        selectedScope.$destroy();
+        selectedElement.remove();
+        selectedElement = selectedScope = null;
+      }
+      if ((selectedTransclude = ctrl.cases['!' + value] || ctrl.cases['?'])) {
+        scope.$eval(attr.change);
+        selectedScope = scope.$new();
+        selectedTransclude(selectedScope, function(caseElement) {
+          selectedElement = caseElement;
+          element.append(caseElement);
+        });
+      }
+    });
+  }
+});
+
+var ngSwitchWhenDirective = ngDirective({
+  transclude: 'element',
+  priority: 500,
+  require: '^ngSwitch',
+  compile: function(element, attrs, transclude) {
+    return function(scope, element, attr, ctrl) {
+      ctrl.cases['!' + attrs.ngSwitchWhen] = transclude;
+    };
+  }
+});
+
+var ngSwitchDefaultDirective = ngDirective({
+  transclude: 'element',
+  priority: 500,
+  require: '^ngSwitch',
+  compile: function(element, attrs, transclude) {
+    return function(scope, element, attr, ctrl) {
+      ctrl.cases['?'] = transclude;
+    };
+  }
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngTransclude
+ *
+ * @description
+ * Insert the transcluded DOM here.
+ *
+ * @element ANY
+ *
+ * @example
+   <doc:example module="transclude">
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.title = 'Lorem Ipsum';
+           $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
+         }
+
+         angular.module('transclude', [])
+          .directive('pane', function(){
+             return {
+               restrict: 'E',
+               transclude: true,
+               scope: { title:'@' },
+               template: '<div style="border: 1px solid black;">' +
+                           '<div style="background-color: gray">{{title}}</div>' +
+                           '<div ng-transclude></div>' +
+                         '</div>'
+             };
+         });
+       </script>
+       <div ng-controller="Ctrl">
+         <input ng-model="title"><br>
+         <textarea ng-model="text"></textarea> <br/>
+         <pane title="{{title}}">{{text}}</pane>
+       </div>
+     </doc:source>
+     <doc:scenario>
+        it('should have transcluded', function() {
+          input('title').enter('TITLE');
+          input('text').enter('TEXT');
+          expect(binding('title')).toEqual('TITLE');
+          expect(binding('text')).toEqual('TEXT');
+        });
+     </doc:scenario>
+   </doc:example>
+ *
+ */
+var ngTranscludeDirective = ngDirective({
+  controller: ['$transclude', '$element', function($transclude, $element) {
+    $transclude(function(clone) {
+      $element.append(clone);
+    });
+  }]
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngView
+ * @restrict ECA
+ *
+ * @description
+ * # Overview
+ * `ngView` is a directive that complements the {@link ng.$route $route} service by
+ * including the rendered template of the current route into the main layout (`index.html`) file.
+ * Every time the current route changes, the included view changes with it according to the
+ * configuration of the `$route` service.
+ *
+ * @scope
+ * @example
+    <example module="ngView">
+      <file name="index.html">
+        <div ng-controller="MainCntl">
+          Choose:
+          <a href="Book/Moby">Moby</a> |
+          <a href="Book/Moby/ch/1">Moby: Ch1</a> |
+          <a href="Book/Gatsby">Gatsby</a> |
+          <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
+          <a href="Book/Scarlet">Scarlet Letter</a><br/>
+
+          <div ng-view></div>
+          <hr />
+
+          <pre>$location.path() = {{$location.path()}}</pre>
+          <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>
+          <pre>$route.current.params = {{$route.current.params}}</pre>
+          <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>
+          <pre>$routeParams = {{$routeParams}}</pre>
+        </div>
+      </file>
+
+      <file name="book.html">
+        controller: {{name}}<br />
+        Book Id: {{params.bookId}}<br />
+      </file>
+
+      <file name="chapter.html">
+        controller: {{name}}<br />
+        Book Id: {{params.bookId}}<br />
+        Chapter Id: {{params.chapterId}}
+      </file>
+
+      <file name="script.js">
+        angular.module('ngView', [], function($routeProvider, $locationProvider) {
+          $routeProvider.when('/Book/:bookId', {
+            templateUrl: 'book.html',
+            controller: BookCntl
+          });
+          $routeProvider.when('/Book/:bookId/ch/:chapterId', {
+            templateUrl: 'chapter.html',
+            controller: ChapterCntl
+          });
+
+          // configure html5 to get links working on jsfiddle
+          $locationProvider.html5Mode(true);
+        });
+
+        function MainCntl($scope, $route, $routeParams, $location) {
+          $scope.$route = $route;
+          $scope.$location = $location;
+          $scope.$routeParams = $routeParams;
+        }
+
+        function BookCntl($scope, $routeParams) {
+          $scope.name = "BookCntl";
+          $scope.params = $routeParams;
+        }
+
+        function ChapterCntl($scope, $routeParams) {
+          $scope.name = "ChapterCntl";
+          $scope.params = $routeParams;
+        }
+      </file>
+
+      <file name="scenario.js">
+        it('should load and compile correct template', function() {
+          element('a:contains("Moby: Ch1")').click();
+          var content = element('.doc-example-live [ng-view]').text();
+          expect(content).toMatch(/controller\: ChapterCntl/);
+          expect(content).toMatch(/Book Id\: Moby/);
+          expect(content).toMatch(/Chapter Id\: 1/);
+
+          element('a:contains("Scarlet")').click();
+          content = element('.doc-example-live [ng-view]').text();
+          expect(content).toMatch(/controller\: BookCntl/);
+          expect(content).toMatch(/Book Id\: Scarlet/);
+        });
+      </file>
+    </example>
+ */
+
+
+/**
+ * @ngdoc event
+ * @name ng.directive:ngView#$viewContentLoaded
+ * @eventOf ng.directive:ngView
+ * @eventType emit on the current ngView scope
+ * @description
+ * Emitted every time the ngView content is reloaded.
+ */
+var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$compile',
+                       '$controller',
+               function($http,   $templateCache,   $route,   $anchorScroll,   $compile,
+                        $controller) {
+  return {
+    restrict: 'ECA',
+    terminal: true,
+    link: function(scope, element, attr) {
+      var lastScope,
+          onloadExp = attr.onload || '';
+
+      scope.$on('$routeChangeSuccess', update);
+      update();
+
+
+      function destroyLastScope() {
+        if (lastScope) {
+          lastScope.$destroy();
+          lastScope = null;
+        }
+      }
+
+      function clearContent() {
+        element.html('');
+        destroyLastScope();
+      }
+
+      function update() {
+        var locals = $route.current && $route.current.locals,
+            template = locals && locals.$template;
+
+        if (template) {
+          element.html(template);
+          destroyLastScope();
+
+          var link = $compile(element.contents()),
+              current = $route.current,
+              controller;
+
+          lastScope = current.scope = scope.$new();
+          if (current.controller) {
+            locals.$scope = lastScope;
+            controller = $controller(current.controller, locals);
+            element.children().data('$ngControllerController', controller);
+          }
+
+          link(lastScope);
+          lastScope.$emit('$viewContentLoaded');
+          lastScope.$eval(onloadExp);
+
+          // $anchorScroll might listen on event...
+          $anchorScroll();
+        } else {
+          clearContent();
+        }
+      }
+    }
+  };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:script
+ *
+ * @description
+ * Load content of a script tag, with type `text/ng-template`, into `$templateCache`, so that the
+ * template can be used by `ngInclude`, `ngView` or directive templates.
+ *
+ * @restrict E
+ * @param {'text/ng-template'} type must be set to `'text/ng-template'`
+ *
+ * @example
+  <doc:example>
+    <doc:source>
+      <script type="text/ng-template" id="/tpl.html">
+        Content of the template.
+      </script>
+
+      <a ng-click="currentTpl='/tpl.html'" id="tpl-link">Load inlined template</a>
+      <div id="tpl-content" ng-include src="currentTpl"></div>
+    </doc:source>
+    <doc:scenario>
+      it('should load template defined inside script tag', function() {
+        element('#tpl-link').click();
+        expect(element('#tpl-content').text()).toMatch(/Content of the template/);
+      });
+    </doc:scenario>
+  </doc:example>
+ */
+var scriptDirective = ['$templateCache', function($templateCache) {
+  return {
+    restrict: 'E',
+    terminal: true,
+    compile: function(element, attr) {
+      if (attr.type == 'text/ng-template') {
+        var templateUrl = attr.id,
+            // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent
+            text = element[0].text;
+
+        $templateCache.put(templateUrl, text);
+      }
+    }
+  };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:select
+ * @restrict E
+ *
+ * @description
+ * HTML `SELECT` element with angular data-binding.
+ *
+ * # `ngOptions`
+ *
+ * Optionally `ngOptions` attribute can be used to dynamically generate a list of `<option>`
+ * elements for a `<select>` element using an array or an object obtained by evaluating the
+ * `ngOptions` expression.
+ *
+ * When an item in the `<select>` menu is selected, the value of array element or object property
+ * represented by the selected option will be bound to the model identified by the `ngModel`
+ * directive of the parent select element.
+ *
+ * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can
+ * be nested into the `<select>` element. This element will then represent `null` or "not selected"
+ * option. See example below for demonstration.
+ *
+ * Note: `ngOptions` provides iterator facility for `<option>` element which should be used instead
+ * of {@link ng.directive:ngRepeat ngRepeat} when you want the
+ * `select` model to be bound to a non-string value. This is because an option element can currently
+ * be bound to string values only.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required The control is considered valid only if value is entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ *    `required` when you want to data-bind to the `required` attribute.
+ * @param {comprehension_expression=} ngOptions in one of the following forms:
+ *
+ *   * for array data sources:
+ *     * `label` **`for`** `value` **`in`** `array`
+ *     * `select` **`as`** `label` **`for`** `value` **`in`** `array`
+ *     * `label`  **`group by`** `group` **`for`** `value` **`in`** `array`
+ *     * `select` **`as`** `label` **`group by`** `group` **`for`** `value` **`in`** `array`
+ *   * for object data sources:
+ *     * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
+ *     * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
+ *     * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`
+ *     * `select` **`as`** `label` **`group by`** `group`
+ *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`
+ *
+ * Where:
+ *
+ *   * `array` / `object`: an expression which evaluates to an array / object to iterate over.
+ *   * `value`: local variable which will refer to each item in the `array` or each property value
+ *      of `object` during iteration.
+ *   * `key`: local variable which will refer to a property name in `object` during iteration.
+ *   * `label`: The result of this expression will be the label for `<option>` element. The
+ *     `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).
+ *   * `select`: The result of this expression will be bound to the model of the parent `<select>`
+ *      element. If not specified, `select` expression will default to `value`.
+ *   * `group`: The result of this expression will be used to group options using the `<optgroup>`
+ *      DOM element.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+        <script>
+        function MyCntrl($scope) {
+          $scope.colors = [
+            {name:'black', shade:'dark'},
+            {name:'white', shade:'light'},
+            {name:'red', shade:'dark'},
+            {name:'blue', shade:'dark'},
+            {name:'yellow', shade:'light'}
+          ];
+          $scope.color = $scope.colors[2]; // red
+        }
+        </script>
+        <div ng-controller="MyCntrl">
+          <ul>
+            <li ng-repeat="color in colors">
+              Name: <input ng-model="color.name">
+              [<a href ng-click="colors.splice($index, 1)">X</a>]
+            </li>
+            <li>
+              [<a href ng-click="colors.push({})">add</a>]
+            </li>
+          </ul>
+          <hr/>
+          Color (null not allowed):
+          <select ng-model="color" ng-options="c.name for c in colors"></select><br>
+
+          Color (null allowed):
+          <span  class="nullable">
+            <select ng-model="color" ng-options="c.name for c in colors">
+              <option value="">-- chose color --</option>
+            </select>
+          </span><br/>
+
+          Color grouped by shade:
+          <select ng-model="color" ng-options="c.name group by c.shade for c in colors">
+          </select><br/>
+
+
+          Select <a href ng-click="color={name:'not in list'}">bogus</a>.<br>
+          <hr/>
+          Currently selected: {{ {selected_color:color}  }}
+          <div style="border:solid 1px black; height:20px"
+               ng-style="{'background-color':color.name}">
+          </div>
+        </div>
+      </doc:source>
+      <doc:scenario>
+         it('should check ng-options', function() {
+           expect(binding('{selected_color:color}')).toMatch('red');
+           select('color').option('0');
+           expect(binding('{selected_color:color}')).toMatch('black');
+           using('.nullable').select('color').option('');
+           expect(binding('{selected_color:color}')).toMatch('null');
+         });
+      </doc:scenario>
+    </doc:example>
+ */
+
+var ngOptionsDirective = valueFn({ terminal: true });
+var selectDirective = ['$compile', '$parse', function($compile,   $parse) {
+                         //0000111110000000000022220000000000000000000000333300000000000000444444444444444440000000005555555555555555500000006666666666666666600000000000000077770
+  var NG_OPTIONS_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w\d]*)|(?:\(\s*([\$\w][\$\w\d]*)\s*,\s*([\$\w][\$\w\d]*)\s*\)))\s+in\s+(.*)$/,
+      nullModelCtrl = {$setViewValue: noop};
+
+  return {
+    restrict: 'E',
+    require: ['select', '?ngModel'],
+    controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) {
+      var self = this,
+          optionsMap = {},
+          ngModelCtrl = nullModelCtrl,
+          nullOption,
+          unknownOption;
+
+
+      self.databound = $attrs.ngModel;
+
+
+      self.init = function(ngModelCtrl_, nullOption_, unknownOption_) {
+        ngModelCtrl = ngModelCtrl_;
+        nullOption = nullOption_;
+        unknownOption = unknownOption_;
+      }
+
+
+      self.addOption = function(value) {
+        optionsMap[value] = true;
+
+        if (ngModelCtrl.$viewValue == value) {
+          $element.val(value);
+          if (unknownOption.parent()) unknownOption.remove();
+        }
+      };
+
+
+      self.removeOption = function(value) {
+        if (this.hasOption(value)) {
+          delete optionsMap[value];
+          if (ngModelCtrl.$viewValue == value) {
+            this.renderUnknownOption(value);
+          }
+        }
+      };
+
+
+      self.renderUnknownOption = function(val) {
+        var unknownVal = '? ' + hashKey(val) + ' ?';
+        unknownOption.val(unknownVal);
+        $element.prepend(unknownOption);
+        $element.val(unknownVal);
+        unknownOption.prop('selected', true); // needed for IE
+      }
+
+
+      self.hasOption = function(value) {
+        return optionsMap.hasOwnProperty(value);
+      }
+
+      $scope.$on('$destroy', function() {
+        // disable unknown option so that we don't do work when the whole select is being destroyed
+        self.renderUnknownOption = noop;
+      });
+    }],
+
+    link: function(scope, element, attr, ctrls) {
+      // if ngModel is not defined, we don't need to do anything
+      if (!ctrls[1]) return;
+
+      var selectCtrl = ctrls[0],
+          ngModelCtrl = ctrls[1],
+          multiple = attr.multiple,
+          optionsExp = attr.ngOptions,
+          nullOption = false, // if false, user will not be able to select it (used by ngOptions)
+          emptyOption,
+          // we can't just jqLite('<option>') since jqLite is not smart enough
+          // to create it in <select> and IE barfs otherwise.
+          optionTemplate = jqLite(document.createElement('option')),
+          optGroupTemplate =jqLite(document.createElement('optgroup')),
+          unknownOption = optionTemplate.clone();
+
+      // find "null" option
+      for(var i = 0, children = element.children(), ii = children.length; i < ii; i++) {
+        if (children[i].value == '') {
+          emptyOption = nullOption = children.eq(i);
+          break;
+        }
+      }
+
+      selectCtrl.init(ngModelCtrl, nullOption, unknownOption);
+
+      // required validator
+      if (multiple && (attr.required || attr.ngRequired)) {
+        var requiredValidator = function(value) {
+          ngModelCtrl.$setValidity('required', !attr.required || (value && value.length));
+          return value;
+        };
+
+        ngModelCtrl.$parsers.push(requiredValidator);
+        ngModelCtrl.$formatters.unshift(requiredValidator);
+
+        attr.$observe('required', function() {
+          requiredValidator(ngModelCtrl.$viewValue);
+        });
+      }
+
+      if (optionsExp) Options(scope, element, ngModelCtrl);
+      else if (multiple) Multiple(scope, element, ngModelCtrl);
+      else Single(scope, element, ngModelCtrl, selectCtrl);
+
+
+      ////////////////////////////
+
+
+
+      function Single(scope, selectElement, ngModelCtrl, selectCtrl) {
+        ngModelCtrl.$render = function() {
+          var viewValue = ngModelCtrl.$viewValue;
+
+          if (selectCtrl.hasOption(viewValue)) {
+            if (unknownOption.parent()) unknownOption.remove();
+            selectElement.val(viewValue);
+            if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy
+          } else {
+            if (isUndefined(viewValue) && emptyOption) {
+              selectElement.val('');
+            } else {
+              selectCtrl.renderUnknownOption(viewValue);
+            }
+          }
+        };
+
+        selectElement.bind('change', function() {
+          scope.$apply(function() {
+            if (unknownOption.parent()) unknownOption.remove();
+            ngModelCtrl.$setViewValue(selectElement.val());
+          });
+        });
+      }
+
+      function Multiple(scope, selectElement, ctrl) {
+        var lastView;
+        ctrl.$render = function() {
+          var items = new HashMap(ctrl.$viewValue);
+          forEach(selectElement.find('option'), function(option) {
+            option.selected = isDefined(items.get(option.value));
+          });
+        };
+
+        // we have to do it on each watch since ngModel watches reference, but
+        // we need to work of an array, so we need to see if anything was inserted/removed
+        scope.$watch(function selectMultipleWatch() {
+          if (!equals(lastView, ctrl.$viewValue)) {
+            lastView = copy(ctrl.$viewValue);
+            ctrl.$render();
+          }
+        });
+
+        selectElement.bind('change', function() {
+          scope.$apply(function() {
+            var array = [];
+            forEach(selectElement.find('option'), function(option) {
+              if (option.selected) {
+                array.push(option.value);
+              }
+            });
+            ctrl.$setViewValue(array);
+          });
+        });
+      }
+
+      function Options(scope, selectElement, ctrl) {
+        var match;
+
+        if (! (match = optionsExp.match(NG_OPTIONS_REGEXP))) {
+          throw Error(
+            "Expected ngOptions in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" +
+            " but got '" + optionsExp + "'.");
+        }
+
+        var displayFn = $parse(match[2] || match[1]),
+            valueName = match[4] || match[6],
+            keyName = match[5],
+            groupByFn = $parse(match[3] || ''),
+            valueFn = $parse(match[2] ? match[1] : valueName),
+            valuesFn = $parse(match[7]),
+            // This is an array of array of existing option groups in DOM. We try to reuse these if possible
+            // optionGroupsCache[0] is the options with no option group
+            // optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element
+            optionGroupsCache = [[{element: selectElement, label:''}]];
+
+        if (nullOption) {
+          // compile the element since there might be bindings in it
+          $compile(nullOption)(scope);
+
+          // remove the class, which is added automatically because we recompile the element and it
+          // becomes the compilation root
+          nullOption.removeClass('ng-scope');
+
+          // we need to remove it before calling selectElement.html('') because otherwise IE will
+          // remove the label from the element. wtf?
+          nullOption.remove();
+        }
+
+        // clear contents, we'll add what's needed based on the model
+        selectElement.html('');
+
+        selectElement.bind('change', function() {
+          scope.$apply(function() {
+            var optionGroup,
+                collection = valuesFn(scope) || [],
+                locals = {},
+                key, value, optionElement, index, groupIndex, length, groupLength;
+
+            if (multiple) {
+              value = [];
+              for (groupIndex = 0, groupLength = optionGroupsCache.length;
+                   groupIndex < groupLength;
+                   groupIndex++) {
+                // list of options for that group. (first item has the parent)
+                optionGroup = optionGroupsCache[groupIndex];
+
+                for(index = 1, length = optionGroup.length; index < length; index++) {
+                  if ((optionElement = optionGroup[index].element)[0].selected) {
+                    key = optionElement.val();
+                    if (keyName) locals[keyName] = key;
+                    locals[valueName] = collection[key];
+                    value.push(valueFn(scope, locals));
+                  }
+                }
+              }
+            } else {
+              key = selectElement.val();
+              if (key == '?') {
+                value = undefined;
+              } else if (key == ''){
+                value = null;
+              } else {
+                locals[valueName] = collection[key];
+                if (keyName) locals[keyName] = key;
+                value = valueFn(scope, locals);
+              }
+            }
+            ctrl.$setViewValue(value);
+          });
+        });
+
+        ctrl.$render = render;
+
+        // TODO(vojta): can't we optimize this ?
+        scope.$watch(render);
+
+        function render() {
+          var optionGroups = {'':[]}, // Temporary location for the option groups before we render them
+              optionGroupNames = [''],
+              optionGroupName,
+              optionGroup,
+              option,
+              existingParent, existingOptions, existingOption,
+              modelValue = ctrl.$modelValue,
+              values = valuesFn(scope) || [],
+              keys = keyName ? sortedKeys(values) : values,
+              groupLength, length,
+              groupIndex, index,
+              locals = {},
+              selected,
+              selectedSet = false, // nothing is selected yet
+              lastElement,
+              element,
+              label;
+
+          if (multiple) {
+            selectedSet = new HashMap(modelValue);
+          }
+
+          // We now build up the list of options we need (we merge later)
+          for (index = 0; length = keys.length, index < length; index++) {
+               locals[valueName] = values[keyName ? locals[keyName]=keys[index]:index];
+               optionGroupName = groupByFn(scope, locals) || '';
+            if (!(optionGroup = optionGroups[optionGroupName])) {
+              optionGroup = optionGroups[optionGroupName] = [];
+              optionGroupNames.push(optionGroupName);
+            }
+            if (multiple) {
+              selected = selectedSet.remove(valueFn(scope, locals)) != undefined;
+            } else {
+              selected = modelValue === valueFn(scope, locals);
+              selectedSet = selectedSet || selected; // see if at least one item is selected
+            }
+            label = displayFn(scope, locals); // what will be seen by the user
+            label = label === undefined ? '' : label; // doing displayFn(scope, locals) || '' overwrites zero values
+            optionGroup.push({
+              id: keyName ? keys[index] : index,   // either the index into array or key from object
+              label: label,
+              selected: selected                   // determine if we should be selected
+            });
+          }
+          if (!multiple) {
+            if (nullOption || modelValue === null) {
+              // insert null option if we have a placeholder, or the model is null
+              optionGroups[''].unshift({id:'', label:'', selected:!selectedSet});
+            } else if (!selectedSet) {
+              // option could not be found, we have to insert the undefined item
+              optionGroups[''].unshift({id:'?', label:'', selected:true});
+            }
+          }
+
+          // Now we need to update the list of DOM nodes to match the optionGroups we computed above
+          for (groupIndex = 0, groupLength = optionGroupNames.length;
+               groupIndex < groupLength;
+               groupIndex++) {
+            // current option group name or '' if no group
+            optionGroupName = optionGroupNames[groupIndex];
+
+            // list of options for that group. (first item has the parent)
+            optionGroup = optionGroups[optionGroupName];
+
+            if (optionGroupsCache.length <= groupIndex) {
+              // we need to grow the optionGroups
+              existingParent = {
+                element: optGroupTemplate.clone().attr('label', optionGroupName),
+                label: optionGroup.label
+              };
+              existingOptions = [existingParent];
+              optionGroupsCache.push(existingOptions);
+              selectElement.append(existingParent.element);
+            } else {
+              existingOptions = optionGroupsCache[groupIndex];
+              existingParent = existingOptions[0];  // either SELECT (no group) or OPTGROUP element
+
+              // update the OPTGROUP label if not the same.
+              if (existingParent.label != optionGroupName) {
+                existingParent.element.attr('label', existingParent.label = optionGroupName);
+              }
+            }
+
+            lastElement = null;  // start at the beginning
+            for(index = 0, length = optionGroup.length; index < length; index++) {
+              option = optionGroup[index];
+              if ((existingOption = existingOptions[index+1])) {
+                // reuse elements
+                lastElement = existingOption.element;
+                if (existingOption.label !== option.label) {
+                  lastElement.text(existingOption.label = option.label);
+                }
+                if (existingOption.id !== option.id) {
+                  lastElement.val(existingOption.id = option.id);
+                }
+                // lastElement.prop('selected') provided by jQuery has side-effects
+                if (lastElement[0].selected !== option.selected) {
+                  lastElement.prop('selected', (existingOption.selected = option.selected));
+                }
+              } else {
+                // grow elements
+
+                // if it's a null option
+                if (option.id === '' && nullOption) {
+                  // put back the pre-compiled element
+                  element = nullOption;
+                } else {
+                  // jQuery(v1.4.2) Bug: We should be able to chain the method calls, but
+                  // in this version of jQuery on some browser the .text() returns a string
+                  // rather then the element.
+                  (element = optionTemplate.clone())
+                      .val(option.id)
+                      .attr('selected', option.selected)
+                      .text(option.label);
+                }
+
+                existingOptions.push(existingOption = {
+                    element: element,
+                    label: option.label,
+                    id: option.id,
+                    selected: option.selected
+                });
+                if (lastElement) {
+                  lastElement.after(element);
+                } else {
+                  existingParent.element.append(element);
+                }
+                lastElement = element;
+              }
+            }
+            // remove any excessive OPTIONs in a group
+            index++; // increment since the existingOptions[0] is parent element not OPTION
+            while(existingOptions.length > index) {
+              existingOptions.pop().element.remove();
+            }
+          }
+          // remove any excessive OPTGROUPs from select
+          while(optionGroupsCache.length > groupIndex) {
+            optionGroupsCache.pop()[0].element.remove();
+          }
+        }
+      }
+    }
+  }
+}];
+
+var optionDirective = ['$interpolate', function($interpolate) {
+  var nullSelectCtrl = {
+    addOption: noop,
+    removeOption: noop
+  };
+
+  return {
+    restrict: 'E',
+    priority: 100,
+    compile: function(element, attr) {
+      if (isUndefined(attr.value)) {
+        var interpolateFn = $interpolate(element.text(), true);
+        if (!interpolateFn) {
+          attr.$set('value', element.text());
+        }
+      }
+
+      return function (scope, element, attr) {
+        var selectCtrlName = '$selectController',
+            parent = element.parent(),
+            selectCtrl = parent.data(selectCtrlName) ||
+              parent.parent().data(selectCtrlName); // in case we are in optgroup
+
+        if (selectCtrl && selectCtrl.databound) {
+          // For some reason Opera defaults to true and if not overridden this messes up the repeater.
+          // We don't want the view to drive the initialization of the model anyway.
+          element.prop('selected', false);
+        } else {
+          selectCtrl = nullSelectCtrl;
+        }
+
+        if (interpolateFn) {
+          scope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal) {
+            attr.$set('value', newVal);
+            if (newVal !== oldVal) selectCtrl.removeOption(oldVal);
+            selectCtrl.addOption(newVal);
+          });
+        } else {
+          selectCtrl.addOption(attr.value);
+        }
+
+        element.bind('$destroy', function() {
+          selectCtrl.removeOption(attr.value);
+        });
+      };
+    }
+  }
+}];
+
+var styleDirective = valueFn({
+  restrict: 'E',
+  terminal: true
+});
+
+  //try to bind to jquery now so that one can write angular.element().read()
+  //but we will rebind on bootstrap again.
+  bindJQuery();
+
+  publishExternalAPI(angular);
+
+  jqLite(document).ready(function() {
+    angularInit(document, bootstrap);
+  });
+
+})(window, document);
+angular.element(document).find('head').append('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none !important;}ng\\:form{display:block;}</style>');
\ No newline at end of file
diff --git a/static/demo/components/angular/angular.min.js b/static/demo/components/angular/angular.min.js
new file mode 100755
index 0000000000000000000000000000000000000000..4ae11c86779422bd7be12e45e8477a64184d1339
--- /dev/null
+++ b/static/demo/components/angular/angular.min.js
@@ -0,0 +1,163 @@
+/*
+ AngularJS v1.0.8
+ (c) 2010-2012 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(P,T,q){'use strict';function m(b,a,c){var d;if(b)if(H(b))for(d in b)d!="prototype"&&d!="length"&&d!="name"&&b.hasOwnProperty(d)&&a.call(c,b[d],d);else if(b.forEach&&b.forEach!==m)b.forEach(a,c);else if(!b||typeof b.length!=="number"?0:typeof b.hasOwnProperty!="function"&&typeof b.constructor!="function"||b instanceof L||aa&&b instanceof aa||ma.call(b)!=="[object Object]"||typeof b.callee==="function")for(d=0;d<b.length;d++)a.call(c,b[d],d);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],
+d);return b}function nb(b){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c);return a.sort()}function hc(b,a,c){for(var d=nb(b),e=0;e<d.length;e++)a.call(c,b[d[e]],d[e]);return d}function ob(b){return function(a,c){b(c,a)}}function xa(){for(var b=Z.length,a;b;){b--;a=Z[b].charCodeAt(0);if(a==57)return Z[b]="A",Z.join("");if(a==90)Z[b]="0";else return Z[b]=String.fromCharCode(a+1),Z.join("")}Z.unshift("0");return Z.join("")}function pb(b,a){a?b.$$hashKey=a:delete b.$$hashKey}function D(b){var a=
+b.$$hashKey;m(arguments,function(a){a!==b&&m(a,function(a,c){b[c]=a})});pb(b,a);return b}function G(b){return parseInt(b,10)}function ya(b,a){return D(new (D(function(){},{prototype:b})),a)}function s(){}function na(b){return b}function I(b){return function(){return b}}function u(b){return typeof b=="undefined"}function v(b){return typeof b!="undefined"}function M(b){return b!=null&&typeof b=="object"}function B(b){return typeof b=="string"}function Ra(b){return typeof b=="number"}function oa(b){return ma.apply(b)==
+"[object Date]"}function E(b){return ma.apply(b)=="[object Array]"}function H(b){return typeof b=="function"}function Sa(b){return ma.apply(b)=="[object RegExp]"}function pa(b){return b&&b.document&&b.location&&b.alert&&b.setInterval}function ic(b){return b&&(b.nodeName||b.bind&&b.find)}function Ta(b,a,c){var d=[];m(b,function(b,g,h){d.push(a.call(c,b,g,h))});return d}function za(b,a){if(b.indexOf)return b.indexOf(a);for(var c=0;c<b.length;c++)if(a===b[c])return c;return-1}function Ua(b,a){var c=
+za(b,a);c>=0&&b.splice(c,1);return a}function U(b,a){if(pa(b)||b&&b.$evalAsync&&b.$watch)throw Error("Can't copy Window or Scope");if(a){if(b===a)throw Error("Can't copy equivalent objects or arrays");if(E(b))for(var c=a.length=0;c<b.length;c++)a.push(U(b[c]));else{c=a.$$hashKey;m(a,function(b,c){delete a[c]});for(var d in b)a[d]=U(b[d]);pb(a,c)}}else(a=b)&&(E(b)?a=U(b,[]):oa(b)?a=new Date(b.getTime()):Sa(b)?a=RegExp(b.source):M(b)&&(a=U(b,{})));return a}function jc(b,a){var a=a||{},c;for(c in b)b.hasOwnProperty(c)&&
+c.substr(0,2)!=="$$"&&(a[c]=b[c]);return a}function ea(b,a){if(b===a)return!0;if(b===null||a===null)return!1;if(b!==b&&a!==a)return!0;var c=typeof b,d;if(c==typeof a&&c=="object")if(E(b)){if(!E(a))return!1;if((c=b.length)==a.length){for(d=0;d<c;d++)if(!ea(b[d],a[d]))return!1;return!0}}else if(oa(b))return oa(a)&&b.getTime()==a.getTime();else if(Sa(b)&&Sa(a))return b.toString()==a.toString();else{if(b&&b.$evalAsync&&b.$watch||a&&a.$evalAsync&&a.$watch||pa(b)||pa(a)||E(a))return!1;c={};for(d in b)if(!(d.charAt(0)===
+"$"||H(b[d]))){if(!ea(b[d],a[d]))return!1;c[d]=!0}for(d in a)if(!c[d]&&d.charAt(0)!=="$"&&a[d]!==q&&!H(a[d]))return!1;return!0}return!1}function Va(b,a){var c=arguments.length>2?ha.call(arguments,2):[];return H(a)&&!(a instanceof RegExp)?c.length?function(){return arguments.length?a.apply(b,c.concat(ha.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}:a}function kc(b,a){var c=a;/^\$+/.test(b)?c=q:pa(a)?c="$WINDOW":a&&T===a?c="$DOCUMENT":a&&a.$evalAsync&&
+a.$watch&&(c="$SCOPE");return c}function ba(b,a){return typeof b==="undefined"?q:JSON.stringify(b,kc,a?"  ":null)}function qb(b){return B(b)?JSON.parse(b):b}function Wa(b){b&&b.length!==0?(b=y(""+b),b=!(b=="f"||b=="0"||b=="false"||b=="no"||b=="n"||b=="[]")):b=!1;return b}function qa(b){b=w(b).clone();try{b.html("")}catch(a){}var c=w("<div>").append(b).html();try{return b[0].nodeType===3?y(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+y(b)})}catch(d){return y(c)}}function rb(b){try{return decodeURIComponent(b)}catch(a){}}
+function Xa(b){var a={},c,d;m((b||"").split("&"),function(b){b&&(c=b.split("="),d=rb(c[0]),v(d)&&(a[d]=v(c[1])?rb(c[1]):!0))});return a}function sb(b){var a=[];m(b,function(b,d){a.push(Ya(d,!0)+(b===!0?"":"="+Ya(b,!0)))});return a.length?a.join("&"):""}function Za(b){return Ya(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Ya(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}
+function lc(b,a){function c(a){a&&d.push(a)}var d=[b],e,g,h=["ng:app","ng-app","x-ng-app","data-ng-app"],f=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;m(h,function(a){h[a]=!0;c(T.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(m(b.querySelectorAll("."+a),c),m(b.querySelectorAll("."+a+"\\:"),c),m(b.querySelectorAll("["+a+"]"),c))});m(d,function(a){if(!e){var b=f.exec(" "+a.className+" ");b?(e=a,g=(b[2]||"").replace(/\s+/g,",")):m(a.attributes,function(b){if(!e&&h[b.name])e=a,g=b.value})}});
+e&&a(e,g?[g]:[])}function tb(b,a){var c=function(){b=w(b);a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");var c=ub(a);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(P&&!d.test(P.name))return c();P.name=P.name.replace(d,"");$a.resumeBootstrap=function(b){m(b,function(b){a.push(b)});c()}}function ab(b,a){a=a||"_";return b.replace(mc,function(b,
+d){return(d?a:"")+b.toLowerCase()})}function bb(b,a,c){if(!b)throw Error("Argument '"+(a||"?")+"' is "+(c||"required"));return b}function ra(b,a,c){c&&E(b)&&(b=b[b.length-1]);bb(H(b),a,"not a function, got "+(b&&typeof b=="object"?b.constructor.name||"Object":typeof b));return b}function cb(b,a,c){if(!a)return b;for(var a=a.split("."),d,e=b,g=a.length,h=0;h<g;h++)d=a[h],b&&(b=(e=b)[d]);return!c&&H(b)?Va(e,b):b}function nc(b){function a(a,b,e){return a[b]||(a[b]=e())}return a(a(b,"angular",Object),
+"module",function(){var b={};return function(d,e,g){e&&b.hasOwnProperty(d)&&(b[d]=null);return a(b,d,function(){function a(c,d,e){return function(){b[e||"push"]([c,d,arguments]);return k}}if(!e)throw Error("No module: "+d);var b=[],c=[],j=a("$injector","invoke"),k={_invokeQueue:b,_runBlocks:c,requires:e,name:d,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),filter:a("$filterProvider",
+"register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:j,run:function(a){c.push(a);return this}};g&&j(g);return k})}})}function vb(b){return b.replace(oc,function(a,b,d,e){return e?d.toUpperCase():d}).replace(pc,"Moz$1")}function db(b,a,c,d){function e(b){var f;var e=c&&b?[this.filter(b)]:[this],i=a,j,k,l,n,o,p;if(!d||b!=null)for(;e.length;){j=e.shift();k=0;for(l=j.length;k<l;k++){n=w(j[k]);i?n.triggerHandler("$destroy"):i=!i;o=0;for(f=(p=n.children()).length,
+n=f;o<n;o++)e.push(aa(p[o]))}}return g.apply(this,arguments)}var g=aa.fn[b],g=g.$original||g;e.$original=g;aa.fn[b]=e}function L(b){if(b instanceof L)return b;if(!(this instanceof L)){if(B(b)&&b.charAt(0)!="<")throw Error("selectors not implemented");return new L(b)}if(B(b)){var a=T.createElement("div");a.innerHTML="<div>&#160;</div>"+b;a.removeChild(a.firstChild);eb(this,a.childNodes);this.remove()}else eb(this,b)}function fb(b){return b.cloneNode(!0)}function sa(b){wb(b);for(var a=0,b=b.childNodes||
+[];a<b.length;a++)sa(b[a])}function xb(b,a,c){var d=$(b,"events");$(b,"handle")&&(u(a)?m(d,function(a,c){gb(b,c,a);delete d[c]}):u(c)?(gb(b,a,d[a]),delete d[a]):Ua(d[a]||[],c))}function wb(b){var a=b[Aa],c=Ba[a];c&&(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),xb(b)),delete Ba[a],b[Aa]=q)}function $(b,a,c){var d=b[Aa],d=Ba[d||-1];if(v(c))d||(b[Aa]=d=++qc,d=Ba[d]={}),d[a]=c;else return d&&d[a]}function yb(b,a,c){var d=$(b,"data"),e=v(c),g=!e&&v(a),h=g&&!M(a);!d&&!h&&$(b,"data",d={});if(e)d[a]=
+c;else if(g)if(h)return d&&d[a];else D(d,a);else return d}function Ca(b,a){return(" "+b.className+" ").replace(/[\n\t]/g," ").indexOf(" "+a+" ")>-1}function zb(b,a){a&&m(a.split(" "),function(a){b.className=S((" "+b.className+" ").replace(/[\n\t]/g," ").replace(" "+S(a)+" "," "))})}function Ab(b,a){a&&m(a.split(" "),function(a){if(!Ca(b,a))b.className=S(b.className+" "+S(a))})}function eb(b,a){if(a)for(var a=!a.nodeName&&v(a.length)&&!pa(a)?a:[a],c=0;c<a.length;c++)b.push(a[c])}function Bb(b,a){return Da(b,
+"$"+(a||"ngController")+"Controller")}function Da(b,a,c){b=w(b);for(b[0].nodeType==9&&(b=b.find("html"));b.length;){if(c=b.data(a))return c;b=b.parent()}}function Cb(b,a){var c=Ea[a.toLowerCase()];return c&&Db[b.nodeName]&&c}function rc(b,a){var c=function(c,e){if(!c.preventDefault)c.preventDefault=function(){c.returnValue=!1};if(!c.stopPropagation)c.stopPropagation=function(){c.cancelBubble=!0};if(!c.target)c.target=c.srcElement||T;if(u(c.defaultPrevented)){var g=c.preventDefault;c.preventDefault=
+function(){c.defaultPrevented=!0;g.call(c)};c.defaultPrevented=!1}c.isDefaultPrevented=function(){return c.defaultPrevented};m(a[e||c.type],function(a){a.call(b,c)});V<=8?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function fa(b){var a=typeof b,c;if(a=="object"&&b!==null)if(typeof(c=b.$$hashKey)=="function")c=b.$$hashKey();else{if(c===q)c=b.$$hashKey=xa()}else c=b;return a+
+":"+c}function Fa(b){m(b,this.put,this)}function hb(){}function Eb(b){var a,c;if(typeof b=="function"){if(!(a=b.$inject))a=[],c=b.toString().replace(sc,""),c=c.match(tc),m(c[1].split(uc),function(b){b.replace(vc,function(b,c,d){a.push(d)})}),b.$inject=a}else E(b)?(c=b.length-1,ra(b[c],"fn"),a=b.slice(0,c)):ra(b,"fn",!0);return a}function ub(b){function a(a){return function(b,c){if(M(b))m(b,ob(a));else return a(b,c)}}function c(a,b){if(H(b)||E(b))b=l.instantiate(b);if(!b.$get)throw Error("Provider "+
+a+" must define $get factory method.");return k[a+f]=b}function d(a,b){return c(a,{$get:b})}function e(a){var b=[];m(a,function(a){if(!j.get(a))if(j.put(a,!0),B(a)){var c=ta(a);b=b.concat(e(c.requires)).concat(c._runBlocks);try{for(var d=c._invokeQueue,c=0,f=d.length;c<f;c++){var g=d[c],p=g[0]=="$injector"?l:l.get(g[0]);p[g[1]].apply(p,g[2])}}catch(h){throw h.message&&(h.message+=" from "+a),h;}}else if(H(a))try{b.push(l.invoke(a))}catch(i){throw i.message&&(i.message+=" from "+a),i;}else if(E(a))try{b.push(l.invoke(a))}catch(o){throw o.message&&
+(o.message+=" from "+String(a[a.length-1])),o;}else ra(a,"module")});return b}function g(a,b){function c(d){if(typeof d!=="string")throw Error("Service name expected");if(a.hasOwnProperty(d)){if(a[d]===h)throw Error("Circular dependency: "+i.join(" <- "));return a[d]}else try{return i.unshift(d),a[d]=h,a[d]=b(d)}finally{i.shift()}}function d(a,b,e){var f=[],j=Eb(a),g,h,p;h=0;for(g=j.length;h<g;h++)p=j[h],f.push(e&&e.hasOwnProperty(p)?e[p]:c(p));a.$inject||(a=a[g]);switch(b?-1:f.length){case 0:return a();
+case 1:return a(f[0]);case 2:return a(f[0],f[1]);case 3:return a(f[0],f[1],f[2]);case 4:return a(f[0],f[1],f[2],f[3]);case 5:return a(f[0],f[1],f[2],f[3],f[4]);case 6:return a(f[0],f[1],f[2],f[3],f[4],f[5]);case 7:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6]);case 8:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7]);case 9:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8]);case 10:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9]);default:return a.apply(b,f)}}return{invoke:d,instantiate:function(a,
+b){var c=function(){},e;c.prototype=(E(a)?a[a.length-1]:a).prototype;c=new c;e=d(a,c,b);return M(e)?e:c},get:c,annotate:Eb}}var h={},f="Provider",i=[],j=new Fa,k={$provide:{provider:a(c),factory:a(d),service:a(function(a,b){return d(a,["$injector",function(a){return a.instantiate(b)}])}),value:a(function(a,b){return d(a,I(b))}),constant:a(function(a,b){k[a]=b;n[a]=b}),decorator:function(a,b){var c=l.get(a+f),d=c.$get;c.$get=function(){var a=o.invoke(d,c);return o.invoke(b,null,{$delegate:a})}}}},
+l=g(k,function(){throw Error("Unknown provider: "+i.join(" <- "));}),n={},o=n.$injector=g(n,function(a){a=l.get(a+f);return o.invoke(a.$get,a)});m(e(b),function(a){o.invoke(a||s)});return o}function wc(){var b=!0;this.disableAutoScrolling=function(){b=!1};this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;m(a,function(a){!b&&y(a.nodeName)==="a"&&(b=a)});return b}function g(){var b=c.hash(),d;b?(d=h.getElementById(b))?d.scrollIntoView():(d=e(h.getElementsByName(b)))?
+d.scrollIntoView():b==="top"&&a.scrollTo(0,0):a.scrollTo(0,0)}var h=a.document;b&&d.$watch(function(){return c.hash()},function(){d.$evalAsync(g)});return g}]}function xc(b,a,c,d){function e(a){try{a.apply(null,ha.call(arguments,1))}finally{if(p--,p===0)for(;z.length;)try{z.pop()()}catch(b){c.error(b)}}}function g(a,b){(function yc(){m(r,function(a){a()});x=b(yc,a)})()}function h(){N!=f.url()&&(N=f.url(),m(K,function(a){a(f.url())}))}var f=this,i=a[0],j=b.location,k=b.history,l=b.setTimeout,n=b.clearTimeout,
+o={};f.isMock=!1;var p=0,z=[];f.$$completeOutstandingRequest=e;f.$$incOutstandingRequestCount=function(){p++};f.notifyWhenNoOutstandingRequests=function(a){m(r,function(a){a()});p===0?a():z.push(a)};var r=[],x;f.addPollFn=function(a){u(x)&&g(100,l);r.push(a);return a};var N=j.href,A=a.find("base"),J=null;f.url=function(a,b){if(a){if(N!=a)return N=a,d.history?b?k.replaceState(null,"",a):(k.pushState(null,"",a),A.attr("href",A.attr("href"))):b?(j.replace(a),J=a):(j.href=a,J=null),f}else return J||j.href.replace(/%27/g,
+"'")};var K=[],C=!1;f.onUrlChange=function(a){C||(d.history&&w(b).bind("popstate",h),d.hashchange?w(b).bind("hashchange",h):f.addPollFn(h),C=!0);K.push(a);return a};f.baseHref=function(){var a=A.attr("href");return a?a.replace(/^https?\:\/\/[^\/]*/,""):""};var ga={},Q="",t=f.baseHref();f.cookies=function(a,b){var d,e,f,j;if(a)if(b===q)i.cookie=escape(a)+"=;path="+t+";expires=Thu, 01 Jan 1970 00:00:00 GMT";else{if(B(b))d=(i.cookie=escape(a)+"="+escape(b)+";path="+t).length+1,d>4096&&c.warn("Cookie '"+
+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!")}else{if(i.cookie!==Q){Q=i.cookie;d=Q.split("; ");ga={};for(f=0;f<d.length;f++)e=d[f],j=e.indexOf("="),j>0&&(a=unescape(e.substring(0,j)),ga[a]===q&&(ga[a]=unescape(e.substring(j+1))))}return ga}};f.defer=function(a,b){var c;p++;c=l(function(){delete o[c];e(a)},b||0);o[c]=!0;return c};f.defer.cancel=function(a){return o[a]?(delete o[a],n(a),e(s),!0):!1}}function zc(){this.$get=["$window","$log","$sniffer","$document",
+function(b,a,c,d){return new xc(b,d,a,c)}]}function Ac(){this.$get=function(){function b(b,d){function e(a){if(a!=l){if(n){if(n==a)n=a.n}else n=a;g(a.n,a.p);g(a,l);l=a;l.n=null}}function g(a,b){if(a!=b){if(a)a.p=b;if(b)b.n=a}}if(b in a)throw Error("cacheId "+b+" taken");var h=0,f=D({},d,{id:b}),i={},j=d&&d.capacity||Number.MAX_VALUE,k={},l=null,n=null;return a[b]={put:function(a,b){var c=k[a]||(k[a]={key:a});e(c);u(b)||(a in i||h++,i[a]=b,h>j&&this.remove(n.key))},get:function(a){var b=k[a];if(b)return e(b),
+i[a]},remove:function(a){var b=k[a];if(b){if(b==l)l=b.p;if(b==n)n=b.n;g(b.n,b.p);delete k[a];delete i[a];h--}},removeAll:function(){i={};h=0;k={};l=n=null},destroy:function(){k=f=i=null;delete a[b]},info:function(){return D({},f,{size:h})}}}var a={};b.info=function(){var b={};m(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function Bc(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function Fb(b){var a={},c="Directive",d=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,
+e=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,g="Template must have exactly one root element. was: ",h=/^\s*(https?|ftp|mailto|file):/;this.directive=function i(d,e){B(d)?(bb(e,"directive"),a.hasOwnProperty(d)||(a[d]=[],b.factory(d+c,["$injector","$exceptionHandler",function(b,c){var e=[];m(a[d],function(a){try{var g=b.invoke(a);if(H(g))g={compile:I(g)};else if(!g.compile&&g.link)g.compile=I(g.link);g.priority=g.priority||0;g.name=g.name||d;g.require=g.require||g.controller&&g.name;g.restrict=g.restrict||"A";
+e.push(g)}catch(h){c(h)}});return e}])),a[d].push(e)):m(d,ob(i));return this};this.urlSanitizationWhitelist=function(a){return v(a)?(h=a,this):h};this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document",function(b,j,k,l,n,o,p,z,r){function x(a,b,c){a instanceof w||(a=w(a));m(a,function(b,c){b.nodeType==3&&b.nodeValue.match(/\S+/)&&(a[c]=w(b).wrap("<span></span>").parent()[0])});var d=A(a,b,a,c);return function(b,c){bb(b,"scope");
+for(var e=c?va.clone.call(a):a,g=0,j=e.length;g<j;g++){var h=e[g];(h.nodeType==1||h.nodeType==9)&&e.eq(g).data("$scope",b)}N(e,"ng-scope");c&&c(e,b);d&&d(b,e,e);return e}}function N(a,b){try{a.addClass(b)}catch(c){}}function A(a,b,c,d){function e(a,c,d,j){var h,i,k,p,o,l,n,r=[];o=0;for(l=c.length;o<l;o++)r.push(c[o]);n=o=0;for(l=g.length;o<l;n++)i=r[n],c=g[o++],h=g[o++],c?(c.scope?(k=a.$new(M(c.scope)),w(i).data("$scope",k)):k=a,(p=c.transclude)||!j&&b?c(h,k,i,d,function(b){return function(c){var d=
+a.$new();d.$$transcluded=!0;return b(d,c).bind("$destroy",Va(d,d.$destroy))}}(p||b)):c(h,k,i,q,j)):h&&h(a,i.childNodes,q,j)}for(var g=[],j,h,i,k=0;k<a.length;k++)h=new ia,j=J(a[k],[],h,d),h=(j=j.length?K(j,a[k],h,b,c):null)&&j.terminal||!a[k].childNodes||!a[k].childNodes.length?null:A(a[k].childNodes,j?j.transclude:b),g.push(j),g.push(h),i=i||j||h;return i?e:null}function J(a,b,c,g){var j=c.$attr,h;switch(a.nodeType){case 1:C(b,ca(Ga(a).toLowerCase()),"E",g);var i,k,o;h=a.attributes;for(var p=0,l=
+h&&h.length;p<l;p++)if(i=h[p],!V||V>=8||i.specified)k=i.name,o=ca(k.toLowerCase()),j[o]=k,c[o]=i=S(V&&k=="href"?decodeURIComponent(a.getAttribute(k,2)):i.value),Cb(a,o)&&(c[o]=!0),R(a,b,i,o),C(b,o,"A",g);a=a.className;if(B(a)&&a!=="")for(;h=e.exec(a);)o=ca(h[2]),C(b,o,"C",g)&&(c[o]=S(h[3])),a=a.substr(h.index+h[0].length);break;case 3:Y(b,a.nodeValue);break;case 8:try{if(h=d.exec(a.nodeValue))o=ca(h[1]),C(b,o,"M",g)&&(c[o]=S(h[2]))}catch(n){}}b.sort(t);return b}function K(a,b,c,d,e){function j(a,
+b){if(a)a.require=t.require,n.push(a);if(b)b.require=t.require,r.push(b)}function h(a,b){var c,d="data",e=!1;if(B(a)){for(;(c=a.charAt(0))=="^"||c=="?";)a=a.substr(1),c=="^"&&(d="inheritedData"),e=e||c=="?";c=b[d]("$"+a+"Controller");if(!c&&!e)throw Error("No controller: "+a);}else E(a)&&(c=[],m(a,function(a){c.push(h(a,b))}));return c}function i(a,d,e,g,j){var l,z,t,F,N;l=b===e?c:jc(c,new ia(w(e),c.$attr));z=l.$$element;if(K){var Cc=/^\s*([@=&])\s*(\w*)\s*$/,x=d.$parent||d;m(K.scope,function(a,b){var c=
+a.match(Cc)||[],e=c[2]||b,c=c[1],g,j,h;d.$$isolateBindings[b]=c+e;switch(c){case "@":l.$observe(e,function(a){d[b]=a});l.$$observers[e].$$scope=x;break;case "=":j=o(l[e]);h=j.assign||function(){g=d[b]=j(x);throw Error(Gb+l[e]+" (directive: "+K.name+")");};g=d[b]=j(x);d.$watch(function(){var a=j(x);a!==d[b]&&(a!==g?g=d[b]=a:h(x,a=g=d[b]));return a});break;case "&":j=o(l[e]);d[b]=function(a){return j(x,a)};break;default:throw Error("Invalid isolate scope definition for directive "+K.name+": "+a);}})}Y&&
+m(Y,function(a){var b={$scope:d,$element:z,$attrs:l,$transclude:j};N=a.controller;N=="@"&&(N=l[a.name]);z.data("$"+a.name+"Controller",p(N,b))});g=0;for(t=n.length;g<t;g++)try{F=n[g],F(d,z,l,F.require&&h(F.require,z))}catch(A){k(A,qa(z))}a&&a(d,e.childNodes,q,j);g=0;for(t=r.length;g<t;g++)try{F=r[g],F(d,z,l,F.require&&h(F.require,z))}catch(Dc){k(Dc,qa(z))}}for(var l=-Number.MAX_VALUE,n=[],r=[],z=null,K=null,A=null,F=c.$$element=w(b),t,C,R,ja,da=d,Y,s,u,D=0,y=a.length;D<y;D++){t=a[D];R=q;if(l>t.priority)break;
+if(u=t.scope)ua("isolated scope",K,t,F),M(u)&&(N(F,"ng-isolate-scope"),K=t),N(F,"ng-scope"),z=z||t;C=t.name;if(u=t.controller)Y=Y||{},ua("'"+C+"' controller",Y[C],t,F),Y[C]=t;if(u=t.transclude)ua("transclusion",ja,t,F),ja=t,l=t.priority,u=="element"?(R=w(b),F=c.$$element=w(T.createComment(" "+C+": "+c[C]+" ")),b=F[0],v(e,w(R[0]),b),da=x(R,d,l)):(R=w(fb(b)).contents(),F.html(""),da=x(R,d));if(u=t.template)if(ua("template",A,t,F),A=t,u=Hb(u),t.replace){R=w("<div>"+S(u)+"</div>").contents();b=R[0];if(R.length!=
+1||b.nodeType!==1)throw Error(g+u);v(e,F,b);C={$attr:{}};a=a.concat(J(b,a.splice(D+1,a.length-(D+1)),C));ga(c,C);y=a.length}else F.html(u);if(t.templateUrl)ua("template",A,t,F),A=t,i=Q(a.splice(D,a.length-D),i,F,c,e,t.replace,da),y=a.length;else if(t.compile)try{s=t.compile(F,c,da),H(s)?j(null,s):s&&j(s.pre,s.post)}catch(G){k(G,qa(F))}if(t.terminal)i.terminal=!0,l=Math.max(l,t.priority)}i.scope=z&&z.scope;i.transclude=ja&&da;return i}function C(d,e,g,j){var h=!1;if(a.hasOwnProperty(e))for(var o,e=
+b.get(e+c),l=0,p=e.length;l<p;l++)try{if(o=e[l],(j===q||j>o.priority)&&o.restrict.indexOf(g)!=-1)d.push(o),h=!0}catch(n){k(n)}return h}function ga(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;m(a,function(d,e){e.charAt(0)!="$"&&(b[e]&&(d+=(e==="style"?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});m(b,function(b,g){g=="class"?(N(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):g=="style"?e.attr("style",e.attr("style")+";"+b):g.charAt(0)!="$"&&!a.hasOwnProperty(g)&&(a[g]=b,d[g]=c[g])})}function Q(a,b,c,d,e,
+j,h){var i=[],k,o,p=c[0],r=a.shift(),z=D({},r,{controller:null,templateUrl:null,transclude:null,scope:null});c.html("");l.get(r.templateUrl,{cache:n}).success(function(l){var n,r,l=Hb(l);if(j){r=w("<div>"+S(l)+"</div>").contents();n=r[0];if(r.length!=1||n.nodeType!==1)throw Error(g+l);l={$attr:{}};v(e,c,n);J(n,a,l);ga(d,l)}else n=p,c.html(l);a.unshift(z);k=K(a,n,d,h);for(o=A(c[0].childNodes,h);i.length;){var ia=i.pop(),l=i.pop();r=i.pop();var F=i.pop(),t=n;r!==p&&(t=fb(n),v(l,w(r),t));k(function(){b(o,
+F,t,e,ia)},F,t,e,ia)}i=null}).error(function(a,b,c,d){throw Error("Failed to load template: "+d.url);});return function(a,c,d,e,g){i?(i.push(c),i.push(d),i.push(e),i.push(g)):k(function(){b(o,c,d,e,g)},c,d,e,g)}}function t(a,b){return b.priority-a.priority}function ua(a,b,c,d){if(b)throw Error("Multiple directives ["+b.name+", "+c.name+"] asking for "+a+" on: "+qa(d));}function Y(a,b){var c=j(b,!0);c&&a.push({priority:0,compile:I(function(a,b){var d=b.parent(),e=d.data("$binding")||[];e.push(c);N(d.data("$binding",
+e),"ng-binding");a.$watch(c,function(a){b[0].nodeValue=a})})})}function R(a,b,c,d){var e=j(c,!0);e&&b.push({priority:100,compile:I(function(a,b,c){b=c.$$observers||(c.$$observers={});d==="class"&&(e=j(c[d],!0));c[d]=q;(b[d]||(b[d]=[])).$$inter=!0;(c.$$observers&&c.$$observers[d].$$scope||a).$watch(e,function(a){c.$set(d,a)})})})}function v(a,b,c){var d=b[0],e=d.parentNode,g,j;if(a){g=0;for(j=a.length;g<j;g++)if(a[g]==d){a[g]=c;break}}e&&e.replaceChild(c,d);c[w.expando]=d[w.expando];b[0]=c}var ia=
+function(a,b){this.$$element=a;this.$attr=b||{}};ia.prototype={$normalize:ca,$set:function(a,b,c,d){var e=Cb(this.$$element[0],a),g=this.$$observers;e&&(this.$$element.prop(a,b),d=e);this[a]=b;d?this.$attr[a]=d:(d=this.$attr[a])||(this.$attr[a]=d=ab(a,"-"));if(Ga(this.$$element[0])==="A"&&a==="href")F.setAttribute("href",b),e=F.href,e!==""&&!e.match(h)&&(this[a]=b="unsafe:"+e);c!==!1&&(b===null||b===q?this.$$element.removeAttr(d):this.$$element.attr(d,b));g&&m(g[a],function(a){try{a(b)}catch(c){k(c)}})},
+$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers={}),e=d[a]||(d[a]=[]);e.push(b);z.$evalAsync(function(){e.$$inter||b(c[a])});return b}};var F=r[0].createElement("a"),ja=j.startSymbol(),da=j.endSymbol(),Hb=ja=="{{"||da=="}}"?na:function(a){return a.replace(/\{\{/g,ja).replace(/}}/g,da)};return x}]}function ca(b){return vb(b.replace(Ec,""))}function Fc(){var b={};this.register=function(a,c){M(a)?D(b,a):b[a]=c};this.$get=["$injector","$window",function(a,c){return function(d,e){if(B(d)){var g=
+d,d=b.hasOwnProperty(g)?b[g]:cb(e.$scope,g,!0)||cb(c,g,!0);ra(d,g,!0)}return a.instantiate(d,e)}}]}function Gc(){this.$get=["$window",function(b){return w(b.document)}]}function Hc(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function Ic(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=["$parse",function(c){function d(d,f){for(var i,j,k=0,l=[],n=d.length,o=!1,p=[];k<n;)(i=d.indexOf(b,
+k))!=-1&&(j=d.indexOf(a,i+e))!=-1?(k!=i&&l.push(d.substring(k,i)),l.push(k=c(o=d.substring(i+e,j))),k.exp=o,k=j+g,o=!0):(k!=n&&l.push(d.substring(k)),k=n);if(!(n=l.length))l.push(""),n=1;if(!f||o)return p.length=n,k=function(a){for(var b=0,c=n,d;b<c;b++){if(typeof(d=l[b])=="function")d=d(a),d==null||d==q?d="":typeof d!="string"&&(d=ba(d));p[b]=d}return p.join("")},k.exp=d,k.parts=l,k}var e=b.length,g=a.length;d.startSymbol=function(){return b};d.endSymbol=function(){return a};return d}]}function Ib(b){for(var b=
+b.split("/"),a=b.length;a--;)b[a]=Za(b[a]);return b.join("/")}function wa(b,a){var c=Jb.exec(b),c={protocol:c[1],host:c[3],port:G(c[5])||Kb[c[1]]||null,path:c[6]||"/",search:c[8],hash:c[10]};if(a)a.$$protocol=c.protocol,a.$$host=c.host,a.$$port=c.port;return c}function ka(b,a,c){return b+"://"+a+(c==Kb[b]?"":":"+c)}function Jc(b,a,c){var d=wa(b);return decodeURIComponent(d.path)!=a||u(d.hash)||d.hash.indexOf(c)!==0?b:ka(d.protocol,d.host,d.port)+a.substr(0,a.lastIndexOf("/"))+d.hash.substr(c.length)}
+function Kc(b,a,c){var d=wa(b);if(decodeURIComponent(d.path)==a&&!u(d.hash)&&d.hash.indexOf(c)===0)return b;else{var e=d.search&&"?"+d.search||"",g=d.hash&&"#"+d.hash||"",h=a.substr(0,a.lastIndexOf("/")),f=d.path.substr(h.length);if(d.path.indexOf(h)!==0)throw Error('Invalid url "'+b+'", missing path prefix "'+h+'" !');return ka(d.protocol,d.host,d.port)+a+"#"+c+f+e+g}}function ib(b,a,c){a=a||"";this.$$parse=function(b){var c=wa(b,this);if(c.path.indexOf(a)!==0)throw Error('Invalid url "'+b+'", missing path prefix "'+
+a+'" !');this.$$path=decodeURIComponent(c.path.substr(a.length));this.$$search=Xa(c.search);this.$$hash=c.hash&&decodeURIComponent(c.hash)||"";this.$$compose()};this.$$compose=function(){var b=sb(this.$$search),c=this.$$hash?"#"+Za(this.$$hash):"";this.$$url=Ib(this.$$path)+(b?"?"+b:"")+c;this.$$absUrl=ka(this.$$protocol,this.$$host,this.$$port)+a+this.$$url};this.$$rewriteAppUrl=function(a){if(a.indexOf(c)==0)return a};this.$$parse(b)}function Ha(b,a,c){var d;this.$$parse=function(b){var c=wa(b,
+this);if(c.hash&&c.hash.indexOf(a)!==0)throw Error('Invalid url "'+b+'", missing hash prefix "'+a+'" !');d=c.path+(c.search?"?"+c.search:"");c=Lc.exec((c.hash||"").substr(a.length));this.$$path=c[1]?(c[1].charAt(0)=="/"?"":"/")+decodeURIComponent(c[1]):"";this.$$search=Xa(c[3]);this.$$hash=c[5]&&decodeURIComponent(c[5])||"";this.$$compose()};this.$$compose=function(){var b=sb(this.$$search),c=this.$$hash?"#"+Za(this.$$hash):"";this.$$url=Ib(this.$$path)+(b?"?"+b:"")+c;this.$$absUrl=ka(this.$$protocol,
+this.$$host,this.$$port)+d+(this.$$url?"#"+a+this.$$url:"")};this.$$rewriteAppUrl=function(a){if(a.indexOf(c)==0)return a};this.$$parse(b)}function Lb(b,a,c,d){Ha.apply(this,arguments);this.$$rewriteAppUrl=function(b){if(b.indexOf(c)==0)return c+d+"#"+a+b.substr(c.length)}}function Ia(b){return function(){return this[b]}}function Mb(b,a){return function(c){if(u(c))return this[b];this[b]=a(c);this.$$compose();return this}}function Mc(){var b="",a=!1;this.hashPrefix=function(a){return v(a)?(b=a,this):
+b};this.html5Mode=function(b){return v(b)?(a=b,this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,g){function h(a){c.$broadcast("$locationChangeSuccess",f.absUrl(),a)}var f,i,j,k=d.url(),l=wa(k);a?(i=d.baseHref()||"/",j=i.substr(0,i.lastIndexOf("/")),l=ka(l.protocol,l.host,l.port)+j+"/",f=e.history?new ib(Jc(k,i,b),j,l):new Lb(Kc(k,i,b),b,l,i.substr(j.length+1))):(l=ka(l.protocol,l.host,l.port)+(l.path||"")+(l.search?"?"+l.search:"")+"#"+b+"/",f=new Ha(k,b,l));g.bind("click",
+function(a){if(!a.ctrlKey&&!(a.metaKey||a.which==2)){for(var b=w(a.target);y(b[0].nodeName)!=="a";)if(b[0]===g[0]||!(b=b.parent())[0])return;var d=b.prop("href"),e=f.$$rewriteAppUrl(d);d&&!b.attr("target")&&e&&(f.$$parse(e),c.$apply(),a.preventDefault(),P.angular["ff-684208-preventDefault"]=!0)}});f.absUrl()!=k&&d.url(f.absUrl(),!0);d.onUrlChange(function(a){f.absUrl()!=a&&(c.$broadcast("$locationChangeStart",a,f.absUrl()).defaultPrevented?d.url(f.absUrl()):(c.$evalAsync(function(){var b=f.absUrl();
+f.$$parse(a);h(b)}),c.$$phase||c.$digest()))});var n=0;c.$watch(function(){var a=d.url(),b=f.$$replace;if(!n||a!=f.absUrl())n++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),h(a))});f.$$replace=!1;return n});return f}]}function Nc(){this.$get=["$window",function(b){function a(a){a instanceof Error&&(a.stack?a=a.message&&a.stack.indexOf(a.message)===-1?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+
+a.sourceURL+":"+a.line));return a}function c(c){var e=b.console||{},g=e[c]||e.log||s;return g.apply?function(){var b=[];m(arguments,function(c){b.push(a(c))});return g.apply(e,b)}:function(a,b){g(a,b)}}return{log:c("log"),warn:c("warn"),info:c("info"),error:c("error")}}]}function Oc(b,a){function c(a){return a.indexOf(r)!=-1}function d(){return p+1<b.length?b.charAt(p+1):!1}function e(a){return"0"<=a&&a<="9"}function g(a){return a==" "||a=="\r"||a=="\t"||a=="\n"||a=="\u000b"||a=="\u00a0"}function h(a){return"a"<=
+a&&a<="z"||"A"<=a&&a<="Z"||"_"==a||a=="$"}function f(a){return a=="-"||a=="+"||e(a)}function i(a,c,d){d=d||p;throw Error("Lexer Error: "+a+" at column"+(v(c)?"s "+c+"-"+p+" ["+b.substring(c,d)+"]":" "+d)+" in expression ["+b+"].");}function j(){for(var a="",c=p;p<b.length;){var g=y(b.charAt(p));if(g=="."||e(g))a+=g;else{var j=d();if(g=="e"&&f(j))a+=g;else if(f(g)&&j&&e(j)&&a.charAt(a.length-1)=="e")a+=g;else if(f(g)&&(!j||!e(j))&&a.charAt(a.length-1)=="e")i("Invalid exponent");else break}p++}a*=1;
+n.push({index:c,text:a,json:!0,fn:function(){return a}})}function k(){for(var c="",d=p,f,j,i,k;p<b.length;){k=b.charAt(p);if(k=="."||h(k)||e(k))k=="."&&(f=p),c+=k;else break;p++}if(f)for(j=p;j<b.length;){k=b.charAt(j);if(k=="("){i=c.substr(f-d+1);c=c.substr(0,f-d);p=j;break}if(g(k))j++;else break}d={index:d,text:c};if(Ja.hasOwnProperty(c))d.fn=d.json=Ja[c];else{var l=Nb(c,a);d.fn=D(function(a,b){return l(a,b)},{assign:function(a,b){return Ob(a,c,b)}})}n.push(d);i&&(n.push({index:f,text:".",json:!1}),
+n.push({index:f+1,text:i,json:!1}))}function l(a){var c=p;p++;for(var d="",e=a,f=!1;p<b.length;){var g=b.charAt(p);e+=g;if(f)g=="u"?(g=b.substring(p+1,p+5),g.match(/[\da-f]{4}/i)||i("Invalid unicode escape [\\u"+g+"]"),p+=4,d+=String.fromCharCode(parseInt(g,16))):(f=Pc[g],d+=f?f:g),f=!1;else if(g=="\\")f=!0;else if(g==a){p++;n.push({index:c,text:e,string:d,json:!0,fn:function(){return d}});return}else d+=g;p++}i("Unterminated quote",c)}for(var n=[],o,p=0,z=[],r,x=":";p<b.length;){r=b.charAt(p);if(c("\"'"))l(r);
+else if(e(r)||c(".")&&e(d()))j();else if(h(r)){if(k(),"{,".indexOf(x)!=-1&&z[0]=="{"&&(o=n[n.length-1]))o.json=o.text.indexOf(".")==-1}else if(c("(){}[].,;:"))n.push({index:p,text:r,json:":[,".indexOf(x)!=-1&&c("{[")||c("}]:,")}),c("{[")&&z.unshift(r),c("}]")&&z.shift(),p++;else if(g(r)){p++;continue}else{var m=r+d(),A=Ja[r],J=Ja[m];J?(n.push({index:p,text:m,fn:J}),p+=2):A?(n.push({index:p,text:r,fn:A,json:"[,:".indexOf(x)!=-1&&c("+-")}),p+=1):i("Unexpected next character ",p,p+1)}x=r}return n}function Qc(b,
+a,c,d){function e(a,c){throw Error("Syntax Error: Token '"+c.text+"' "+a+" at column "+(c.index+1)+" of the expression ["+b+"] starting at ["+b.substring(c.index)+"].");}function g(){if(Q.length===0)throw Error("Unexpected end of expression: "+b);return Q[0]}function h(a,b,c,d){if(Q.length>0){var e=Q[0],f=e.text;if(f==a||f==b||f==c||f==d||!a&&!b&&!c&&!d)return e}return!1}function f(b,c,d,f){return(b=h(b,c,d,f))?(a&&!b.json&&e("is not valid json",b),Q.shift(),b):!1}function i(a){f(a)||e("is unexpected, expecting ["+
+a+"]",h())}function j(a,b){return function(c,d){return a(c,d,b)}}function k(a,b,c){return function(d,e){return b(d,e,a,c)}}function l(){for(var a=[];;)if(Q.length>0&&!h("}",")",";","]")&&a.push(v()),!f(";"))return a.length==1?a[0]:function(b,c){for(var d,e=0;e<a.length;e++){var f=a[e];f&&(d=f(b,c))}return d}}function n(){for(var a=f(),b=c(a.text),d=[];;)if(a=f(":"))d.push(t());else{var e=function(a,c,e){for(var e=[e],f=0;f<d.length;f++)e.push(d[f](a,c));return b.apply(a,e)};return function(){return e}}}
+function o(){for(var a=p(),b;;)if(b=f("||"))a=k(a,b.fn,p());else return a}function p(){var a=z(),b;if(b=f("&&"))a=k(a,b.fn,p());return a}function z(){var a=r(),b;if(b=f("==","!="))a=k(a,b.fn,z());return a}function r(){var a;a=x();for(var b;b=f("+","-");)a=k(a,b.fn,x());if(b=f("<",">","<=",">="))a=k(a,b.fn,r());return a}function x(){for(var a=m(),b;b=f("*","/","%");)a=k(a,b.fn,m());return a}function m(){var a;return f("+")?A():(a=f("-"))?k(C,a.fn,m()):(a=f("!"))?j(a.fn,m()):A()}function A(){var a;
+if(f("("))a=v(),i(")");else if(f("["))a=J();else if(f("{"))a=K();else{var b=f();(a=b.fn)||e("not a primary expression",b)}for(var c;b=f("(","[",".");)b.text==="("?(a=w(a,c),c=null):b.text==="["?(c=a,a=R(a)):b.text==="."?(c=a,a=Y(a)):e("IMPOSSIBLE");return a}function J(){var a=[];if(g().text!="]"){do a.push(t());while(f(","))}i("]");return function(b,c){for(var d=[],e=0;e<a.length;e++)d.push(a[e](b,c));return d}}function K(){var a=[];if(g().text!="}"){do{var b=f(),b=b.string||b.text;i(":");var c=t();
+a.push({key:b,value:c})}while(f(","))}i("}");return function(b,c){for(var d={},e=0;e<a.length;e++){var f=a[e];d[f.key]=f.value(b,c)}return d}}var C=I(0),u,Q=Oc(b,d),t=function(){var a=o(),c,d;return(d=f("="))?(a.assign||e("implies assignment but ["+b.substring(0,d.index)+"] can not be assigned to",d),c=o(),function(b,d){return a.assign(b,c(b,d),d)}):a},w=function(a,b){var c=[];if(g().text!=")"){do c.push(t());while(f(","))}i(")");return function(d,e){for(var f=[],g=b?b(d,e):d,j=0;j<c.length;j++)f.push(c[j](d,
+e));j=a(d,e,g)||s;return j.apply?j.apply(g,f):j(f[0],f[1],f[2],f[3],f[4])}},Y=function(a){var b=f().text,c=Nb(b,d);return D(function(b,d,e){return c(e||a(b,d),d)},{assign:function(c,d,e){return Ob(a(c,e),b,d)}})},R=function(a){var b=t();i("]");return D(function(c,d){var e=a(c,d),f=b(c,d),g;if(!e)return q;if((e=e[f])&&e.then){g=e;if(!("$$v"in e))g.$$v=q,g.then(function(a){g.$$v=a});e=e.$$v}return e},{assign:function(c,d,e){return a(c,e)[b(c,e)]=d}})},v=function(){for(var a=t(),b;;)if(b=f("|"))a=k(a,
+b.fn,n());else return a};a?(t=o,w=Y=R=v=function(){e("is not valid json",{text:b,index:0})},u=A()):u=l();Q.length!==0&&e("is an unexpected token",Q[0]);return u}function Ob(b,a,c){for(var a=a.split("."),d=0;a.length>1;d++){var e=a.shift(),g=b[e];g||(g={},b[e]=g);b=g}return b[a.shift()]=c}function Pb(b,a,c,d,e){return function(g,h){var f=h&&h.hasOwnProperty(b)?h:g,i;if(f===null||f===q)return f;if((f=f[b])&&f.then){if(!("$$v"in f))i=f,i.$$v=q,i.then(function(a){i.$$v=a});f=f.$$v}if(!a||f===null||f===
+q)return f;if((f=f[a])&&f.then){if(!("$$v"in f))i=f,i.$$v=q,i.then(function(a){i.$$v=a});f=f.$$v}if(!c||f===null||f===q)return f;if((f=f[c])&&f.then){if(!("$$v"in f))i=f,i.$$v=q,i.then(function(a){i.$$v=a});f=f.$$v}if(!d||f===null||f===q)return f;if((f=f[d])&&f.then){if(!("$$v"in f))i=f,i.$$v=q,i.then(function(a){i.$$v=a});f=f.$$v}if(!e||f===null||f===q)return f;if((f=f[e])&&f.then){if(!("$$v"in f))i=f,i.$$v=q,i.then(function(a){i.$$v=a});f=f.$$v}return f}}function Nb(b,a){if(jb.hasOwnProperty(b))return jb[b];
+var c=b.split("."),d=c.length,e;if(a)e=d<6?Pb(c[0],c[1],c[2],c[3],c[4]):function(a,b){var e=0,g;do g=Pb(c[e++],c[e++],c[e++],c[e++],c[e++])(a,b),b=q,a=g;while(e<d);return g};else{var g="var l, fn, p;\n";m(c,function(a,b){g+="if(s === null || s === undefined) return s;\nl=s;\ns="+(b?"s":'((k&&k.hasOwnProperty("'+a+'"))?k:s)')+'["'+a+'"];\nif (s && s.then) {\n if (!("$$v" in s)) {\n p=s;\n p.$$v = undefined;\n p.then(function(v) {p.$$v=v;});\n}\n s=s.$$v\n}\n'});g+="return s;";e=Function("s","k",g);
+e.toString=function(){return g}}return jb[b]=e}function Rc(){var b={};this.$get=["$filter","$sniffer",function(a,c){return function(d){switch(typeof d){case "string":return b.hasOwnProperty(d)?b[d]:b[d]=Qc(d,!1,a,c.csp);case "function":return d;default:return s}}}]}function Sc(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return Tc(function(a){b.$evalAsync(a)},a)}]}function Tc(b,a){function c(a){return a}function d(a){return h(a)}var e=function(){var f=[],i,j;return j={resolve:function(a){if(f){var c=
+f;f=q;i=g(a);c.length&&b(function(){for(var a,b=0,d=c.length;b<d;b++)a=c[b],i.then(a[0],a[1])})}},reject:function(a){j.resolve(h(a))},promise:{then:function(b,g){var j=e(),h=function(d){try{j.resolve((b||c)(d))}catch(e){j.reject(e),a(e)}},p=function(b){try{j.resolve((g||d)(b))}catch(c){j.reject(c),a(c)}};f?f.push([h,p]):i.then(h,p);return j.promise}}}},g=function(a){return a&&a.then?a:{then:function(c){var d=e();b(function(){d.resolve(c(a))});return d.promise}}},h=function(a){return{then:function(c,
+g){var h=e();b(function(){h.resolve((g||d)(a))});return h.promise}}};return{defer:e,reject:h,when:function(f,i,j){var k=e(),l,n=function(b){try{return(i||c)(b)}catch(d){return a(d),h(d)}},o=function(b){try{return(j||d)(b)}catch(c){return a(c),h(c)}};b(function(){g(f).then(function(a){l||(l=!0,k.resolve(g(a).then(n,o)))},function(a){l||(l=!0,k.resolve(o(a)))})});return k.promise},all:function(a){var b=e(),c=a.length,d=[];c?m(a,function(a,e){g(a).then(function(a){e in d||(d[e]=a,--c||b.resolve(d))},
+function(a){e in d||b.reject(a)})}):b.resolve(d);return b.promise}}}function Uc(){var b={};this.when=function(a,c){b[a]=D({reloadOnSearch:!0},c);if(a){var d=a[a.length-1]=="/"?a.substr(0,a.length-1):a+"/";b[d]={redirectTo:a}}return this};this.otherwise=function(a){this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache",function(a,c,d,e,g,h,f){function i(a,b){for(var b="^"+b.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")+"$",c="",d=[],e=
+{},f=/:(\w+)/g,g,j=0;(g=f.exec(b))!==null;)c+=b.slice(j,g.index),c+="([^\\/]*)",d.push(g[1]),j=f.lastIndex;c+=b.substr(j);var h=a.match(RegExp(c));h&&m(d,function(a,b){e[a]=h[b+1]});return h?e:null}function j(){var b=k(),j=o.current;if(b&&j&&b.$$route===j.$$route&&ea(b.pathParams,j.pathParams)&&!b.reloadOnSearch&&!n)j.params=b.params,U(j.params,d),a.$broadcast("$routeUpdate",j);else if(b||j)n=!1,a.$broadcast("$routeChangeStart",b,j),(o.current=b)&&b.redirectTo&&(B(b.redirectTo)?c.path(l(b.redirectTo,
+b.params)).search(b.params).replace():c.url(b.redirectTo(b.pathParams,c.path(),c.search())).replace()),e.when(b).then(function(){if(b){var a=[],c=[],d;m(b.resolve||{},function(b,d){a.push(d);c.push(B(b)?g.get(b):g.invoke(b))});if(!v(d=b.template))if(v(d=b.templateUrl))d=h.get(d,{cache:f}).then(function(a){return a.data});v(d)&&(a.push("$template"),c.push(d));return e.all(c).then(function(b){var c={};m(b,function(b,d){c[a[d]]=b});return c})}}).then(function(c){if(b==o.current){if(b)b.locals=c,U(b.params,
+d);a.$broadcast("$routeChangeSuccess",b,j)}},function(c){b==o.current&&a.$broadcast("$routeChangeError",b,j,c)})}function k(){var a,d;m(b,function(b,e){if(!d&&(a=i(c.path(),e)))d=ya(b,{params:D({},c.search(),a),pathParams:a}),d.$$route=b});return d||b[null]&&ya(b[null],{params:{},pathParams:{}})}function l(a,b){var c=[];m((a||"").split(":"),function(a,d){if(d==0)c.push(a);else{var e=a.match(/(\w+)(.*)/),f=e[1];c.push(b[f]);c.push(e[2]||"");delete b[f]}});return c.join("")}var n=!1,o={routes:b,reload:function(){n=
+!0;a.$evalAsync(j)}};a.$on("$locationChangeSuccess",j);return o}]}function Vc(){this.$get=I({})}function Wc(){var b=10;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$injector","$exceptionHandler","$parse",function(a,c,d){function e(){this.$id=xa();this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this["this"]=this.$root=this;this.$$destroyed=!1;this.$$asyncQueue=[];this.$$listeners={};this.$$isolateBindings=
+{}}function g(a){if(i.$$phase)throw Error(i.$$phase+" already in progress");i.$$phase=a}function h(a,b){var c=d(a);ra(c,b);return c}function f(){}e.prototype={$new:function(a){if(H(a))throw Error("API-CHANGE: Use $controller to instantiate controllers.");a?(a=new e,a.$root=this.$root):(a=function(){},a.prototype=this,a=new a,a.$id=xa());a["this"]=a;a.$$listeners={};a.$parent=this;a.$$asyncQueue=[];a.$$watchers=a.$$nextSibling=a.$$childHead=a.$$childTail=null;a.$$prevSibling=this.$$childTail;this.$$childHead?
+this.$$childTail=this.$$childTail.$$nextSibling=a:this.$$childHead=this.$$childTail=a;return a},$watch:function(a,b,c){var d=h(a,"watch"),e=this.$$watchers,g={fn:b,last:f,get:d,exp:a,eq:!!c};if(!H(b)){var i=h(b||s,"listener");g.fn=function(a,b,c){i(c)}}if(!e)e=this.$$watchers=[];e.unshift(g);return function(){Ua(e,g)}},$digest:function(){var a,d,e,h,o,p,m,r=b,x,q=[],A,J;g("$digest");do{m=!1;x=this;do{for(o=x.$$asyncQueue;o.length;)try{x.$eval(o.shift())}catch(K){c(K)}if(h=x.$$watchers)for(p=h.length;p--;)try{if((a=
+h[p])&&(d=a.get(x))!==(e=a.last)&&!(a.eq?ea(d,e):typeof d=="number"&&typeof e=="number"&&isNaN(d)&&isNaN(e)))m=!0,a.last=a.eq?U(d):d,a.fn(d,e===f?d:e,x),r<5&&(A=4-r,q[A]||(q[A]=[]),J=H(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,J+="; newVal: "+ba(d)+"; oldVal: "+ba(e),q[A].push(J))}catch(C){c(C)}if(!(h=x.$$childHead||x!==this&&x.$$nextSibling))for(;x!==this&&!(h=x.$$nextSibling);)x=x.$parent}while(x=h);if(m&&!r--)throw i.$$phase=null,Error(b+" $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: "+
+ba(q));}while(m||o.length);i.$$phase=null},$destroy:function(){if(!(i==this||this.$$destroyed)){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;if(a.$$childHead==this)a.$$childHead=this.$$nextSibling;if(a.$$childTail==this)a.$$childTail=this.$$prevSibling;if(this.$$prevSibling)this.$$prevSibling.$$nextSibling=this.$$nextSibling;if(this.$$nextSibling)this.$$nextSibling.$$prevSibling=this.$$prevSibling;this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=
+null}},$eval:function(a,b){return d(a)(this,b)},$evalAsync:function(a){this.$$asyncQueue.push(a)},$apply:function(a){try{return g("$apply"),this.$eval(a)}catch(b){c(b)}finally{i.$$phase=null;try{i.$digest()}catch(d){throw c(d),d;}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);return function(){c[za(c,b)]=null}},$emit:function(a,b){var d=[],e,f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},
+defaultPrevented:!1},i=[h].concat(ha.call(arguments,1)),m,q;do{e=f.$$listeners[a]||d;h.currentScope=f;m=0;for(q=e.length;m<q;m++)if(e[m])try{if(e[m].apply(null,i),g)return h}catch(A){c(A)}else e.splice(m,1),m--,q--;f=f.$parent}while(f);return h},$broadcast:function(a,b){var d=this,e=this,f={name:a,targetScope:this,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1},g=[f].concat(ha.call(arguments,1)),h,i;do{d=e;f.currentScope=d;e=d.$$listeners[a]||[];h=0;for(i=e.length;h<i;h++)if(e[h])try{e[h].apply(null,
+g)}catch(m){c(m)}else e.splice(h,1),h--,i--;if(!(e=d.$$childHead||d!==this&&d.$$nextSibling))for(;d!==this&&!(e=d.$$nextSibling);)d=d.$parent}while(d=e);return f}};var i=new e;return i}]}function Xc(){this.$get=["$window",function(b){var a={},c=G((/android (\d+)/.exec(y(b.navigator.userAgent))||[])[1]);return{history:!(!b.history||!b.history.pushState||c<4),hashchange:"onhashchange"in b&&(!b.document.documentMode||b.document.documentMode>7),hasEvent:function(c){if(c=="input"&&V==9)return!1;if(u(a[c])){var e=
+b.document.createElement("div");a[c]="on"+c in e}return a[c]},csp:!1}}]}function Yc(){this.$get=I(P)}function Qb(b){var a={},c,d,e;if(!b)return a;m(b.split("\n"),function(b){e=b.indexOf(":");c=y(S(b.substr(0,e)));d=S(b.substr(e+1));c&&(a[c]?a[c]+=", "+d:a[c]=d)});return a}function Rb(b){var a=M(b)?b:q;return function(c){a||(a=Qb(b));return c?a[y(c)]||null:a}}function Sb(b,a,c){if(H(c))return c(b,a);m(c,function(c){b=c(b,a)});return b}function Zc(){var b=/^\s*(\[|\{[^\{])/,a=/[\}\]]\s*$/,c=/^\)\]\}',?\n/,
+d=this.defaults={transformResponse:[function(d){B(d)&&(d=d.replace(c,""),b.test(d)&&a.test(d)&&(d=qb(d,!0)));return d}],transformRequest:[function(a){return M(a)&&ma.apply(a)!=="[object File]"?ba(a):a}],headers:{common:{Accept:"application/json, text/plain, */*","X-Requested-With":"XMLHttpRequest"},post:{"Content-Type":"application/json;charset=utf-8"},put:{"Content-Type":"application/json;charset=utf-8"}}},e=this.responseInterceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope",
+"$q","$injector",function(a,b,c,i,j,k){function l(a){function c(a){var b=D({},a,{data:Sb(a.data,a.headers,f)});return 200<=a.status&&a.status<300?b:j.reject(b)}a.method=la(a.method);var e=a.transformRequest||d.transformRequest,f=a.transformResponse||d.transformResponse,g=D({},a.headers),i=D({"X-XSRF-TOKEN":b.cookies()["XSRF-TOKEN"]},d.headers.common,d.headers[y(a.method)]),k,l,o,p;a:for(k in i){l=y(k);for(o in a.headers)if(y(o)===l)continue a;g[k]=i[k]}if(u(a.data))for(var q in g)if(y(q)==="content-type"){delete g[q];
+break}e=Sb(a.data,Rb(g),e);p=n(a,e,g);p=p.then(c,c);m(z,function(a){p=a(p)});p.success=function(b){p.then(function(c){b(c.data,c.status,c.headers,a)});return p};p.error=function(b){p.then(null,function(c){b(c.data,c.status,c.headers,a)});return p};return p}function n(b,c,d){function e(a,b,c){m&&(200<=a&&a<300?m.put(q,[a,b,Qb(c)]):m.remove(q));f(b,a,c);i.$apply()}function f(a,c,d){c=Math.max(c,0);(200<=c&&c<300?k.resolve:k.reject)({data:a,status:c,headers:Rb(d),config:b})}function h(){var a=za(l.pendingRequests,
+b);a!==-1&&l.pendingRequests.splice(a,1)}var k=j.defer(),n=k.promise,m,t,q=o(b.url,b.params);l.pendingRequests.push(b);n.then(h,h);b.cache&&b.method=="GET"&&(m=M(b.cache)?b.cache:p);if(m)if(t=m.get(q))if(t.then)return t.then(h,h),t;else E(t)?f(t[1],t[0],U(t[2])):f(t,200,{});else m.put(q,n);t||a(b.method,q,c,e,d,b.timeout,b.withCredentials);return n}function o(a,b){if(!b)return a;var c=[];hc(b,function(a,b){a==null||a==q||(M(a)&&(a=ba(a)),c.push(encodeURIComponent(b)+"="+encodeURIComponent(a)))});
+return a+(a.indexOf("?")==-1?"?":"&")+c.join("&")}var p=c("$http"),z=[];m(e,function(a){z.push(B(a)?k.get(a):k.invoke(a))});l.pendingRequests=[];(function(a){m(arguments,function(a){l[a]=function(b,c){return l(D(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){m(arguments,function(a){l[a]=function(b,c,d){return l(D(d||{},{method:a,url:b,data:c}))}})})("post","put");l.defaults=d;return l}]}function $c(){this.$get=["$browser","$window","$document",function(b,a,c){return ad(b,
+bd,b.defer,a.angular.callbacks,c[0],a.location.protocol.replace(":",""))}]}function ad(b,a,c,d,e,g){function h(a,b){var c=e.createElement("script"),d=function(){e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;V?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=d;e.body.appendChild(c)}return function(e,i,j,k,l,n,o){function p(a,c,d,e){c=(i.match(Jb)||["",g])[1]=="file"?d?200:404:c;a(c==1223?204:c,d,e);b.$$completeOutstandingRequest(s)}b.$$incOutstandingRequestCount();
+i=i||b.url();if(y(e)=="jsonp"){var q="_"+(d.counter++).toString(36);d[q]=function(a){d[q].data=a};h(i.replace("JSON_CALLBACK","angular.callbacks."+q),function(){d[q].data?p(k,200,d[q].data):p(k,-2);delete d[q]})}else{var r=new a;r.open(e,i,!0);m(l,function(a,b){a&&r.setRequestHeader(b,a)});var x;r.onreadystatechange=function(){if(r.readyState==4){var a=r.getAllResponseHeaders(),b=["Cache-Control","Content-Language","Content-Type","Expires","Last-Modified","Pragma"];a||(a="",m(b,function(b){var c=
+r.getResponseHeader(b);c&&(a+=b+": "+c+"\n")}));p(k,x||r.status,r.responseText,a)}};if(o)r.withCredentials=!0;r.send(j||"");n>0&&c(function(){x=-1;r.abort()},n)}}}function cd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),
+SHORTMONTH:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),DAY:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),SHORTDAY:"Sun,Mon,Tue,Wed,Thu,Fri,Sat".split(","),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return b===1?"one":"other"}}}}function dd(){this.$get=["$rootScope","$browser","$q",
+"$exceptionHandler",function(b,a,c,d){function e(e,f,i){var j=c.defer(),k=j.promise,l=v(i)&&!i,f=a.defer(function(){try{j.resolve(e())}catch(a){j.reject(a),d(a)}finally{delete g[k.$$timeoutId]}l||b.$apply()},f);k.$$timeoutId=f;g[f]=j;return k}var g={};e.cancel=function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject("canceled"),delete g[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return e}]}function Tb(b){function a(a,e){return b.factory(a+c,e)}var c="Filter";this.register=a;this.$get=
+["$injector",function(a){return function(b){return a.get(b+c)}}];a("currency",Ub);a("date",Vb);a("filter",ed);a("json",fd);a("limitTo",gd);a("lowercase",hd);a("number",Wb);a("orderBy",Xb);a("uppercase",id)}function ed(){return function(b,a){if(!E(b))return b;var c=[];c.check=function(a){for(var b=0;b<c.length;b++)if(!c[b](a))return!1;return!0};var d=function(a,b){if(b.charAt(0)==="!")return!d(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return(""+a).toLowerCase().indexOf(b)>
+-1;case "object":for(var c in a)if(c.charAt(0)!=="$"&&d(a[c],b))return!0;return!1;case "array":for(c=0;c<a.length;c++)if(d(a[c],b))return!0;return!1;default:return!1}};switch(typeof a){case "boolean":case "number":case "string":a={$:a};case "object":for(var e in a)e=="$"?function(){var b=(""+a[e]).toLowerCase();b&&c.push(function(a){return d(a,b)})}():function(){var b=e,f=(""+a[e]).toLowerCase();f&&c.push(function(a){return d(cb(a,b),f)})}();break;case "function":c.push(a);break;default:return b}for(var g=
+[],h=0;h<b.length;h++){var f=b[h];c.check(f)&&g.push(f)}return g}}function Ub(b){var a=b.NUMBER_FORMATS;return function(b,d){if(u(d))d=a.CURRENCY_SYM;return Yb(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,2).replace(/\u00A4/g,d)}}function Wb(b){var a=b.NUMBER_FORMATS;return function(b,d){return Yb(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function Yb(b,a,c,d,e){if(isNaN(b)||!isFinite(b))return"";var g=b<0,b=Math.abs(b),h=b+"",f="",i=[],j=!1;if(h.indexOf("e")!==-1){var k=h.match(/([\d\.]+)e(-?)(\d+)/);
+k&&k[2]=="-"&&k[3]>e+1?h="0":(f=h,j=!0)}if(j)e>0&&b>-1&&b<1&&(f=b.toFixed(e));else{h=(h.split(Zb)[1]||"").length;u(e)&&(e=Math.min(Math.max(a.minFrac,h),a.maxFrac));var h=Math.pow(10,e),b=Math.round(b*h)/h,b=(""+b).split(Zb),h=b[0],b=b[1]||"",j=0,k=a.lgSize,l=a.gSize;if(h.length>=k+l)for(var j=h.length-k,n=0;n<j;n++)(j-n)%l===0&&n!==0&&(f+=c),f+=h.charAt(n);for(n=j;n<h.length;n++)(h.length-n)%k===0&&n!==0&&(f+=c),f+=h.charAt(n);for(;b.length<e;)b+="0";e&&e!=="0"&&(f+=d+b.substr(0,e))}i.push(g?a.negPre:
+a.posPre);i.push(f);i.push(g?a.negSuf:a.posSuf);return i.join("")}function kb(b,a,c){var d="";b<0&&(d="-",b=-b);for(b=""+b;b.length<a;)b="0"+b;c&&(b=b.substr(b.length-a));return d+b}function O(b,a,c,d){c=c||0;return function(e){e=e["get"+b]();if(c>0||e>-c)e+=c;e===0&&c==-12&&(e=12);return kb(e,a,d)}}function Ka(b,a){return function(c,d){var e=c["get"+b](),g=la(a?"SHORT"+b:b);return d[g][e]}}function Vb(b){function a(a){var b;if(b=a.match(c)){var a=new Date(0),g=0,h=0;b[9]&&(g=G(b[9]+b[10]),h=G(b[9]+
+b[11]));a.setUTCFullYear(G(b[1]),G(b[2])-1,G(b[3]));a.setUTCHours(G(b[4]||0)-g,G(b[5]||0)-h,G(b[6]||0),G(b[7]||0))}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var g="",h=[],f,i,e=e||"mediumDate",e=b.DATETIME_FORMATS[e]||e;B(c)&&(c=jd.test(c)?G(c):a(c));Ra(c)&&(c=new Date(c));if(!oa(c))return c;for(;e;)(i=kd.exec(e))?(h=h.concat(ha.call(i,1)),e=h.pop()):(h.push(e),e=null);m(h,function(a){f=ld[a];g+=f?f(c,
+b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function fd(){return function(b){return ba(b,!0)}}function gd(){return function(b,a){if(!(b instanceof Array))return b;var a=G(a),c=[],d,e;if(!b||!(b instanceof Array))return c;a>b.length?a=b.length:a<-b.length&&(a=-b.length);a>0?(d=0,e=a):(d=b.length+a,e=b.length);for(;d<e;d++)c.push(b[d]);return c}}function Xb(b){return function(a,c,d){function e(a,b){return Wa(b)?function(b,c){return a(c,b)}:a}if(!E(a))return a;if(!c)return a;
+for(var c=E(c)?c:[c],c=Ta(c,function(a){var c=!1,d=a||na;if(B(a)){if(a.charAt(0)=="+"||a.charAt(0)=="-")c=a.charAt(0)=="-",a=a.substring(1);d=b(a)}return e(function(a,b){var c;c=d(a);var e=d(b),f=typeof c,g=typeof e;f==g?(f=="string"&&(c=c.toLowerCase(),e=e.toLowerCase()),c=c===e?0:c<e?-1:1):c=f<g?-1:1;return c},c)}),g=[],h=0;h<a.length;h++)g.push(a[h]);return g.sort(e(function(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);if(e!==0)return e}return 0},d))}}function W(b){H(b)&&(b={link:b});b.restrict=
+b.restrict||"AC";return I(b)}function $b(b,a){function c(a,c){c=c?"-"+ab(c,"-"):"";b.removeClass((a?La:Ma)+c).addClass((a?Ma:La)+c)}var d=this,e=b.parent().controller("form")||Na,g=0,h=d.$error={};d.$name=a.name||a.ngForm;d.$dirty=!1;d.$pristine=!0;d.$valid=!0;d.$invalid=!1;e.$addControl(d);b.addClass(Oa);c(!0);d.$addControl=function(a){a.$name&&!d.hasOwnProperty(a.$name)&&(d[a.$name]=a)};d.$removeControl=function(a){a.$name&&d[a.$name]===a&&delete d[a.$name];m(h,function(b,c){d.$setValidity(c,!0,
+a)})};d.$setValidity=function(a,b,j){var k=h[a];if(b){if(k&&(Ua(k,j),!k.length)){g--;if(!g)c(b),d.$valid=!0,d.$invalid=!1;h[a]=!1;c(!0,a);e.$setValidity(a,!0,d)}}else{g||c(b);if(k){if(za(k,j)!=-1)return}else h[a]=k=[],g++,c(!1,a),e.$setValidity(a,!1,d);k.push(j);d.$valid=!1;d.$invalid=!0}};d.$setDirty=function(){b.removeClass(Oa).addClass(ac);d.$dirty=!0;d.$pristine=!1;e.$setDirty()}}function X(b){return u(b)||b===""||b===null||b!==b}function Pa(b,a,c,d,e,g){var h=function(){var c=S(a.val());d.$viewValue!==
+c&&b.$apply(function(){d.$setViewValue(c)})};if(e.hasEvent("input"))a.bind("input",h);else{var f,i=function(){f||(f=g.defer(function(){h();f=null}))};a.bind("keydown",function(a){a=a.keyCode;a===91||15<a&&a<19||37<=a&&a<=40||i()});a.bind("change",h);e.hasEvent("paste")&&a.bind("paste cut",i)}d.$render=function(){a.val(X(d.$viewValue)?"":d.$viewValue)};var j=c.ngPattern,k=function(a,b){return X(b)||a.test(b)?(d.$setValidity("pattern",!0),b):(d.$setValidity("pattern",!1),q)};j&&(j.match(/^\/(.*)\/$/)?
+(j=RegExp(j.substr(1,j.length-2)),e=function(a){return k(j,a)}):e=function(a){var c=b.$eval(j);if(!c||!c.test)throw Error("Expected "+j+" to be a RegExp but was "+c);return k(c,a)},d.$formatters.push(e),d.$parsers.push(e));if(c.ngMinlength){var l=G(c.ngMinlength),e=function(a){return!X(a)&&a.length<l?(d.$setValidity("minlength",!1),q):(d.$setValidity("minlength",!0),a)};d.$parsers.push(e);d.$formatters.push(e)}if(c.ngMaxlength){var n=G(c.ngMaxlength),c=function(a){return!X(a)&&a.length>n?(d.$setValidity("maxlength",
+!1),q):(d.$setValidity("maxlength",!0),a)};d.$parsers.push(c);d.$formatters.push(c)}}function lb(b,a){b="ngClass"+b;return W(function(c,d,e){function g(b){if(a===!0||c.$index%2===a)i&&!ea(b,i)&&h(i),f(b);i=U(b)}function h(a){M(a)&&!E(a)&&(a=Ta(a,function(a,b){if(a)return b}));d.removeClass(E(a)?a.join(" "):a)}function f(a){M(a)&&!E(a)&&(a=Ta(a,function(a,b){if(a)return b}));a&&d.addClass(E(a)?a.join(" "):a)}var i=q;c.$watch(e[b],g,!0);e.$observe("class",function(){var a=c.$eval(e[b]);g(a,a)});b!==
+"ngClass"&&c.$watch("$index",function(d,g){var i=d&1;i!==g&1&&(i===a?f(c.$eval(e[b])):h(c.$eval(e[b])))})})}var y=function(b){return B(b)?b.toLowerCase():b},la=function(b){return B(b)?b.toUpperCase():b},V=G((/msie (\d+)/.exec(y(navigator.userAgent))||[])[1]),w,aa,ha=[].slice,Qa=[].push,ma=Object.prototype.toString,$a=P.angular||(P.angular={}),ta,Ga,Z=["0","0","0"];s.$inject=[];na.$inject=[];var S=function(){return!String.prototype.trim?function(b){return B(b)?b.replace(/^\s*/,"").replace(/\s*$/,""):
+b}:function(b){return B(b)?b.trim():b}}();Ga=V<9?function(b){b=b.nodeName?b:b[0];return b.scopeName&&b.scopeName!="HTML"?la(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var mc=/[A-Z]/g,md={full:"1.0.8",major:1,minor:0,dot:8,codeName:"bubble-burst"},Ba=L.cache={},Aa=L.expando="ng-"+(new Date).getTime(),qc=1,bc=P.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},gb=P.document.removeEventListener?
+function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)},oc=/([\:\-\_]+(.))/g,pc=/^moz([A-Z])/,va=L.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;this.bind("DOMContentLoaded",a);L(P).bind("load",a)},toString:function(){var b=[];m(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return b>=0?w(this[b]):w(this[this.length+b])},length:0,push:Qa,sort:[].sort,splice:[].splice},Ea={};m("multiple,selected,checked,disabled,readOnly,required".split(","),
+function(b){Ea[y(b)]=b});var Db={};m("input,select,option,textarea,button,form".split(","),function(b){Db[la(b)]=!0});m({data:yb,inheritedData:Da,scope:function(b){return Da(b,"$scope")},controller:Bb,injector:function(b){return Da(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Ca,css:function(b,a,c){a=vb(a);if(v(c))b.style[a]=c;else{var d;V<=8&&(d=b.currentStyle&&b.currentStyle[a],d===""&&(d="auto"));d=d||b.style[a];V<=8&&(d=d===""?q:d);return d}},attr:function(b,a,c){var d=
+y(a);if(Ea[d])if(v(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||s).specified?d:q;else if(v(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),b===null?q:b},prop:function(b,a,c){if(v(c))b[a]=c;else return b[a]},text:D(V<9?function(b,a){if(b.nodeType==1){if(u(a))return b.innerText;b.innerText=a}else{if(u(a))return b.nodeValue;b.nodeValue=a}}:function(b,a){if(u(a))return b.textContent;b.textContent=a},{$dv:""}),
+val:function(b,a){if(u(a)){if(Ga(b)==="SELECT"&&b.multiple){var c=[];m(b.options,function(a){a.selected&&c.push(a.value||a.text)});return c.length===0?null:c}return b.value}b.value=a},html:function(b,a){if(u(a))return b.innerHTML;for(var c=0,d=b.childNodes;c<d.length;c++)sa(d[c]);b.innerHTML=a}},function(b,a){L.prototype[a]=function(a,d){var e,g;if((b.length==2&&b!==Ca&&b!==Bb?a:d)===q)if(M(a)){for(e=0;e<this.length;e++)if(b===yb)b(this[e],a);else for(g in a)b(this[e],g,a[g]);return this}else{if(this.length)return b(this[0],
+a,d)}else{for(e=0;e<this.length;e++)b(this[e],a,d);return this}return b.$dv}});m({removeData:wb,dealoc:sa,bind:function a(c,d,e){var g=$(c,"events"),h=$(c,"handle");g||$(c,"events",g={});h||$(c,"handle",h=rc(c,g));m(d.split(" "),function(d){var i=g[d];if(!i){if(d=="mouseenter"||d=="mouseleave"){var j=T.body.contains||T.body.compareDocumentPosition?function(a,c){var d=a.nodeType===9?a.documentElement:a,e=c&&c.parentNode;return a===e||!(!e||!(e.nodeType===1&&(d.contains?d.contains(e):a.compareDocumentPosition&&
+a.compareDocumentPosition(e)&16)))}:function(a,c){if(c)for(;c=c.parentNode;)if(c===a)return!0;return!1};g[d]=[];a(c,{mouseleave:"mouseout",mouseenter:"mouseover"}[d],function(a){var c=a.relatedTarget;(!c||c!==this&&!j(this,c))&&h(a,d)})}else bc(c,d,h),g[d]=[];i=g[d]}i.push(e)})},unbind:xb,replaceWith:function(a,c){var d,e=a.parentNode;sa(a);m(new L(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a);d=c})},children:function(a){var c=[];m(a.childNodes,function(a){a.nodeType===1&&c.push(a)});
+return c},contents:function(a){return a.childNodes||[]},append:function(a,c){m(new L(c),function(c){a.nodeType===1&&a.appendChild(c)})},prepend:function(a,c){if(a.nodeType===1){var d=a.firstChild;m(new L(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){var c=w(c)[0],d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:function(a){sa(a);var c=a.parentNode;c&&c.removeChild(a)},after:function(a,c){var d=a,e=a.parentNode;m(new L(c),function(a){e.insertBefore(a,d.nextSibling);d=a})},
+addClass:Ab,removeClass:zb,toggleClass:function(a,c,d){u(d)&&(d=!Ca(a,c));(d?Ab:zb)(a,c)},parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},next:function(a){if(a.nextElementSibling)return a.nextElementSibling;for(a=a.nextSibling;a!=null&&a.nodeType!==1;)a=a.nextSibling;return a},find:function(a,c){return a.getElementsByTagName(c)},clone:fb,triggerHandler:function(a,c){var d=($(a,"events")||{})[c];m(d,function(c){c.call(a,null)})}},function(a,c){L.prototype[c]=function(c,e){for(var g,
+h=0;h<this.length;h++)g==q?(g=a(this[h],c,e),g!==q&&(g=w(g))):eb(g,a(this[h],c,e));return g==q?this:g}});Fa.prototype={put:function(a,c){this[fa(a)]=c},get:function(a){return this[fa(a)]},remove:function(a){var c=this[a=fa(a)];delete this[a];return c}};hb.prototype={push:function(a,c){var d=this[a=fa(a)];d?d.push(c):this[a]=[c]},shift:function(a){var c=this[a=fa(a)];if(c)return c.length==1?(delete this[a],c[0]):c.shift()},peek:function(a){if(a=this[fa(a)])return a[0]}};var tc=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,
+uc=/,/,vc=/^\s*(_?)(\S+?)\1\s*$/,sc=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Gb="Non-assignable model expression: ";Fb.$inject=["$provide"];var Ec=/^(x[\:\-_]|data[\:\-_])/i,Jb=/^([^:]+):\/\/(\w+:{0,1}\w*@)?(\{?[\w\.-]*\}?)(:([0-9]+))?(\/[^\?#]*)?(\?([^#]*))?(#(.*))?$/,cc=/^([^\?#]*)?(\?([^#]*))?(#(.*))?$/,Lc=cc,Kb={http:80,https:443,ftp:21};ib.prototype={$$replace:!1,absUrl:Ia("$$absUrl"),url:function(a,c){if(u(a))return this.$$url;var d=cc.exec(a);d[1]&&this.path(decodeURIComponent(d[1]));if(d[2]||d[1])this.search(d[3]||
+"");this.hash(d[5]||"",c);return this},protocol:Ia("$$protocol"),host:Ia("$$host"),port:Ia("$$port"),path:Mb("$$path",function(a){return a.charAt(0)=="/"?a:"/"+a}),search:function(a,c){if(u(a))return this.$$search;v(c)?c===null?delete this.$$search[a]:this.$$search[a]=c:this.$$search=B(a)?Xa(a):a;this.$$compose();return this},hash:Mb("$$hash",na),replace:function(){this.$$replace=!0;return this}};Ha.prototype=ya(ib.prototype);Lb.prototype=ya(Ha.prototype);var Ja={"null":function(){return null},"true":function(){return!0},
+"false":function(){return!1},undefined:s,"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return v(d)?v(e)?d+e:d:v(e)?e:q},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);return(v(d)?d:0)-(v(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"^":function(a,c,d,e){return d(a,c)^e(a,c)},"=":s,"==":function(a,c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a,c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)<e(a,c)},
+">":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Pc={n:"\n",f:"\u000c",r:"\r",t:"\t",v:"\u000b","'":"'",'"':'"'},jb={},bd=P.XMLHttpRequest||function(){try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(c){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(d){}throw Error("This browser does not support XMLHttpRequest.");
+};Tb.$inject=["$provide"];Ub.$inject=["$locale"];Wb.$inject=["$locale"];var Zb=".",ld={yyyy:O("FullYear",4),yy:O("FullYear",2,0,!0),y:O("FullYear",1),MMMM:Ka("Month"),MMM:Ka("Month",!0),MM:O("Month",2,1),M:O("Month",1,1),dd:O("Date",2),d:O("Date",1),HH:O("Hours",2),H:O("Hours",1),hh:O("Hours",2,-12),h:O("Hours",1,-12),mm:O("Minutes",2),m:O("Minutes",1),ss:O("Seconds",2),s:O("Seconds",1),EEEE:Ka("Day"),EEE:Ka("Day",!0),a:function(a,c){return a.getHours()<12?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){var a=
+-1*a.getTimezoneOffset(),c=a>=0?"+":"";c+=kb(Math[a>0?"floor":"ceil"](a/60),2)+kb(Math.abs(a%60),2);return c}},kd=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,jd=/^\d+$/;Vb.$inject=["$locale"];var hd=I(y),id=I(la);Xb.$inject=["$parse"];var nd=I({restrict:"E",compile:function(a,c){V<=8&&(!c.href&&!c.name&&c.$set("href",""),a.append(T.createComment("IE fix")));return function(a,c){c.bind("click",function(a){c.attr("href")||a.preventDefault()})}}}),mb={};m(Ea,function(a,
+c){var d=ca("ng-"+c);mb[d]=function(){return{priority:100,compile:function(){return function(a,g,h){a.$watch(h[d],function(a){h.$set(c,!!a)})}}}}});m(["src","href"],function(a){var c=ca("ng-"+a);mb[c]=function(){return{priority:99,link:function(d,e,g){g.$observe(c,function(c){c&&(g.$set(a,c),V&&e.prop(a,g[a]))})}}}});var Na={$addControl:s,$removeControl:s,$setValidity:s,$setDirty:s};$b.$inject=["$element","$attrs","$scope"];var Qa=function(a){return["$timeout",function(c){var d={name:"form",restrict:"E",
+controller:$b,compile:function(){return{pre:function(a,d,h,f){if(!h.action){var i=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};bc(d[0],"submit",i);d.bind("$destroy",function(){c(function(){gb(d[0],"submit",i)},0,!1)})}var j=d.parent().controller("form"),k=h.name||h.ngForm;k&&(a[k]=f);j&&d.bind("$destroy",function(){j.$removeControl(f);k&&(a[k]=q);D(f,Na)})}}}};return a?D(U(d),{restrict:"EAC"}):d}]},od=Qa(),pd=Qa(!0),qd=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,
+rd=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/,sd=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,dc={text:Pa,number:function(a,c,d,e,g,h){Pa(a,c,d,e,g,h);e.$parsers.push(function(a){var c=X(a);return c||sd.test(a)?(e.$setValidity("number",!0),a===""?null:c?a:parseFloat(a)):(e.$setValidity("number",!1),q)});e.$formatters.push(function(a){return X(a)?"":""+a});if(d.min){var f=parseFloat(d.min),a=function(a){return!X(a)&&a<f?(e.$setValidity("min",!1),q):(e.$setValidity("min",!0),a)};e.$parsers.push(a);
+e.$formatters.push(a)}if(d.max){var i=parseFloat(d.max),d=function(a){return!X(a)&&a>i?(e.$setValidity("max",!1),q):(e.$setValidity("max",!0),a)};e.$parsers.push(d);e.$formatters.push(d)}e.$formatters.push(function(a){return X(a)||Ra(a)?(e.$setValidity("number",!0),a):(e.$setValidity("number",!1),q)})},url:function(a,c,d,e,g,h){Pa(a,c,d,e,g,h);a=function(a){return X(a)||qd.test(a)?(e.$setValidity("url",!0),a):(e.$setValidity("url",!1),q)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,
+c,d,e,g,h){Pa(a,c,d,e,g,h);a=function(a){return X(a)||rd.test(a)?(e.$setValidity("email",!0),a):(e.$setValidity("email",!1),q)};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,e){u(d.name)&&c.attr("name",xa());c.bind("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var g=d.ngTrueValue,h=d.ngFalseValue;B(g)||(g=!0);B(h)||(h=!1);c.bind("click",
+function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$formatters.push(function(a){return a===g});e.$parsers.push(function(a){return a?g:h})},hidden:s,button:s,submit:s,reset:s},ec=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,g,h){h&&(dc[y(g.type)]||dc.text)(d,e,g,h,c,a)}}}],Ma="ng-valid",La="ng-invalid",Oa="ng-pristine",ac="ng-dirty",td=["$scope","$exceptionHandler","$attrs","$element","$parse",
+function(a,c,d,e,g){function h(a,c){c=c?"-"+ab(c,"-"):"";e.removeClass((a?La:Ma)+c).addClass((a?Ma:La)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var f=g(d.ngModel),i=f.assign;if(!i)throw Error(Gb+d.ngModel+" ("+qa(e)+")");this.$render=s;var j=e.inheritedData("$formController")||Na,k=0,l=this.$error={};e.addClass(Oa);h(!0);this.$setValidity=function(a,
+c){if(l[a]!==!c){if(c){if(l[a]&&k--,!k)h(!0),this.$valid=!0,this.$invalid=!1}else h(!1),this.$invalid=!0,this.$valid=!1,k++;l[a]=!c;h(c,a);j.$setValidity(a,c,this)}};this.$setViewValue=function(d){this.$viewValue=d;if(this.$pristine)this.$dirty=!0,this.$pristine=!1,e.removeClass(Oa).addClass(ac),j.$setDirty();m(this.$parsers,function(a){d=a(d)});if(this.$modelValue!==d)this.$modelValue=d,i(a,d),m(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}})};var n=this;a.$watch(function(){var c=
+f(a);if(n.$modelValue!==c){var d=n.$formatters,e=d.length;for(n.$modelValue=c;e--;)c=d[e](c);if(n.$viewValue!==c)n.$viewValue=c,n.$render()}})}],ud=function(){return{require:["ngModel","^?form"],controller:td,link:function(a,c,d,e){var g=e[0],h=e[1]||Na;h.$addControl(g);c.bind("$destroy",function(){h.$removeControl(g)})}}},vd=I({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),fc=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=
+!0;var g=function(a){if(d.required&&(X(a)||a===!1))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(g);e.$parsers.unshift(g);d.$observe("required",function(){g(e.$viewValue)})}}}},wd=function(){return{require:"ngModel",link:function(a,c,d,e){var g=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){var c=[];a&&m(a.split(g),function(a){a&&c.push(S(a))});return c});e.$formatters.push(function(a){return E(a)?a.join(", "):
+q})}}},xd=/^(true|false|\d+)$/,yd=function(){return{priority:100,compile:function(a,c){return xd.test(c.ngValue)?function(a,c,g){g.$set("value",a.$eval(g.ngValue))}:function(a,c,g){a.$watch(g.ngValue,function(a){g.$set("value",a)})}}}},zd=W(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==q?"":a)})}),Ad=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding",c);e.$observe("ngBindTemplate",
+function(a){d.text(a)})}}],Bd=[function(){return function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBindHtmlUnsafe);a.$watch(d.ngBindHtmlUnsafe,function(a){c.html(a||"")})}}],Cd=lb("",!0),Dd=lb("Odd",0),Ed=lb("Even",1),Fd=W({compile:function(a,c){c.$set("ngCloak",q);a.removeClass("ng-cloak")}}),Gd=[function(){return{scope:!0,controller:"@"}}],Hd=["$sniffer",function(a){return{priority:1E3,compile:function(){a.csp=!0}}}],gc={};m("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave submit".split(" "),
+function(a){var c=ca("ng-"+a);gc[c]=["$parse",function(d){return function(e,g,h){var f=d(h[c]);g.bind(y(a),function(a){e.$apply(function(){f(e,{$event:a})})})}}]});var Id=["$http","$templateCache","$anchorScroll","$compile",function(a,c,d,e){return{restrict:"ECA",terminal:!0,compile:function(g,h){var f=h.ngInclude||h.src,i=h.onload||"",j=h.autoscroll;return function(g,h){var n=0,o,p=function(){o&&(o.$destroy(),o=null);h.html("")};g.$watch(f,function(f){var m=++n;f?a.get(f,{cache:c}).success(function(a){m===
+n&&(o&&o.$destroy(),o=g.$new(),h.html(a),e(h.contents())(o),v(j)&&(!j||g.$eval(j))&&d(),o.$emit("$includeContentLoaded"),g.$eval(i))}).error(function(){m===n&&p()}):p()})}}}}],Jd=W({compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),Kd=W({terminal:!0,priority:1E3}),Ld=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,g,h){var f=h.count,i=g.attr(h.$attr.when),j=h.offset||0,k=e.$eval(i),l={},n=c.startSymbol(),o=c.endSymbol();m(k,function(a,e){l[e]=
+c(a.replace(d,n+f+"-"+j+o))});e.$watch(function(){var c=parseFloat(e.$eval(f));return isNaN(c)?"":(c in k||(c=a.pluralCat(c-j)),l[c](e,g,!0))},function(a){g.text(a)})}}}],Md=W({transclude:"element",priority:1E3,terminal:!0,compile:function(a,c,d){return function(a,c,h){var f=h.ngRepeat,h=f.match(/^\s*(.+)\s+in\s+(.*)\s*$/),i,j,k;if(!h)throw Error("Expected ngRepeat in form of '_item_ in _collection_' but got '"+f+"'.");f=h[1];i=h[2];h=f.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!h)throw Error("'item' in 'item in collection' should be identifier or (key, value) but got '"+
+f+"'.");j=h[3]||h[1];k=h[2];var l=new hb;a.$watch(function(a){var e,f,h=a.$eval(i),m=c,q=new hb,u,A,w,v,C,s;if(E(h))C=h||[];else{C=[];for(w in h)h.hasOwnProperty(w)&&w.charAt(0)!="$"&&C.push(w);C.sort()}u=C.length-1;e=0;for(f=C.length;e<f;e++){w=h===C?e:C[e];v=h[w];if(s=l.shift(v)){A=s.scope;q.push(v,s);if(e!==s.index)s.index=e,m.after(s.element);m=s.element}else A=a.$new();A[j]=v;k&&(A[k]=w);A.$index=e;A.$first=e===0;A.$last=e===u;A.$middle=!(A.$first||A.$last);s||d(A,function(a){m.after(a);s={scope:A,
+element:m=a,index:e};q.push(v,s)})}for(w in l)if(l.hasOwnProperty(w))for(C=l[w];C.length;)v=C.pop(),v.element.remove(),v.scope.$destroy();l=q})}}}),Nd=W(function(a,c,d){a.$watch(d.ngShow,function(a){c.css("display",Wa(a)?"":"none")})}),Od=W(function(a,c,d){a.$watch(d.ngHide,function(a){c.css("display",Wa(a)?"none":"")})}),Pd=W(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&m(d,function(a,d){c.css(d,"")});a&&c.css(a)},!0)}),Qd=I({restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases=
+{}}],link:function(a,c,d,e){var g,h,f;a.$watch(d.ngSwitch||d.on,function(i){h&&(f.$destroy(),h.remove(),h=f=null);if(g=e.cases["!"+i]||e.cases["?"])a.$eval(d.change),f=a.$new(),g(f,function(a){h=a;c.append(a)})})}}),Rd=W({transclude:"element",priority:500,require:"^ngSwitch",compile:function(a,c,d){return function(a,g,h,f){f.cases["!"+c.ngSwitchWhen]=d}}}),Sd=W({transclude:"element",priority:500,require:"^ngSwitch",compile:function(a,c,d){return function(a,c,h,f){f.cases["?"]=d}}}),Td=W({controller:["$transclude",
+"$element",function(a,c){a(function(a){c.append(a)})}]}),Ud=["$http","$templateCache","$route","$anchorScroll","$compile","$controller",function(a,c,d,e,g,h){return{restrict:"ECA",terminal:!0,link:function(a,c,j){function k(){var j=d.current&&d.current.locals,k=j&&j.$template;if(k){c.html(k);l&&(l.$destroy(),l=null);var k=g(c.contents()),m=d.current;l=m.scope=a.$new();if(m.controller)j.$scope=l,j=h(m.controller,j),c.children().data("$ngControllerController",j);k(l);l.$emit("$viewContentLoaded");l.$eval(n);
+e()}else c.html(""),l&&(l.$destroy(),l=null)}var l,n=j.onload||"";a.$on("$routeChangeSuccess",k);k()}}}],Vd=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){d.type=="text/ng-template"&&a.put(d.id,c[0].text)}}}],Wd=I({terminal:!0}),Xd=["$compile","$parse",function(a,c){var d=/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w\d]*)|(?:\(\s*([\$\w][\$\w\d]*)\s*,\s*([\$\w][\$\w\d]*)\s*\)))\s+in\s+(.*)$/,e={$setViewValue:s};return{restrict:"E",
+require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var i=this,j={},k=e,l;i.databound=d.ngModel;i.init=function(a,c,d){k=a;l=d};i.addOption=function(c){j[c]=!0;k.$viewValue==c&&(a.val(c),l.parent()&&l.remove())};i.removeOption=function(a){this.hasOption(a)&&(delete j[a],k.$viewValue==a&&this.renderUnknownOption(a))};i.renderUnknownOption=function(c){c="? "+fa(c)+" ?";l.val(c);a.prepend(l);a.val(c);l.prop("selected",!0)};i.hasOption=function(a){return j.hasOwnProperty(a)};
+c.$on("$destroy",function(){i.renderUnknownOption=s})}],link:function(e,h,f,i){function j(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(y.parent()&&y.remove(),c.val(a),a===""&&x.prop("selected",!0)):u(a)&&x?c.val(""):e.renderUnknownOption(a)};c.bind("change",function(){a.$apply(function(){y.parent()&&y.remove();d.$setViewValue(c.val())})})}function k(a,c,d){var e;d.$render=function(){var a=new Fa(d.$viewValue);m(c.find("option"),function(c){c.selected=v(a.get(c.value))})};a.$watch(function(){ea(e,
+d.$viewValue)||(e=U(d.$viewValue),d.$render())});c.bind("change",function(){a.$apply(function(){var a=[];m(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function l(e,f,g){function h(){var a={"":[]},c=[""],d,i,s,v,u;s=g.$modelValue;v=o(e)||[];var x=l?nb(v):v,C,y,z;y={};u=!1;var B,E;p&&(u=new Fa(s));for(z=0;C=x.length,z<C;z++){y[k]=v[l?y[l]=x[z]:z];d=m(e,y)||"";if(!(i=a[d]))i=a[d]=[],c.push(d);p?d=u.remove(n(e,y))!=q:(d=s===n(e,y),u=u||d);B=j(e,y);B=B===q?"":B;i.push({id:l?
+x[z]:z,label:B,selected:d})}p||(r||s===null?a[""].unshift({id:"",label:"",selected:!u}):u||a[""].unshift({id:"?",label:"",selected:!0}));y=0;for(x=c.length;y<x;y++){d=c[y];i=a[d];if(w.length<=y)s={element:A.clone().attr("label",d),label:i.label},v=[s],w.push(v),f.append(s.element);else if(v=w[y],s=v[0],s.label!=d)s.element.attr("label",s.label=d);B=null;z=0;for(C=i.length;z<C;z++)if(d=i[z],u=v[z+1]){B=u.element;if(u.label!==d.label)B.text(u.label=d.label);if(u.id!==d.id)B.val(u.id=d.id);if(B[0].selected!==
+d.selected)B.prop("selected",u.selected=d.selected)}else d.id===""&&r?E=r:(E=D.clone()).val(d.id).attr("selected",d.selected).text(d.label),v.push({element:E,label:d.label,id:d.id,selected:d.selected}),B?B.after(E):s.element.append(E),B=E;for(z++;v.length>z;)v.pop().element.remove()}for(;w.length>y;)w.pop()[0].element.remove()}var i;if(!(i=s.match(d)))throw Error("Expected ngOptions in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '"+s+"'.");var j=c(i[2]||i[1]),k=i[4]||
+i[6],l=i[5],m=c(i[3]||""),n=c(i[2]?i[1]:k),o=c(i[7]),w=[[{element:f,label:""}]];r&&(a(r)(e),r.removeClass("ng-scope"),r.remove());f.html("");f.bind("change",function(){e.$apply(function(){var a,c=o(e)||[],d={},h,i,j,m,r,s;if(p){i=[];m=0;for(s=w.length;m<s;m++){a=w[m];j=1;for(r=a.length;j<r;j++)if((h=a[j].element)[0].selected)h=h.val(),l&&(d[l]=h),d[k]=c[h],i.push(n(e,d))}}else h=f.val(),h=="?"?i=q:h==""?i=null:(d[k]=c[h],l&&(d[l]=h),i=n(e,d));g.$setViewValue(i)})});g.$render=h;e.$watch(h)}if(i[1]){for(var n=
+i[0],o=i[1],p=f.multiple,s=f.ngOptions,r=!1,x,D=w(T.createElement("option")),A=w(T.createElement("optgroup")),y=D.clone(),i=0,B=h.children(),C=B.length;i<C;i++)if(B[i].value==""){x=r=B.eq(i);break}n.init(o,r,y);if(p&&(f.required||f.ngRequired)){var E=function(a){o.$setValidity("required",!f.required||a&&a.length);return a};o.$parsers.push(E);o.$formatters.unshift(E);f.$observe("required",function(){E(o.$viewValue)})}s?l(e,h,o):p?k(e,h,o):j(e,h,o,n)}}}}],Yd=["$interpolate",function(a){var c={addOption:s,
+removeOption:s};return{restrict:"E",priority:100,compile:function(d,e){if(u(e.value)){var g=a(d.text(),!0);g||e.$set("value",d.text())}return function(a,d,e){var j=d.parent(),k=j.data("$selectController")||j.parent().data("$selectController");k&&k.databound?d.prop("selected",!1):k=c;g?a.$watch(g,function(a,c){e.$set("value",a);a!==c&&k.removeOption(c);k.addOption(a)}):k.addOption(e.value);d.bind("$destroy",function(){k.removeOption(e.value)})}}}}],Zd=I({restrict:"E",terminal:!0});(aa=P.jQuery)?(w=
+aa,D(aa.fn,{scope:va.scope,controller:va.controller,injector:va.injector,inheritedData:va.inheritedData}),db("remove",!0,!0,!1),db("empty",!1,!1,!1),db("html",!1,!1,!0)):w=L;$a.element=w;(function(a){D(a,{bootstrap:tb,copy:U,extend:D,equals:ea,element:w,forEach:m,injector:ub,noop:s,bind:Va,toJson:ba,fromJson:qb,identity:na,isUndefined:u,isDefined:v,isString:B,isFunction:H,isObject:M,isNumber:Ra,isElement:ic,isArray:E,version:md,isDate:oa,lowercase:y,uppercase:la,callbacks:{counter:0}});ta=nc(P);try{ta("ngLocale")}catch(c){ta("ngLocale",
+[]).provider("$locale",cd)}ta("ng",["ngLocale"],["$provide",function(a){a.provider("$compile",Fb).directive({a:nd,input:ec,textarea:ec,form:od,script:Vd,select:Xd,style:Zd,option:Yd,ngBind:zd,ngBindHtmlUnsafe:Bd,ngBindTemplate:Ad,ngClass:Cd,ngClassEven:Ed,ngClassOdd:Dd,ngCsp:Hd,ngCloak:Fd,ngController:Gd,ngForm:pd,ngHide:Od,ngInclude:Id,ngInit:Jd,ngNonBindable:Kd,ngPluralize:Ld,ngRepeat:Md,ngShow:Nd,ngStyle:Pd,ngSwitch:Qd,ngSwitchWhen:Rd,ngSwitchDefault:Sd,ngOptions:Wd,ngView:Ud,ngTransclude:Td,ngModel:ud,
+ngList:wd,ngChange:vd,required:fc,ngRequired:fc,ngValue:yd}).directive(mb).directive(gc);a.provider({$anchorScroll:wc,$browser:zc,$cacheFactory:Ac,$controller:Fc,$document:Gc,$exceptionHandler:Hc,$filter:Tb,$interpolate:Ic,$http:Zc,$httpBackend:$c,$location:Mc,$log:Nc,$parse:Rc,$route:Uc,$routeParams:Vc,$rootScope:Wc,$q:Sc,$sniffer:Xc,$templateCache:Bc,$timeout:dd,$window:Yc})}])})($a);w(T).ready(function(){lc(T,tb)})})(window,document);angular.element(document).find("head").append('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none !important;}ng\\:form{display:block;}</style>');
diff --git a/static/demo/components/angular/bower.json b/static/demo/components/angular/bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..14f1953506a3f815a54bd55b46a406fa854be311
--- /dev/null
+++ b/static/demo/components/angular/bower.json
@@ -0,0 +1,7 @@
+{
+  "name": "angular",
+  "version": "1.0.8",
+  "main": "./angular.js",
+  "dependencies": {
+  }
+}
diff --git a/static/demo/components/bootstrap.css/.bower.json b/static/demo/components/bootstrap.css/.bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..0dd1adfd753f022bdc785cb19addc0cadd6f279e
--- /dev/null
+++ b/static/demo/components/bootstrap.css/.bower.json
@@ -0,0 +1,38 @@
+{
+  "name": "bootstrap",
+  "description": "Sleek, intuitive, and powerful front-end framework for faster and easier web development.  This is the version that should be available to bower.",
+  "version": "2.1.1",
+  "keywords": [
+    "bootstrap",
+    "css",
+    "bootstrap.js"
+  ],
+  "homepage": "http://twitter.github.com/bootstrap/",
+  "author": {
+    "name": "Twitter Inc."
+  },
+  "scripts": {
+    "test": "make test"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/bowerjs/bootstrap.git"
+  },
+  "licenses": [
+    {
+      "type": "Apache-2.0",
+      "url": "http://www.apache.org/licenses/LICENSE-2.0"
+    }
+  ],
+  "readme": "[Twitter Bootstrap](http://twitter.github.com/bootstrap) [![Build Status](https://secure.travis-ci.org/twitter/bootstrap.png)](http://travis-ci.org/twitter/bootstrap)\n=================\n\nBootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created and maintained by [Mark Otto](http://twitter.com/mdo) and [Jacob Thornton](http://twitter.com/fat) at Twitter.\n\nTo get started, checkout http://getbootstrap.com!\n\n\n\nQuick start\n-----------\n\nClone the repo, `git clone git://github.com/twitter/bootstrap.git`, or [download the latest release](https://github.com/twitter/bootstrap/zipball/master).\n\n\n\nVersioning\n----------\n\nFor transparency and insight into our release cycle, and for striving to maintain backward compatibility, Bootstrap will be maintained under the Semantic Versioning guidelines as much as possible.\n\nReleases will be numbered with the following format:\n\n`<major>.<minor>.<patch>`\n\nAnd constructed with the following guidelines:\n\n* Breaking backward compatibility bumps the major (and resets the minor and patch)\n* New additions without breaking backward compatibility bumps the minor (and resets the patch)\n* Bug fixes and misc changes bumps the patch\n\nFor more information on SemVer, please visit http://semver.org/.\n\n\n\nBug tracker\n-----------\n\nHave a bug? Please create an issue here on GitHub that conforms with [necolas's guidelines](https://github.com/necolas/issue-guidelines).\n\nhttps://github.com/twitter/bootstrap/issues\n\n\n\nTwitter account\n---------------\n\nKeep up to date on announcements and more by following Bootstrap on Twitter, [@TwBootstrap](http://twitter.com/TwBootstrap).\n\n\n\nBlog\n----\n\nRead more detailed announcements, discussions, and more on [The Official Twitter Bootstrap Blog](http://blog.getbootstrap.com).\n\n\n\nMailing list\n------------\n\nHave a question? Ask on our mailing list!\n\ntwitter-bootstrap@googlegroups.com\n\nhttp://groups.google.com/group/twitter-bootstrap\n\n\n\nIRC\n---\n\nServer: irc.freenode.net\n\nChannel: ##twitter-bootstrap (the double ## is not a typo)\n\n\n\nDevelopers\n----------\n\nWe have included a makefile with convenience methods for working with the Bootstrap library.\n\n+ **dependencies**\nOur makefile depends on you having recess, connect, uglify.js, and jshint installed. To install, just run the following command in npm:\n\n```\n$ npm install recess connect uglify-js jshint -g\n```\n\n+ **build** - `make`\nRuns the recess compiler to rebuild the `/less` files and compiles the docs pages. Requires recess and uglify-js. <a href=\"http://twitter.github.com/bootstrap/less.html#compiling\">Read more in our docs &raquo;</a>\n\n+ **test** - `make test`\nRuns jshint and qunit tests headlessly in [phantomjs](http://code.google.com/p/phantomjs/) (used for ci). Depends on having phantomjs installed.\n\n+ **watch** - `make watch`\nThis is a convenience method for watching just Less files and automatically building them whenever you save. Requires the Watchr gem.\n\n\n\nContributing\n------------\n\nPlease submit all pull requests against *-wip branches. If your unit test contains javascript patches or features, you must include relevant unit tests. Thanks!\n\n\n\nAuthors\n-------\n\n**Mark Otto**\n\n+ http://twitter.com/mdo\n+ http://github.com/markdotto\n\n**Jacob Thornton**\n\n+ http://twitter.com/fat\n+ http://github.com/fat\n\n\n\nCopyright and license\n---------------------\n\nCopyright 2012 Twitter, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this work except in compliance with the License.\nYou may obtain a copy of the License in the LICENSE file, or at:\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
+  "_id": "bootstrap@2.1.1",
+  "_release": "2.1.1",
+  "_resolution": {
+    "type": "version",
+    "tag": "2.1.1",
+    "commit": "e308a950094356d5f501187a7241002a6d3222b1"
+  },
+  "_source": "git://github.com/bowerjs/bootstrap.git",
+  "_target": "~2.1.1",
+  "_originalSource": "git://github.com/bowerjs/bootstrap.git"
+}
\ No newline at end of file
diff --git a/static/demo/components/bootstrap.css/README.md b/static/demo/components/bootstrap.css/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..b82b70e5b9b9092935e7105257a9bb22d5950ae6
--- /dev/null
+++ b/static/demo/components/bootstrap.css/README.md
@@ -0,0 +1,141 @@
+[Twitter Bootstrap](http://twitter.github.com/bootstrap) [![Build Status](https://secure.travis-ci.org/twitter/bootstrap.png)](http://travis-ci.org/twitter/bootstrap)
+=================
+
+This version of Bootstrap is maintained to be only the built version of bootstrap to be used with bower.  If you are looking for the full source of bootstrap go to [bootstrap](https://github.com/twitter/bootstrap)
+
+Bootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created and maintained by [Mark Otto](http://twitter.com/mdo) and [Jacob Thornton](http://twitter.com/fat) at Twitter.
+
+To get started, checkout http://getbootstrap.com!
+
+
+
+Quick start
+-----------
+
+Clone the repo, `git clone git://github.com/twitter/bootstrap.git`, or [download the latest release](https://github.com/twitter/bootstrap/zipball/master).
+
+
+
+Versioning
+----------
+
+For transparency and insight into our release cycle, and for striving to maintain backward compatibility, Bootstrap will be maintained under the Semantic Versioning guidelines as much as possible.
+
+Releases will be numbered with the following format:
+
+`<major>.<minor>.<patch>`
+
+And constructed with the following guidelines:
+
+* Breaking backward compatibility bumps the major (and resets the minor and patch)
+* New additions without breaking backward compatibility bumps the minor (and resets the patch)
+* Bug fixes and misc changes bumps the patch
+
+For more information on SemVer, please visit http://semver.org/.
+
+
+
+Bug tracker
+-----------
+
+Have a bug? Please create an issue here on GitHub that conforms with [necolas's guidelines](https://github.com/necolas/issue-guidelines).
+
+https://github.com/twitter/bootstrap/issues
+
+
+
+Twitter account
+---------------
+
+Keep up to date on announcements and more by following Bootstrap on Twitter, [@TwBootstrap](http://twitter.com/TwBootstrap).
+
+
+
+Blog
+----
+
+Read more detailed announcements, discussions, and more on [The Official Twitter Bootstrap Blog](http://blog.getbootstrap.com).
+
+
+
+Mailing list
+------------
+
+Have a question? Ask on our mailing list!
+
+twitter-bootstrap@googlegroups.com
+
+http://groups.google.com/group/twitter-bootstrap
+
+
+
+IRC
+---
+
+Server: irc.freenode.net
+
+Channel: ##twitter-bootstrap (the double ## is not a typo)
+
+
+
+Developers
+----------
+
+We have included a makefile with convenience methods for working with the Bootstrap library.
+
++ **dependencies**
+Our makefile depends on you having recess, connect, uglify.js, and jshint installed. To install, just run the following command in npm:
+
+```
+$ npm install recess connect uglify-js jshint -g
+```
+
++ **build** - `make`
+Runs the recess compiler to rebuild the `/less` files and compiles the docs pages. Requires recess and uglify-js. <a href="http://twitter.github.com/bootstrap/less.html#compiling">Read more in our docs &raquo;</a>
+
++ **test** - `make test`
+Runs jshint and qunit tests headlessly in [phantomjs](http://code.google.com/p/phantomjs/) (used for ci). Depends on having phantomjs installed.
+
++ **watch** - `make watch`
+This is a convenience method for watching just Less files and automatically building them whenever you save. Requires the Watchr gem.
+
+
+
+Contributing
+------------
+
+Please submit all pull requests against *-wip branches. If your unit test contains javascript patches or features, you must include relevant unit tests. Thanks!
+
+
+
+Authors
+-------
+
+**Mark Otto**
+
++ http://twitter.com/mdo
++ http://github.com/markdotto
+
+**Jacob Thornton**
+
++ http://twitter.com/fat
++ http://github.com/fat
+
+
+
+Copyright and license
+---------------------
+
+Copyright 2012 Twitter, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this work except in compliance with the License.
+You may obtain a copy of the License in the LICENSE file, or at:
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/static/demo/components/bootstrap.css/component.json b/static/demo/components/bootstrap.css/component.json
new file mode 100644
index 0000000000000000000000000000000000000000..ec55b2867f2c8b11d397ac66ebc09dbca0545e91
--- /dev/null
+++ b/static/demo/components/bootstrap.css/component.json
@@ -0,0 +1,29 @@
+{
+    "name": "bootstrap",
+    "description": "Sleek, intuitive, and powerful front-end framework for faster and easier web development.  This is the version that should be available to bower.",
+    "version": "2.1.1",
+    "keywords": [
+        "bootstrap",
+        "css",
+        "bootstrap.js"
+    ],
+    "homepage": "http://twitter.github.com/bootstrap/",
+    "author": {
+        "name": "Twitter Inc."
+    },
+    "scripts": {
+        "test": "make test"
+    },
+    "repository": {
+        "type": "git",
+        "url": "git://github.com/bowerjs/bootstrap.git"
+    },
+    "licenses": [
+        {
+            "type": "Apache-2.0",
+            "url": "http://www.apache.org/licenses/LICENSE-2.0"
+        }
+    ],
+    "readme": "[Twitter Bootstrap](http://twitter.github.com/bootstrap) [![Build Status](https://secure.travis-ci.org/twitter/bootstrap.png)](http://travis-ci.org/twitter/bootstrap)\n=================\n\nBootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created and maintained by [Mark Otto](http://twitter.com/mdo) and [Jacob Thornton](http://twitter.com/fat) at Twitter.\n\nTo get started, checkout http://getbootstrap.com!\n\n\n\nQuick start\n-----------\n\nClone the repo, `git clone git://github.com/twitter/bootstrap.git`, or [download the latest release](https://github.com/twitter/bootstrap/zipball/master).\n\n\n\nVersioning\n----------\n\nFor transparency and insight into our release cycle, and for striving to maintain backward compatibility, Bootstrap will be maintained under the Semantic Versioning guidelines as much as possible.\n\nReleases will be numbered with the following format:\n\n`<major>.<minor>.<patch>`\n\nAnd constructed with the following guidelines:\n\n* Breaking backward compatibility bumps the major (and resets the minor and patch)\n* New additions without breaking backward compatibility bumps the minor (and resets the patch)\n* Bug fixes and misc changes bumps the patch\n\nFor more information on SemVer, please visit http://semver.org/.\n\n\n\nBug tracker\n-----------\n\nHave a bug? Please create an issue here on GitHub that conforms with [necolas's guidelines](https://github.com/necolas/issue-guidelines).\n\nhttps://github.com/twitter/bootstrap/issues\n\n\n\nTwitter account\n---------------\n\nKeep up to date on announcements and more by following Bootstrap on Twitter, [@TwBootstrap](http://twitter.com/TwBootstrap).\n\n\n\nBlog\n----\n\nRead more detailed announcements, discussions, and more on [The Official Twitter Bootstrap Blog](http://blog.getbootstrap.com).\n\n\n\nMailing list\n------------\n\nHave a question? Ask on our mailing list!\n\ntwitter-bootstrap@googlegroups.com\n\nhttp://groups.google.com/group/twitter-bootstrap\n\n\n\nIRC\n---\n\nServer: irc.freenode.net\n\nChannel: ##twitter-bootstrap (the double ## is not a typo)\n\n\n\nDevelopers\n----------\n\nWe have included a makefile with convenience methods for working with the Bootstrap library.\n\n+ **dependencies**\nOur makefile depends on you having recess, connect, uglify.js, and jshint installed. To install, just run the following command in npm:\n\n```\n$ npm install recess connect uglify-js jshint -g\n```\n\n+ **build** - `make`\nRuns the recess compiler to rebuild the `/less` files and compiles the docs pages. Requires recess and uglify-js. <a href=\"http://twitter.github.com/bootstrap/less.html#compiling\">Read more in our docs &raquo;</a>\n\n+ **test** - `make test`\nRuns jshint and qunit tests headlessly in [phantomjs](http://code.google.com/p/phantomjs/) (used for ci). Depends on having phantomjs installed.\n\n+ **watch** - `make watch`\nThis is a convenience method for watching just Less files and automatically building them whenever you save. Requires the Watchr gem.\n\n\n\nContributing\n------------\n\nPlease submit all pull requests against *-wip branches. If your unit test contains javascript patches or features, you must include relevant unit tests. Thanks!\n\n\n\nAuthors\n-------\n\n**Mark Otto**\n\n+ http://twitter.com/mdo\n+ http://github.com/markdotto\n\n**Jacob Thornton**\n\n+ http://twitter.com/fat\n+ http://github.com/fat\n\n\n\nCopyright and license\n---------------------\n\nCopyright 2012 Twitter, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this work except in compliance with the License.\nYou may obtain a copy of the License in the LICENSE file, or at:\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n",
+    "_id": "bootstrap@2.1.1"
+}
\ No newline at end of file
diff --git a/static/demo/components/bootstrap.css/css/bootstrap-responsive.css b/static/demo/components/bootstrap.css/css/bootstrap-responsive.css
new file mode 100644
index 0000000000000000000000000000000000000000..9259d26dca9111efc3ec6011c2e926e86afa95fc
--- /dev/null
+++ b/static/demo/components/bootstrap.css/css/bootstrap-responsive.css
@@ -0,0 +1,1058 @@
+/*!
+ * Bootstrap Responsive v2.1.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+.visible-phone {
+  display: none !important;
+}
+
+.visible-tablet {
+  display: none !important;
+}
+
+.hidden-desktop {
+  display: none !important;
+}
+
+.visible-desktop {
+  display: inherit !important;
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+}
+
+@media (max-width: 767px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .row {
+    margin-left: -30px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 30px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1170px;
+  }
+  .span12 {
+    width: 1170px;
+  }
+  .span11 {
+    width: 1070px;
+  }
+  .span10 {
+    width: 970px;
+  }
+  .span9 {
+    width: 870px;
+  }
+  .span8 {
+    width: 770px;
+  }
+  .span7 {
+    width: 670px;
+  }
+  .span6 {
+    width: 570px;
+  }
+  .span5 {
+    width: 470px;
+  }
+  .span4 {
+    width: 370px;
+  }
+  .span3 {
+    width: 270px;
+  }
+  .span2 {
+    width: 170px;
+  }
+  .span1 {
+    width: 70px;
+  }
+  .offset12 {
+    margin-left: 1230px;
+  }
+  .offset11 {
+    margin-left: 1130px;
+  }
+  .offset10 {
+    margin-left: 1030px;
+  }
+  .offset9 {
+    margin-left: 930px;
+  }
+  .offset8 {
+    margin-left: 830px;
+  }
+  .offset7 {
+    margin-left: 730px;
+  }
+  .offset6 {
+    margin-left: 630px;
+  }
+  .offset5 {
+    margin-left: 530px;
+  }
+  .offset4 {
+    margin-left: 430px;
+  }
+  .offset3 {
+    margin-left: 330px;
+  }
+  .offset2 {
+    margin-left: 230px;
+  }
+  .offset1 {
+    margin-left: 130px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.564102564102564%;
+    *margin-left: 2.5109110747408616%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.45299145299145%;
+    *width: 91.39979996362975%;
+  }
+  .row-fluid .span10 {
+    width: 82.90598290598291%;
+    *width: 82.8527914166212%;
+  }
+  .row-fluid .span9 {
+    width: 74.35897435897436%;
+    *width: 74.30578286961266%;
+  }
+  .row-fluid .span8 {
+    width: 65.81196581196582%;
+    *width: 65.75877432260411%;
+  }
+  .row-fluid .span7 {
+    width: 57.26495726495726%;
+    *width: 57.21176577559556%;
+  }
+  .row-fluid .span6 {
+    width: 48.717948717948715%;
+    *width: 48.664757228587014%;
+  }
+  .row-fluid .span5 {
+    width: 40.17094017094017%;
+    *width: 40.11774868157847%;
+  }
+  .row-fluid .span4 {
+    width: 31.623931623931625%;
+    *width: 31.570740134569924%;
+  }
+  .row-fluid .span3 {
+    width: 23.076923076923077%;
+    *width: 23.023731587561375%;
+  }
+  .row-fluid .span2 {
+    width: 14.52991452991453%;
+    *width: 14.476723040552828%;
+  }
+  .row-fluid .span1 {
+    width: 5.982905982905983%;
+    *width: 5.929714493544281%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.12820512820512%;
+    *margin-left: 105.02182214948171%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.56410256410257%;
+    *margin-left: 102.45771958537915%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.58119658119658%;
+    *margin-left: 96.47481360247316%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.01709401709402%;
+    *margin-left: 93.91071103837061%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.03418803418803%;
+    *margin-left: 87.92780505546462%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.47008547008548%;
+    *margin-left: 85.36370249136206%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.48717948717949%;
+    *margin-left: 79.38079650845607%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 76.92307692307693%;
+    *margin-left: 76.81669394435352%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 70.94017094017094%;
+    *margin-left: 70.83378796144753%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.37606837606839%;
+    *margin-left: 68.26968539734497%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.393162393162385%;
+    *margin-left: 62.28677941443899%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.82905982905982%;
+    *margin-left: 59.72267685033642%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 53.84615384615384%;
+    *margin-left: 53.739770867430444%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.28205128205128%;
+    *margin-left: 51.175668303327875%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.299145299145295%;
+    *margin-left: 45.1927623204219%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.73504273504273%;
+    *margin-left: 42.62865975631933%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 36.75213675213675%;
+    *margin-left: 36.645753773413354%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.18803418803419%;
+    *margin-left: 34.081651209310785%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.205128205128204%;
+    *margin-left: 28.0987452264048%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.641025641025642%;
+    *margin-left: 25.53464266230224%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.65811965811966%;
+    *margin-left: 19.551736679396257%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.094017094017094%;
+    *margin-left: 16.98763411529369%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.11111111111111%;
+    *margin-left: 11.004728132387708%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.547008547008547%;
+    *margin-left: 8.440625568285142%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 30px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 1156px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 1056px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 956px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 856px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 756px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 656px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 556px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 456px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 356px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 256px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 156px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 56px;
+  }
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -20px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 20px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 724px;
+  }
+  .span12 {
+    width: 724px;
+  }
+  .span11 {
+    width: 662px;
+  }
+  .span10 {
+    width: 600px;
+  }
+  .span9 {
+    width: 538px;
+  }
+  .span8 {
+    width: 476px;
+  }
+  .span7 {
+    width: 414px;
+  }
+  .span6 {
+    width: 352px;
+  }
+  .span5 {
+    width: 290px;
+  }
+  .span4 {
+    width: 228px;
+  }
+  .span3 {
+    width: 166px;
+  }
+  .span2 {
+    width: 104px;
+  }
+  .span1 {
+    width: 42px;
+  }
+  .offset12 {
+    margin-left: 764px;
+  }
+  .offset11 {
+    margin-left: 702px;
+  }
+  .offset10 {
+    margin-left: 640px;
+  }
+  .offset9 {
+    margin-left: 578px;
+  }
+  .offset8 {
+    margin-left: 516px;
+  }
+  .offset7 {
+    margin-left: 454px;
+  }
+  .offset6 {
+    margin-left: 392px;
+  }
+  .offset5 {
+    margin-left: 330px;
+  }
+  .offset4 {
+    margin-left: 268px;
+  }
+  .offset3 {
+    margin-left: 206px;
+  }
+  .offset2 {
+    margin-left: 144px;
+  }
+  .offset1 {
+    margin-left: 82px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.7624309392265194%;
+    *margin-left: 2.709239449864817%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.43646408839778%;
+    *width: 91.38327259903608%;
+  }
+  .row-fluid .span10 {
+    width: 82.87292817679558%;
+    *width: 82.81973668743387%;
+  }
+  .row-fluid .span9 {
+    width: 74.30939226519337%;
+    *width: 74.25620077583166%;
+  }
+  .row-fluid .span8 {
+    width: 65.74585635359117%;
+    *width: 65.69266486422946%;
+  }
+  .row-fluid .span7 {
+    width: 57.18232044198895%;
+    *width: 57.12912895262725%;
+  }
+  .row-fluid .span6 {
+    width: 48.61878453038674%;
+    *width: 48.56559304102504%;
+  }
+  .row-fluid .span5 {
+    width: 40.05524861878453%;
+    *width: 40.00205712942283%;
+  }
+  .row-fluid .span4 {
+    width: 31.491712707182323%;
+    *width: 31.43852121782062%;
+  }
+  .row-fluid .span3 {
+    width: 22.92817679558011%;
+    *width: 22.87498530621841%;
+  }
+  .row-fluid .span2 {
+    width: 14.3646408839779%;
+    *width: 14.311449394616199%;
+  }
+  .row-fluid .span1 {
+    width: 5.801104972375691%;
+    *width: 5.747913483013988%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.52486187845304%;
+    *margin-left: 105.41847889972962%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.76243093922652%;
+    *margin-left: 102.6560479605031%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.96132596685082%;
+    *margin-left: 96.8549429881274%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.1988950276243%;
+    *margin-left: 94.09251204890089%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.39779005524862%;
+    *margin-left: 88.2914070765252%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.6353591160221%;
+    *margin-left: 85.52897613729868%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.8342541436464%;
+    *margin-left: 79.72787116492299%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 77.07182320441989%;
+    *margin-left: 76.96544022569647%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 71.2707182320442%;
+    *margin-left: 71.16433525332079%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.50828729281768%;
+    *margin-left: 68.40190431409427%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.70718232044199%;
+    *margin-left: 62.600799341718584%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.94475138121547%;
+    *margin-left: 59.838368402492065%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 54.14364640883978%;
+    *margin-left: 54.037263430116376%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.38121546961326%;
+    *margin-left: 51.27483249088986%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.58011049723757%;
+    *margin-left: 45.47372751851417%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.81767955801105%;
+    *margin-left: 42.71129657928765%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 37.01657458563536%;
+    *margin-left: 36.91019160691196%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.25414364640884%;
+    *margin-left: 34.14776066768544%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.45303867403315%;
+    *margin-left: 28.346655695309746%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.69060773480663%;
+    *margin-left: 25.584224756083227%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.88950276243094%;
+    *margin-left: 19.783119783707537%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.12707182320442%;
+    *margin-left: 17.02068884448102%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.32596685082873%;
+    *margin-left: 11.219583872105325%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.56353591160221%;
+    *margin-left: 8.457152932878806%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 20px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 710px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 648px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 586px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 524px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 462px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 400px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 338px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 276px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 214px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 152px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 90px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 28px;
+  }
+}
+
+@media (max-width: 767px) {
+  body {
+    padding-right: 20px;
+    padding-left: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom,
+  .navbar-static-top {
+    margin-right: -20px;
+    margin-left: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    width: auto;
+    clear: none;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0;
+  }
+  [class*="span"],
+  .row-fluid [class*="span"] {
+    display: block;
+    float: none;
+    width: 100%;
+    margin-left: 0;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 0;
+  }
+  .modal {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    left: 20px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade.in {
+    top: auto;
+  }
+}
+
+@media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 20px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+  .modal {
+    top: 10px;
+    right: 10px;
+    left: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+
+@media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 20px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 20px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  .navbar .brand {
+    padding-right: 10px;
+    padding-left: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 10px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #777777;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: #777777;
+    -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+            border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+            border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .dropdown-menu a:hover {
+    background-color: #f2f2f2;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover {
+    background-color: #111111;
+  }
+  .nav-collapse.in .btn-group {
+    padding: 0;
+    margin-top: 5px;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    display: block;
+    float: none;
+    max-width: none;
+    padding: 0;
+    margin: 0 15px;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+            border-radius: 0;
+    -webkit-box-shadow: none;
+       -moz-box-shadow: none;
+            box-shadow: none;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .nav > li > .dropdown-menu:before,
+  .nav-collapse .nav > li > .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 10px 15px;
+    margin: 10px 0;
+    border-top: 1px solid #f2f2f2;
+    border-bottom: 1px solid #f2f2f2;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  }
+  .navbar-inverse .nav-collapse .navbar-form,
+  .navbar-inverse .nav-collapse .navbar-search {
+    border-top-color: #111111;
+    border-bottom-color: #111111;
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    height: 0;
+    overflow: hidden;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+}
+
+@media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}
diff --git a/static/demo/components/bootstrap.css/css/bootstrap-responsive.min.css b/static/demo/components/bootstrap.css/css/bootstrap-responsive.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..7b0158da04d8db2c18c8ab6950c2d2decfc69f0e
--- /dev/null
+++ b/static/demo/components/bootstrap.css/css/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.1.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade.in{top:auto}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/static/demo/components/bootstrap.css/css/bootstrap.css b/static/demo/components/bootstrap.css/css/bootstrap.css
new file mode 100644
index 0000000000000000000000000000000000000000..9fa6f766fc8af2c816697c45d4e0e26c0875a02f
--- /dev/null
+++ b/static/demo/components/bootstrap.css/css/bootstrap.css
@@ -0,0 +1,5774 @@
+/*!
+ * Bootstrap v2.1.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+
+audio:not([controls]) {
+  display: none;
+}
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+a:hover,
+a:active {
+  outline: 0;
+}
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+img {
+  width: auto\9;
+  height: auto;
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+
+#map_canvas img {
+  max-width: none;
+}
+
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  background-color: #ffffff;
+}
+
+a {
+  color: #0088cc;
+  text-decoration: none;
+}
+
+a:hover {
+  color: #005580;
+  text-decoration: underline;
+}
+
+.img-rounded {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.img-polaroid {
+  padding: 4px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+
+.img-circle {
+  -webkit-border-radius: 500px;
+     -moz-border-radius: 500px;
+          border-radius: 500px;
+}
+
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+
+.row:before,
+.row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row:after {
+  clear: both;
+}
+
+[class*="span"] {
+  float: left;
+  min-height: 1px;
+  margin-left: 20px;
+}
+
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.span12 {
+  width: 940px;
+}
+
+.span11 {
+  width: 860px;
+}
+
+.span10 {
+  width: 780px;
+}
+
+.span9 {
+  width: 700px;
+}
+
+.span8 {
+  width: 620px;
+}
+
+.span7 {
+  width: 540px;
+}
+
+.span6 {
+  width: 460px;
+}
+
+.span5 {
+  width: 380px;
+}
+
+.span4 {
+  width: 300px;
+}
+
+.span3 {
+  width: 220px;
+}
+
+.span2 {
+  width: 140px;
+}
+
+.span1 {
+  width: 60px;
+}
+
+.offset12 {
+  margin-left: 980px;
+}
+
+.offset11 {
+  margin-left: 900px;
+}
+
+.offset10 {
+  margin-left: 820px;
+}
+
+.offset9 {
+  margin-left: 740px;
+}
+
+.offset8 {
+  margin-left: 660px;
+}
+
+.offset7 {
+  margin-left: 580px;
+}
+
+.offset6 {
+  margin-left: 500px;
+}
+
+.offset5 {
+  margin-left: 420px;
+}
+
+.offset4 {
+  margin-left: 340px;
+}
+
+.offset3 {
+  margin-left: 260px;
+}
+
+.offset2 {
+  margin-left: 180px;
+}
+
+.offset1 {
+  margin-left: 100px;
+}
+
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row-fluid:after {
+  clear: both;
+}
+
+.row-fluid [class*="span"] {
+  display: block;
+  float: left;
+  width: 100%;
+  min-height: 30px;
+  margin-left: 2.127659574468085%;
+  *margin-left: 2.074468085106383%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+
+.row-fluid .span12 {
+  width: 100%;
+  *width: 99.94680851063829%;
+}
+
+.row-fluid .span11 {
+  width: 91.48936170212765%;
+  *width: 91.43617021276594%;
+}
+
+.row-fluid .span10 {
+  width: 82.97872340425532%;
+  *width: 82.92553191489361%;
+}
+
+.row-fluid .span9 {
+  width: 74.46808510638297%;
+  *width: 74.41489361702126%;
+}
+
+.row-fluid .span8 {
+  width: 65.95744680851064%;
+  *width: 65.90425531914893%;
+}
+
+.row-fluid .span7 {
+  width: 57.44680851063829%;
+  *width: 57.39361702127659%;
+}
+
+.row-fluid .span6 {
+  width: 48.93617021276595%;
+  *width: 48.88297872340425%;
+}
+
+.row-fluid .span5 {
+  width: 40.42553191489362%;
+  *width: 40.37234042553192%;
+}
+
+.row-fluid .span4 {
+  width: 31.914893617021278%;
+  *width: 31.861702127659576%;
+}
+
+.row-fluid .span3 {
+  width: 23.404255319148934%;
+  *width: 23.351063829787233%;
+}
+
+.row-fluid .span2 {
+  width: 14.893617021276595%;
+  *width: 14.840425531914894%;
+}
+
+.row-fluid .span1 {
+  width: 6.382978723404255%;
+  *width: 6.329787234042553%;
+}
+
+.row-fluid .offset12 {
+  margin-left: 104.25531914893617%;
+  *margin-left: 104.14893617021275%;
+}
+
+.row-fluid .offset12:first-child {
+  margin-left: 102.12765957446808%;
+  *margin-left: 102.02127659574467%;
+}
+
+.row-fluid .offset11 {
+  margin-left: 95.74468085106382%;
+  *margin-left: 95.6382978723404%;
+}
+
+.row-fluid .offset11:first-child {
+  margin-left: 93.61702127659574%;
+  *margin-left: 93.51063829787232%;
+}
+
+.row-fluid .offset10 {
+  margin-left: 87.23404255319149%;
+  *margin-left: 87.12765957446807%;
+}
+
+.row-fluid .offset10:first-child {
+  margin-left: 85.1063829787234%;
+  *margin-left: 84.99999999999999%;
+}
+
+.row-fluid .offset9 {
+  margin-left: 78.72340425531914%;
+  *margin-left: 78.61702127659572%;
+}
+
+.row-fluid .offset9:first-child {
+  margin-left: 76.59574468085106%;
+  *margin-left: 76.48936170212764%;
+}
+
+.row-fluid .offset8 {
+  margin-left: 70.2127659574468%;
+  *margin-left: 70.10638297872339%;
+}
+
+.row-fluid .offset8:first-child {
+  margin-left: 68.08510638297872%;
+  *margin-left: 67.9787234042553%;
+}
+
+.row-fluid .offset7 {
+  margin-left: 61.70212765957446%;
+  *margin-left: 61.59574468085106%;
+}
+
+.row-fluid .offset7:first-child {
+  margin-left: 59.574468085106375%;
+  *margin-left: 59.46808510638297%;
+}
+
+.row-fluid .offset6 {
+  margin-left: 53.191489361702125%;
+  *margin-left: 53.085106382978715%;
+}
+
+.row-fluid .offset6:first-child {
+  margin-left: 51.063829787234035%;
+  *margin-left: 50.95744680851063%;
+}
+
+.row-fluid .offset5 {
+  margin-left: 44.68085106382979%;
+  *margin-left: 44.57446808510638%;
+}
+
+.row-fluid .offset5:first-child {
+  margin-left: 42.5531914893617%;
+  *margin-left: 42.4468085106383%;
+}
+
+.row-fluid .offset4 {
+  margin-left: 36.170212765957444%;
+  *margin-left: 36.06382978723405%;
+}
+
+.row-fluid .offset4:first-child {
+  margin-left: 34.04255319148936%;
+  *margin-left: 33.93617021276596%;
+}
+
+.row-fluid .offset3 {
+  margin-left: 27.659574468085104%;
+  *margin-left: 27.5531914893617%;
+}
+
+.row-fluid .offset3:first-child {
+  margin-left: 25.53191489361702%;
+  *margin-left: 25.425531914893618%;
+}
+
+.row-fluid .offset2 {
+  margin-left: 19.148936170212764%;
+  *margin-left: 19.04255319148936%;
+}
+
+.row-fluid .offset2:first-child {
+  margin-left: 17.02127659574468%;
+  *margin-left: 16.914893617021278%;
+}
+
+.row-fluid .offset1 {
+  margin-left: 10.638297872340425%;
+  *margin-left: 10.53191489361702%;
+}
+
+.row-fluid .offset1:first-child {
+  margin-left: 8.51063829787234%;
+  *margin-left: 8.404255319148938%;
+}
+
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
+
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+
+.container:before,
+.container:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container:after {
+  clear: both;
+}
+
+.container-fluid {
+  padding-right: 20px;
+  padding-left: 20px;
+  *zoom: 1;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container-fluid:after {
+  clear: both;
+}
+
+p {
+  margin: 0 0 10px;
+}
+
+.lead {
+  margin-bottom: 20px;
+  font-size: 21px;
+  font-weight: 200;
+  line-height: 30px;
+}
+
+small {
+  font-size: 85%;
+}
+
+strong {
+  font-weight: bold;
+}
+
+em {
+  font-style: italic;
+}
+
+cite {
+  font-style: normal;
+}
+
+.muted {
+  color: #999999;
+}
+
+.text-warning {
+  color: #c09853;
+}
+
+.text-error {
+  color: #b94a48;
+}
+
+.text-info {
+  color: #3a87ad;
+}
+
+.text-success {
+  color: #468847;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 10px 0;
+  font-family: inherit;
+  font-weight: bold;
+  line-height: 1;
+  color: inherit;
+  text-rendering: optimizelegibility;
+}
+
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  line-height: 1;
+  color: #999999;
+}
+
+h1 {
+  font-size: 36px;
+  line-height: 40px;
+}
+
+h2 {
+  font-size: 30px;
+  line-height: 40px;
+}
+
+h3 {
+  font-size: 24px;
+  line-height: 40px;
+}
+
+h4 {
+  font-size: 18px;
+  line-height: 20px;
+}
+
+h5 {
+  font-size: 14px;
+  line-height: 20px;
+}
+
+h6 {
+  font-size: 12px;
+  line-height: 20px;
+}
+
+h1 small {
+  font-size: 24px;
+}
+
+h2 small {
+  font-size: 18px;
+}
+
+h3 small {
+  font-size: 14px;
+}
+
+h4 small {
+  font-size: 14px;
+}
+
+.page-header {
+  padding-bottom: 9px;
+  margin: 20px 0 30px;
+  border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 10px 25px;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+
+li {
+  line-height: 20px;
+}
+
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+
+dl {
+  margin-bottom: 20px;
+}
+
+dt,
+dd {
+  line-height: 20px;
+}
+
+dt {
+  font-weight: bold;
+}
+
+dd {
+  margin-left: 10px;
+}
+
+.dl-horizontal {
+  *zoom: 1;
+}
+
+.dl-horizontal:before,
+.dl-horizontal:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.dl-horizontal:after {
+  clear: both;
+}
+
+.dl-horizontal dt {
+  float: left;
+  width: 160px;
+  overflow: hidden;
+  clear: left;
+  text-align: right;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.dl-horizontal dd {
+  margin-left: 180px;
+}
+
+hr {
+  margin: 20px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+
+abbr[title] {
+  cursor: help;
+  border-bottom: 1px dotted #999999;
+}
+
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 20px;
+  border-left: 5px solid #eeeeee;
+}
+
+blockquote p {
+  margin-bottom: 0;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 25px;
+}
+
+blockquote small {
+  display: block;
+  line-height: 20px;
+  color: #999999;
+}
+
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+
+blockquote.pull-right {
+  float: right;
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+}
+
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+
+blockquote.pull-right small:before {
+  content: '';
+}
+
+blockquote.pull-right small:after {
+  content: '\00A0 \2014';
+}
+
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+address {
+  display: block;
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 20px;
+}
+
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+code {
+  padding: 2px 4px;
+  color: #d14;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 20px;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+pre.prettyprint {
+  margin-bottom: 20px;
+}
+
+pre code {
+  padding: 0;
+  color: inherit;
+  background-color: transparent;
+  border: 0;
+}
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+
+form {
+  margin: 0 0 20px;
+}
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: 40px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+
+legend small {
+  font-size: 15px;
+  color: #999999;
+}
+
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+}
+
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+label {
+  display: block;
+  margin-bottom: 5px;
+}
+
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  display: inline-block;
+  height: 20px;
+  padding: 4px 6px;
+  margin-bottom: 9px;
+  font-size: 14px;
+  line-height: 20px;
+  color: #555555;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+input,
+textarea,
+.uneditable-input {
+  width: 206px;
+}
+
+textarea {
+  height: auto;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+          transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="datetime"]:focus,
+input[type="datetime-local"]:focus,
+input[type="date"]:focus,
+input[type="month"]:focus,
+input[type="time"]:focus,
+input[type="week"]:focus,
+input[type="number"]:focus,
+input[type="email"]:focus,
+input[type="url"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="color"]:focus,
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  *margin-top: 0;
+  line-height: normal;
+  cursor: pointer;
+}
+
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+  width: auto;
+}
+
+select,
+input[type="file"] {
+  height: 30px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 30px;
+}
+
+select {
+  width: 220px;
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+}
+
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.uneditable-input,
+.uneditable-textarea {
+  color: #999999;
+  cursor: not-allowed;
+  background-color: #fcfcfc;
+  border-color: #cccccc;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+}
+
+.uneditable-input {
+  overflow: hidden;
+  white-space: nowrap;
+}
+
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+  color: #999999;
+}
+
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+  color: #999999;
+}
+
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+  color: #999999;
+}
+
+.radio,
+.checkbox {
+  min-height: 18px;
+  padding-left: 18px;
+}
+
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -18px;
+}
+
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+
+.input-mini {
+  width: 60px;
+}
+
+.input-small {
+  width: 90px;
+}
+
+.input-medium {
+  width: 150px;
+}
+
+.input-large {
+  width: 210px;
+}
+
+.input-xlarge {
+  width: 270px;
+}
+
+.input-xxlarge {
+  width: 530px;
+}
+
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+  display: inline-block;
+}
+
+input,
+textarea,
+.uneditable-input {
+  margin-left: 0;
+}
+
+.controls-row [class*="span"] + [class*="span"] {
+  margin-left: 20px;
+}
+
+input.span12,
+textarea.span12,
+.uneditable-input.span12 {
+  width: 926px;
+}
+
+input.span11,
+textarea.span11,
+.uneditable-input.span11 {
+  width: 846px;
+}
+
+input.span10,
+textarea.span10,
+.uneditable-input.span10 {
+  width: 766px;
+}
+
+input.span9,
+textarea.span9,
+.uneditable-input.span9 {
+  width: 686px;
+}
+
+input.span8,
+textarea.span8,
+.uneditable-input.span8 {
+  width: 606px;
+}
+
+input.span7,
+textarea.span7,
+.uneditable-input.span7 {
+  width: 526px;
+}
+
+input.span6,
+textarea.span6,
+.uneditable-input.span6 {
+  width: 446px;
+}
+
+input.span5,
+textarea.span5,
+.uneditable-input.span5 {
+  width: 366px;
+}
+
+input.span4,
+textarea.span4,
+.uneditable-input.span4 {
+  width: 286px;
+}
+
+input.span3,
+textarea.span3,
+.uneditable-input.span3 {
+  width: 206px;
+}
+
+input.span2,
+textarea.span2,
+.uneditable-input.span2 {
+  width: 126px;
+}
+
+input.span1,
+textarea.span1,
+.uneditable-input.span1 {
+  width: 46px;
+}
+
+.controls-row {
+  *zoom: 1;
+}
+
+.controls-row:before,
+.controls-row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.controls-row:after {
+  clear: both;
+}
+
+.controls-row [class*="span"] {
+  float: left;
+}
+
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #eeeeee;
+}
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+
+.control-group.warning > label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+
+.control-group.warning .checkbox,
+.control-group.warning .radio,
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+}
+
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  border-color: #c09853;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+}
+
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+
+.control-group.error > label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+
+.control-group.error .checkbox,
+.control-group.error .radio,
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+}
+
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  border-color: #b94a48;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+}
+
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+
+.control-group.success > label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+
+.control-group.success .checkbox,
+.control-group.success .radio,
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+}
+
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  border-color: #468847;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+}
+
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+
+.control-group.info > label,
+.control-group.info .help-block,
+.control-group.info .help-inline {
+  color: #3a87ad;
+}
+
+.control-group.info .checkbox,
+.control-group.info .radio,
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+  color: #3a87ad;
+}
+
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+  border-color: #3a87ad;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.info input:focus,
+.control-group.info select:focus,
+.control-group.info textarea:focus {
+  border-color: #2d6987;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+}
+
+.control-group.info .input-prepend .add-on,
+.control-group.info .input-append .add-on {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #3a87ad;
+}
+
+input:focus:required:invalid,
+textarea:focus:required:invalid,
+select:focus:required:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+
+input:focus:required:invalid:focus,
+textarea:focus:required:invalid:focus,
+select:focus:required:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+     -moz-box-shadow: 0 0 6px #f8b9b7;
+          box-shadow: 0 0 6px #f8b9b7;
+}
+
+.form-actions {
+  padding: 19px 20px 20px;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #e5e5e5;
+  *zoom: 1;
+}
+
+.form-actions:before,
+.form-actions:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-actions:after {
+  clear: both;
+}
+
+.help-block,
+.help-inline {
+  color: #595959;
+}
+
+.help-block {
+  display: block;
+  margin-bottom: 10px;
+}
+
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  padding-left: 5px;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.input-append,
+.input-prepend {
+  margin-bottom: 5px;
+  font-size: 0;
+  white-space: nowrap;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+  position: relative;
+  margin-bottom: 0;
+  *margin-left: 0;
+  font-size: 14px;
+  vertical-align: top;
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+.input-append input:focus,
+.input-prepend input:focus,
+.input-append select:focus,
+.input-prepend select:focus,
+.input-append .uneditable-input:focus,
+.input-prepend .uneditable-input:focus {
+  z-index: 2;
+}
+
+.input-append .add-on,
+.input-prepend .add-on {
+  display: inline-block;
+  width: auto;
+  height: 20px;
+  min-width: 16px;
+  padding: 4px 5px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+}
+
+.input-append .add-on,
+.input-prepend .add-on,
+.input-append .btn,
+.input-prepend .btn {
+  vertical-align: top;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-append .active,
+.input-prepend .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+
+.input-prepend .add-on,
+.input-prepend .btn {
+  margin-right: -1px;
+}
+
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.input-append .add-on,
+.input-append .btn {
+  margin-left: -1px;
+}
+
+.input-append .add-on:last-child,
+.input-append .btn:last-child {
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+  margin-right: -1px;
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+  margin-left: -1px;
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+  margin-bottom: 0;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+/* Allow for input prepend/append in search forms */
+
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.form-search .input-append .search-query {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search .input-append .btn {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .btn {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+  display: inline-block;
+}
+
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+
+.control-group {
+  margin-bottom: 10px;
+}
+
+legend + .control-group {
+  margin-top: 20px;
+  -webkit-margin-top-collapse: separate;
+}
+
+.form-horizontal .control-group {
+  margin-bottom: 20px;
+  *zoom: 1;
+}
+
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-horizontal .control-group:after {
+  clear: both;
+}
+
+.form-horizontal .control-label {
+  float: left;
+  width: 160px;
+  padding-top: 5px;
+  text-align: right;
+}
+
+.form-horizontal .controls {
+  *display: inline-block;
+  *padding-left: 20px;
+  margin-left: 180px;
+  *margin-left: 0;
+}
+
+.form-horizontal .controls:first-child {
+  *padding-left: 180px;
+}
+
+.form-horizontal .help-block {
+  margin-bottom: 0;
+}
+
+.form-horizontal input + .help-block,
+.form-horizontal select + .help-block,
+.form-horizontal textarea + .help-block {
+  margin-top: 10px;
+}
+
+.form-horizontal .form-actions {
+  padding-left: 180px;
+}
+
+table {
+  max-width: 100%;
+  background-color: transparent;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+.table {
+  width: 100%;
+  margin-bottom: 20px;
+}
+
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 20px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+
+.table th {
+  font-weight: bold;
+}
+
+.table thead th {
+  vertical-align: bottom;
+}
+
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+
+.table-bordered {
+  border: 1px solid #dddddd;
+  border-collapse: separate;
+  *border-collapse: collapse;
+  border-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.table-bordered th,
+.table-bordered td {
+  border-left: 1px solid #dddddd;
+}
+
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered thead:first-child tr:first-child th:last-child,
+.table-bordered tbody:first-child tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child th:first-child,
+.table-bordered tbody:last-child tr:last-child td:first-child,
+.table-bordered tfoot:last-child tr:last-child td:first-child {
+  -webkit-border-radius: 0 0 0 4px;
+     -moz-border-radius: 0 0 0 4px;
+          border-radius: 0 0 0 4px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child th:last-child,
+.table-bordered tbody:last-child tr:last-child td:last-child,
+.table-bordered tfoot:last-child tr:last-child td:last-child {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:first-child,
+.table-bordered caption + tbody tr:first-child td:first-child,
+.table-bordered colgroup + thead tr:first-child th:first-child,
+.table-bordered colgroup + tbody tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:last-child,
+.table-bordered caption + tbody tr:first-child td:last-child,
+.table-bordered colgroup + thead tr:first-child th:last-child,
+.table-bordered colgroup + tbody tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-striped tbody tr:nth-child(odd) td,
+.table-striped tbody tr:nth-child(odd) th {
+  background-color: #f9f9f9;
+}
+
+.table-hover tbody tr:hover td,
+.table-hover tbody tr:hover th {
+  background-color: #f5f5f5;
+}
+
+table [class*=span],
+.row-fluid table [class*=span] {
+  display: table-cell;
+  float: none;
+  margin-left: 0;
+}
+
+.table .span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+
+.table .span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+
+.table .span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+
+.table .span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+
+.table .span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+
+.table .span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+
+.table .span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+
+.table .span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+
+.table .span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+
+.table .span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+
+.table .span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+
+.table .span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+
+.table .span13 {
+  float: none;
+  width: 1004px;
+  margin-left: 0;
+}
+
+.table .span14 {
+  float: none;
+  width: 1084px;
+  margin-left: 0;
+}
+
+.table .span15 {
+  float: none;
+  width: 1164px;
+  margin-left: 0;
+}
+
+.table .span16 {
+  float: none;
+  width: 1244px;
+  margin-left: 0;
+}
+
+.table .span17 {
+  float: none;
+  width: 1324px;
+  margin-left: 0;
+}
+
+.table .span18 {
+  float: none;
+  width: 1404px;
+  margin-left: 0;
+}
+
+.table .span19 {
+  float: none;
+  width: 1484px;
+  margin-left: 0;
+}
+
+.table .span20 {
+  float: none;
+  width: 1564px;
+  margin-left: 0;
+}
+
+.table .span21 {
+  float: none;
+  width: 1644px;
+  margin-left: 0;
+}
+
+.table .span22 {
+  float: none;
+  width: 1724px;
+  margin-left: 0;
+}
+
+.table .span23 {
+  float: none;
+  width: 1804px;
+  margin-left: 0;
+}
+
+.table .span24 {
+  float: none;
+  width: 1884px;
+  margin-left: 0;
+}
+
+.table tbody tr.success td {
+  background-color: #dff0d8;
+}
+
+.table tbody tr.error td {
+  background-color: #f2dede;
+}
+
+.table tbody tr.warning td {
+  background-color: #fcf8e3;
+}
+
+.table tbody tr.info td {
+  background-color: #d9edf7;
+}
+
+.table-hover tbody tr.success:hover td {
+  background-color: #d0e9c6;
+}
+
+.table-hover tbody tr.error:hover td {
+  background-color: #ebcccc;
+}
+
+.table-hover tbody tr.warning:hover td {
+  background-color: #faf2cc;
+}
+
+.table-hover tbody tr.info:hover td {
+  background-color: #c4e3f3;
+}
+
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  margin-top: 1px;
+  *margin-right: .3em;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("../img/glyphicons-halflings.png");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+}
+
+/* White icons with optional class, or on hover/active states of certain elements */
+
+.icon-white,
+.nav-tabs > .active > a > [class^="icon-"],
+.nav-tabs > .active > a > [class*=" icon-"],
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"] {
+  background-image: url("../img/glyphicons-halflings-white.png");
+}
+
+.icon-glass {
+  background-position: 0      0;
+}
+
+.icon-music {
+  background-position: -24px 0;
+}
+
+.icon-search {
+  background-position: -48px 0;
+}
+
+.icon-envelope {
+  background-position: -72px 0;
+}
+
+.icon-heart {
+  background-position: -96px 0;
+}
+
+.icon-star {
+  background-position: -120px 0;
+}
+
+.icon-star-empty {
+  background-position: -144px 0;
+}
+
+.icon-user {
+  background-position: -168px 0;
+}
+
+.icon-film {
+  background-position: -192px 0;
+}
+
+.icon-th-large {
+  background-position: -216px 0;
+}
+
+.icon-th {
+  background-position: -240px 0;
+}
+
+.icon-th-list {
+  background-position: -264px 0;
+}
+
+.icon-ok {
+  background-position: -288px 0;
+}
+
+.icon-remove {
+  background-position: -312px 0;
+}
+
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+
+.icon-off {
+  background-position: -384px 0;
+}
+
+.icon-signal {
+  background-position: -408px 0;
+}
+
+.icon-cog {
+  background-position: -432px 0;
+}
+
+.icon-trash {
+  background-position: -456px 0;
+}
+
+.icon-home {
+  background-position: 0 -24px;
+}
+
+.icon-file {
+  background-position: -24px -24px;
+}
+
+.icon-time {
+  background-position: -48px -24px;
+}
+
+.icon-road {
+  background-position: -72px -24px;
+}
+
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+
+.icon-download {
+  background-position: -120px -24px;
+}
+
+.icon-upload {
+  background-position: -144px -24px;
+}
+
+.icon-inbox {
+  background-position: -168px -24px;
+}
+
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+
+.icon-repeat {
+  background-position: -216px -24px;
+}
+
+.icon-refresh {
+  background-position: -240px -24px;
+}
+
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+
+.icon-lock {
+  background-position: -287px -24px;
+}
+
+.icon-flag {
+  background-position: -312px -24px;
+}
+
+.icon-headphones {
+  background-position: -336px -24px;
+}
+
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+
+.icon-barcode {
+  background-position: -456px -24px;
+}
+
+.icon-tag {
+  background-position: 0 -48px;
+}
+
+.icon-tags {
+  background-position: -25px -48px;
+}
+
+.icon-book {
+  background-position: -48px -48px;
+}
+
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+
+.icon-print {
+  background-position: -96px -48px;
+}
+
+.icon-camera {
+  background-position: -120px -48px;
+}
+
+.icon-font {
+  background-position: -144px -48px;
+}
+
+.icon-bold {
+  background-position: -167px -48px;
+}
+
+.icon-italic {
+  background-position: -192px -48px;
+}
+
+.icon-text-height {
+  background-position: -216px -48px;
+}
+
+.icon-text-width {
+  background-position: -240px -48px;
+}
+
+.icon-align-left {
+  background-position: -264px -48px;
+}
+
+.icon-align-center {
+  background-position: -288px -48px;
+}
+
+.icon-align-right {
+  background-position: -312px -48px;
+}
+
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+
+.icon-list {
+  background-position: -360px -48px;
+}
+
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+
+.icon-picture {
+  background-position: -456px -48px;
+}
+
+.icon-pencil {
+  background-position: 0 -72px;
+}
+
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+
+.icon-adjust {
+  background-position: -48px -72px;
+}
+
+.icon-tint {
+  background-position: -72px -72px;
+}
+
+.icon-edit {
+  background-position: -96px -72px;
+}
+
+.icon-share {
+  background-position: -120px -72px;
+}
+
+.icon-check {
+  background-position: -144px -72px;
+}
+
+.icon-move {
+  background-position: -168px -72px;
+}
+
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+
+.icon-backward {
+  background-position: -240px -72px;
+}
+
+.icon-play {
+  background-position: -264px -72px;
+}
+
+.icon-pause {
+  background-position: -288px -72px;
+}
+
+.icon-stop {
+  background-position: -312px -72px;
+}
+
+.icon-forward {
+  background-position: -336px -72px;
+}
+
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+
+.icon-eject {
+  background-position: -408px -72px;
+}
+
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+
+.icon-plus {
+  background-position: -408px -96px;
+}
+
+.icon-minus {
+  background-position: -433px -96px;
+}
+
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+
+.icon-gift {
+  background-position: -24px -120px;
+}
+
+.icon-leaf {
+  background-position: -48px -120px;
+}
+
+.icon-fire {
+  background-position: -72px -120px;
+}
+
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+
+.icon-plane {
+  background-position: -168px -120px;
+}
+
+.icon-calendar {
+  background-position: -192px -120px;
+}
+
+.icon-random {
+  width: 16px;
+  background-position: -216px -120px;
+}
+
+.icon-comment {
+  background-position: -240px -120px;
+}
+
+.icon-magnet {
+  background-position: -264px -120px;
+}
+
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+
+.icon-retweet {
+  background-position: -336px -120px;
+}
+
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+
+.icon-folder-close {
+  background-position: -384px -120px;
+}
+
+.icon-folder-open {
+  width: 16px;
+  background-position: -408px -120px;
+}
+
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+
+.icon-hdd {
+  background-position: 0 -144px;
+}
+
+.icon-bullhorn {
+  background-position: -24px -144px;
+}
+
+.icon-bell {
+  background-position: -48px -144px;
+}
+
+.icon-certificate {
+  background-position: -72px -144px;
+}
+
+.icon-thumbs-up {
+  background-position: -96px -144px;
+}
+
+.icon-thumbs-down {
+  background-position: -120px -144px;
+}
+
+.icon-hand-right {
+  background-position: -144px -144px;
+}
+
+.icon-hand-left {
+  background-position: -168px -144px;
+}
+
+.icon-hand-up {
+  background-position: -192px -144px;
+}
+
+.icon-hand-down {
+  background-position: -216px -144px;
+}
+
+.icon-circle-arrow-right {
+  background-position: -240px -144px;
+}
+
+.icon-circle-arrow-left {
+  background-position: -264px -144px;
+}
+
+.icon-circle-arrow-up {
+  background-position: -288px -144px;
+}
+
+.icon-circle-arrow-down {
+  background-position: -312px -144px;
+}
+
+.icon-globe {
+  background-position: -336px -144px;
+}
+
+.icon-wrench {
+  background-position: -360px -144px;
+}
+
+.icon-tasks {
+  background-position: -384px -144px;
+}
+
+.icon-filter {
+  background-position: -408px -144px;
+}
+
+.icon-briefcase {
+  background-position: -432px -144px;
+}
+
+.icon-fullscreen {
+  background-position: -456px -144px;
+}
+
+.dropup,
+.dropdown {
+  position: relative;
+}
+
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top: 4px solid #000000;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+  content: "";
+}
+
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.dropdown-menu .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.dropdown-menu a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 20px;
+  color: #333333;
+  white-space: nowrap;
+}
+
+.dropdown-menu li > a:hover,
+.dropdown-menu li > a:focus,
+.dropdown-submenu:hover > a {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0088cc;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0088cc;
+  background-color: #0081c2;
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  outline: 0;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu .disabled > a,
+.dropdown-menu .disabled > a:hover {
+  color: #999999;
+}
+
+.dropdown-menu .disabled > a:hover {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+}
+
+.open {
+  *z-index: 1000;
+}
+
+.open > .dropdown-menu {
+  display: block;
+}
+
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid #000000;
+  content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+
+.dropdown-submenu {
+  position: relative;
+}
+
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+     -moz-border-radius: 0 6px 6px 6px;
+          border-radius: 0 6px 6px 6px;
+}
+
+.dropdown-submenu:hover > .dropdown-menu {
+  display: block;
+}
+
+.dropdown-submenu > a:after {
+  display: block;
+  float: right;
+  width: 0;
+  height: 0;
+  margin-top: 5px;
+  margin-right: -10px;
+  border-color: transparent;
+  border-left-color: #cccccc;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  content: " ";
+}
+
+.dropdown-submenu:hover > a:after {
+  border-left-color: #ffffff;
+}
+
+.dropdown .dropdown-menu .nav-header {
+  padding-right: 20px;
+  padding-left: 20px;
+}
+
+.typeahead {
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-large {
+  padding: 24px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.well-small {
+  padding: 9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+     -moz-transition: opacity 0.15s linear;
+       -o-transition: opacity 0.15s linear;
+          transition: opacity 0.15s linear;
+}
+
+.fade.in {
+  opacity: 1;
+}
+
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition: height 0.35s ease;
+     -moz-transition: height 0.35s ease;
+       -o-transition: height 0.35s ease;
+          transition: height 0.35s ease;
+}
+
+.collapse.in {
+  height: auto;
+}
+
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+
+.close:hover {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+}
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+
+.btn {
+  display: inline-block;
+  *display: inline;
+  padding: 4px 14px;
+  margin-bottom: 0;
+  *margin-left: .3em;
+  font-size: 14px;
+  line-height: 20px;
+  *line-height: 20px;
+  color: #333333;
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  vertical-align: middle;
+  cursor: pointer;
+  background-color: #f5f5f5;
+  *background-color: #e6e6e6;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  border: 1px solid #bbbbbb;
+  *border: 0;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-bottom-color: #a2a2a2;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn:hover,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  color: #333333;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+}
+
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+
+.btn:first-child {
+  *margin-left: 0;
+}
+
+.btn:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+  /* Buttons in IE7 don't get borders, so darken on hover */
+
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+     -moz-transition: background-position 0.1s linear;
+       -o-transition: background-position 0.1s linear;
+          transition: background-position 0.1s linear;
+}
+
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.btn.active,
+.btn:active {
+  background-color: #e6e6e6;
+  background-color: #d9d9d9 \9;
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-color: #e6e6e6;
+  background-image: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-large {
+  padding: 9px 14px;
+  font-size: 16px;
+  line-height: normal;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.btn-large [class^="icon-"] {
+  margin-top: 2px;
+}
+
+.btn-small {
+  padding: 3px 9px;
+  font-size: 12px;
+  line-height: 18px;
+}
+
+.btn-small [class^="icon-"] {
+  margin-top: 0;
+}
+
+.btn-mini {
+  padding: 2px 6px;
+  font-size: 11px;
+  line-height: 17px;
+}
+
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+.btn {
+  border-color: #c5c5c5;
+  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
+}
+
+.btn-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #006dcc;
+  *background-color: #0044cc;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-primary:hover,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  color: #ffffff;
+  background-color: #0044cc;
+  *background-color: #003bb3;
+}
+
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #003399 \9;
+}
+
+.btn-warning {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #faa732;
+  *background-color: #f89406;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-warning:hover,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  color: #ffffff;
+  background-color: #f89406;
+  *background-color: #df8505;
+}
+
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+
+.btn-danger {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #da4f49;
+  *background-color: #bd362f;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-danger:hover,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  color: #ffffff;
+  background-color: #bd362f;
+  *background-color: #a9302a;
+}
+
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+
+.btn-success {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #5bb75b;
+  *background-color: #51a351;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(to bottom, #62c462, #51a351);
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-repeat: repeat-x;
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-success:hover,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  color: #ffffff;
+  background-color: #51a351;
+  *background-color: #499249;
+}
+
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+
+.btn-info {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #49afcd;
+  *background-color: #2f96b4;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-info:hover,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  color: #ffffff;
+  background-color: #2f96b4;
+  *background-color: #2a85a0;
+}
+
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+
+.btn-inverse {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #363636;
+  *background-color: #222222;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
+  background-image: -webkit-linear-gradient(top, #444444, #222222);
+  background-image: -o-linear-gradient(top, #444444, #222222);
+  background-image: linear-gradient(to bottom, #444444, #222222);
+  background-image: -moz-linear-gradient(top, #444444, #222222);
+  background-repeat: repeat-x;
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-inverse:hover,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  color: #ffffff;
+  background-color: #222222;
+  *background-color: #151515;
+}
+
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #080808 \9;
+}
+
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+  *padding-top: 1px;
+  *padding-bottom: 1px;
+}
+
+.btn-link,
+.btn-link:active,
+.btn-link[disabled] {
+  background-color: transparent;
+  background-image: none;
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-link {
+  color: #0088cc;
+  cursor: pointer;
+  border-color: transparent;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-link:hover {
+  color: #005580;
+  text-decoration: underline;
+  background-color: transparent;
+}
+
+.btn-link[disabled]:hover {
+  color: #333333;
+  text-decoration: none;
+}
+
+.btn-group {
+  position: relative;
+  *margin-left: .3em;
+  font-size: 0;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+
+.btn-group:first-child {
+  *margin-left: 0;
+}
+
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-toolbar {
+  margin-top: 10px;
+  margin-bottom: 10px;
+  font-size: 0;
+}
+
+.btn-toolbar .btn-group {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+
+.btn-toolbar .btn + .btn,
+.btn-toolbar .btn-group + .btn,
+.btn-toolbar .btn + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-group > .btn {
+  position: relative;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group > .btn + .btn {
+  margin-left: -1px;
+}
+
+.btn-group > .btn,
+.btn-group > .dropdown-menu {
+  font-size: 14px;
+}
+
+.btn-group > .btn-mini {
+  font-size: 11px;
+}
+
+.btn-group > .btn-small {
+  font-size: 12px;
+}
+
+.btn-group > .btn-large {
+  font-size: 16px;
+}
+
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+  *padding-top: 5px;
+  padding-right: 8px;
+  *padding-bottom: 5px;
+  padding-left: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group > .btn-mini + .dropdown-toggle {
+  *padding-top: 2px;
+  padding-right: 5px;
+  *padding-bottom: 2px;
+  padding-left: 5px;
+}
+
+.btn-group > .btn-small + .dropdown-toggle {
+  *padding-top: 5px;
+  *padding-bottom: 4px;
+}
+
+.btn-group > .btn-large + .dropdown-toggle {
+  *padding-top: 7px;
+  padding-right: 12px;
+  *padding-bottom: 7px;
+  padding-left: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group.open .btn.dropdown-toggle {
+  background-color: #e6e6e6;
+}
+
+.btn-group.open .btn-primary.dropdown-toggle {
+  background-color: #0044cc;
+}
+
+.btn-group.open .btn-warning.dropdown-toggle {
+  background-color: #f89406;
+}
+
+.btn-group.open .btn-danger.dropdown-toggle {
+  background-color: #bd362f;
+}
+
+.btn-group.open .btn-success.dropdown-toggle {
+  background-color: #51a351;
+}
+
+.btn-group.open .btn-info.dropdown-toggle {
+  background-color: #2f96b4;
+}
+
+.btn-group.open .btn-inverse.dropdown-toggle {
+  background-color: #222222;
+}
+
+.btn .caret {
+  margin-top: 8px;
+  margin-left: 0;
+}
+
+.btn-mini .caret,
+.btn-small .caret,
+.btn-large .caret {
+  margin-top: 6px;
+}
+
+.btn-large .caret {
+  border-top-width: 5px;
+  border-right-width: 5px;
+  border-left-width: 5px;
+}
+
+.dropup .btn-large .caret {
+  border-top: 0;
+  border-bottom: 5px solid #000000;
+}
+
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.btn-group-vertical {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+
+.btn-group-vertical .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group-vertical .btn + .btn {
+  margin-top: -1px;
+  margin-left: 0;
+}
+
+.btn-group-vertical .btn:first-child {
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.btn-group-vertical .btn:last-child {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.btn-group-vertical .btn-large:first-child {
+  -webkit-border-radius: 6px 6px 0 0;
+     -moz-border-radius: 6px 6px 0 0;
+          border-radius: 6px 6px 0 0;
+}
+
+.btn-group-vertical .btn-large:last-child {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 20px;
+  color: #c09853;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.alert h4 {
+  margin: 0;
+}
+
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 20px;
+}
+
+.alert-success {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+
+.alert-danger,
+.alert-error {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #eed3d7;
+}
+
+.alert-info {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+
+.alert-block p + p {
+  margin-top: 5px;
+}
+
+.nav {
+  margin-bottom: 20px;
+  margin-left: 0;
+  list-style: none;
+}
+
+.nav > li > a {
+  display: block;
+}
+
+.nav > li > a:hover {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+
+.nav > .pull-right {
+  float: right;
+}
+
+.nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+
+.nav-list {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-bottom: 0;
+}
+
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-right: -15px;
+  margin-left: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+
+.nav-list > .active > a,
+.nav-list > .active > a:hover {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #0088cc;
+}
+
+.nav-list [class^="icon-"] {
+  margin-right: 2px;
+}
+
+.nav-list .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: 20px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover {
+  color: #555555;
+  cursor: default;
+  background-color: #ffffff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover {
+  color: #ffffff;
+  background-color: #0088cc;
+}
+
+.nav-stacked > li {
+  float: none;
+}
+
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li > a:hover {
+  z-index: 2;
+  border-color: #ddd;
+}
+
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+
+.nav-tabs .dropdown-menu {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.nav .dropdown-toggle .caret {
+  margin-top: 6px;
+  border-top-color: #0088cc;
+  border-bottom-color: #0088cc;
+}
+
+.nav .dropdown-toggle:hover .caret {
+  border-top-color: #005580;
+  border-bottom-color: #005580;
+}
+
+/* move down carets for tabs */
+
+.nav-tabs .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.nav .active .dropdown-toggle .caret {
+  border-top-color: #fff;
+  border-bottom-color: #fff;
+}
+
+.nav-tabs .active .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.nav > .dropdown.active > a:hover {
+  cursor: pointer;
+}
+
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+
+.tabs-stacked .open > a:hover {
+  border-color: #999999;
+}
+
+.tabbable {
+  *zoom: 1;
+}
+
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.tabbable:after {
+  clear: both;
+}
+
+.tab-content {
+  overflow: auto;
+}
+
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+
+.tabs-below > .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.tabs-below > .nav-tabs > li > a:hover {
+  border-top-color: #ddd;
+  border-bottom-color: transparent;
+}
+
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover {
+  border-color: transparent #ddd #ddd #ddd;
+}
+
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.tabs-left > .nav-tabs > li > a:hover {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.tabs-right > .nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+
+.nav > .disabled > a {
+  color: #999999;
+}
+
+.nav > .disabled > a:hover {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+}
+
+.navbar {
+  *position: relative;
+  *z-index: 2;
+  margin-bottom: 20px;
+  overflow: visible;
+  color: #777777;
+}
+
+.navbar-inner {
+  min-height: 40px;
+  padding-right: 20px;
+  padding-left: 20px;
+  background-color: #fafafa;
+  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
+  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
+  background-repeat: repeat-x;
+  border: 1px solid #d4d4d4;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+}
+
+.navbar-inner:before,
+.navbar-inner:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-inner:after {
+  clear: both;
+}
+
+.navbar .container {
+  width: auto;
+}
+
+.nav-collapse.collapse {
+  height: auto;
+}
+
+.navbar .brand {
+  display: block;
+  float: left;
+  padding: 10px 20px 10px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  color: #777777;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .brand:hover {
+  text-decoration: none;
+}
+
+.navbar-text {
+  margin-bottom: 0;
+  line-height: 40px;
+}
+
+.navbar-link {
+  color: #777777;
+}
+
+.navbar-link:hover {
+  color: #333333;
+}
+
+.navbar .divider-vertical {
+  height: 40px;
+  margin: 0 9px;
+  border-right: 1px solid #ffffff;
+  border-left: 1px solid #f2f2f2;
+}
+
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 5px;
+}
+
+.navbar .btn-group .btn,
+.navbar .input-prepend .btn,
+.navbar .input-append .btn {
+  margin-top: 0;
+}
+
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-form:after {
+  clear: both;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 5px;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .btn {
+  display: inline-block;
+  margin-bottom: 0;
+}
+
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 6px;
+  white-space: nowrap;
+}
+
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+
+.navbar-search .search-query {
+  padding: 4px 14px;
+  margin-bottom: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.navbar-static-top {
+  position: static;
+  width: 100%;
+  margin-bottom: 0;
+}
+
+.navbar-static-top .navbar-inner {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  margin-bottom: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  border-width: 0 0 1px;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  border-width: 1px 0 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.navbar-fixed-top {
+  top: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar-fixed-bottom {
+  bottom: 0;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+
+.navbar .nav.pull-right {
+  float: right;
+  margin-right: 0;
+}
+
+.navbar .nav > li {
+  float: left;
+}
+
+.navbar .nav > li > a {
+  float: none;
+  padding: 10px 15px 10px;
+  color: #777777;
+  text-decoration: none;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: transparent;
+}
+
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: #555555;
+  text-decoration: none;
+  background-color: #e5e5e5;
+  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+}
+
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-right: 5px;
+  margin-left: 5px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #ededed;
+  *background-color: #e5e5e5;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
+  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
+  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-repeat: repeat-x;
+  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #e5e5e5;
+  *background-color: #d9d9d9;
+}
+
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+  background-color: #cccccc \9;
+}
+
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+     -moz-border-radius: 1px;
+          border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+
+.navbar .nav > li > .dropdown-menu:before {
+  position: absolute;
+  top: -7px;
+  left: 9px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.navbar .nav > li > .dropdown-menu:after {
+  position: absolute;
+  top: -6px;
+  left: 10px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
+  top: auto;
+  bottom: -7px;
+  border-top: 7px solid #ccc;
+  border-bottom: 0;
+  border-top-color: rgba(0, 0, 0, 0.2);
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
+  top: auto;
+  bottom: -6px;
+  border-top: 6px solid #ffffff;
+  border-bottom: 0;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #555555;
+  background-color: #e5e5e5;
+}
+
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #777777;
+  border-bottom-color: #777777;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu.pull-right:before {
+  right: 12px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:after,
+.navbar .nav > li > .dropdown-menu.pull-right:after {
+  right: 13px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
+  right: 100%;
+  left: auto;
+  margin-right: -1px;
+  margin-left: 0;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.navbar-inverse {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-inner {
+  background-color: #1b1b1b;
+  background-image: -moz-linear-gradient(top, #222222, #111111);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
+  background-image: -webkit-linear-gradient(top, #222222, #111111);
+  background-image: -o-linear-gradient(top, #222222, #111111);
+  background-image: linear-gradient(to bottom, #222222, #111111);
+  background-repeat: repeat-x;
+  border-color: #252525;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
+}
+
+.navbar-inverse .brand,
+.navbar-inverse .nav > li > a {
+  color: #999999;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-inverse .brand:hover,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+}
+
+.navbar-inverse .nav > li > a:focus,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+  background-color: transparent;
+}
+
+.navbar-inverse .nav .active > a,
+.navbar-inverse .nav .active > a:hover,
+.navbar-inverse .nav .active > a:focus {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .navbar-link {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-link:hover {
+  color: #ffffff;
+}
+
+.navbar-inverse .divider-vertical {
+  border-right-color: #222222;
+  border-left-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #999999;
+  border-bottom-color: #999999;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .navbar-search .search-query {
+  color: #ffffff;
+  background-color: #515151;
+  border-color: #111111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+  -webkit-transition: none;
+     -moz-transition: none;
+       -o-transition: none;
+          transition: none;
+}
+
+.navbar-inverse .navbar-search .search-query:-moz-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:focus,
+.navbar-inverse .navbar-search .search-query.focused {
+  padding: 5px 15px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  outline: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+.navbar-inverse .btn-navbar {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e0e0e;
+  *background-color: #040404;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
+  background-image: -webkit-linear-gradient(top, #151515, #040404);
+  background-image: -o-linear-gradient(top, #151515, #040404);
+  background-image: linear-gradient(to bottom, #151515, #040404);
+  background-image: -moz-linear-gradient(top, #151515, #040404);
+  background-repeat: repeat-x;
+  border-color: #040404 #040404 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.navbar-inverse .btn-navbar:hover,
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active,
+.navbar-inverse .btn-navbar.disabled,
+.navbar-inverse .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #040404;
+  *background-color: #000000;
+}
+
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active {
+  background-color: #000000 \9;
+}
+
+.breadcrumb {
+  padding: 8px 15px;
+  margin: 0 0 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.breadcrumb li {
+  display: inline-block;
+  *display: inline;
+  text-shadow: 0 1px 0 #ffffff;
+  *zoom: 1;
+}
+
+.breadcrumb .divider {
+  padding: 0 5px;
+  color: #ccc;
+}
+
+.breadcrumb .active {
+  color: #999999;
+}
+
+.pagination {
+  height: 40px;
+  margin: 20px 0;
+}
+
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  margin-left: 0;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.pagination ul > li {
+  display: inline;
+}
+
+.pagination ul > li > a,
+.pagination ul > li > span {
+  float: left;
+  padding: 0 14px;
+  line-height: 38px;
+  text-decoration: none;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-left-width: 0;
+}
+
+.pagination ul > li > a:hover,
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+  background-color: #f5f5f5;
+}
+
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+  color: #999999;
+  cursor: default;
+}
+
+.pagination ul > .disabled > span,
+.pagination ul > .disabled > a,
+.pagination ul > .disabled > a:hover {
+  color: #999999;
+  cursor: default;
+  background-color: transparent;
+}
+
+.pagination ul > li:first-child > a,
+.pagination ul > li:first-child > span {
+  border-left-width: 1px;
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.pagination ul > li:last-child > a,
+.pagination ul > li:last-child > span {
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+.pagination-centered {
+  text-align: center;
+}
+
+.pagination-right {
+  text-align: right;
+}
+
+.pager {
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+  *zoom: 1;
+}
+
+.pager:before,
+.pager:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.pager:after {
+  clear: both;
+}
+
+.pager li {
+  display: inline;
+}
+
+.pager a,
+.pager span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.pager a:hover {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+
+.pager .next a,
+.pager .next span {
+  float: right;
+}
+
+.pager .previous a {
+  float: left;
+}
+
+.pager .disabled a,
+.pager .disabled a:hover,
+.pager .disabled span {
+  color: #999999;
+  cursor: default;
+  background-color: #fff;
+}
+
+.modal-open .modal .dropdown-menu {
+  z-index: 2050;
+}
+
+.modal-open .modal .dropdown.open {
+  *z-index: 2050;
+}
+
+.modal-open .modal .popover {
+  z-index: 2060;
+}
+
+.modal-open .modal .tooltip {
+  z-index: 2080;
+}
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+
+.modal-backdrop.fade {
+  opacity: 0;
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.modal {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  z-index: 1050;
+  width: 560px;
+  margin: -250px 0 0 -280px;
+  overflow: auto;
+  background-color: #ffffff;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding-box;
+          background-clip: padding-box;
+}
+
+.modal.fade {
+  top: -25%;
+  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
+     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
+       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
+          transition: opacity 0.3s linear, top 0.3s ease-out;
+}
+
+.modal.fade.in {
+  top: 50%;
+}
+
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+
+.modal-header .close {
+  margin-top: 2px;
+}
+
+.modal-header h3 {
+  margin: 0;
+  line-height: 30px;
+}
+
+.modal-body {
+  max-height: 400px;
+  padding: 15px;
+  overflow-y: auto;
+}
+
+.modal-form {
+  margin-bottom: 0;
+}
+
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+     -moz-box-shadow: inset 0 1px 0 #ffffff;
+          box-shadow: inset 0 1px 0 #ffffff;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.modal-footer:after {
+  clear: both;
+}
+
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+
+.tooltip {
+  position: absolute;
+  z-index: 1030;
+  display: block;
+  padding: 5px;
+  font-size: 11px;
+  opacity: 0;
+  filter: alpha(opacity=0);
+  visibility: visible;
+}
+
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.tooltip.top {
+  margin-top: -3px;
+}
+
+.tooltip.right {
+  margin-left: 3px;
+}
+
+.tooltip.bottom {
+  margin-top: 3px;
+}
+
+.tooltip.left {
+  margin-left: -3px;
+}
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #ffffff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000000;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-top-color: #000000;
+  border-width: 5px 5px 0;
+}
+
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-right-color: #000000;
+  border-width: 5px 5px 5px 0;
+}
+
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-left-color: #000000;
+  border-width: 5px 0 5px 5px;
+}
+
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-bottom-color: #000000;
+  border-width: 0 5px 5px;
+}
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  width: 236px;
+  padding: 1px;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.popover.top {
+  margin-bottom: 10px;
+}
+
+.popover.right {
+  margin-left: 10px;
+}
+
+.popover.bottom {
+  margin-top: 10px;
+}
+
+.popover.left {
+  margin-right: 10px;
+}
+
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  -webkit-border-radius: 5px 5px 0 0;
+     -moz-border-radius: 5px 5px 0 0;
+          border-radius: 5px 5px 0 0;
+}
+
+.popover-content {
+  padding: 9px 14px;
+}
+
+.popover-content p,
+.popover-content ul,
+.popover-content ol {
+  margin-bottom: 0;
+}
+
+.popover .arrow,
+.popover .arrow:after {
+  position: absolute;
+  display: inline-block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.popover .arrow:after {
+  z-index: -1;
+  content: "";
+}
+
+.popover.top .arrow {
+  bottom: -10px;
+  left: 50%;
+  margin-left: -10px;
+  border-top-color: #ffffff;
+  border-width: 10px 10px 0;
+}
+
+.popover.top .arrow:after {
+  bottom: -1px;
+  left: -11px;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  border-width: 11px 11px 0;
+}
+
+.popover.right .arrow {
+  top: 50%;
+  left: -10px;
+  margin-top: -10px;
+  border-right-color: #ffffff;
+  border-width: 10px 10px 10px 0;
+}
+
+.popover.right .arrow:after {
+  bottom: -11px;
+  left: -1px;
+  border-right-color: rgba(0, 0, 0, 0.25);
+  border-width: 11px 11px 11px 0;
+}
+
+.popover.bottom .arrow {
+  top: -10px;
+  left: 50%;
+  margin-left: -10px;
+  border-bottom-color: #ffffff;
+  border-width: 0 10px 10px;
+}
+
+.popover.bottom .arrow:after {
+  top: -1px;
+  left: -11px;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+  border-width: 0 11px 11px;
+}
+
+.popover.left .arrow {
+  top: 50%;
+  right: -10px;
+  margin-top: -10px;
+  border-left-color: #ffffff;
+  border-width: 10px 0 10px 10px;
+}
+
+.popover.left .arrow:after {
+  right: -1px;
+  bottom: -11px;
+  border-left-color: rgba(0, 0, 0, 0.25);
+  border-width: 11px 0 11px 11px;
+}
+
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.thumbnails:after {
+  clear: both;
+}
+
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+
+.thumbnails > li {
+  float: left;
+  margin-bottom: 20px;
+  margin-left: 20px;
+}
+
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 20px;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -webkit-transition: all 0.2s ease-in-out;
+     -moz-transition: all 0.2s ease-in-out;
+       -o-transition: all 0.2s ease-in-out;
+          transition: all 0.2s ease-in-out;
+}
+
+a.thumbnail:hover {
+  border-color: #0088cc;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.thumbnail .caption {
+  padding: 9px;
+  color: #555555;
+}
+
+.label,
+.badge {
+  font-size: 11.844px;
+  font-weight: bold;
+  line-height: 14px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  white-space: nowrap;
+  vertical-align: baseline;
+  background-color: #999999;
+}
+
+.label {
+  padding: 1px 4px 2px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.badge {
+  padding: 1px 9px 2px;
+  -webkit-border-radius: 9px;
+     -moz-border-radius: 9px;
+          border-radius: 9px;
+}
+
+a.label:hover,
+a.badge:hover {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.label-important,
+.badge-important {
+  background-color: #b94a48;
+}
+
+.label-important[href],
+.badge-important[href] {
+  background-color: #953b39;
+}
+
+.label-warning,
+.badge-warning {
+  background-color: #f89406;
+}
+
+.label-warning[href],
+.badge-warning[href] {
+  background-color: #c67605;
+}
+
+.label-success,
+.badge-success {
+  background-color: #468847;
+}
+
+.label-success[href],
+.badge-success[href] {
+  background-color: #356635;
+}
+
+.label-info,
+.badge-info {
+  background-color: #3a87ad;
+}
+
+.label-info[href],
+.badge-info[href] {
+  background-color: #2d6987;
+}
+
+.label-inverse,
+.badge-inverse {
+  background-color: #333333;
+}
+
+.label-inverse[href],
+.badge-inverse[href] {
+  background-color: #1a1a1a;
+}
+
+.btn .label,
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+
+.btn-mini .label,
+.btn-mini .badge {
+  top: 0;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 0 0;
+  }
+  to {
+    background-position: 40px 0;
+  }
+}
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f7f7f7;
+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
+  background-repeat: repeat-x;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress .bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e90d2;
+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+  background-image: -o-linear-gradient(top, #149bdf, #0480be);
+  background-image: linear-gradient(to bottom, #149bdf, #0480be);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: width 0.6s ease;
+     -moz-transition: width 0.6s ease;
+       -o-transition: width 0.6s ease;
+          transition: width 0.6s ease;
+}
+
+.progress .bar + .bar {
+  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+}
+
+.progress-striped .bar {
+  background-color: #149bdf;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+     -moz-background-size: 40px 40px;
+       -o-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+     -moz-animation: progress-bar-stripes 2s linear infinite;
+      -ms-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-danger .bar,
+.progress .bar-danger {
+  background-color: #dd514c;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
+}
+
+.progress-danger.progress-striped .bar,
+.progress-striped .bar-danger {
+  background-color: #ee5f5b;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-success .bar,
+.progress .bar-success {
+  background-color: #5eb95e;
+  background-image: -moz-linear-gradient(top, #62c462, #57a957);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+  background-image: -o-linear-gradient(top, #62c462, #57a957);
+  background-image: linear-gradient(to bottom, #62c462, #57a957);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
+}
+
+.progress-success.progress-striped .bar,
+.progress-striped .bar-success {
+  background-color: #62c462;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-info .bar,
+.progress .bar-info {
+  background-color: #4bb1cf;
+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
+}
+
+.progress-info.progress-striped .bar,
+.progress-striped .bar-info {
+  background-color: #5bc0de;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-warning .bar,
+.progress .bar-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+}
+
+.progress-warning.progress-striped .bar,
+.progress-striped .bar-warning {
+  background-color: #fbb450;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.accordion {
+  margin-bottom: 20px;
+}
+
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.accordion-heading {
+  border-bottom: 0;
+}
+
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+
+.accordion-toggle {
+  cursor: pointer;
+}
+
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
+
+.carousel {
+  position: relative;
+  margin-bottom: 20px;
+  line-height: 1;
+}
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+
+.carousel .item {
+  position: relative;
+  display: none;
+  -webkit-transition: 0.6s ease-in-out left;
+     -moz-transition: 0.6s ease-in-out left;
+       -o-transition: 0.6s ease-in-out left;
+          transition: 0.6s ease-in-out left;
+}
+
+.carousel .item > img {
+  display: block;
+  line-height: 1;
+}
+
+.carousel .active,
+.carousel .next,
+.carousel .prev {
+  display: block;
+}
+
+.carousel .active {
+  left: 0;
+}
+
+.carousel .next,
+.carousel .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+
+.carousel .next {
+  left: 100%;
+}
+
+.carousel .prev {
+  left: -100%;
+}
+
+.carousel .next.left,
+.carousel .prev.right {
+  left: 0;
+}
+
+.carousel .active.left {
+  left: -100%;
+}
+
+.carousel .active.right {
+  left: 100%;
+}
+
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: #ffffff;
+  text-align: center;
+  background: #222222;
+  border: 3px solid #ffffff;
+  -webkit-border-radius: 23px;
+     -moz-border-radius: 23px;
+          border-radius: 23px;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+
+.carousel-control.right {
+  right: 15px;
+  left: auto;
+}
+
+.carousel-control:hover {
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+
+.carousel-caption {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 15px;
+  background: #333333;
+  background: rgba(0, 0, 0, 0.75);
+}
+
+.carousel-caption h4,
+.carousel-caption p {
+  line-height: 20px;
+  color: #ffffff;
+}
+
+.carousel-caption h4 {
+  margin: 0 0 5px;
+}
+
+.carousel-caption p {
+  margin-bottom: 0;
+}
+
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  background-color: #eeeeee;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  letter-spacing: -1px;
+  color: inherit;
+}
+
+.hero-unit p {
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 30px;
+  color: inherit;
+}
+
+.pull-right {
+  float: right;
+}
+
+.pull-left {
+  float: left;
+}
+
+.hide {
+  display: none;
+}
+
+.show {
+  display: block;
+}
+
+.invisible {
+  visibility: hidden;
+}
+
+.affix {
+  position: fixed;
+}
diff --git a/static/demo/components/bootstrap.css/css/bootstrap.min.css b/static/demo/components/bootstrap.css/css/bootstrap.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..31d8b960a67f195bdedaaf9e7aa70b2389f3f1a8
--- /dev/null
+++ b/static/demo/components/bootstrap.css/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.1.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}.text-warning{color:#c09853}.text-error{color:#b94a48}.text-info{color:#3a87ad}.text-success{color:#468847}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info>label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on,.input-append .btn{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}.table .span1{float:none;width:44px;margin-left:0}.table .span2{float:none;width:124px;margin-left:0}.table .span3{float:none;width:204px;margin-left:0}.table .span4{float:none;width:284px;margin-left:0}.table .span5{float:none;width:364px;margin-left:0}.table .span6{float:none;width:444px;margin-left:0}.table .span7{float:none;width:524px;margin-left:0}.table .span8{float:none;width:604px;margin-left:0}.table .span9{float:none;width:684px;margin-left:0}.table .span10{float:none;width:764px;margin-left:0}.table .span11{float:none;width:844px;margin-left:0}.table .span12{float:none;width:924px;margin-left:0}.table .span13{float:none;width:1004px;margin-left:0}.table .span14{float:none;width:1084px;margin-left:0}.table .span15{float:none;width:1164px;margin-left:0}.table .span16{float:none;width:1244px;margin-left:0}.table .span17{float:none;width:1324px;margin-left:0}.table .span18{float:none;width:1404px;margin-left:0}.table .span19{float:none;width:1484px;margin-left:0}.table .span20{float:none;width:1564px;margin-left:0}.table .span21{float:none;width:1644px;margin-left:0}.table .span22{float:none;width:1724px;margin-left:0}.table .span23{float:none;width:1804px;margin-left:0}.table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.warning td{background-color:#fcf8e3}.table tbody tr.info td{background-color:#d9edf7}.table-hover tbody tr.success:hover td{background-color:#d0e9c6}.table-hover tbody tr.error:hover td{background-color:#ebcccc}.table-hover tbody tr.warning:hover td{background-color:#faf2cc}.table-hover tbody tr.info:hover td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-tabs>.active>a>[class^="icon-"],.nav-tabs>.active>a>[class*=" icon-"],.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:linear-gradient(to bottom,#08c,#0077b3);background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 14px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^="icon-"]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:17px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-image:-moz-linear-gradient(top,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-image:-moz-linear-gradient(top,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-image:-moz-linear-gradient(top,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#777}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#777}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-image:-moz-linear-gradient(top,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{height:40px;margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a,.pager span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a,.pager .next span{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover,.pager .disabled span{color:#999;cursor:default;background-color:#fff}.modal-open .modal .dropdown-menu{z-index:2050}.modal-open .modal .dropdown.open{*z-index:2050}.modal-open .modal .popover{z-index:2060}.modal-open .modal .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/static/demo/components/bootstrap.css/img/glyphicons-halflings-white.png b/static/demo/components/bootstrap.css/img/glyphicons-halflings-white.png
new file mode 100644
index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae
Binary files /dev/null and b/static/demo/components/bootstrap.css/img/glyphicons-halflings-white.png differ
diff --git a/static/demo/components/bootstrap.css/img/glyphicons-halflings.png b/static/demo/components/bootstrap.css/img/glyphicons-halflings.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643
Binary files /dev/null and b/static/demo/components/bootstrap.css/img/glyphicons-halflings.png differ
diff --git a/static/demo/components/bootstrap.css/js/bootstrap.js b/static/demo/components/bootstrap.css/js/bootstrap.js
new file mode 100644
index 0000000000000000000000000000000000000000..f73fcb8e700568994d2c071b5ab889d81d9a2089
--- /dev/null
+++ b/static/demo/components/bootstrap.css/js/bootstrap.js
@@ -0,0 +1,2027 @@
+/* ===================================================
+ * bootstrap-transition.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
+ * ===================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  $(function () {
+
+    "use strict"; // jshint ;_;
+
+
+    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
+     * ======================================================= */
+
+    $.support.transition = (function () {
+
+      var transitionEnd = (function () {
+
+        var el = document.createElement('bootstrap')
+          , transEndEventNames = {
+               'WebkitTransition' : 'webkitTransitionEnd'
+            ,  'MozTransition'    : 'transitionend'
+            ,  'OTransition'      : 'oTransitionEnd otransitionend'
+            ,  'transition'       : 'transitionend'
+            }
+          , name
+
+        for (name in transEndEventNames){
+          if (el.style[name] !== undefined) {
+            return transEndEventNames[name]
+          }
+        }
+
+      }())
+
+      return transitionEnd && {
+        end: transitionEnd
+      }
+
+    })()
+
+  })
+
+}(window.jQuery);/* ==========================================================
+ * bootstrap-alert.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* ALERT CLASS DEFINITION
+  * ====================== */
+
+  var dismiss = '[data-dismiss="alert"]'
+    , Alert = function (el) {
+        $(el).on('click', dismiss, this.close)
+      }
+
+  Alert.prototype.close = function (e) {
+    var $this = $(this)
+      , selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = $(selector)
+
+    e && e.preventDefault()
+
+    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
+
+    $parent.trigger(e = $.Event('close'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      $parent
+        .trigger('closed')
+        .remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent.on($.support.transition.end, removeElement) :
+      removeElement()
+  }
+
+
+ /* ALERT PLUGIN DEFINITION
+  * ======================= */
+
+  $.fn.alert = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('alert')
+      if (!data) $this.data('alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.alert.Constructor = Alert
+
+
+ /* ALERT DATA-API
+  * ============== */
+
+  $(function () {
+    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
+  })
+
+}(window.jQuery);/* ============================================================
+ * bootstrap-button.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* BUTTON PUBLIC CLASS DEFINITION
+  * ============================== */
+
+  var Button = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.button.defaults, options)
+  }
+
+  Button.prototype.setState = function (state) {
+    var d = 'disabled'
+      , $el = this.$element
+      , data = $el.data()
+      , val = $el.is('input') ? 'val' : 'html'
+
+    state = state + 'Text'
+    data.resetText || $el.data('resetText', $el[val]())
+
+    $el[val](data[state] || this.options[state])
+
+    // push to event loop to allow forms to submit
+    setTimeout(function () {
+      state == 'loadingText' ?
+        $el.addClass(d).attr(d, d) :
+        $el.removeClass(d).removeAttr(d)
+    }, 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
+
+    $parent && $parent
+      .find('.active')
+      .removeClass('active')
+
+    this.$element.toggleClass('active')
+  }
+
+
+ /* BUTTON PLUGIN DEFINITION
+  * ======================== */
+
+  $.fn.button = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('button')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('button', (data = new Button(this, options)))
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  $.fn.button.defaults = {
+    loadingText: 'loading...'
+  }
+
+  $.fn.button.Constructor = Button
+
+
+ /* BUTTON DATA-API
+  * =============== */
+
+  $(function () {
+    $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
+      var $btn = $(e.target)
+      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+      $btn.button('toggle')
+    })
+  })
+
+}(window.jQuery);/* ==========================================================
+ * bootstrap-carousel.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* CAROUSEL CLASS DEFINITION
+  * ========================= */
+
+  var Carousel = function (element, options) {
+    this.$element = $(element)
+    this.options = options
+    this.options.slide && this.slide(this.options.slide)
+    this.options.pause == 'hover' && this.$element
+      .on('mouseenter', $.proxy(this.pause, this))
+      .on('mouseleave', $.proxy(this.cycle, this))
+  }
+
+  Carousel.prototype = {
+
+    cycle: function (e) {
+      if (!e) this.paused = false
+      this.options.interval
+        && !this.paused
+        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+      return this
+    }
+
+  , to: function (pos) {
+      var $active = this.$element.find('.item.active')
+        , children = $active.parent().children()
+        , activePos = children.index($active)
+        , that = this
+
+      if (pos > (children.length - 1) || pos < 0) return
+
+      if (this.sliding) {
+        return this.$element.one('slid', function () {
+          that.to(pos)
+        })
+      }
+
+      if (activePos == pos) {
+        return this.pause().cycle()
+      }
+
+      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
+    }
+
+  , pause: function (e) {
+      if (!e) this.paused = true
+      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
+        this.$element.trigger($.support.transition.end)
+        this.cycle()
+      }
+      clearInterval(this.interval)
+      this.interval = null
+      return this
+    }
+
+  , next: function () {
+      if (this.sliding) return
+      return this.slide('next')
+    }
+
+  , prev: function () {
+      if (this.sliding) return
+      return this.slide('prev')
+    }
+
+  , slide: function (type, next) {
+      var $active = this.$element.find('.item.active')
+        , $next = next || $active[type]()
+        , isCycling = this.interval
+        , direction = type == 'next' ? 'left' : 'right'
+        , fallback  = type == 'next' ? 'first' : 'last'
+        , that = this
+        , e = $.Event('slide', {
+            relatedTarget: $next[0]
+          })
+
+      this.sliding = true
+
+      isCycling && this.pause()
+
+      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
+
+      if ($next.hasClass('active')) return
+
+      if ($.support.transition && this.$element.hasClass('slide')) {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $next.addClass(type)
+        $next[0].offsetWidth // force reflow
+        $active.addClass(direction)
+        $next.addClass(direction)
+        this.$element.one($.support.transition.end, function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () { that.$element.trigger('slid') }, 0)
+        })
+      } else {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $active.removeClass('active')
+        $next.addClass('active')
+        this.sliding = false
+        this.$element.trigger('slid')
+      }
+
+      isCycling && this.cycle()
+
+      return this
+    }
+
+  }
+
+
+ /* CAROUSEL PLUGIN DEFINITION
+  * ========================== */
+
+  $.fn.carousel = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('carousel')
+        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
+        , action = typeof option == 'string' ? option : options.slide
+      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.cycle()
+    })
+  }
+
+  $.fn.carousel.defaults = {
+    interval: 5000
+  , pause: 'hover'
+  }
+
+  $.fn.carousel.Constructor = Carousel
+
+
+ /* CAROUSEL DATA-API
+  * ================= */
+
+  $(function () {
+    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
+      var $this = $(this), href
+        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
+      $target.carousel(options)
+      e.preventDefault()
+    })
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-collapse.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* COLLAPSE PUBLIC CLASS DEFINITION
+  * ================================ */
+
+  var Collapse = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.collapse.defaults, options)
+
+    if (this.options.parent) {
+      this.$parent = $(this.options.parent)
+    }
+
+    this.options.toggle && this.toggle()
+  }
+
+  Collapse.prototype = {
+
+    constructor: Collapse
+
+  , dimension: function () {
+      var hasWidth = this.$element.hasClass('width')
+      return hasWidth ? 'width' : 'height'
+    }
+
+  , show: function () {
+      var dimension
+        , scroll
+        , actives
+        , hasData
+
+      if (this.transitioning) return
+
+      dimension = this.dimension()
+      scroll = $.camelCase(['scroll', dimension].join('-'))
+      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
+
+      if (actives && actives.length) {
+        hasData = actives.data('collapse')
+        if (hasData && hasData.transitioning) return
+        actives.collapse('hide')
+        hasData || actives.data('collapse', null)
+      }
+
+      this.$element[dimension](0)
+      this.transition('addClass', $.Event('show'), 'shown')
+      $.support.transition && this.$element[dimension](this.$element[0][scroll])
+    }
+
+  , hide: function () {
+      var dimension
+      if (this.transitioning) return
+      dimension = this.dimension()
+      this.reset(this.$element[dimension]())
+      this.transition('removeClass', $.Event('hide'), 'hidden')
+      this.$element[dimension](0)
+    }
+
+  , reset: function (size) {
+      var dimension = this.dimension()
+
+      this.$element
+        .removeClass('collapse')
+        [dimension](size || 'auto')
+        [0].offsetWidth
+
+      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
+
+      return this
+    }
+
+  , transition: function (method, startEvent, completeEvent) {
+      var that = this
+        , complete = function () {
+            if (startEvent.type == 'show') that.reset()
+            that.transitioning = 0
+            that.$element.trigger(completeEvent)
+          }
+
+      this.$element.trigger(startEvent)
+
+      if (startEvent.isDefaultPrevented()) return
+
+      this.transitioning = 1
+
+      this.$element[method]('in')
+
+      $.support.transition && this.$element.hasClass('collapse') ?
+        this.$element.one($.support.transition.end, complete) :
+        complete()
+    }
+
+  , toggle: function () {
+      this[this.$element.hasClass('in') ? 'hide' : 'show']()
+    }
+
+  }
+
+
+ /* COLLAPSIBLE PLUGIN DEFINITION
+  * ============================== */
+
+  $.fn.collapse = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('collapse')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.collapse.defaults = {
+    toggle: true
+  }
+
+  $.fn.collapse.Constructor = Collapse
+
+
+ /* COLLAPSIBLE DATA-API
+  * ==================== */
+
+  $(function () {
+    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
+      var $this = $(this), href
+        , target = $this.attr('data-target')
+          || e.preventDefault()
+          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+        , option = $(target).data('collapse') ? 'toggle' : $this.data()
+      $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+      $(target).collapse(option)
+    })
+  })
+
+}(window.jQuery);/* ============================================================
+ * bootstrap-dropdown.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* DROPDOWN CLASS DEFINITION
+  * ========================= */
+
+  var toggle = '[data-toggle=dropdown]'
+    , Dropdown = function (element) {
+        var $el = $(element).on('click.dropdown.data-api', this.toggle)
+        $('html').on('click.dropdown.data-api', function () {
+          $el.parent().removeClass('open')
+        })
+      }
+
+  Dropdown.prototype = {
+
+    constructor: Dropdown
+
+  , toggle: function (e) {
+      var $this = $(this)
+        , $parent
+        , isActive
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      clearMenus()
+
+      if (!isActive) {
+        $parent.toggleClass('open')
+        $this.focus()
+      }
+
+      return false
+    }
+
+  , keydown: function (e) {
+      var $this
+        , $items
+        , $active
+        , $parent
+        , isActive
+        , index
+
+      if (!/(38|40|27)/.test(e.keyCode)) return
+
+      $this = $(this)
+
+      e.preventDefault()
+      e.stopPropagation()
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
+
+      $items = $('[role=menu] li:not(.divider) a', $parent)
+
+      if (!$items.length) return
+
+      index = $items.index($items.filter(':focus'))
+
+      if (e.keyCode == 38 && index > 0) index--                                        // up
+      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
+      if (!~index) index = 0
+
+      $items
+        .eq(index)
+        .focus()
+    }
+
+  }
+
+  function clearMenus() {
+    getParent($(toggle))
+      .removeClass('open')
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = $(selector)
+    $parent.length || ($parent = $this.parent())
+
+    return $parent
+  }
+
+
+  /* DROPDOWN PLUGIN DEFINITION
+   * ========================== */
+
+  $.fn.dropdown = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('dropdown')
+      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  /* APPLY TO STANDARD DROPDOWN ELEMENTS
+   * =================================== */
+
+  $(function () {
+    $('html')
+      .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
+    $('body')
+      .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+      .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
+      .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+  })
+
+}(window.jQuery);/* =========================================================
+ * bootstrap-modal.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#modals
+ * =========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* MODAL CLASS DEFINITION
+  * ====================== */
+
+  var Modal = function (element, options) {
+    this.options = options
+    this.$element = $(element)
+      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
+    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
+  }
+
+  Modal.prototype = {
+
+      constructor: Modal
+
+    , toggle: function () {
+        return this[!this.isShown ? 'show' : 'hide']()
+      }
+
+    , show: function () {
+        var that = this
+          , e = $.Event('show')
+
+        this.$element.trigger(e)
+
+        if (this.isShown || e.isDefaultPrevented()) return
+
+        $('body').addClass('modal-open')
+
+        this.isShown = true
+
+        this.escape()
+
+        this.backdrop(function () {
+          var transition = $.support.transition && that.$element.hasClass('fade')
+
+          if (!that.$element.parent().length) {
+            that.$element.appendTo(document.body) //don't move modals dom position
+          }
+
+          that.$element
+            .show()
+
+          if (transition) {
+            that.$element[0].offsetWidth // force reflow
+          }
+
+          that.$element
+            .addClass('in')
+            .attr('aria-hidden', false)
+            .focus()
+
+          that.enforceFocus()
+
+          transition ?
+            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
+            that.$element.trigger('shown')
+
+        })
+      }
+
+    , hide: function (e) {
+        e && e.preventDefault()
+
+        var that = this
+
+        e = $.Event('hide')
+
+        this.$element.trigger(e)
+
+        if (!this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = false
+
+        $('body').removeClass('modal-open')
+
+        this.escape()
+
+        $(document).off('focusin.modal')
+
+        this.$element
+          .removeClass('in')
+          .attr('aria-hidden', true)
+
+        $.support.transition && this.$element.hasClass('fade') ?
+          this.hideWithTransition() :
+          this.hideModal()
+      }
+
+    , enforceFocus: function () {
+        var that = this
+        $(document).on('focusin.modal', function (e) {
+          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
+            that.$element.focus()
+          }
+        })
+      }
+
+    , escape: function () {
+        var that = this
+        if (this.isShown && this.options.keyboard) {
+          this.$element.on('keyup.dismiss.modal', function ( e ) {
+            e.which == 27 && that.hide()
+          })
+        } else if (!this.isShown) {
+          this.$element.off('keyup.dismiss.modal')
+        }
+      }
+
+    , hideWithTransition: function () {
+        var that = this
+          , timeout = setTimeout(function () {
+              that.$element.off($.support.transition.end)
+              that.hideModal()
+            }, 500)
+
+        this.$element.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          that.hideModal()
+        })
+      }
+
+    , hideModal: function (that) {
+        this.$element
+          .hide()
+          .trigger('hidden')
+
+        this.backdrop()
+      }
+
+    , removeBackdrop: function () {
+        this.$backdrop.remove()
+        this.$backdrop = null
+      }
+
+    , backdrop: function (callback) {
+        var that = this
+          , animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+        if (this.isShown && this.options.backdrop) {
+          var doAnimate = $.support.transition && animate
+
+          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+            .appendTo(document.body)
+
+          if (this.options.backdrop != 'static') {
+            this.$backdrop.click($.proxy(this.hide, this))
+          }
+
+          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+          this.$backdrop.addClass('in')
+
+          doAnimate ?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (!this.isShown && this.$backdrop) {
+          this.$backdrop.removeClass('in')
+
+          $.support.transition && this.$element.hasClass('fade')?
+            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
+            this.removeBackdrop()
+
+        } else if (callback) {
+          callback()
+        }
+      }
+  }
+
+
+ /* MODAL PLUGIN DEFINITION
+  * ======================= */
+
+  $.fn.modal = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('modal')
+        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option]()
+      else if (options.show) data.show()
+    })
+  }
+
+  $.fn.modal.defaults = {
+      backdrop: true
+    , keyboard: true
+    , show: true
+  }
+
+  $.fn.modal.Constructor = Modal
+
+
+ /* MODAL DATA-API
+  * ============== */
+
+  $(function () {
+    $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
+      var $this = $(this)
+        , href = $this.attr('href')
+        , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+        , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+      e.preventDefault()
+
+      $target
+        .modal(option)
+        .one('hide', function () {
+          $this.focus()
+        })
+    })
+  })
+
+}(window.jQuery);/* ===========================================================
+ * bootstrap-tooltip.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TOOLTIP PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Tooltip = function (element, options) {
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.prototype = {
+
+    constructor: Tooltip
+
+  , init: function (type, element, options) {
+      var eventIn
+        , eventOut
+
+      this.type = type
+      this.$element = $(element)
+      this.options = this.getOptions(options)
+      this.enabled = true
+
+      if (this.options.trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (this.options.trigger != 'manual') {
+        eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
+        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
+        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+
+      this.options.selector ?
+        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+        this.fixTitle()
+    }
+
+  , getOptions: function (options) {
+      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
+
+      if (options.delay && typeof options.delay == 'number') {
+        options.delay = {
+          show: options.delay
+        , hide: options.delay
+        }
+      }
+
+      return options
+    }
+
+  , enter: function (e) {
+      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+
+      if (!self.options.delay || !self.options.delay.show) return self.show()
+
+      clearTimeout(this.timeout)
+      self.hoverState = 'in'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'in') self.show()
+      }, self.options.delay.show)
+    }
+
+  , leave: function (e) {
+      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+
+      if (this.timeout) clearTimeout(this.timeout)
+      if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+      self.hoverState = 'out'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'out') self.hide()
+      }, self.options.delay.hide)
+    }
+
+  , show: function () {
+      var $tip
+        , inside
+        , pos
+        , actualWidth
+        , actualHeight
+        , placement
+        , tp
+
+      if (this.hasContent() && this.enabled) {
+        $tip = this.tip()
+        this.setContent()
+
+        if (this.options.animation) {
+          $tip.addClass('fade')
+        }
+
+        placement = typeof this.options.placement == 'function' ?
+          this.options.placement.call(this, $tip[0], this.$element[0]) :
+          this.options.placement
+
+        inside = /in/.test(placement)
+
+        $tip
+          .remove()
+          .css({ top: 0, left: 0, display: 'block' })
+          .appendTo(inside ? this.$element : document.body)
+
+        pos = this.getPosition(inside)
+
+        actualWidth = $tip[0].offsetWidth
+        actualHeight = $tip[0].offsetHeight
+
+        switch (inside ? placement.split(' ')[1] : placement) {
+          case 'bottom':
+            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'top':
+            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'left':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
+            break
+          case 'right':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
+            break
+        }
+
+        $tip
+          .css(tp)
+          .addClass(placement)
+          .addClass('in')
+      }
+    }
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+
+      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+      $tip.removeClass('fade in top bottom left right')
+    }
+
+  , hide: function () {
+      var that = this
+        , $tip = this.tip()
+
+      $tip.removeClass('in')
+
+      function removeWithAnimation() {
+        var timeout = setTimeout(function () {
+          $tip.off($.support.transition.end).remove()
+        }, 500)
+
+        $tip.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          $tip.remove()
+        })
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        removeWithAnimation() :
+        $tip.remove()
+
+      return this
+    }
+
+  , fixTitle: function () {
+      var $e = this.$element
+      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
+      }
+    }
+
+  , hasContent: function () {
+      return this.getTitle()
+    }
+
+  , getPosition: function (inside) {
+      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
+        width: this.$element[0].offsetWidth
+      , height: this.$element[0].offsetHeight
+      })
+    }
+
+  , getTitle: function () {
+      var title
+        , $e = this.$element
+        , o = this.options
+
+      title = $e.attr('data-original-title')
+        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+      return title
+    }
+
+  , tip: function () {
+      return this.$tip = this.$tip || $(this.options.template)
+    }
+
+  , validate: function () {
+      if (!this.$element[0].parentNode) {
+        this.hide()
+        this.$element = null
+        this.options = null
+      }
+    }
+
+  , enable: function () {
+      this.enabled = true
+    }
+
+  , disable: function () {
+      this.enabled = false
+    }
+
+  , toggleEnabled: function () {
+      this.enabled = !this.enabled
+    }
+
+  , toggle: function () {
+      this[this.tip().hasClass('in') ? 'hide' : 'show']()
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  }
+
+
+ /* TOOLTIP PLUGIN DEFINITION
+  * ========================= */
+
+  $.fn.tooltip = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tooltip')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tooltip.Constructor = Tooltip
+
+  $.fn.tooltip.defaults = {
+    animation: true
+  , placement: 'top'
+  , selector: false
+  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
+  , trigger: 'hover'
+  , title: ''
+  , delay: 0
+  , html: true
+  }
+
+}(window.jQuery);
+/* ===========================================================
+ * bootstrap-popover.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* POPOVER PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+
+  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
+     ========================================== */
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
+
+    constructor: Popover
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+        , content = this.getContent()
+
+      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+      $tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)
+
+      $tip.removeClass('fade top bottom left right in')
+    }
+
+  , hasContent: function () {
+      return this.getTitle() || this.getContent()
+    }
+
+  , getContent: function () {
+      var content
+        , $e = this.$element
+        , o = this.options
+
+      content = $e.attr('data-content')
+        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
+
+      return content
+    }
+
+  , tip: function () {
+      if (!this.$tip) {
+        this.$tip = $(this.options.template)
+      }
+      return this.$tip
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  })
+
+
+ /* POPOVER PLUGIN DEFINITION
+  * ======================= */
+
+  $.fn.popover = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('popover')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.popover.Constructor = Popover
+
+  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
+    placement: 'right'
+  , trigger: 'click'
+  , content: ''
+  , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-scrollspy.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* SCROLLSPY CLASS DEFINITION
+  * ========================== */
+
+  function ScrollSpy(element, options) {
+    var process = $.proxy(this.process, this)
+      , $element = $(element).is('body') ? $(window) : $(element)
+      , href
+    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
+    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
+    this.selector = (this.options.target
+      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      || '') + ' .nav li > a'
+    this.$body = $('body')
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.prototype = {
+
+      constructor: ScrollSpy
+
+    , refresh: function () {
+        var self = this
+          , $targets
+
+        this.offsets = $([])
+        this.targets = $([])
+
+        $targets = this.$body
+          .find(this.selector)
+          .map(function () {
+            var $el = $(this)
+              , href = $el.data('target') || $el.attr('href')
+              , $href = /^#\w/.test(href) && $(href)
+            return ( $href
+              && $href.length
+              && [[ $href.position().top, href ]] ) || null
+          })
+          .sort(function (a, b) { return a[0] - b[0] })
+          .each(function () {
+            self.offsets.push(this[0])
+            self.targets.push(this[1])
+          })
+      }
+
+    , process: function () {
+        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+          , maxScroll = scrollHeight - this.$scrollElement.height()
+          , offsets = this.offsets
+          , targets = this.targets
+          , activeTarget = this.activeTarget
+          , i
+
+        if (scrollTop >= maxScroll) {
+          return activeTarget != (i = targets.last()[0])
+            && this.activate ( i )
+        }
+
+        for (i = offsets.length; i--;) {
+          activeTarget != targets[i]
+            && scrollTop >= offsets[i]
+            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+            && this.activate( targets[i] )
+        }
+      }
+
+    , activate: function (target) {
+        var active
+          , selector
+
+        this.activeTarget = target
+
+        $(this.selector)
+          .parent('.active')
+          .removeClass('active')
+
+        selector = this.selector
+          + '[data-target="' + target + '"],'
+          + this.selector + '[href="' + target + '"]'
+
+        active = $(selector)
+          .parent('li')
+          .addClass('active')
+
+        if (active.parent('.dropdown-menu').length)  {
+          active = active.closest('li.dropdown').addClass('active')
+        }
+
+        active.trigger('activate')
+      }
+
+  }
+
+
+ /* SCROLLSPY PLUGIN DEFINITION
+  * =========================== */
+
+  $.fn.scrollspy = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('scrollspy')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+  $.fn.scrollspy.defaults = {
+    offset: 10
+  }
+
+
+ /* SCROLLSPY DATA-API
+  * ================== */
+
+  $(window).on('load', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      $spy.scrollspy($spy.data())
+    })
+  })
+
+}(window.jQuery);/* ========================================================
+ * bootstrap-tab.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
+ * ========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TAB CLASS DEFINITION
+  * ==================== */
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.prototype = {
+
+    constructor: Tab
+
+  , show: function () {
+      var $this = this.element
+        , $ul = $this.closest('ul:not(.dropdown-menu)')
+        , selector = $this.attr('data-target')
+        , previous
+        , $target
+        , e
+
+      if (!selector) {
+        selector = $this.attr('href')
+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+      }
+
+      if ( $this.parent('li').hasClass('active') ) return
+
+      previous = $ul.find('.active a').last()[0]
+
+      e = $.Event('show', {
+        relatedTarget: previous
+      })
+
+      $this.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      $target = $(selector)
+
+      this.activate($this.parent('li'), $ul)
+      this.activate($target, $target.parent(), function () {
+        $this.trigger({
+          type: 'shown'
+        , relatedTarget: previous
+        })
+      })
+    }
+
+  , activate: function ( element, container, callback) {
+      var $active = container.find('> .active')
+        , transition = callback
+            && $.support.transition
+            && $active.hasClass('fade')
+
+      function next() {
+        $active
+          .removeClass('active')
+          .find('> .dropdown-menu > .active')
+          .removeClass('active')
+
+        element.addClass('active')
+
+        if (transition) {
+          element[0].offsetWidth // reflow for transition
+          element.addClass('in')
+        } else {
+          element.removeClass('fade')
+        }
+
+        if ( element.parent('.dropdown-menu') ) {
+          element.closest('li.dropdown').addClass('active')
+        }
+
+        callback && callback()
+      }
+
+      transition ?
+        $active.one($.support.transition.end, next) :
+        next()
+
+      $active.removeClass('in')
+    }
+  }
+
+
+ /* TAB PLUGIN DEFINITION
+  * ===================== */
+
+  $.fn.tab = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tab')
+      if (!data) $this.data('tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tab.Constructor = Tab
+
+
+ /* TAB DATA-API
+  * ============ */
+
+  $(function () {
+    $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+      e.preventDefault()
+      $(this).tab('show')
+    })
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-typeahead.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function($){
+
+  "use strict"; // jshint ;_;
+
+
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
+  * ================================= */
+
+  var Typeahead = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.typeahead.defaults, options)
+    this.matcher = this.options.matcher || this.matcher
+    this.sorter = this.options.sorter || this.sorter
+    this.highlighter = this.options.highlighter || this.highlighter
+    this.updater = this.options.updater || this.updater
+    this.$menu = $(this.options.menu).appendTo('body')
+    this.source = this.options.source
+    this.shown = false
+    this.listen()
+  }
+
+  Typeahead.prototype = {
+
+    constructor: Typeahead
+
+  , select: function () {
+      var val = this.$menu.find('.active').attr('data-value')
+      this.$element
+        .val(this.updater(val))
+        .change()
+      return this.hide()
+    }
+
+  , updater: function (item) {
+      return item
+    }
+
+  , show: function () {
+      var pos = $.extend({}, this.$element.offset(), {
+        height: this.$element[0].offsetHeight
+      })
+
+      this.$menu.css({
+        top: pos.top + pos.height
+      , left: pos.left
+      })
+
+      this.$menu.show()
+      this.shown = true
+      return this
+    }
+
+  , hide: function () {
+      this.$menu.hide()
+      this.shown = false
+      return this
+    }
+
+  , lookup: function (event) {
+      var items
+
+      this.query = this.$element.val()
+
+      if (!this.query || this.query.length < this.options.minLength) {
+        return this.shown ? this.hide() : this
+      }
+
+      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
+
+      return items ? this.process(items) : this
+    }
+
+  , process: function (items) {
+      var that = this
+
+      items = $.grep(items, function (item) {
+        return that.matcher(item)
+      })
+
+      items = this.sorter(items)
+
+      if (!items.length) {
+        return this.shown ? this.hide() : this
+      }
+
+      return this.render(items.slice(0, this.options.items)).show()
+    }
+
+  , matcher: function (item) {
+      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
+    }
+
+  , sorter: function (items) {
+      var beginswith = []
+        , caseSensitive = []
+        , caseInsensitive = []
+        , item
+
+      while (item = items.shift()) {
+        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
+        else if (~item.indexOf(this.query)) caseSensitive.push(item)
+        else caseInsensitive.push(item)
+      }
+
+      return beginswith.concat(caseSensitive, caseInsensitive)
+    }
+
+  , highlighter: function (item) {
+      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
+      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
+        return '<strong>' + match + '</strong>'
+      })
+    }
+
+  , render: function (items) {
+      var that = this
+
+      items = $(items).map(function (i, item) {
+        i = $(that.options.item).attr('data-value', item)
+        i.find('a').html(that.highlighter(item))
+        return i[0]
+      })
+
+      items.first().addClass('active')
+      this.$menu.html(items)
+      return this
+    }
+
+  , next: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , next = active.next()
+
+      if (!next.length) {
+        next = $(this.$menu.find('li')[0])
+      }
+
+      next.addClass('active')
+    }
+
+  , prev: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , prev = active.prev()
+
+      if (!prev.length) {
+        prev = this.$menu.find('li').last()
+      }
+
+      prev.addClass('active')
+    }
+
+  , listen: function () {
+      this.$element
+        .on('blur',     $.proxy(this.blur, this))
+        .on('keypress', $.proxy(this.keypress, this))
+        .on('keyup',    $.proxy(this.keyup, this))
+
+      if ($.browser.chrome || $.browser.webkit || $.browser.msie) {
+        this.$element.on('keydown', $.proxy(this.keydown, this))
+      }
+
+      this.$menu
+        .on('click', $.proxy(this.click, this))
+        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+    }
+
+  , move: function (e) {
+      if (!this.shown) return
+
+      switch(e.keyCode) {
+        case 9: // tab
+        case 13: // enter
+        case 27: // escape
+          e.preventDefault()
+          break
+
+        case 38: // up arrow
+          e.preventDefault()
+          this.prev()
+          break
+
+        case 40: // down arrow
+          e.preventDefault()
+          this.next()
+          break
+      }
+
+      e.stopPropagation()
+    }
+
+  , keydown: function (e) {
+      this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])
+      this.move(e)
+    }
+
+  , keypress: function (e) {
+      if (this.suppressKeyPressRepeat) return
+      this.move(e)
+    }
+
+  , keyup: function (e) {
+      switch(e.keyCode) {
+        case 40: // down arrow
+        case 38: // up arrow
+          break
+
+        case 9: // tab
+        case 13: // enter
+          if (!this.shown) return
+          this.select()
+          break
+
+        case 27: // escape
+          if (!this.shown) return
+          this.hide()
+          break
+
+        default:
+          this.lookup()
+      }
+
+      e.stopPropagation()
+      e.preventDefault()
+  }
+
+  , blur: function (e) {
+      var that = this
+      setTimeout(function () { that.hide() }, 150)
+    }
+
+  , click: function (e) {
+      e.stopPropagation()
+      e.preventDefault()
+      this.select()
+    }
+
+  , mouseenter: function (e) {
+      this.$menu.find('.active').removeClass('active')
+      $(e.currentTarget).addClass('active')
+    }
+
+  }
+
+
+  /* TYPEAHEAD PLUGIN DEFINITION
+   * =========================== */
+
+  $.fn.typeahead = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('typeahead')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.typeahead.defaults = {
+    source: []
+  , items: 8
+  , menu: '<ul class="typeahead dropdown-menu"></ul>'
+  , item: '<li><a href="#"></a></li>'
+  , minLength: 1
+  }
+
+  $.fn.typeahead.Constructor = Typeahead
+
+
+ /*   TYPEAHEAD DATA-API
+  * ================== */
+
+  $(function () {
+    $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
+      var $this = $(this)
+      if ($this.data('typeahead')) return
+      e.preventDefault()
+      $this.typeahead($this.data())
+    })
+  })
+
+}(window.jQuery);
+/* ==========================================================
+ * bootstrap-affix.js v2.1.1
+ * http://twitter.github.com/bootstrap/javascript.html#affix
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* AFFIX CLASS DEFINITION
+  * ====================== */
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, $.fn.affix.defaults, options)
+    this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
+    this.$element = $(element)
+    this.checkPosition()
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var scrollHeight = $(document).height()
+      , scrollTop = this.$window.scrollTop()
+      , position = this.$element.offset()
+      , offset = this.options.offset
+      , offsetBottom = offset.bottom
+      , offsetTop = offset.top
+      , reset = 'affix affix-top affix-bottom'
+      , affix
+
+    if (typeof offset != 'object') offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function') offsetTop = offset.top()
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
+
+    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
+      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
+      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
+      'top'    : false
+
+    if (this.affixed === affix) return
+
+    this.affixed = affix
+    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
+
+    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
+  }
+
+
+ /* AFFIX PLUGIN DEFINITION
+  * ======================= */
+
+  $.fn.affix = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('affix')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.affix.Constructor = Affix
+
+  $.fn.affix.defaults = {
+    offset: 0
+  }
+
+
+ /* AFFIX DATA-API
+  * ============== */
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+        , data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
+      data.offsetTop && (data.offset.top = data.offsetTop)
+
+      $spy.affix(data)
+    })
+  })
+
+
+}(window.jQuery);
\ No newline at end of file
diff --git a/static/demo/components/bootstrap.css/js/bootstrap.min.js b/static/demo/components/bootstrap.css/js/bootstrap.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..0e33fb164243165b20cccaff9345a284fa2929ce
--- /dev/null
+++ b/static/demo/components/bootstrap.css/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){e(function(){"use strict";e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()},e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e(function(){e("body").on("click.alert.data-api",t,n.prototype.close)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")},e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e(function(){e("body").on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=n,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},to:function(t){var n=this.$element.find(".item.active"),r=n.parent().children(),i=r.index(n),s=this;if(t>r.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){s.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",e(r[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f=e.Event("slide",{relatedTarget:i[0]});this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u]();if(i.hasClass("active"))return;if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}},e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e(function(){e("body").on("click.carousel.data-api","[data-slide]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=!i.data("modal")&&e.extend({},i.data(),n.data());i.carousel(s),t.preventDefault()})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning)return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning)return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=typeof n=="object"&&n;i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e(function(){e("body").on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})})}(window.jQuery),!function(e){"use strict";function r(){i(e(t)).removeClass("open")}function i(t){var n=t.attr("data-target"),r;return n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=e(n),r.length||(r=t.parent()),r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||(s.toggleClass("open"),n.focus()),!1},keydown:function(t){var n,r,s,o,u,a;if(!/(38|40|27)/.test(t.keyCode))return;n=e(this),t.preventDefault(),t.stopPropagation();if(n.is(".disabled, :disabled"))return;o=i(n),u=o.hasClass("open");if(!u||u&&t.keyCode==27)return n.click();r=e("[role=menu] li:not(.divider) a",o);if(!r.length)return;a=r.index(r.filter(":focus")),t.keyCode==38&&a>0&&a--,t.keyCode==40&&a<r.length-1&&a++,~a||(a=0),r.eq(a).focus()}},e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e(function(){e("html").on("click.dropdown.data-api touchstart.dropdown.data-api",r),e("body").on("click.dropdown touchstart.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;e("body").addClass("modal-open"),this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1).focus(),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.trigger("shown")}):t.$element.trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,e("body").removeClass("modal-open"),this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(e){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,e.proxy(this.removeBackdrop,this)):this.removeBackdrop()):t&&t()}},e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e(function(){e("body").on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):this.options.trigger!="manual"&&(i=this.options.trigger=="hover"?"mouseenter":"focus",s=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this))),this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,t,this.$element.data()),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)return n.show();clearTimeout(this.timeout),n.hoverState="in",this.timeout=setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var e,t,n,r,i,s,o;if(this.hasContent()&&this.enabled){e=this.tip(),this.setContent(),this.options.animation&&e.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,t=/in/.test(s),e.remove().css({top:0,left:0,display:"block"}).appendTo(t?this.$element:document.body),n=this.getPosition(t),r=e[0].offsetWidth,i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.css(o).addClass(s).addClass("in")}},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).remove()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.remove()})}var t=this,n=this.tip();return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?r():n.remove(),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content > *")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-content")||(typeof n.content=="function"?n.content.call(t[0]):n.content),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var t=e(this),n=t.data("target")||t.attr("href"),r=/^#\w/.test(n)&&e(n);return r&&r.length&&[[r.position().top,n]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}},e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active a").last()[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}},e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e(function(){e("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=e(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:t.top+t.height,left:t.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),(e.browser.chrome||e.browser.webkit||e.browser.msie)&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this))},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=!~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(e){var t=this;setTimeout(function(){t.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(t){this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")}},e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e(function(){e("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;t.preventDefault(),n.typeahead(n.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))},e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
\ No newline at end of file
diff --git a/static/demo/components/d3/.bower.json b/static/demo/components/d3/.bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..e652d1bb972774ce612bc516bb1ddbc174cc1942
--- /dev/null
+++ b/static/demo/components/d3/.bower.json
@@ -0,0 +1,15 @@
+{
+  "name": "d3",
+  "version": "3.0.8",
+  "main": "./d3.js",
+  "homepage": "https://github.com/mbostock/d3",
+  "_release": "3.0.8",
+  "_resolution": {
+    "type": "version",
+    "tag": "v3.0.8",
+    "commit": "0bad3b32ba52896000f5205dc1b35f8e939d976b"
+  },
+  "_source": "git://github.com/mbostock/d3.git",
+  "_target": "~3.0.0",
+  "_originalSource": "d3"
+}
\ No newline at end of file
diff --git a/static/demo/components/d3/.gitignore b/static/demo/components/d3/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..8cc5a84db98c185e620ea4b71c70c26a55a548c6
--- /dev/null
+++ b/static/demo/components/d3/.gitignore
@@ -0,0 +1,3 @@
+_site
+node_modules
+.DS_Store
diff --git a/static/demo/components/d3/.gitmodules b/static/demo/components/d3/.gitmodules
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/static/demo/components/d3/.npmignore b/static/demo/components/d3/.npmignore
new file mode 100644
index 0000000000000000000000000000000000000000..146266d9e18cb1d12f57138202ab307682eb22c1
--- /dev/null
+++ b/static/demo/components/d3/.npmignore
@@ -0,0 +1,4 @@
+examples/
+test/
+lib/
+.DS_Store
diff --git a/static/demo/components/d3/LICENSE b/static/demo/components/d3/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..cde4728a2cc06102b0c151af1047b96d54404fa4
--- /dev/null
+++ b/static/demo/components/d3/LICENSE
@@ -0,0 +1,26 @@
+Copyright (c) 2012, Michael Bostock
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* The name Michael Bostock may not be used to endorse or promote products
+  derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/static/demo/components/d3/Makefile b/static/demo/components/d3/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d22d52cdbff83f75d1e53458207dbd44e9c3c5dd
--- /dev/null
+++ b/static/demo/components/d3/Makefile
@@ -0,0 +1,286 @@
+# See the README for installation instructions.
+
+NODE_PATH ?= ./node_modules
+JS_UGLIFY = $(NODE_PATH)/uglify-js/bin/uglifyjs
+JS_TESTER = $(NODE_PATH)/vows/bin/vows
+LOCALE ?= en_US
+
+all: \
+	d3.js \
+	d3.min.js \
+	component.json \
+	package.json
+
+# Modify this rule to build your own custom release.
+
+.INTERMEDIATE d3.js: \
+	src/start.js \
+	d3.core.js \
+	d3.scale.js \
+	d3.svg.js \
+	d3.behavior.js \
+	d3.layout.js \
+	d3.dsv.js \
+	d3.geo.js \
+	d3.geom.js \
+	d3.time.js \
+	src/end.js
+
+d3.core.js: \
+	src/core/core.js \
+	src/core/format-$(LOCALE).js \
+	src/compat/date.js \
+	src/compat/style.js \
+	src/core/class.js \
+	src/core/array.js \
+	src/core/map.js \
+	src/core/identity.js \
+	src/core/true.js \
+	src/core/functor.js \
+	src/core/rebind.js \
+	src/core/ascending.js \
+	src/core/descending.js \
+	src/core/mean.js \
+	src/core/median.js \
+	src/core/min.js \
+	src/core/max.js \
+	src/core/extent.js \
+	src/core/random.js \
+	src/core/number.js \
+	src/core/sum.js \
+	src/core/quantile.js \
+	src/core/shuffle.js \
+	src/core/transpose.js \
+	src/core/zip.js \
+	src/core/bisect.js \
+	src/core/nest.js \
+	src/core/keys.js \
+	src/core/values.js \
+	src/core/entries.js \
+	src/core/permute.js \
+	src/core/merge.js \
+	src/core/collapse.js \
+	src/core/range.js \
+	src/core/requote.js \
+	src/core/round.js \
+	src/core/xhr.js \
+	src/core/text.js \
+	src/core/json.js \
+	src/core/html.js \
+	src/core/xml.js \
+	src/core/ns.js \
+	src/core/dispatch.js \
+	src/core/format.js \
+	src/core/formatPrefix.js \
+	src/core/ease.js \
+	src/core/event.js \
+	src/core/transform.js \
+	src/core/interpolate.js \
+	src/core/uninterpolate.js \
+	src/core/color.js \
+	src/core/rgb.js \
+	src/core/hsl.js \
+	src/core/hcl.js \
+	src/core/lab.js \
+	src/core/xyz.js \
+	src/core/selection.js \
+	src/core/selection-select.js \
+	src/core/selection-selectAll.js \
+	src/core/selection-attr.js \
+	src/core/selection-classed.js \
+	src/core/selection-style.js \
+	src/core/selection-property.js \
+	src/core/selection-text.js \
+	src/core/selection-html.js \
+	src/core/selection-append.js \
+	src/core/selection-insert.js \
+	src/core/selection-remove.js \
+	src/core/selection-data.js \
+	src/core/selection-datum.js \
+	src/core/selection-filter.js \
+	src/core/selection-order.js \
+	src/core/selection-sort.js \
+	src/core/selection-on.js \
+	src/core/selection-each.js \
+	src/core/selection-call.js \
+	src/core/selection-empty.js \
+	src/core/selection-node.js \
+	src/core/selection-transition.js \
+	src/core/selection-root.js \
+	src/core/selection-enter.js \
+	src/core/selection-enter-select.js \
+	src/core/transition.js \
+	src/core/transition-select.js \
+	src/core/transition-selectAll.js \
+	src/core/transition-filter.js \
+	src/core/transition-attr.js \
+	src/core/transition-style.js \
+	src/core/transition-text.js \
+	src/core/transition-remove.js \
+	src/core/transition-ease.js \
+	src/core/transition-delay.js \
+	src/core/transition-duration.js \
+	src/core/transition-each.js \
+	src/core/transition-transition.js \
+	src/core/transition-tween.js \
+	src/core/timer.js \
+	src/core/mouse.js \
+	src/core/touches.js \
+	src/core/noop.js
+
+d3.scale.js: \
+	src/scale/scale.js \
+	src/scale/nice.js \
+	src/scale/linear.js \
+	src/scale/bilinear.js \
+	src/scale/polylinear.js \
+	src/scale/log.js \
+	src/scale/pow.js \
+	src/scale/sqrt.js \
+	src/scale/ordinal.js \
+	src/scale/category.js \
+	src/scale/quantile.js \
+	src/scale/quantize.js \
+	src/scale/threshold.js \
+	src/scale/identity.js
+
+d3.svg.js: \
+	src/svg/svg.js \
+	src/svg/arc.js \
+	src/svg/line.js \
+	src/svg/line-radial.js \
+	src/svg/area.js \
+	src/svg/area-radial.js \
+	src/svg/chord.js \
+	src/svg/diagonal.js \
+	src/svg/diagonal-radial.js \
+	src/svg/symbol.js \
+	src/svg/axis.js \
+	src/svg/brush.js
+
+d3.behavior.js: \
+	src/behavior/behavior.js \
+	src/behavior/drag.js \
+	src/behavior/zoom.js
+
+d3.layout.js: \
+	src/layout/layout.js \
+	src/layout/bundle.js \
+	src/layout/chord.js \
+	src/layout/force.js \
+	src/layout/partition.js \
+	src/layout/pie.js \
+	src/layout/stack.js \
+	src/layout/histogram.js \
+	src/layout/hierarchy.js \
+	src/layout/pack.js \
+	src/layout/cluster.js \
+	src/layout/tree.js \
+	src/layout/treemap.js
+
+d3.geo.js: \
+	src/geo/geo.js \
+	src/geo/stream.js \
+	src/geo/spherical.js \
+	src/geo/cartesian.js \
+	src/geo/resample.js \
+	src/geo/albers-usa.js \
+	src/geo/albers.js \
+	src/geo/azimuthal-equal-area.js \
+	src/geo/azimuthal-equidistant.js \
+	src/geo/bounds.js \
+	src/geo/centroid.js \
+	src/geo/circle.js \
+	src/geo/clip.js \
+	src/geo/clip-antimeridian.js \
+	src/geo/clip-circle.js \
+	src/geo/compose.js \
+	src/geo/equirectangular.js \
+	src/geo/gnomonic.js \
+	src/geo/graticule.js \
+	src/geo/haversin.js \
+	src/geo/interpolate.js \
+	src/geo/greatArc.js \
+	src/geo/mercator.js \
+	src/geo/orthographic.js \
+	src/geo/path.js \
+	src/geo/path-buffer.js \
+	src/geo/path-context.js \
+	src/geo/path-area.js \
+	src/geo/path-centroid.js \
+	src/geo/area.js \
+	src/geo/centroid.js \
+	src/geo/projection.js \
+	src/geo/rotation.js \
+	src/geo/stereographic.js \
+	src/geo/azimuthal.js
+
+d3.dsv.js: \
+	src/dsv/dsv.js \
+	src/dsv/csv.js \
+	src/dsv/tsv.js
+
+d3.time.js: \
+	src/time/time.js \
+	src/time/format-$(LOCALE).js \
+	src/time/format.js \
+	src/time/format-utc.js \
+	src/time/format-iso.js \
+	src/time/interval.js \
+	src/time/second.js \
+	src/time/minute.js \
+	src/time/hour.js \
+	src/time/day.js \
+	src/time/week.js \
+	src/time/month.js \
+	src/time/year.js \
+	src/time/scale.js \
+	src/time/scale-utc.js
+
+d3.geom.js: \
+	src/geom/geom.js \
+	src/geom/hull.js \
+	src/geom/polygon.js \
+	src/geom/voronoi.js \
+	src/geom/delaunay.js \
+	src/geom/quadtree.js
+
+test: all
+	@$(JS_TESTER)
+
+benchmark: all
+	@node test/geo/benchmark.js
+
+%.min.js: %.js Makefile
+	@rm -f $@
+	$(JS_UGLIFY) $< -c -m -o $@
+
+d3%js: Makefile
+	@rm -f $@
+	@cat $(filter %.js,$^) > $@.tmp
+	$(JS_UGLIFY) $@.tmp -b indent-level=2 -o $@
+	@rm $@.tmp
+	@chmod a-w $@
+
+component.json: src/component.js
+	@rm -f $@
+	node src/component.js > $@
+	@chmod a-w $@
+
+package.json: src/package.js
+	@rm -f $@
+	node src/package.js > $@
+	@chmod a-w $@
+
+src/core/format-$(LOCALE).js: src/locale.js src/core/format-locale.js
+	LC_NUMERIC=$(LOCALE) locale -ck LC_NUMERIC | node src/locale.js src/core/format-locale.js > $@
+
+src/time/format-$(LOCALE).js: src/locale.js src/time/format-locale.js
+	LC_TIME=$(LOCALE) locale -ck LC_TIME | node src/locale.js src/time/format-locale.js > $@
+
+.INTERMEDIATE: \
+	src/core/format-$(LOCALE).js \
+	src/time/format-$(LOCALE).js
+
+clean:
+	rm -f d3*.js package.json component.json
diff --git a/static/demo/components/d3/README.md b/static/demo/components/d3/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..885069c70bfc5368778df7bfddf85918970f8e73
--- /dev/null
+++ b/static/demo/components/d3/README.md
@@ -0,0 +1,7 @@
+# Data-Driven Documents
+
+**D3.js** is a JavaScript library for manipulating documents based on data. **D3** helps you bring data to life using HTML, SVG and CSS. D3’s emphasis on web standards gives you the full capabilities of modern browsers without tying yourself to a proprietary framework, combining powerful visualization components and a data-driven approach to DOM manipulation.
+
+Want to learn more? [See the wiki.](https://github.com/mbostock/d3/wiki)
+
+For examples, [see the gallery](https://github.com/mbostock/d3/wiki/Gallery) and [mbostock’s bl.ocks](http://bl.ocks.org/mbostock).
diff --git a/static/demo/components/d3/component.json b/static/demo/components/d3/component.json
new file mode 100644
index 0000000000000000000000000000000000000000..1321c0d2cf957c04ed3fff7078584eecf0277e27
--- /dev/null
+++ b/static/demo/components/d3/component.json
@@ -0,0 +1,5 @@
+{
+  "name": "d3",
+  "version": "3.0.8",
+  "main": "./d3.js"
+}
diff --git a/static/demo/components/d3/d3.js b/static/demo/components/d3/d3.js
new file mode 100644
index 0000000000000000000000000000000000000000..24904eba6bf623c4c90630c2935a938c9844f31b
--- /dev/null
+++ b/static/demo/components/d3/d3.js
@@ -0,0 +1,7801 @@
+d3 = function() {
+  var π = Math.PI, ε = 1e-6, d3 = {
+    version: "3.0.8"
+  }, d3_radians = π / 180, d3_degrees = 180 / π, d3_document = document, d3_window = window;
+  function d3_target(d) {
+    return d.target;
+  }
+  function d3_source(d) {
+    return d.source;
+  }
+  var d3_format_decimalPoint = ".", d3_format_thousandsSeparator = ",", d3_format_grouping = [ 3, 3 ];
+  if (!Date.now) Date.now = function() {
+    return +new Date();
+  };
+  try {
+    d3_document.createElement("div").style.setProperty("opacity", 0, "");
+  } catch (error) {
+    var d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;
+    d3_style_prototype.setProperty = function(name, value, priority) {
+      d3_style_setProperty.call(this, name, value + "", priority);
+    };
+  }
+  function d3_class(ctor, properties) {
+    try {
+      for (var key in properties) {
+        Object.defineProperty(ctor.prototype, key, {
+          value: properties[key],
+          enumerable: false
+        });
+      }
+    } catch (e) {
+      ctor.prototype = properties;
+    }
+  }
+  var d3_array = d3_arraySlice;
+  function d3_arrayCopy(pseudoarray) {
+    var i = -1, n = pseudoarray.length, array = [];
+    while (++i < n) array.push(pseudoarray[i]);
+    return array;
+  }
+  function d3_arraySlice(pseudoarray) {
+    return Array.prototype.slice.call(pseudoarray);
+  }
+  try {
+    d3_array(d3_document.documentElement.childNodes)[0].nodeType;
+  } catch (e) {
+    d3_array = d3_arrayCopy;
+  }
+  var d3_arraySubclass = [].__proto__ ? function(array, prototype) {
+    array.__proto__ = prototype;
+  } : function(array, prototype) {
+    for (var property in prototype) array[property] = prototype[property];
+  };
+  d3.map = function(object) {
+    var map = new d3_Map();
+    for (var key in object) map.set(key, object[key]);
+    return map;
+  };
+  function d3_Map() {}
+  d3_class(d3_Map, {
+    has: function(key) {
+      return d3_map_prefix + key in this;
+    },
+    get: function(key) {
+      return this[d3_map_prefix + key];
+    },
+    set: function(key, value) {
+      return this[d3_map_prefix + key] = value;
+    },
+    remove: function(key) {
+      key = d3_map_prefix + key;
+      return key in this && delete this[key];
+    },
+    keys: function() {
+      var keys = [];
+      this.forEach(function(key) {
+        keys.push(key);
+      });
+      return keys;
+    },
+    values: function() {
+      var values = [];
+      this.forEach(function(key, value) {
+        values.push(value);
+      });
+      return values;
+    },
+    entries: function() {
+      var entries = [];
+      this.forEach(function(key, value) {
+        entries.push({
+          key: key,
+          value: value
+        });
+      });
+      return entries;
+    },
+    forEach: function(f) {
+      for (var key in this) {
+        if (key.charCodeAt(0) === d3_map_prefixCode) {
+          f.call(this, key.substring(1), this[key]);
+        }
+      }
+    }
+  });
+  var d3_map_prefix = "\0", d3_map_prefixCode = d3_map_prefix.charCodeAt(0);
+  function d3_identity(d) {
+    return d;
+  }
+  function d3_true() {
+    return true;
+  }
+  function d3_functor(v) {
+    return typeof v === "function" ? v : function() {
+      return v;
+    };
+  }
+  d3.functor = d3_functor;
+  d3.rebind = function(target, source) {
+    var i = 1, n = arguments.length, method;
+    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
+    return target;
+  };
+  function d3_rebind(target, source, method) {
+    return function() {
+      var value = method.apply(source, arguments);
+      return value === source ? target : value;
+    };
+  }
+  d3.ascending = function(a, b) {
+    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+  };
+  d3.descending = function(a, b) {
+    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+  };
+  d3.mean = function(array, f) {
+    var n = array.length, a, m = 0, i = -1, j = 0;
+    if (arguments.length === 1) {
+      while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j;
+    } else {
+      while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j;
+    }
+    return j ? m : undefined;
+  };
+  d3.median = function(array, f) {
+    if (arguments.length > 1) array = array.map(f);
+    array = array.filter(d3_number);
+    return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined;
+  };
+  d3.min = function(array, f) {
+    var i = -1, n = array.length, a, b;
+    if (arguments.length === 1) {
+      while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
+      while (++i < n) if ((b = array[i]) != null && a > b) a = b;
+    } else {
+      while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
+      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
+    }
+    return a;
+  };
+  d3.max = function(array, f) {
+    var i = -1, n = array.length, a, b;
+    if (arguments.length === 1) {
+      while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
+      while (++i < n) if ((b = array[i]) != null && b > a) a = b;
+    } else {
+      while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
+      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
+    }
+    return a;
+  };
+  d3.extent = function(array, f) {
+    var i = -1, n = array.length, a, b, c;
+    if (arguments.length === 1) {
+      while (++i < n && ((a = c = array[i]) == null || a != a)) a = c = undefined;
+      while (++i < n) if ((b = array[i]) != null) {
+        if (a > b) a = b;
+        if (c < b) c = b;
+      }
+    } else {
+      while (++i < n && ((a = c = f.call(array, array[i], i)) == null || a != a)) a = undefined;
+      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
+        if (a > b) a = b;
+        if (c < b) c = b;
+      }
+    }
+    return [ a, c ];
+  };
+  d3.random = {
+    normal: function(µ, σ) {
+      var n = arguments.length;
+      if (n < 2) σ = 1;
+      if (n < 1) µ = 0;
+      return function() {
+        var x, y, r;
+        do {
+          x = Math.random() * 2 - 1;
+          y = Math.random() * 2 - 1;
+          r = x * x + y * y;
+        } while (!r || r > 1);
+        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);
+      };
+    },
+    logNormal: function() {
+      var random = d3.random.normal.apply(d3, arguments);
+      return function() {
+        return Math.exp(random());
+      };
+    },
+    irwinHall: function(m) {
+      return function() {
+        for (var s = 0, j = 0; j < m; j++) s += Math.random();
+        return s / m;
+      };
+    }
+  };
+  function d3_number(x) {
+    return x != null && !isNaN(x);
+  }
+  d3.sum = function(array, f) {
+    var s = 0, n = array.length, a, i = -1;
+    if (arguments.length === 1) {
+      while (++i < n) if (!isNaN(a = +array[i])) s += a;
+    } else {
+      while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a;
+    }
+    return s;
+  };
+  d3.quantile = function(values, p) {
+    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;
+    return e ? v + e * (values[h] - v) : v;
+  };
+  d3.shuffle = function(array) {
+    var m = array.length, t, i;
+    while (m) {
+      i = Math.random() * m-- | 0;
+      t = array[m], array[m] = array[i], array[i] = t;
+    }
+    return array;
+  };
+  d3.transpose = function(matrix) {
+    return d3.zip.apply(d3, matrix);
+  };
+  d3.zip = function() {
+    if (!(n = arguments.length)) return [];
+    for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {
+      for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {
+        zip[j] = arguments[j][i];
+      }
+    }
+    return zips;
+  };
+  function d3_zipLength(d) {
+    return d.length;
+  }
+  d3.bisector = function(f) {
+    return {
+      left: function(a, x, lo, hi) {
+        if (arguments.length < 3) lo = 0;
+        if (arguments.length < 4) hi = a.length;
+        while (lo < hi) {
+          var mid = lo + hi >>> 1;
+          if (f.call(a, a[mid], mid) < x) lo = mid + 1; else hi = mid;
+        }
+        return lo;
+      },
+      right: function(a, x, lo, hi) {
+        if (arguments.length < 3) lo = 0;
+        if (arguments.length < 4) hi = a.length;
+        while (lo < hi) {
+          var mid = lo + hi >>> 1;
+          if (x < f.call(a, a[mid], mid)) hi = mid; else lo = mid + 1;
+        }
+        return lo;
+      }
+    };
+  };
+  var d3_bisector = d3.bisector(function(d) {
+    return d;
+  });
+  d3.bisectLeft = d3_bisector.left;
+  d3.bisect = d3.bisectRight = d3_bisector.right;
+  d3.nest = function() {
+    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;
+    function map(array, depth) {
+      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;
+      var i = -1, n = array.length, key = keys[depth++], keyValue, object, valuesByKey = new d3_Map(), values, o = {};
+      while (++i < n) {
+        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
+          values.push(object);
+        } else {
+          valuesByKey.set(keyValue, [ object ]);
+        }
+      }
+      valuesByKey.forEach(function(keyValue, values) {
+        o[keyValue] = map(values, depth);
+      });
+      return o;
+    }
+    function entries(map, depth) {
+      if (depth >= keys.length) return map;
+      var a = [], sortKey = sortKeys[depth++], key;
+      for (key in map) {
+        a.push({
+          key: key,
+          values: entries(map[key], depth)
+        });
+      }
+      if (sortKey) a.sort(function(a, b) {
+        return sortKey(a.key, b.key);
+      });
+      return a;
+    }
+    nest.map = function(array) {
+      return map(array, 0);
+    };
+    nest.entries = function(array) {
+      return entries(map(array, 0), 0);
+    };
+    nest.key = function(d) {
+      keys.push(d);
+      return nest;
+    };
+    nest.sortKeys = function(order) {
+      sortKeys[keys.length - 1] = order;
+      return nest;
+    };
+    nest.sortValues = function(order) {
+      sortValues = order;
+      return nest;
+    };
+    nest.rollup = function(f) {
+      rollup = f;
+      return nest;
+    };
+    return nest;
+  };
+  d3.keys = function(map) {
+    var keys = [];
+    for (var key in map) keys.push(key);
+    return keys;
+  };
+  d3.values = function(map) {
+    var values = [];
+    for (var key in map) values.push(map[key]);
+    return values;
+  };
+  d3.entries = function(map) {
+    var entries = [];
+    for (var key in map) entries.push({
+      key: key,
+      value: map[key]
+    });
+    return entries;
+  };
+  d3.permute = function(array, indexes) {
+    var permutes = [], i = -1, n = indexes.length;
+    while (++i < n) permutes[i] = array[indexes[i]];
+    return permutes;
+  };
+  d3.merge = function(arrays) {
+    return Array.prototype.concat.apply([], arrays);
+  };
+  function d3_collapse(s) {
+    return s.trim().replace(/\s+/g, " ");
+  }
+  d3.range = function(start, stop, step) {
+    if (arguments.length < 3) {
+      step = 1;
+      if (arguments.length < 2) {
+        stop = start;
+        start = 0;
+      }
+    }
+    if ((stop - start) / step === Infinity) throw new Error("infinite range");
+    var range = [], k = d3_range_integerScale(Math.abs(step)), i = -1, j;
+    start *= k, stop *= k, step *= k;
+    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);
+    return range;
+  };
+  function d3_range_integerScale(x) {
+    var k = 1;
+    while (x * k % 1) k *= 10;
+    return k;
+  }
+  d3.requote = function(s) {
+    return s.replace(d3_requote_re, "\\$&");
+  };
+  var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
+  d3.round = function(x, n) {
+    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);
+  };
+  d3.xhr = function(url, mimeType, callback) {
+    var xhr = {}, dispatch = d3.dispatch("progress", "load", "error"), headers = {}, response = d3_identity, request = new (d3_window.XDomainRequest && /^(http(s)?:)?\/\//.test(url) ? XDomainRequest : XMLHttpRequest)();
+    "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {
+      request.readyState > 3 && respond();
+    };
+    function respond() {
+      var s = request.status;
+      !s && request.responseText || s >= 200 && s < 300 || s === 304 ? dispatch.load.call(xhr, response.call(xhr, request)) : dispatch.error.call(xhr, request);
+    }
+    request.onprogress = function(event) {
+      var o = d3.event;
+      d3.event = event;
+      try {
+        dispatch.progress.call(xhr, request);
+      } finally {
+        d3.event = o;
+      }
+    };
+    xhr.header = function(name, value) {
+      name = (name + "").toLowerCase();
+      if (arguments.length < 2) return headers[name];
+      if (value == null) delete headers[name]; else headers[name] = value + "";
+      return xhr;
+    };
+    xhr.mimeType = function(value) {
+      if (!arguments.length) return mimeType;
+      mimeType = value == null ? null : value + "";
+      return xhr;
+    };
+    xhr.response = function(value) {
+      response = value;
+      return xhr;
+    };
+    [ "get", "post" ].forEach(function(method) {
+      xhr[method] = function() {
+        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));
+      };
+    });
+    xhr.send = function(method, data, callback) {
+      if (arguments.length === 2 && typeof data === "function") callback = data, data = null;
+      request.open(method, url, true);
+      if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*";
+      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);
+      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);
+      if (callback != null) xhr.on("error", callback).on("load", function(request) {
+        callback(null, request);
+      });
+      request.send(data == null ? null : data);
+      return xhr;
+    };
+    xhr.abort = function() {
+      request.abort();
+      return xhr;
+    };
+    d3.rebind(xhr, dispatch, "on");
+    if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, 
+    mimeType = null;
+    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));
+  };
+  function d3_xhr_fixCallback(callback) {
+    return callback.length === 1 ? function(error, request) {
+      callback(error == null ? request : null);
+    } : callback;
+  }
+  d3.text = function() {
+    return d3.xhr.apply(d3, arguments).response(d3_text);
+  };
+  function d3_text(request) {
+    return request.responseText;
+  }
+  d3.json = function(url, callback) {
+    return d3.xhr(url, "application/json", callback).response(d3_json);
+  };
+  function d3_json(request) {
+    return JSON.parse(request.responseText);
+  }
+  d3.html = function(url, callback) {
+    return d3.xhr(url, "text/html", callback).response(d3_html);
+  };
+  function d3_html(request) {
+    var range = d3_document.createRange();
+    range.selectNode(d3_document.body);
+    return range.createContextualFragment(request.responseText);
+  }
+  d3.xml = function() {
+    return d3.xhr.apply(d3, arguments).response(d3_xml);
+  };
+  function d3_xml(request) {
+    return request.responseXML;
+  }
+  var d3_nsPrefix = {
+    svg: "http://www.w3.org/2000/svg",
+    xhtml: "http://www.w3.org/1999/xhtml",
+    xlink: "http://www.w3.org/1999/xlink",
+    xml: "http://www.w3.org/XML/1998/namespace",
+    xmlns: "http://www.w3.org/2000/xmlns/"
+  };
+  d3.ns = {
+    prefix: d3_nsPrefix,
+    qualify: function(name) {
+      var i = name.indexOf(":"), prefix = name;
+      if (i >= 0) {
+        prefix = name.substring(0, i);
+        name = name.substring(i + 1);
+      }
+      return d3_nsPrefix.hasOwnProperty(prefix) ? {
+        space: d3_nsPrefix[prefix],
+        local: name
+      } : name;
+    }
+  };
+  d3.dispatch = function() {
+    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;
+    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
+    return dispatch;
+  };
+  function d3_dispatch() {}
+  d3_dispatch.prototype.on = function(type, listener) {
+    var i = type.indexOf("."), name = "";
+    if (i > 0) {
+      name = type.substring(i + 1);
+      type = type.substring(0, i);
+    }
+    return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);
+  };
+  function d3_dispatch_event(dispatch) {
+    var listeners = [], listenerByName = new d3_Map();
+    function event() {
+      var z = listeners, i = -1, n = z.length, l;
+      while (++i < n) if (l = z[i].on) l.apply(this, arguments);
+      return dispatch;
+    }
+    event.on = function(name, listener) {
+      var l = listenerByName.get(name), i;
+      if (arguments.length < 2) return l && l.on;
+      if (l) {
+        l.on = null;
+        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
+        listenerByName.remove(name);
+      }
+      if (listener) listeners.push(listenerByName.set(name, {
+        on: listener
+      }));
+      return dispatch;
+    };
+    return event;
+  }
+  d3.format = function(specifier) {
+    var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "", basePrefix = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, suffix = "", integer = false;
+    if (precision) precision = +precision.substring(1);
+    if (zfill || fill === "0" && align === "=") {
+      zfill = fill = "0";
+      align = "=";
+      if (comma) width -= Math.floor((width - 1) / 4);
+    }
+    switch (type) {
+     case "n":
+      comma = true;
+      type = "g";
+      break;
+
+     case "%":
+      scale = 100;
+      suffix = "%";
+      type = "f";
+      break;
+
+     case "p":
+      scale = 100;
+      suffix = "%";
+      type = "r";
+      break;
+
+     case "b":
+     case "o":
+     case "x":
+     case "X":
+      if (basePrefix) basePrefix = "0" + type.toLowerCase();
+
+     case "c":
+     case "d":
+      integer = true;
+      precision = 0;
+      break;
+
+     case "s":
+      scale = -1;
+      type = "r";
+      break;
+    }
+    if (basePrefix === "#") basePrefix = "";
+    if (type == "r" && !precision) type = "g";
+    type = d3_format_types.get(type) || d3_format_typeDefault;
+    var zcomma = zfill && comma;
+    return function(value) {
+      if (integer && value % 1) return "";
+      var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign;
+      if (scale < 0) {
+        var prefix = d3.formatPrefix(value, precision);
+        value = prefix.scale(value);
+        suffix = prefix.symbol;
+      } else {
+        value *= scale;
+      }
+      value = type(value, precision);
+      if (!zfill && comma) value = d3_format_group(value);
+      var length = basePrefix.length + value.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : "";
+      if (zcomma) value = d3_format_group(padding + value);
+      if (d3_format_decimalPoint) value.replace(".", d3_format_decimalPoint);
+      negative += basePrefix;
+      return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + suffix;
+    };
+  };
+  var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/;
+  var d3_format_types = d3.map({
+    b: function(x) {
+      return x.toString(2);
+    },
+    c: function(x) {
+      return String.fromCharCode(x);
+    },
+    o: function(x) {
+      return x.toString(8);
+    },
+    x: function(x) {
+      return x.toString(16);
+    },
+    X: function(x) {
+      return x.toString(16).toUpperCase();
+    },
+    g: function(x, p) {
+      return x.toPrecision(p);
+    },
+    e: function(x, p) {
+      return x.toExponential(p);
+    },
+    f: function(x, p) {
+      return x.toFixed(p);
+    },
+    r: function(x, p) {
+      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));
+    }
+  });
+  function d3_format_precision(x, p) {
+    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);
+  }
+  function d3_format_typeDefault(x) {
+    return x + "";
+  }
+  var d3_format_group = d3_identity;
+  if (d3_format_grouping) {
+    var d3_format_groupingLength = d3_format_grouping.length;
+    d3_format_group = function(value) {
+      var i = value.lastIndexOf("."), f = i >= 0 ? "." + value.substring(i + 1) : (i = value.length, 
+      ""), t = [], j = 0, g = d3_format_grouping[0];
+      while (i > 0 && g > 0) {
+        t.push(value.substring(i -= g, i + g));
+        g = d3_format_grouping[j = (j + 1) % d3_format_groupingLength];
+      }
+      return t.reverse().join(d3_format_thousandsSeparator || "") + f;
+    };
+  }
+  var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix);
+  d3.formatPrefix = function(value, precision) {
+    var i = 0;
+    if (value) {
+      if (value < 0) value *= -1;
+      if (precision) value = d3.round(value, d3_format_precision(value, precision));
+      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);
+      i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3));
+    }
+    return d3_formatPrefixes[8 + i / 3];
+  };
+  function d3_formatPrefix(d, i) {
+    var k = Math.pow(10, Math.abs(8 - i) * 3);
+    return {
+      scale: i > 8 ? function(d) {
+        return d / k;
+      } : function(d) {
+        return d * k;
+      },
+      symbol: d
+    };
+  }
+  var d3_ease_default = function() {
+    return d3_identity;
+  };
+  var d3_ease = d3.map({
+    linear: d3_ease_default,
+    poly: d3_ease_poly,
+    quad: function() {
+      return d3_ease_quad;
+    },
+    cubic: function() {
+      return d3_ease_cubic;
+    },
+    sin: function() {
+      return d3_ease_sin;
+    },
+    exp: function() {
+      return d3_ease_exp;
+    },
+    circle: function() {
+      return d3_ease_circle;
+    },
+    elastic: d3_ease_elastic,
+    back: d3_ease_back,
+    bounce: function() {
+      return d3_ease_bounce;
+    }
+  });
+  var d3_ease_mode = d3.map({
+    "in": d3_identity,
+    out: d3_ease_reverse,
+    "in-out": d3_ease_reflect,
+    "out-in": function(f) {
+      return d3_ease_reflect(d3_ease_reverse(f));
+    }
+  });
+  d3.ease = function(name) {
+    var i = name.indexOf("-"), t = i >= 0 ? name.substring(0, i) : name, m = i >= 0 ? name.substring(i + 1) : "in";
+    t = d3_ease.get(t) || d3_ease_default;
+    m = d3_ease_mode.get(m) || d3_identity;
+    return d3_ease_clamp(m(t.apply(null, Array.prototype.slice.call(arguments, 1))));
+  };
+  function d3_ease_clamp(f) {
+    return function(t) {
+      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
+    };
+  }
+  function d3_ease_reverse(f) {
+    return function(t) {
+      return 1 - f(1 - t);
+    };
+  }
+  function d3_ease_reflect(f) {
+    return function(t) {
+      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));
+    };
+  }
+  function d3_ease_quad(t) {
+    return t * t;
+  }
+  function d3_ease_cubic(t) {
+    return t * t * t;
+  }
+  function d3_ease_cubicInOut(t) {
+    if (t <= 0) return 0;
+    if (t >= 1) return 1;
+    var t2 = t * t, t3 = t2 * t;
+    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);
+  }
+  function d3_ease_poly(e) {
+    return function(t) {
+      return Math.pow(t, e);
+    };
+  }
+  function d3_ease_sin(t) {
+    return 1 - Math.cos(t * π / 2);
+  }
+  function d3_ease_exp(t) {
+    return Math.pow(2, 10 * (t - 1));
+  }
+  function d3_ease_circle(t) {
+    return 1 - Math.sqrt(1 - t * t);
+  }
+  function d3_ease_elastic(a, p) {
+    var s;
+    if (arguments.length < 2) p = .45;
+    if (arguments.length) s = p / (2 * π) * Math.asin(1 / a); else a = 1, s = p / 4;
+    return function(t) {
+      return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * π / p);
+    };
+  }
+  function d3_ease_back(s) {
+    if (!s) s = 1.70158;
+    return function(t) {
+      return t * t * ((s + 1) * t - s);
+    };
+  }
+  function d3_ease_bounce(t) {
+    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
+  }
+  d3.event = null;
+  function d3_eventCancel() {
+    d3.event.stopPropagation();
+    d3.event.preventDefault();
+  }
+  function d3_eventSource() {
+    var e = d3.event, s;
+    while (s = e.sourceEvent) e = s;
+    return e;
+  }
+  function d3_eventDispatch(target) {
+    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;
+    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
+    dispatch.of = function(thiz, argumentz) {
+      return function(e1) {
+        try {
+          var e0 = e1.sourceEvent = d3.event;
+          e1.target = target;
+          d3.event = e1;
+          dispatch[e1.type].apply(thiz, argumentz);
+        } finally {
+          d3.event = e0;
+        }
+      };
+    };
+    return dispatch;
+  }
+  d3.transform = function(string) {
+    var g = d3_document.createElementNS(d3.ns.prefix.svg, "g");
+    return (d3.transform = function(string) {
+      g.setAttribute("transform", string);
+      var t = g.transform.baseVal.consolidate();
+      return new d3_transform(t ? t.matrix : d3_transformIdentity);
+    })(string);
+  };
+  function d3_transform(m) {
+    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
+    if (r0[0] * r1[1] < r1[0] * r0[1]) {
+      r0[0] *= -1;
+      r0[1] *= -1;
+      kx *= -1;
+      kz *= -1;
+    }
+    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;
+    this.translate = [ m.e, m.f ];
+    this.scale = [ kx, ky ];
+    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;
+  }
+  d3_transform.prototype.toString = function() {
+    return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")";
+  };
+  function d3_transformDot(a, b) {
+    return a[0] * b[0] + a[1] * b[1];
+  }
+  function d3_transformNormalize(a) {
+    var k = Math.sqrt(d3_transformDot(a, a));
+    if (k) {
+      a[0] /= k;
+      a[1] /= k;
+    }
+    return k;
+  }
+  function d3_transformCombine(a, b, k) {
+    a[0] += k * b[0];
+    a[1] += k * b[1];
+    return a;
+  }
+  var d3_transformIdentity = {
+    a: 1,
+    b: 0,
+    c: 0,
+    d: 1,
+    e: 0,
+    f: 0
+  };
+  d3.interpolate = function(a, b) {
+    var i = d3.interpolators.length, f;
+    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;
+    return f;
+  };
+  d3.interpolateNumber = function(a, b) {
+    b -= a;
+    return function(t) {
+      return a + b * t;
+    };
+  };
+  d3.interpolateRound = function(a, b) {
+    b -= a;
+    return function(t) {
+      return Math.round(a + b * t);
+    };
+  };
+  d3.interpolateString = function(a, b) {
+    var m, i, j, s0 = 0, s1 = 0, s = [], q = [], n, o;
+    d3_interpolate_number.lastIndex = 0;
+    for (i = 0; m = d3_interpolate_number.exec(b); ++i) {
+      if (m.index) s.push(b.substring(s0, s1 = m.index));
+      q.push({
+        i: s.length,
+        x: m[0]
+      });
+      s.push(null);
+      s0 = d3_interpolate_number.lastIndex;
+    }
+    if (s0 < b.length) s.push(b.substring(s0));
+    for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) {
+      o = q[i];
+      if (o.x == m[0]) {
+        if (o.i) {
+          if (s[o.i + 1] == null) {
+            s[o.i - 1] += o.x;
+            s.splice(o.i, 1);
+            for (j = i + 1; j < n; ++j) q[j].i--;
+          } else {
+            s[o.i - 1] += o.x + s[o.i + 1];
+            s.splice(o.i, 2);
+            for (j = i + 1; j < n; ++j) q[j].i -= 2;
+          }
+        } else {
+          if (s[o.i + 1] == null) {
+            s[o.i] = o.x;
+          } else {
+            s[o.i] = o.x + s[o.i + 1];
+            s.splice(o.i + 1, 1);
+            for (j = i + 1; j < n; ++j) q[j].i--;
+          }
+        }
+        q.splice(i, 1);
+        n--;
+        i--;
+      } else {
+        o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x));
+      }
+    }
+    while (i < n) {
+      o = q.pop();
+      if (s[o.i + 1] == null) {
+        s[o.i] = o.x;
+      } else {
+        s[o.i] = o.x + s[o.i + 1];
+        s.splice(o.i + 1, 1);
+      }
+      n--;
+    }
+    if (s.length === 1) {
+      return s[0] == null ? q[0].x : function() {
+        return b;
+      };
+    }
+    return function(t) {
+      for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t);
+      return s.join("");
+    };
+  };
+  d3.interpolateTransform = function(a, b) {
+    var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;
+    if (ta[0] != tb[0] || ta[1] != tb[1]) {
+      s.push("translate(", null, ",", null, ")");
+      q.push({
+        i: 1,
+        x: d3.interpolateNumber(ta[0], tb[0])
+      }, {
+        i: 3,
+        x: d3.interpolateNumber(ta[1], tb[1])
+      });
+    } else if (tb[0] || tb[1]) {
+      s.push("translate(" + tb + ")");
+    } else {
+      s.push("");
+    }
+    if (ra != rb) {
+      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;
+      q.push({
+        i: s.push(s.pop() + "rotate(", null, ")") - 2,
+        x: d3.interpolateNumber(ra, rb)
+      });
+    } else if (rb) {
+      s.push(s.pop() + "rotate(" + rb + ")");
+    }
+    if (wa != wb) {
+      q.push({
+        i: s.push(s.pop() + "skewX(", null, ")") - 2,
+        x: d3.interpolateNumber(wa, wb)
+      });
+    } else if (wb) {
+      s.push(s.pop() + "skewX(" + wb + ")");
+    }
+    if (ka[0] != kb[0] || ka[1] != kb[1]) {
+      n = s.push(s.pop() + "scale(", null, ",", null, ")");
+      q.push({
+        i: n - 4,
+        x: d3.interpolateNumber(ka[0], kb[0])
+      }, {
+        i: n - 2,
+        x: d3.interpolateNumber(ka[1], kb[1])
+      });
+    } else if (kb[0] != 1 || kb[1] != 1) {
+      s.push(s.pop() + "scale(" + kb + ")");
+    }
+    n = q.length;
+    return function(t) {
+      var i = -1, o;
+      while (++i < n) s[(o = q[i]).i] = o.x(t);
+      return s.join("");
+    };
+  };
+  d3.interpolateRgb = function(a, b) {
+    a = d3.rgb(a);
+    b = d3.rgb(b);
+    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;
+    return function(t) {
+      return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));
+    };
+  };
+  d3.interpolateHsl = function(a, b) {
+    a = d3.hsl(a);
+    b = d3.hsl(b);
+    var h0 = a.h, s0 = a.s, l0 = a.l, h1 = b.h - h0, s1 = b.s - s0, l1 = b.l - l0;
+    if (h1 > 180) h1 -= 360; else if (h1 < -180) h1 += 360;
+    return function(t) {
+      return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t) + "";
+    };
+  };
+  d3.interpolateLab = function(a, b) {
+    a = d3.lab(a);
+    b = d3.lab(b);
+    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;
+    return function(t) {
+      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + "";
+    };
+  };
+  d3.interpolateHcl = function(a, b) {
+    a = d3.hcl(a);
+    b = d3.hcl(b);
+    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;
+    if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
+    return function(t) {
+      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + "";
+    };
+  };
+  d3.interpolateArray = function(a, b) {
+    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;
+    for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i]));
+    for (;i < na; ++i) c[i] = a[i];
+    for (;i < nb; ++i) c[i] = b[i];
+    return function(t) {
+      for (i = 0; i < n0; ++i) c[i] = x[i](t);
+      return c;
+    };
+  };
+  d3.interpolateObject = function(a, b) {
+    var i = {}, c = {}, k;
+    for (k in a) {
+      if (k in b) {
+        i[k] = d3_interpolateByName(k)(a[k], b[k]);
+      } else {
+        c[k] = a[k];
+      }
+    }
+    for (k in b) {
+      if (!(k in a)) {
+        c[k] = b[k];
+      }
+    }
+    return function(t) {
+      for (k in i) c[k] = i[k](t);
+      return c;
+    };
+  };
+  var d3_interpolate_number = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
+  function d3_interpolateByName(name) {
+    return name == "transform" ? d3.interpolateTransform : d3.interpolate;
+  }
+  d3.interpolators = [ d3.interpolateObject, function(a, b) {
+    return b instanceof Array && d3.interpolateArray(a, b);
+  }, function(a, b) {
+    return (typeof a === "string" || typeof b === "string") && d3.interpolateString(a + "", b + "");
+  }, function(a, b) {
+    return (typeof b === "string" ? d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Color) && d3.interpolateRgb(a, b);
+  }, function(a, b) {
+    return !isNaN(a = +a) && !isNaN(b = +b) && d3.interpolateNumber(a, b);
+  } ];
+  function d3_uninterpolateNumber(a, b) {
+    b = b - (a = +a) ? 1 / (b - a) : 0;
+    return function(x) {
+      return (x - a) * b;
+    };
+  }
+  function d3_uninterpolateClamp(a, b) {
+    b = b - (a = +a) ? 1 / (b - a) : 0;
+    return function(x) {
+      return Math.max(0, Math.min(1, (x - a) * b));
+    };
+  }
+  function d3_Color() {}
+  d3_Color.prototype.toString = function() {
+    return this.rgb() + "";
+  };
+  d3.rgb = function(r, g, b) {
+    return arguments.length === 1 ? r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : d3_rgb(~~r, ~~g, ~~b);
+  };
+  function d3_rgb(r, g, b) {
+    return new d3_Rgb(r, g, b);
+  }
+  function d3_Rgb(r, g, b) {
+    this.r = r;
+    this.g = g;
+    this.b = b;
+  }
+  var d3_rgbPrototype = d3_Rgb.prototype = new d3_Color();
+  d3_rgbPrototype.brighter = function(k) {
+    k = Math.pow(.7, arguments.length ? k : 1);
+    var r = this.r, g = this.g, b = this.b, i = 30;
+    if (!r && !g && !b) return d3_rgb(i, i, i);
+    if (r && r < i) r = i;
+    if (g && g < i) g = i;
+    if (b && b < i) b = i;
+    return d3_rgb(Math.min(255, Math.floor(r / k)), Math.min(255, Math.floor(g / k)), Math.min(255, Math.floor(b / k)));
+  };
+  d3_rgbPrototype.darker = function(k) {
+    k = Math.pow(.7, arguments.length ? k : 1);
+    return d3_rgb(Math.floor(k * this.r), Math.floor(k * this.g), Math.floor(k * this.b));
+  };
+  d3_rgbPrototype.hsl = function() {
+    return d3_rgb_hsl(this.r, this.g, this.b);
+  };
+  d3_rgbPrototype.toString = function() {
+    return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
+  };
+  function d3_rgb_hex(v) {
+    return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);
+  }
+  function d3_rgb_parse(format, rgb, hsl) {
+    var r = 0, g = 0, b = 0, m1, m2, name;
+    m1 = /([a-z]+)\((.*)\)/i.exec(format);
+    if (m1) {
+      m2 = m1[2].split(",");
+      switch (m1[1]) {
+       case "hsl":
+        {
+          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);
+        }
+
+       case "rgb":
+        {
+          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));
+        }
+      }
+    }
+    if (name = d3_rgb_names.get(format)) return rgb(name.r, name.g, name.b);
+    if (format != null && format.charAt(0) === "#") {
+      if (format.length === 4) {
+        r = format.charAt(1);
+        r += r;
+        g = format.charAt(2);
+        g += g;
+        b = format.charAt(3);
+        b += b;
+      } else if (format.length === 7) {
+        r = format.substring(1, 3);
+        g = format.substring(3, 5);
+        b = format.substring(5, 7);
+      }
+      r = parseInt(r, 16);
+      g = parseInt(g, 16);
+      b = parseInt(b, 16);
+    }
+    return rgb(r, g, b);
+  }
+  function d3_rgb_hsl(r, g, b) {
+    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;
+    if (d) {
+      s = l < .5 ? d / (max + min) : d / (2 - max - min);
+      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;
+      h *= 60;
+    } else {
+      s = h = 0;
+    }
+    return d3_hsl(h, s, l);
+  }
+  function d3_rgb_lab(r, g, b) {
+    r = d3_rgb_xyz(r);
+    g = d3_rgb_xyz(g);
+    b = d3_rgb_xyz(b);
+    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);
+    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));
+  }
+  function d3_rgb_xyz(r) {
+    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);
+  }
+  function d3_rgb_parseNumber(c) {
+    var f = parseFloat(c);
+    return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
+  }
+  var d3_rgb_names = d3.map({
+    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",
+    darkgrey: "#a9a9a9",
+    darkkhaki: "#bdb76b",
+    darkmagenta: "#8b008b",
+    darkolivegreen: "#556b2f",
+    darkorange: "#ff8c00",
+    darkorchid: "#9932cc",
+    darkred: "#8b0000",
+    darksalmon: "#e9967a",
+    darkseagreen: "#8fbc8f",
+    darkslateblue: "#483d8b",
+    darkslategray: "#2f4f4f",
+    darkslategrey: "#2f4f4f",
+    darkturquoise: "#00ced1",
+    darkviolet: "#9400d3",
+    deeppink: "#ff1493",
+    deepskyblue: "#00bfff",
+    dimgray: "#696969",
+    dimgrey: "#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",
+    grey: "#808080",
+    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",
+    lightgray: "#d3d3d3",
+    lightgreen: "#90ee90",
+    lightgrey: "#d3d3d3",
+    lightpink: "#ffb6c1",
+    lightsalmon: "#ffa07a",
+    lightseagreen: "#20b2aa",
+    lightskyblue: "#87cefa",
+    lightslategray: "#778899",
+    lightslategrey: "#778899",
+    lightsteelblue: "#b0c4de",
+    lightyellow: "#ffffe0",
+    lime: "#00ff00",
+    limegreen: "#32cd32",
+    linen: "#faf0e6",
+    magenta: "#ff00ff",
+    maroon: "#800000",
+    mediumaquamarine: "#66cdaa",
+    mediumblue: "#0000cd",
+    mediumorchid: "#ba55d3",
+    mediumpurple: "#9370db",
+    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: "#db7093",
+    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",
+    slategrey: "#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"
+  });
+  d3_rgb_names.forEach(function(key, value) {
+    d3_rgb_names.set(key, d3_rgb_parse(value, d3_rgb, d3_hsl_rgb));
+  });
+  d3.hsl = function(h, s, l) {
+    return arguments.length === 1 ? h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : d3_hsl(+h, +s, +l);
+  };
+  function d3_hsl(h, s, l) {
+    return new d3_Hsl(h, s, l);
+  }
+  function d3_Hsl(h, s, l) {
+    this.h = h;
+    this.s = s;
+    this.l = l;
+  }
+  var d3_hslPrototype = d3_Hsl.prototype = new d3_Color();
+  d3_hslPrototype.brighter = function(k) {
+    k = Math.pow(.7, arguments.length ? k : 1);
+    return d3_hsl(this.h, this.s, this.l / k);
+  };
+  d3_hslPrototype.darker = function(k) {
+    k = Math.pow(.7, arguments.length ? k : 1);
+    return d3_hsl(this.h, this.s, k * this.l);
+  };
+  d3_hslPrototype.rgb = function() {
+    return d3_hsl_rgb(this.h, this.s, this.l);
+  };
+  function d3_hsl_rgb(h, s, l) {
+    var m1, m2;
+    h = h % 360;
+    if (h < 0) h += 360;
+    s = s < 0 ? 0 : s > 1 ? 1 : s;
+    l = l < 0 ? 0 : l > 1 ? 1 : l;
+    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
+    m1 = 2 * l - m2;
+    function v(h) {
+      if (h > 360) h -= 360; else if (h < 0) h += 360;
+      if (h < 60) return m1 + (m2 - m1) * h / 60;
+      if (h < 180) return m2;
+      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
+      return m1;
+    }
+    function vv(h) {
+      return Math.round(v(h) * 255);
+    }
+    return d3_rgb(vv(h + 120), vv(h), vv(h - 120));
+  }
+  d3.hcl = function(h, c, l) {
+    return arguments.length === 1 ? h instanceof d3_Hcl ? d3_hcl(h.h, h.c, h.l) : h instanceof d3_Lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : d3_hcl(+h, +c, +l);
+  };
+  function d3_hcl(h, c, l) {
+    return new d3_Hcl(h, c, l);
+  }
+  function d3_Hcl(h, c, l) {
+    this.h = h;
+    this.c = c;
+    this.l = l;
+  }
+  var d3_hclPrototype = d3_Hcl.prototype = new d3_Color();
+  d3_hclPrototype.brighter = function(k) {
+    return d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));
+  };
+  d3_hclPrototype.darker = function(k) {
+    return d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));
+  };
+  d3_hclPrototype.rgb = function() {
+    return d3_hcl_lab(this.h, this.c, this.l).rgb();
+  };
+  function d3_hcl_lab(h, c, l) {
+    return d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);
+  }
+  d3.lab = function(l, a, b) {
+    return arguments.length === 1 ? l instanceof d3_Lab ? d3_lab(l.l, l.a, l.b) : l instanceof d3_Hcl ? d3_hcl_lab(l.l, l.c, l.h) : d3_rgb_lab((l = d3.rgb(l)).r, l.g, l.b) : d3_lab(+l, +a, +b);
+  };
+  function d3_lab(l, a, b) {
+    return new d3_Lab(l, a, b);
+  }
+  function d3_Lab(l, a, b) {
+    this.l = l;
+    this.a = a;
+    this.b = b;
+  }
+  var d3_lab_K = 18;
+  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;
+  var d3_labPrototype = d3_Lab.prototype = new d3_Color();
+  d3_labPrototype.brighter = function(k) {
+    return d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
+  };
+  d3_labPrototype.darker = function(k) {
+    return d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
+  };
+  d3_labPrototype.rgb = function() {
+    return d3_lab_rgb(this.l, this.a, this.b);
+  };
+  function d3_lab_rgb(l, a, b) {
+    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;
+    x = d3_lab_xyz(x) * d3_lab_X;
+    y = d3_lab_xyz(y) * d3_lab_Y;
+    z = d3_lab_xyz(z) * d3_lab_Z;
+    return d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));
+  }
+  function d3_lab_hcl(l, a, b) {
+    return d3_hcl(Math.atan2(b, a) / π * 180, Math.sqrt(a * a + b * b), l);
+  }
+  function d3_lab_xyz(x) {
+    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;
+  }
+  function d3_xyz_lab(x) {
+    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;
+  }
+  function d3_xyz_rgb(r) {
+    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));
+  }
+  function d3_selection(groups) {
+    d3_arraySubclass(groups, d3_selectionPrototype);
+    return groups;
+  }
+  var d3_select = function(s, n) {
+    return n.querySelector(s);
+  }, d3_selectAll = function(s, n) {
+    return n.querySelectorAll(s);
+  }, d3_selectRoot = d3_document.documentElement, d3_selectMatcher = d3_selectRoot.matchesSelector || d3_selectRoot.webkitMatchesSelector || d3_selectRoot.mozMatchesSelector || d3_selectRoot.msMatchesSelector || d3_selectRoot.oMatchesSelector, d3_selectMatches = function(n, s) {
+    return d3_selectMatcher.call(n, s);
+  };
+  if (typeof Sizzle === "function") {
+    d3_select = function(s, n) {
+      return Sizzle(s, n)[0] || null;
+    };
+    d3_selectAll = function(s, n) {
+      return Sizzle.uniqueSort(Sizzle(s, n));
+    };
+    d3_selectMatches = Sizzle.matchesSelector;
+  }
+  var d3_selectionPrototype = [];
+  d3.selection = function() {
+    return d3_selectionRoot;
+  };
+  d3.selection.prototype = d3_selectionPrototype;
+  d3_selectionPrototype.select = function(selector) {
+    var subgroups = [], subgroup, subnode, group, node;
+    if (typeof selector !== "function") selector = d3_selection_selector(selector);
+    for (var j = -1, m = this.length; ++j < m; ) {
+      subgroups.push(subgroup = []);
+      subgroup.parentNode = (group = this[j]).parentNode;
+      for (var i = -1, n = group.length; ++i < n; ) {
+        if (node = group[i]) {
+          subgroup.push(subnode = selector.call(node, node.__data__, i));
+          if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
+        } else {
+          subgroup.push(null);
+        }
+      }
+    }
+    return d3_selection(subgroups);
+  };
+  function d3_selection_selector(selector) {
+    return function() {
+      return d3_select(selector, this);
+    };
+  }
+  d3_selectionPrototype.selectAll = function(selector) {
+    var subgroups = [], subgroup, node;
+    if (typeof selector !== "function") selector = d3_selection_selectorAll(selector);
+    for (var j = -1, m = this.length; ++j < m; ) {
+      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+        if (node = group[i]) {
+          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i)));
+          subgroup.parentNode = node;
+        }
+      }
+    }
+    return d3_selection(subgroups);
+  };
+  function d3_selection_selectorAll(selector) {
+    return function() {
+      return d3_selectAll(selector, this);
+    };
+  }
+  d3_selectionPrototype.attr = function(name, value) {
+    if (arguments.length < 2) {
+      if (typeof name === "string") {
+        var node = this.node();
+        name = d3.ns.qualify(name);
+        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);
+      }
+      for (value in name) this.each(d3_selection_attr(value, name[value]));
+      return this;
+    }
+    return this.each(d3_selection_attr(name, value));
+  };
+  function d3_selection_attr(name, value) {
+    name = d3.ns.qualify(name);
+    function attrNull() {
+      this.removeAttribute(name);
+    }
+    function attrNullNS() {
+      this.removeAttributeNS(name.space, name.local);
+    }
+    function attrConstant() {
+      this.setAttribute(name, value);
+    }
+    function attrConstantNS() {
+      this.setAttributeNS(name.space, name.local, value);
+    }
+    function attrFunction() {
+      var x = value.apply(this, arguments);
+      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);
+    }
+    function attrFunctionNS() {
+      var x = value.apply(this, arguments);
+      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);
+    }
+    return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;
+  }
+  d3_selectionPrototype.classed = function(name, value) {
+    if (arguments.length < 2) {
+      if (typeof name === "string") {
+        var node = this.node(), n = (name = name.trim().split(/^|\s+/g)).length, i = -1;
+        if (value = node.classList) {
+          while (++i < n) if (!value.contains(name[i])) return false;
+        } else {
+          value = node.className;
+          if (value.baseVal != null) value = value.baseVal;
+          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;
+        }
+        return true;
+      }
+      for (value in name) this.each(d3_selection_classed(value, name[value]));
+      return this;
+    }
+    return this.each(d3_selection_classed(name, value));
+  };
+  function d3_selection_classedRe(name) {
+    return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g");
+  }
+  function d3_selection_classed(name, value) {
+    name = name.trim().split(/\s+/).map(d3_selection_classedName);
+    var n = name.length;
+    function classedConstant() {
+      var i = -1;
+      while (++i < n) name[i](this, value);
+    }
+    function classedFunction() {
+      var i = -1, x = value.apply(this, arguments);
+      while (++i < n) name[i](this, x);
+    }
+    return typeof value === "function" ? classedFunction : classedConstant;
+  }
+  function d3_selection_classedName(name) {
+    var re = d3_selection_classedRe(name);
+    return function(node, value) {
+      if (c = node.classList) return value ? c.add(name) : c.remove(name);
+      var c = node.className, cb = c.baseVal != null, cv = cb ? c.baseVal : c;
+      if (value) {
+        re.lastIndex = 0;
+        if (!re.test(cv)) {
+          cv = d3_collapse(cv + " " + name);
+          if (cb) c.baseVal = cv; else node.className = cv;
+        }
+      } else if (cv) {
+        cv = d3_collapse(cv.replace(re, " "));
+        if (cb) c.baseVal = cv; else node.className = cv;
+      }
+    };
+  }
+  d3_selectionPrototype.style = function(name, value, priority) {
+    var n = arguments.length;
+    if (n < 3) {
+      if (typeof name !== "string") {
+        if (n < 2) value = "";
+        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));
+        return this;
+      }
+      if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);
+      priority = "";
+    }
+    return this.each(d3_selection_style(name, value, priority));
+  };
+  function d3_selection_style(name, value, priority) {
+    function styleNull() {
+      this.style.removeProperty(name);
+    }
+    function styleConstant() {
+      this.style.setProperty(name, value, priority);
+    }
+    function styleFunction() {
+      var x = value.apply(this, arguments);
+      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);
+    }
+    return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant;
+  }
+  d3_selectionPrototype.property = function(name, value) {
+    if (arguments.length < 2) {
+      if (typeof name === "string") return this.node()[name];
+      for (value in name) this.each(d3_selection_property(value, name[value]));
+      return this;
+    }
+    return this.each(d3_selection_property(name, value));
+  };
+  function d3_selection_property(name, value) {
+    function propertyNull() {
+      delete this[name];
+    }
+    function propertyConstant() {
+      this[name] = value;
+    }
+    function propertyFunction() {
+      var x = value.apply(this, arguments);
+      if (x == null) delete this[name]; else this[name] = x;
+    }
+    return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant;
+  }
+  d3_selectionPrototype.text = function(value) {
+    return arguments.length ? this.each(typeof value === "function" ? function() {
+      var v = value.apply(this, arguments);
+      this.textContent = v == null ? "" : v;
+    } : value == null ? function() {
+      this.textContent = "";
+    } : function() {
+      this.textContent = value;
+    }) : this.node().textContent;
+  };
+  d3_selectionPrototype.html = function(value) {
+    return arguments.length ? this.each(typeof value === "function" ? function() {
+      var v = value.apply(this, arguments);
+      this.innerHTML = v == null ? "" : v;
+    } : value == null ? function() {
+      this.innerHTML = "";
+    } : function() {
+      this.innerHTML = value;
+    }) : this.node().innerHTML;
+  };
+  d3_selectionPrototype.append = function(name) {
+    name = d3.ns.qualify(name);
+    function append() {
+      return this.appendChild(d3_document.createElementNS(this.namespaceURI, name));
+    }
+    function appendNS() {
+      return this.appendChild(d3_document.createElementNS(name.space, name.local));
+    }
+    return this.select(name.local ? appendNS : append);
+  };
+  d3_selectionPrototype.insert = function(name, before) {
+    name = d3.ns.qualify(name);
+    function insert() {
+      return this.insertBefore(d3_document.createElementNS(this.namespaceURI, name), d3_select(before, this));
+    }
+    function insertNS() {
+      return this.insertBefore(d3_document.createElementNS(name.space, name.local), d3_select(before, this));
+    }
+    return this.select(name.local ? insertNS : insert);
+  };
+  d3_selectionPrototype.remove = function() {
+    return this.each(function() {
+      var parent = this.parentNode;
+      if (parent) parent.removeChild(this);
+    });
+  };
+  d3_selectionPrototype.data = function(value, key) {
+    var i = -1, n = this.length, group, node;
+    if (!arguments.length) {
+      value = new Array(n = (group = this[0]).length);
+      while (++i < n) {
+        if (node = group[i]) {
+          value[i] = node.__data__;
+        }
+      }
+      return value;
+    }
+    function bind(group, groupData) {
+      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;
+      if (key) {
+        var nodeByKeyValue = new d3_Map(), dataByKeyValue = new d3_Map(), keyValues = [], keyValue;
+        for (i = -1; ++i < n; ) {
+          keyValue = key.call(node = group[i], node.__data__, i);
+          if (nodeByKeyValue.has(keyValue)) {
+            exitNodes[i] = node;
+          } else {
+            nodeByKeyValue.set(keyValue, node);
+          }
+          keyValues.push(keyValue);
+        }
+        for (i = -1; ++i < m; ) {
+          keyValue = key.call(groupData, nodeData = groupData[i], i);
+          if (node = nodeByKeyValue.get(keyValue)) {
+            updateNodes[i] = node;
+            node.__data__ = nodeData;
+          } else if (!dataByKeyValue.has(keyValue)) {
+            enterNodes[i] = d3_selection_dataNode(nodeData);
+          }
+          dataByKeyValue.set(keyValue, nodeData);
+          nodeByKeyValue.remove(keyValue);
+        }
+        for (i = -1; ++i < n; ) {
+          if (nodeByKeyValue.has(keyValues[i])) {
+            exitNodes[i] = group[i];
+          }
+        }
+      } else {
+        for (i = -1; ++i < n0; ) {
+          node = group[i];
+          nodeData = groupData[i];
+          if (node) {
+            node.__data__ = nodeData;
+            updateNodes[i] = node;
+          } else {
+            enterNodes[i] = d3_selection_dataNode(nodeData);
+          }
+        }
+        for (;i < m; ++i) {
+          enterNodes[i] = d3_selection_dataNode(groupData[i]);
+        }
+        for (;i < n; ++i) {
+          exitNodes[i] = group[i];
+        }
+      }
+      enterNodes.update = updateNodes;
+      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;
+      enter.push(enterNodes);
+      update.push(updateNodes);
+      exit.push(exitNodes);
+    }
+    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);
+    if (typeof value === "function") {
+      while (++i < n) {
+        bind(group = this[i], value.call(group, group.parentNode.__data__, i));
+      }
+    } else {
+      while (++i < n) {
+        bind(group = this[i], value);
+      }
+    }
+    update.enter = function() {
+      return enter;
+    };
+    update.exit = function() {
+      return exit;
+    };
+    return update;
+  };
+  function d3_selection_dataNode(data) {
+    return {
+      __data__: data
+    };
+  }
+  d3_selectionPrototype.datum = function(value) {
+    return arguments.length ? this.property("__data__", value) : this.property("__data__");
+  };
+  d3_selectionPrototype.filter = function(filter) {
+    var subgroups = [], subgroup, group, node;
+    if (typeof filter !== "function") filter = d3_selection_filter(filter);
+    for (var j = 0, m = this.length; j < m; j++) {
+      subgroups.push(subgroup = []);
+      subgroup.parentNode = (group = this[j]).parentNode;
+      for (var i = 0, n = group.length; i < n; i++) {
+        if ((node = group[i]) && filter.call(node, node.__data__, i)) {
+          subgroup.push(node);
+        }
+      }
+    }
+    return d3_selection(subgroups);
+  };
+  function d3_selection_filter(selector) {
+    return function() {
+      return d3_selectMatches(this, selector);
+    };
+  }
+  d3_selectionPrototype.order = function() {
+    for (var j = -1, m = this.length; ++j < m; ) {
+      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {
+        if (node = group[i]) {
+          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
+          next = node;
+        }
+      }
+    }
+    return this;
+  };
+  d3_selectionPrototype.sort = function(comparator) {
+    comparator = d3_selection_sortComparator.apply(this, arguments);
+    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);
+    return this.order();
+  };
+  function d3_selection_sortComparator(comparator) {
+    if (!arguments.length) comparator = d3.ascending;
+    return function(a, b) {
+      return !a - !b || comparator(a.__data__, b.__data__);
+    };
+  }
+  d3_selectionPrototype.on = function(type, listener, capture) {
+    var n = arguments.length;
+    if (n < 3) {
+      if (typeof type !== "string") {
+        if (n < 2) listener = false;
+        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));
+        return this;
+      }
+      if (n < 2) return (n = this.node()["__on" + type]) && n._;
+      capture = false;
+    }
+    return this.each(d3_selection_on(type, listener, capture));
+  };
+  function d3_selection_on(type, listener, capture) {
+    var name = "__on" + type, i = type.indexOf(".");
+    if (i > 0) type = type.substring(0, i);
+    function onRemove() {
+      var wrapper = this[name];
+      if (wrapper) {
+        this.removeEventListener(type, wrapper, wrapper.$);
+        delete this[name];
+      }
+    }
+    function onAdd() {
+      var node = this, args = d3_array(arguments);
+      onRemove.call(this);
+      this.addEventListener(type, this[name] = wrapper, wrapper.$ = capture);
+      wrapper._ = listener;
+      function wrapper(e) {
+        var o = d3.event;
+        d3.event = e;
+        args[0] = node.__data__;
+        try {
+          listener.apply(node, args);
+        } finally {
+          d3.event = o;
+        }
+      }
+    }
+    return listener ? onAdd : onRemove;
+  }
+  d3_selectionPrototype.each = function(callback) {
+    return d3_selection_each(this, function(node, i, j) {
+      callback.call(node, node.__data__, i, j);
+    });
+  };
+  function d3_selection_each(groups, callback) {
+    for (var j = 0, m = groups.length; j < m; j++) {
+      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {
+        if (node = group[i]) callback(node, i, j);
+      }
+    }
+    return groups;
+  }
+  d3_selectionPrototype.call = function(callback) {
+    var args = d3_array(arguments);
+    callback.apply(args[0] = this, args);
+    return this;
+  };
+  d3_selectionPrototype.empty = function() {
+    return !this.node();
+  };
+  d3_selectionPrototype.node = function() {
+    for (var j = 0, m = this.length; j < m; j++) {
+      for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+        var node = group[i];
+        if (node) return node;
+      }
+    }
+    return null;
+  };
+  d3_selectionPrototype.transition = function() {
+    var id = d3_transitionInheritId || ++d3_transitionId, subgroups = [], subgroup, node, transition = Object.create(d3_transitionInherit);
+    transition.time = Date.now();
+    for (var j = -1, m = this.length; ++j < m; ) {
+      subgroups.push(subgroup = []);
+      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+        if (node = group[i]) d3_transitionNode(node, i, id, transition);
+        subgroup.push(node);
+      }
+    }
+    return d3_transition(subgroups, id);
+  };
+  var d3_selectionRoot = d3_selection([ [ d3_document ] ]);
+  d3_selectionRoot[0].parentNode = d3_selectRoot;
+  d3.select = function(selector) {
+    return typeof selector === "string" ? d3_selectionRoot.select(selector) : d3_selection([ [ selector ] ]);
+  };
+  d3.selectAll = function(selector) {
+    return typeof selector === "string" ? d3_selectionRoot.selectAll(selector) : d3_selection([ d3_array(selector) ]);
+  };
+  function d3_selection_enter(selection) {
+    d3_arraySubclass(selection, d3_selection_enterPrototype);
+    return selection;
+  }
+  var d3_selection_enterPrototype = [];
+  d3.selection.enter = d3_selection_enter;
+  d3.selection.enter.prototype = d3_selection_enterPrototype;
+  d3_selection_enterPrototype.append = d3_selectionPrototype.append;
+  d3_selection_enterPrototype.insert = d3_selectionPrototype.insert;
+  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
+  d3_selection_enterPrototype.node = d3_selectionPrototype.node;
+  d3_selection_enterPrototype.select = function(selector) {
+    var subgroups = [], subgroup, subnode, upgroup, group, node;
+    for (var j = -1, m = this.length; ++j < m; ) {
+      upgroup = (group = this[j]).update;
+      subgroups.push(subgroup = []);
+      subgroup.parentNode = group.parentNode;
+      for (var i = -1, n = group.length; ++i < n; ) {
+        if (node = group[i]) {
+          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i));
+          subnode.__data__ = node.__data__;
+        } else {
+          subgroup.push(null);
+        }
+      }
+    }
+    return d3_selection(subgroups);
+  };
+  function d3_transition(groups, id) {
+    d3_arraySubclass(groups, d3_transitionPrototype);
+    groups.id = id;
+    return groups;
+  }
+  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit = {
+    ease: d3_ease_cubicInOut,
+    delay: 0,
+    duration: 250
+  };
+  d3_transitionPrototype.call = d3_selectionPrototype.call;
+  d3_transitionPrototype.empty = d3_selectionPrototype.empty;
+  d3_transitionPrototype.node = d3_selectionPrototype.node;
+  d3.transition = function(selection) {
+    return arguments.length ? d3_transitionInheritId ? selection.transition() : selection : d3_selectionRoot.transition();
+  };
+  d3.transition.prototype = d3_transitionPrototype;
+  function d3_transitionNode(node, i, id, inherit) {
+    var lock = node.__transition__ || (node.__transition__ = {
+      active: 0,
+      count: 0
+    }), transition = lock[id];
+    if (!transition) {
+      var time = inherit.time;
+      transition = lock[id] = {
+        tween: new d3_Map(),
+        event: d3.dispatch("start", "end"),
+        time: time,
+        ease: inherit.ease,
+        delay: inherit.delay,
+        duration: inherit.duration
+      };
+      ++lock.count;
+      d3.timer(function(elapsed) {
+        var d = node.__data__, ease = transition.ease, event = transition.event, delay = transition.delay, duration = transition.duration, tweened = [];
+        return delay <= elapsed ? start(elapsed) : d3.timer(start, delay, time), 1;
+        function start(elapsed) {
+          if (lock.active > id) return stop();
+          lock.active = id;
+          event.start.call(node, d, i);
+          transition.tween.forEach(function(key, value) {
+            if (value = value.call(node, d, i)) {
+              tweened.push(value);
+            }
+          });
+          if (!tick(elapsed)) d3.timer(tick, 0, time);
+          return 1;
+        }
+        function tick(elapsed) {
+          if (lock.active !== id) return stop();
+          var t = (elapsed - delay) / duration, e = ease(t), n = tweened.length;
+          while (n > 0) {
+            tweened[--n].call(node, e);
+          }
+          if (t >= 1) {
+            stop();
+            event.end.call(node, d, i);
+            return 1;
+          }
+        }
+        function stop() {
+          if (--lock.count) delete lock[id]; else delete node.__transition__;
+          return 1;
+        }
+      }, 0, time);
+      return transition;
+    }
+  }
+  d3_transitionPrototype.select = function(selector) {
+    var id = this.id, subgroups = [], subgroup, subnode, node;
+    if (typeof selector !== "function") selector = d3_selection_selector(selector);
+    for (var j = -1, m = this.length; ++j < m; ) {
+      subgroups.push(subgroup = []);
+      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i))) {
+          if ("__data__" in node) subnode.__data__ = node.__data__;
+          d3_transitionNode(subnode, i, id, node.__transition__[id]);
+          subgroup.push(subnode);
+        } else {
+          subgroup.push(null);
+        }
+      }
+    }
+    return d3_transition(subgroups, id);
+  };
+  d3_transitionPrototype.selectAll = function(selector) {
+    var id = this.id, subgroups = [], subgroup, subnodes, node, subnode, transition;
+    if (typeof selector !== "function") selector = d3_selection_selectorAll(selector);
+    for (var j = -1, m = this.length; ++j < m; ) {
+      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+        if (node = group[i]) {
+          transition = node.__transition__[id];
+          subnodes = selector.call(node, node.__data__, i);
+          subgroups.push(subgroup = []);
+          for (var k = -1, o = subnodes.length; ++k < o; ) {
+            d3_transitionNode(subnode = subnodes[k], k, id, transition);
+            subgroup.push(subnode);
+          }
+        }
+      }
+    }
+    return d3_transition(subgroups, id);
+  };
+  d3_transitionPrototype.filter = function(filter) {
+    var subgroups = [], subgroup, group, node;
+    if (typeof filter !== "function") filter = d3_selection_filter(filter);
+    for (var j = 0, m = this.length; j < m; j++) {
+      subgroups.push(subgroup = []);
+      for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+        if ((node = group[i]) && filter.call(node, node.__data__, i)) {
+          subgroup.push(node);
+        }
+      }
+    }
+    return d3_transition(subgroups, this.id, this.time).ease(this.ease());
+  };
+  d3_transitionPrototype.attr = function(nameNS, value) {
+    if (arguments.length < 2) {
+      for (value in nameNS) this.attr(value, nameNS[value]);
+      return this;
+    }
+    var interpolate = d3_interpolateByName(nameNS), name = d3.ns.qualify(nameNS);
+    function attrNull() {
+      this.removeAttribute(name);
+    }
+    function attrNullNS() {
+      this.removeAttributeNS(name.space, name.local);
+    }
+    return d3_transition_tween(this, "attr." + nameNS, value, function(b) {
+      function attrString() {
+        var a = this.getAttribute(name), i;
+        return a !== b && (i = interpolate(a, b), function(t) {
+          this.setAttribute(name, i(t));
+        });
+      }
+      function attrStringNS() {
+        var a = this.getAttributeNS(name.space, name.local), i;
+        return a !== b && (i = interpolate(a, b), function(t) {
+          this.setAttributeNS(name.space, name.local, i(t));
+        });
+      }
+      return b == null ? name.local ? attrNullNS : attrNull : (b += "", name.local ? attrStringNS : attrString);
+    });
+  };
+  d3_transitionPrototype.attrTween = function(nameNS, tween) {
+    var name = d3.ns.qualify(nameNS);
+    function attrTween(d, i) {
+      var f = tween.call(this, d, i, this.getAttribute(name));
+      return f && function(t) {
+        this.setAttribute(name, f(t));
+      };
+    }
+    function attrTweenNS(d, i) {
+      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
+      return f && function(t) {
+        this.setAttributeNS(name.space, name.local, f(t));
+      };
+    }
+    return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
+  };
+  d3_transitionPrototype.style = function(name, value, priority) {
+    var n = arguments.length;
+    if (n < 3) {
+      if (typeof name !== "string") {
+        if (n < 2) value = "";
+        for (priority in name) this.style(priority, name[priority], value);
+        return this;
+      }
+      priority = "";
+    }
+    var interpolate = d3_interpolateByName(name);
+    function styleNull() {
+      this.style.removeProperty(name);
+    }
+    return d3_transition_tween(this, "style." + name, value, function(b) {
+      function styleString() {
+        var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;
+        return a !== b && (i = interpolate(a, b), function(t) {
+          this.style.setProperty(name, i(t), priority);
+        });
+      }
+      return b == null ? styleNull : (b += "", styleString);
+    });
+  };
+  d3_transitionPrototype.styleTween = function(name, tween, priority) {
+    if (arguments.length < 3) priority = "";
+    return this.tween("style." + name, function(d, i) {
+      var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));
+      return f && function(t) {
+        this.style.setProperty(name, f(t), priority);
+      };
+    });
+  };
+  d3_transitionPrototype.text = function(value) {
+    return d3_transition_tween(this, "text", value, d3_transition_text);
+  };
+  function d3_transition_text(b) {
+    if (b == null) b = "";
+    return function() {
+      this.textContent = b;
+    };
+  }
+  d3_transitionPrototype.remove = function() {
+    return this.each("end.transition", function() {
+      var p;
+      if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this);
+    });
+  };
+  d3_transitionPrototype.ease = function(value) {
+    var id = this.id;
+    if (arguments.length < 1) return this.node().__transition__[id].ease;
+    if (typeof value !== "function") value = d3.ease.apply(d3, arguments);
+    return d3_selection_each(this, function(node) {
+      node.__transition__[id].ease = value;
+    });
+  };
+  d3_transitionPrototype.delay = function(value) {
+    var id = this.id;
+    return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
+      node.__transition__[id].delay = value.call(node, node.__data__, i, j) | 0;
+    } : (value |= 0, function(node) {
+      node.__transition__[id].delay = value;
+    }));
+  };
+  d3_transitionPrototype.duration = function(value) {
+    var id = this.id;
+    return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
+      node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j) | 0);
+    } : (value = Math.max(1, value | 0), function(node) {
+      node.__transition__[id].duration = value;
+    }));
+  };
+  d3_transitionPrototype.each = function(type, listener) {
+    var id = this.id;
+    if (arguments.length < 2) {
+      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;
+      d3_transitionInheritId = id;
+      d3_selection_each(this, function(node, i, j) {
+        d3_transitionInherit = node.__transition__[id];
+        type.call(node, node.__data__, i, j);
+      });
+      d3_transitionInherit = inherit;
+      d3_transitionInheritId = inheritId;
+    } else {
+      d3_selection_each(this, function(node) {
+        node.__transition__[id].event.on(type, listener);
+      });
+    }
+    return this;
+  };
+  d3_transitionPrototype.transition = function() {
+    var id0 = this.id, id1 = ++d3_transitionId, subgroups = [], subgroup, group, node, transition;
+    for (var j = 0, m = this.length; j < m; j++) {
+      subgroups.push(subgroup = []);
+      for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+        if (node = group[i]) {
+          transition = Object.create(node.__transition__[id0]);
+          transition.delay += transition.duration;
+          d3_transitionNode(node, i, id1, transition);
+        }
+        subgroup.push(node);
+      }
+    }
+    return d3_transition(subgroups, id1);
+  };
+  d3_transitionPrototype.tween = function(name, tween) {
+    var id = this.id;
+    if (arguments.length < 2) return this.node().__transition__[id].tween.get(name);
+    return d3_selection_each(this, tween == null ? function(node) {
+      node.__transition__[id].tween.remove(name);
+    } : function(node) {
+      node.__transition__[id].tween.set(name, tween);
+    });
+  };
+  function d3_transition_tween(groups, name, value, tween) {
+    var id = groups.id;
+    return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) {
+      node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j)));
+    } : (value = tween(value), function(node) {
+      node.__transition__[id].tween.set(name, value);
+    }));
+  }
+  var d3_timer_id = 0, d3_timer_byId = {}, d3_timer_queue = null, d3_timer_interval, d3_timer_timeout;
+  d3.timer = function(callback, delay, then) {
+    if (arguments.length < 3) {
+      if (arguments.length < 2) delay = 0; else if (!isFinite(delay)) return;
+      then = Date.now();
+    }
+    var timer = d3_timer_byId[callback.id];
+    if (timer && timer.callback === callback) {
+      timer.then = then;
+      timer.delay = delay;
+    } else d3_timer_byId[callback.id = ++d3_timer_id] = d3_timer_queue = {
+      callback: callback,
+      then: then,
+      delay: delay,
+      next: d3_timer_queue
+    };
+    if (!d3_timer_interval) {
+      d3_timer_timeout = clearTimeout(d3_timer_timeout);
+      d3_timer_interval = 1;
+      d3_timer_frame(d3_timer_step);
+    }
+  };
+  function d3_timer_step() {
+    var elapsed, now = Date.now(), t1 = d3_timer_queue;
+    while (t1) {
+      elapsed = now - t1.then;
+      if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed);
+      t1 = t1.next;
+    }
+    var delay = d3_timer_flush() - now;
+    if (delay > 24) {
+      if (isFinite(delay)) {
+        clearTimeout(d3_timer_timeout);
+        d3_timer_timeout = setTimeout(d3_timer_step, delay);
+      }
+      d3_timer_interval = 0;
+    } else {
+      d3_timer_interval = 1;
+      d3_timer_frame(d3_timer_step);
+    }
+  }
+  d3.timer.flush = function() {
+    var elapsed, now = Date.now(), t1 = d3_timer_queue;
+    while (t1) {
+      elapsed = now - t1.then;
+      if (!t1.delay) t1.flush = t1.callback(elapsed);
+      t1 = t1.next;
+    }
+    d3_timer_flush();
+  };
+  function d3_timer_flush() {
+    var t0 = null, t1 = d3_timer_queue, then = Infinity;
+    while (t1) {
+      if (t1.flush) {
+        delete d3_timer_byId[t1.callback.id];
+        t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next;
+      } else {
+        then = Math.min(then, t1.then + t1.delay);
+        t1 = (t0 = t1).next;
+      }
+    }
+    return then;
+  }
+  var d3_timer_frame = d3_window.requestAnimationFrame || d3_window.webkitRequestAnimationFrame || d3_window.mozRequestAnimationFrame || d3_window.oRequestAnimationFrame || d3_window.msRequestAnimationFrame || function(callback) {
+    setTimeout(callback, 17);
+  };
+  d3.mouse = function(container) {
+    return d3_mousePoint(container, d3_eventSource());
+  };
+  var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;
+  function d3_mousePoint(container, e) {
+    var svg = container.ownerSVGElement || container;
+    if (svg.createSVGPoint) {
+      var point = svg.createSVGPoint();
+      if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {
+        svg = d3.select(d3_document.body).append("svg").style("position", "absolute").style("top", 0).style("left", 0);
+        var ctm = svg[0][0].getScreenCTM();
+        d3_mouse_bug44083 = !(ctm.f || ctm.e);
+        svg.remove();
+      }
+      if (d3_mouse_bug44083) {
+        point.x = e.pageX;
+        point.y = e.pageY;
+      } else {
+        point.x = e.clientX;
+        point.y = e.clientY;
+      }
+      point = point.matrixTransform(container.getScreenCTM().inverse());
+      return [ point.x, point.y ];
+    }
+    var rect = container.getBoundingClientRect();
+    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];
+  }
+  d3.touches = function(container, touches) {
+    if (arguments.length < 2) touches = d3_eventSource().touches;
+    return touches ? d3_array(touches).map(function(touch) {
+      var point = d3_mousePoint(container, touch);
+      point.identifier = touch.identifier;
+      return point;
+    }) : [];
+  };
+  function d3_noop() {}
+  d3.scale = {};
+  function d3_scaleExtent(domain) {
+    var start = domain[0], stop = domain[domain.length - 1];
+    return start < stop ? [ start, stop ] : [ stop, start ];
+  }
+  function d3_scaleRange(scale) {
+    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());
+  }
+  function d3_scale_nice(domain, nice) {
+    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;
+    if (x1 < x0) {
+      dx = i0, i0 = i1, i1 = dx;
+      dx = x0, x0 = x1, x1 = dx;
+    }
+    if (nice = nice(x1 - x0)) {
+      domain[i0] = nice.floor(x0);
+      domain[i1] = nice.ceil(x1);
+    }
+    return domain;
+  }
+  function d3_scale_niceDefault() {
+    return Math;
+  }
+  d3.scale.linear = function() {
+    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3.interpolate, false);
+  };
+  function d3_scale_linear(domain, range, interpolate, clamp) {
+    var output, input;
+    function rescale() {
+      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
+      output = linear(domain, range, uninterpolate, interpolate);
+      input = linear(range, domain, uninterpolate, d3.interpolate);
+      return scale;
+    }
+    function scale(x) {
+      return output(x);
+    }
+    scale.invert = function(y) {
+      return input(y);
+    };
+    scale.domain = function(x) {
+      if (!arguments.length) return domain;
+      domain = x.map(Number);
+      return rescale();
+    };
+    scale.range = function(x) {
+      if (!arguments.length) return range;
+      range = x;
+      return rescale();
+    };
+    scale.rangeRound = function(x) {
+      return scale.range(x).interpolate(d3.interpolateRound);
+    };
+    scale.clamp = function(x) {
+      if (!arguments.length) return clamp;
+      clamp = x;
+      return rescale();
+    };
+    scale.interpolate = function(x) {
+      if (!arguments.length) return interpolate;
+      interpolate = x;
+      return rescale();
+    };
+    scale.ticks = function(m) {
+      return d3_scale_linearTicks(domain, m);
+    };
+    scale.tickFormat = function(m) {
+      return d3_scale_linearTickFormat(domain, m);
+    };
+    scale.nice = function() {
+      d3_scale_nice(domain, d3_scale_linearNice);
+      return rescale();
+    };
+    scale.copy = function() {
+      return d3_scale_linear(domain, range, interpolate, clamp);
+    };
+    return rescale();
+  }
+  function d3_scale_linearRebind(scale, linear) {
+    return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
+  }
+  function d3_scale_linearNice(dx) {
+    dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1);
+    return dx && {
+      floor: function(x) {
+        return Math.floor(x / dx) * dx;
+      },
+      ceil: function(x) {
+        return Math.ceil(x / dx) * dx;
+      }
+    };
+  }
+  function d3_scale_linearTickRange(domain, m) {
+    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;
+    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;
+    extent[0] = Math.ceil(extent[0] / step) * step;
+    extent[1] = Math.floor(extent[1] / step) * step + step * .5;
+    extent[2] = step;
+    return extent;
+  }
+  function d3_scale_linearTicks(domain, m) {
+    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));
+  }
+  function d3_scale_linearTickFormat(domain, m) {
+    return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f");
+  }
+  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
+    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);
+    return function(x) {
+      return i(u(x));
+    };
+  }
+  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
+    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;
+    if (domain[k] < domain[0]) {
+      domain = domain.slice().reverse();
+      range = range.slice().reverse();
+    }
+    while (++j <= k) {
+      u.push(uninterpolate(domain[j - 1], domain[j]));
+      i.push(interpolate(range[j - 1], range[j]));
+    }
+    return function(x) {
+      var j = d3.bisect(domain, x, 1, k) - 1;
+      return i[j](u[j](x));
+    };
+  }
+  d3.scale.log = function() {
+    return d3_scale_log(d3.scale.linear(), d3_scale_logp);
+  };
+  function d3_scale_log(linear, log) {
+    var pow = log.pow;
+    function scale(x) {
+      return linear(log(x));
+    }
+    scale.invert = function(x) {
+      return pow(linear.invert(x));
+    };
+    scale.domain = function(x) {
+      if (!arguments.length) return linear.domain().map(pow);
+      log = x[0] < 0 ? d3_scale_logn : d3_scale_logp;
+      pow = log.pow;
+      linear.domain(x.map(log));
+      return scale;
+    };
+    scale.nice = function() {
+      linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault));
+      return scale;
+    };
+    scale.ticks = function() {
+      var extent = d3_scaleExtent(linear.domain()), ticks = [];
+      if (extent.every(isFinite)) {
+        var i = Math.floor(extent[0]), j = Math.ceil(extent[1]), u = pow(extent[0]), v = pow(extent[1]);
+        if (log === d3_scale_logn) {
+          ticks.push(pow(i));
+          for (;i++ < j; ) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k);
+        } else {
+          for (;i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k);
+          ticks.push(pow(i));
+        }
+        for (i = 0; ticks[i] < u; i++) {}
+        for (j = ticks.length; ticks[j - 1] > v; j--) {}
+        ticks = ticks.slice(i, j);
+      }
+      return ticks;
+    };
+    scale.tickFormat = function(n, format) {
+      if (arguments.length < 2) format = d3_scale_logFormat;
+      if (!arguments.length) return format;
+      var k = Math.max(.1, n / scale.ticks().length), f = log === d3_scale_logn ? (e = -1e-12, 
+      Math.floor) : (e = 1e-12, Math.ceil), e;
+      return function(d) {
+        return d / pow(f(log(d) + e)) <= k ? format(d) : "";
+      };
+    };
+    scale.copy = function() {
+      return d3_scale_log(linear.copy(), log);
+    };
+    return d3_scale_linearRebind(scale, linear);
+  }
+  var d3_scale_logFormat = d3.format(".0e");
+  function d3_scale_logp(x) {
+    return Math.log(x < 0 ? 0 : x) / Math.LN10;
+  }
+  function d3_scale_logn(x) {
+    return -Math.log(x > 0 ? 0 : -x) / Math.LN10;
+  }
+  d3_scale_logp.pow = function(x) {
+    return Math.pow(10, x);
+  };
+  d3_scale_logn.pow = function(x) {
+    return -Math.pow(10, -x);
+  };
+  d3.scale.pow = function() {
+    return d3_scale_pow(d3.scale.linear(), 1);
+  };
+  function d3_scale_pow(linear, exponent) {
+    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);
+    function scale(x) {
+      return linear(powp(x));
+    }
+    scale.invert = function(x) {
+      return powb(linear.invert(x));
+    };
+    scale.domain = function(x) {
+      if (!arguments.length) return linear.domain().map(powb);
+      linear.domain(x.map(powp));
+      return scale;
+    };
+    scale.ticks = function(m) {
+      return d3_scale_linearTicks(scale.domain(), m);
+    };
+    scale.tickFormat = function(m) {
+      return d3_scale_linearTickFormat(scale.domain(), m);
+    };
+    scale.nice = function() {
+      return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice));
+    };
+    scale.exponent = function(x) {
+      if (!arguments.length) return exponent;
+      var domain = scale.domain();
+      powp = d3_scale_powPow(exponent = x);
+      powb = d3_scale_powPow(1 / exponent);
+      return scale.domain(domain);
+    };
+    scale.copy = function() {
+      return d3_scale_pow(linear.copy(), exponent);
+    };
+    return d3_scale_linearRebind(scale, linear);
+  }
+  function d3_scale_powPow(e) {
+    return function(x) {
+      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);
+    };
+  }
+  d3.scale.sqrt = function() {
+    return d3.scale.pow().exponent(.5);
+  };
+  d3.scale.ordinal = function() {
+    return d3_scale_ordinal([], {
+      t: "range",
+      a: [ [] ]
+    });
+  };
+  function d3_scale_ordinal(domain, ranger) {
+    var index, range, rangeBand;
+    function scale(x) {
+      return range[((index.get(x) || index.set(x, domain.push(x))) - 1) % range.length];
+    }
+    function steps(start, step) {
+      return d3.range(domain.length).map(function(i) {
+        return start + step * i;
+      });
+    }
+    scale.domain = function(x) {
+      if (!arguments.length) return domain;
+      domain = [];
+      index = new d3_Map();
+      var i = -1, n = x.length, xi;
+      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));
+      return scale[ranger.t].apply(scale, ranger.a);
+    };
+    scale.range = function(x) {
+      if (!arguments.length) return range;
+      range = x;
+      rangeBand = 0;
+      ranger = {
+        t: "range",
+        a: arguments
+      };
+      return scale;
+    };
+    scale.rangePoints = function(x, padding) {
+      if (arguments.length < 2) padding = 0;
+      var start = x[0], stop = x[1], step = (stop - start) / (Math.max(1, domain.length - 1) + padding);
+      range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);
+      rangeBand = 0;
+      ranger = {
+        t: "rangePoints",
+        a: arguments
+      };
+      return scale;
+    };
+    scale.rangeBands = function(x, padding, outerPadding) {
+      if (arguments.length < 2) padding = 0;
+      if (arguments.length < 3) outerPadding = padding;
+      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);
+      range = steps(start + step * outerPadding, step);
+      if (reverse) range.reverse();
+      rangeBand = step * (1 - padding);
+      ranger = {
+        t: "rangeBands",
+        a: arguments
+      };
+      return scale;
+    };
+    scale.rangeRoundBands = function(x, padding, outerPadding) {
+      if (arguments.length < 2) padding = 0;
+      if (arguments.length < 3) outerPadding = padding;
+      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)), error = stop - start - (domain.length - padding) * step;
+      range = steps(start + Math.round(error / 2), step);
+      if (reverse) range.reverse();
+      rangeBand = Math.round(step * (1 - padding));
+      ranger = {
+        t: "rangeRoundBands",
+        a: arguments
+      };
+      return scale;
+    };
+    scale.rangeBand = function() {
+      return rangeBand;
+    };
+    scale.rangeExtent = function() {
+      return d3_scaleExtent(ranger.a[0]);
+    };
+    scale.copy = function() {
+      return d3_scale_ordinal(domain, ranger);
+    };
+    return scale.domain(domain);
+  }
+  d3.scale.category10 = function() {
+    return d3.scale.ordinal().range(d3_category10);
+  };
+  d3.scale.category20 = function() {
+    return d3.scale.ordinal().range(d3_category20);
+  };
+  d3.scale.category20b = function() {
+    return d3.scale.ordinal().range(d3_category20b);
+  };
+  d3.scale.category20c = function() {
+    return d3.scale.ordinal().range(d3_category20c);
+  };
+  var d3_category10 = [ "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" ];
+  var d3_category20 = [ "#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c", "#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5", "#8c564b", "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f", "#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5" ];
+  var d3_category20b = [ "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", "#637939", "#8ca252", "#b5cf6b", "#cedb9c", "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", "#843c39", "#ad494a", "#d6616b", "#e7969c", "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" ];
+  var d3_category20c = [ "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", "#31a354", "#74c476", "#a1d99b", "#c7e9c0", "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", "#636363", "#969696", "#bdbdbd", "#d9d9d9" ];
+  d3.scale.quantile = function() {
+    return d3_scale_quantile([], []);
+  };
+  function d3_scale_quantile(domain, range) {
+    var thresholds;
+    function rescale() {
+      var k = 0, q = range.length;
+      thresholds = [];
+      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);
+      return scale;
+    }
+    function scale(x) {
+      if (isNaN(x = +x)) return NaN;
+      return range[d3.bisect(thresholds, x)];
+    }
+    scale.domain = function(x) {
+      if (!arguments.length) return domain;
+      domain = x.filter(function(d) {
+        return !isNaN(d);
+      }).sort(d3.ascending);
+      return rescale();
+    };
+    scale.range = function(x) {
+      if (!arguments.length) return range;
+      range = x;
+      return rescale();
+    };
+    scale.quantiles = function() {
+      return thresholds;
+    };
+    scale.copy = function() {
+      return d3_scale_quantile(domain, range);
+    };
+    return rescale();
+  }
+  d3.scale.quantize = function() {
+    return d3_scale_quantize(0, 1, [ 0, 1 ]);
+  };
+  function d3_scale_quantize(x0, x1, range) {
+    var kx, i;
+    function scale(x) {
+      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];
+    }
+    function rescale() {
+      kx = range.length / (x1 - x0);
+      i = range.length - 1;
+      return scale;
+    }
+    scale.domain = function(x) {
+      if (!arguments.length) return [ x0, x1 ];
+      x0 = +x[0];
+      x1 = +x[x.length - 1];
+      return rescale();
+    };
+    scale.range = function(x) {
+      if (!arguments.length) return range;
+      range = x;
+      return rescale();
+    };
+    scale.copy = function() {
+      return d3_scale_quantize(x0, x1, range);
+    };
+    return rescale();
+  }
+  d3.scale.threshold = function() {
+    return d3_scale_threshold([ .5 ], [ 0, 1 ]);
+  };
+  function d3_scale_threshold(domain, range) {
+    function scale(x) {
+      return range[d3.bisect(domain, x)];
+    }
+    scale.domain = function(_) {
+      if (!arguments.length) return domain;
+      domain = _;
+      return scale;
+    };
+    scale.range = function(_) {
+      if (!arguments.length) return range;
+      range = _;
+      return scale;
+    };
+    scale.copy = function() {
+      return d3_scale_threshold(domain, range);
+    };
+    return scale;
+  }
+  d3.scale.identity = function() {
+    return d3_scale_identity([ 0, 1 ]);
+  };
+  function d3_scale_identity(domain) {
+    function identity(x) {
+      return +x;
+    }
+    identity.invert = identity;
+    identity.domain = identity.range = function(x) {
+      if (!arguments.length) return domain;
+      domain = x.map(identity);
+      return identity;
+    };
+    identity.ticks = function(m) {
+      return d3_scale_linearTicks(domain, m);
+    };
+    identity.tickFormat = function(m) {
+      return d3_scale_linearTickFormat(domain, m);
+    };
+    identity.copy = function() {
+      return d3_scale_identity(domain);
+    };
+    return identity;
+  }
+  d3.svg = {};
+  d3.svg.arc = function() {
+    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;
+    function arc() {
+      var r0 = innerRadius.apply(this, arguments), r1 = outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, da = (a1 < a0 && (da = a0, 
+      a0 = a1, a1 = da), a1 - a0), df = da < π ? "0" : "1", c0 = Math.cos(a0), s0 = Math.sin(a0), c1 = Math.cos(a1), s1 = Math.sin(a1);
+      return da >= d3_svg_arcMax ? r0 ? "M0," + r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + -r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 + "M0," + r0 + "A" + r0 + "," + r0 + " 0 1,0 0," + -r0 + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 + "Z" : "M0," + r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + -r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 + "Z" : r0 ? "M" + r1 * c0 + "," + r1 * s0 + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 + "L" + r0 * c1 + "," + r0 * s1 + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 + "Z" : "M" + r1 * c0 + "," + r1 * s0 + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 + "L0,0" + "Z";
+    }
+    arc.innerRadius = function(v) {
+      if (!arguments.length) return innerRadius;
+      innerRadius = d3_functor(v);
+      return arc;
+    };
+    arc.outerRadius = function(v) {
+      if (!arguments.length) return outerRadius;
+      outerRadius = d3_functor(v);
+      return arc;
+    };
+    arc.startAngle = function(v) {
+      if (!arguments.length) return startAngle;
+      startAngle = d3_functor(v);
+      return arc;
+    };
+    arc.endAngle = function(v) {
+      if (!arguments.length) return endAngle;
+      endAngle = d3_functor(v);
+      return arc;
+    };
+    arc.centroid = function() {
+      var r = (innerRadius.apply(this, arguments) + outerRadius.apply(this, arguments)) / 2, a = (startAngle.apply(this, arguments) + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;
+      return [ Math.cos(a) * r, Math.sin(a) * r ];
+    };
+    return arc;
+  };
+  var d3_svg_arcOffset = -π / 2, d3_svg_arcMax = 2 * π - 1e-6;
+  function d3_svg_arcInnerRadius(d) {
+    return d.innerRadius;
+  }
+  function d3_svg_arcOuterRadius(d) {
+    return d.outerRadius;
+  }
+  function d3_svg_arcStartAngle(d) {
+    return d.startAngle;
+  }
+  function d3_svg_arcEndAngle(d) {
+    return d.endAngle;
+  }
+  function d3_svg_line(projection) {
+    var x = d3_svg_lineX, y = d3_svg_lineY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;
+    function line(data) {
+      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);
+      function segment() {
+        segments.push("M", interpolate(projection(points), tension));
+      }
+      while (++i < n) {
+        if (defined.call(this, d = data[i], i)) {
+          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);
+        } else if (points.length) {
+          segment();
+          points = [];
+        }
+      }
+      if (points.length) segment();
+      return segments.length ? segments.join("") : null;
+    }
+    line.x = function(_) {
+      if (!arguments.length) return x;
+      x = _;
+      return line;
+    };
+    line.y = function(_) {
+      if (!arguments.length) return y;
+      y = _;
+      return line;
+    };
+    line.defined = function(_) {
+      if (!arguments.length) return defined;
+      defined = _;
+      return line;
+    };
+    line.interpolate = function(_) {
+      if (!arguments.length) return interpolateKey;
+      if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
+      return line;
+    };
+    line.tension = function(_) {
+      if (!arguments.length) return tension;
+      tension = _;
+      return line;
+    };
+    return line;
+  }
+  d3.svg.line = function() {
+    return d3_svg_line(d3_identity);
+  };
+  function d3_svg_lineX(d) {
+    return d[0];
+  }
+  function d3_svg_lineY(d) {
+    return d[1];
+  }
+  var d3_svg_lineInterpolators = d3.map({
+    linear: d3_svg_lineLinear,
+    "linear-closed": d3_svg_lineLinearClosed,
+    "step-before": d3_svg_lineStepBefore,
+    "step-after": d3_svg_lineStepAfter,
+    basis: d3_svg_lineBasis,
+    "basis-open": d3_svg_lineBasisOpen,
+    "basis-closed": d3_svg_lineBasisClosed,
+    bundle: d3_svg_lineBundle,
+    cardinal: d3_svg_lineCardinal,
+    "cardinal-open": d3_svg_lineCardinalOpen,
+    "cardinal-closed": d3_svg_lineCardinalClosed,
+    monotone: d3_svg_lineMonotone
+  });
+  d3_svg_lineInterpolators.forEach(function(key, value) {
+    value.key = key;
+    value.closed = /-closed$/.test(key);
+  });
+  function d3_svg_lineLinear(points) {
+    return points.join("L");
+  }
+  function d3_svg_lineLinearClosed(points) {
+    return d3_svg_lineLinear(points) + "Z";
+  }
+  function d3_svg_lineStepBefore(points) {
+    var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+    while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]);
+    return path.join("");
+  }
+  function d3_svg_lineStepAfter(points) {
+    var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+    while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]);
+    return path.join("");
+  }
+  function d3_svg_lineCardinalOpen(points, tension) {
+    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), d3_svg_lineCardinalTangents(points, tension));
+  }
+  function d3_svg_lineCardinalClosed(points, tension) {
+    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), 
+    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));
+  }
+  function d3_svg_lineCardinal(points, tension) {
+    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));
+  }
+  function d3_svg_lineHermite(points, tangents) {
+    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {
+      return d3_svg_lineLinear(points);
+    }
+    var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;
+    if (quad) {
+      path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1];
+      p0 = points[1];
+      pi = 2;
+    }
+    if (tangents.length > 1) {
+      t = tangents[1];
+      p = points[pi];
+      pi++;
+      path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
+      for (var i = 2; i < tangents.length; i++, pi++) {
+        p = points[pi];
+        t = tangents[i];
+        path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
+      }
+    }
+    if (quad) {
+      var lp = points[pi];
+      path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1];
+    }
+    return path;
+  }
+  function d3_svg_lineCardinalTangents(points, tension) {
+    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;
+    while (++i < n) {
+      p0 = p1;
+      p1 = p2;
+      p2 = points[i];
+      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);
+    }
+    return tangents;
+  }
+  function d3_svg_lineBasis(points) {
+    if (points.length < 3) return d3_svg_lineLinear(points);
+    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0 ];
+    d3_svg_lineBasisBezier(path, px, py);
+    while (++i < n) {
+      pi = points[i];
+      px.shift();
+      px.push(pi[0]);
+      py.shift();
+      py.push(pi[1]);
+      d3_svg_lineBasisBezier(path, px, py);
+    }
+    i = -1;
+    while (++i < 2) {
+      px.shift();
+      px.push(pi[0]);
+      py.shift();
+      py.push(pi[1]);
+      d3_svg_lineBasisBezier(path, px, py);
+    }
+    return path.join("");
+  }
+  function d3_svg_lineBasisOpen(points) {
+    if (points.length < 4) return d3_svg_lineLinear(points);
+    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];
+    while (++i < 3) {
+      pi = points[i];
+      px.push(pi[0]);
+      py.push(pi[1]);
+    }
+    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));
+    --i;
+    while (++i < n) {
+      pi = points[i];
+      px.shift();
+      px.push(pi[0]);
+      py.shift();
+      py.push(pi[1]);
+      d3_svg_lineBasisBezier(path, px, py);
+    }
+    return path.join("");
+  }
+  function d3_svg_lineBasisClosed(points) {
+    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];
+    while (++i < 4) {
+      pi = points[i % n];
+      px.push(pi[0]);
+      py.push(pi[1]);
+    }
+    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
+    --i;
+    while (++i < m) {
+      pi = points[i % n];
+      px.shift();
+      px.push(pi[0]);
+      py.shift();
+      py.push(pi[1]);
+      d3_svg_lineBasisBezier(path, px, py);
+    }
+    return path.join("");
+  }
+  function d3_svg_lineBundle(points, tension) {
+    var n = points.length - 1;
+    if (n) {
+      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;
+      while (++i <= n) {
+        p = points[i];
+        t = i / n;
+        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);
+        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);
+      }
+    }
+    return d3_svg_lineBasis(points);
+  }
+  function d3_svg_lineDot4(a, b) {
+    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
+  }
+  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];
+  function d3_svg_lineBasisBezier(path, x, y) {
+    path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));
+  }
+  function d3_svg_lineSlope(p0, p1) {
+    return (p1[1] - p0[1]) / (p1[0] - p0[0]);
+  }
+  function d3_svg_lineFiniteDifferences(points) {
+    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);
+    while (++i < j) {
+      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;
+    }
+    m[i] = d;
+    return m;
+  }
+  function d3_svg_lineMonotoneTangents(points) {
+    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;
+    while (++i < j) {
+      d = d3_svg_lineSlope(points[i], points[i + 1]);
+      if (Math.abs(d) < 1e-6) {
+        m[i] = m[i + 1] = 0;
+      } else {
+        a = m[i] / d;
+        b = m[i + 1] / d;
+        s = a * a + b * b;
+        if (s > 9) {
+          s = d * 3 / Math.sqrt(s);
+          m[i] = s * a;
+          m[i + 1] = s * b;
+        }
+      }
+    }
+    i = -1;
+    while (++i <= j) {
+      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));
+      tangents.push([ s || 0, m[i] * s || 0 ]);
+    }
+    return tangents;
+  }
+  function d3_svg_lineMonotone(points) {
+    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));
+  }
+  d3.svg.line.radial = function() {
+    var line = d3_svg_line(d3_svg_lineRadial);
+    line.radius = line.x, delete line.x;
+    line.angle = line.y, delete line.y;
+    return line;
+  };
+  function d3_svg_lineRadial(points) {
+    var point, i = -1, n = points.length, r, a;
+    while (++i < n) {
+      point = points[i];
+      r = point[0];
+      a = point[1] + d3_svg_arcOffset;
+      point[0] = r * Math.cos(a);
+      point[1] = r * Math.sin(a);
+    }
+    return points;
+  }
+  function d3_svg_area(projection) {
+    var x0 = d3_svg_lineX, x1 = d3_svg_lineX, y0 = 0, y1 = d3_svg_lineY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7;
+    function area(data) {
+      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {
+        return x;
+      } : d3_functor(x1), fy1 = y0 === y1 ? function() {
+        return y;
+      } : d3_functor(y1), x, y;
+      function segment() {
+        segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z");
+      }
+      while (++i < n) {
+        if (defined.call(this, d = data[i], i)) {
+          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);
+          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);
+        } else if (points0.length) {
+          segment();
+          points0 = [];
+          points1 = [];
+        }
+      }
+      if (points0.length) segment();
+      return segments.length ? segments.join("") : null;
+    }
+    area.x = function(_) {
+      if (!arguments.length) return x1;
+      x0 = x1 = _;
+      return area;
+    };
+    area.x0 = function(_) {
+      if (!arguments.length) return x0;
+      x0 = _;
+      return area;
+    };
+    area.x1 = function(_) {
+      if (!arguments.length) return x1;
+      x1 = _;
+      return area;
+    };
+    area.y = function(_) {
+      if (!arguments.length) return y1;
+      y0 = y1 = _;
+      return area;
+    };
+    area.y0 = function(_) {
+      if (!arguments.length) return y0;
+      y0 = _;
+      return area;
+    };
+    area.y1 = function(_) {
+      if (!arguments.length) return y1;
+      y1 = _;
+      return area;
+    };
+    area.defined = function(_) {
+      if (!arguments.length) return defined;
+      defined = _;
+      return area;
+    };
+    area.interpolate = function(_) {
+      if (!arguments.length) return interpolateKey;
+      if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
+      interpolateReverse = interpolate.reverse || interpolate;
+      L = interpolate.closed ? "M" : "L";
+      return area;
+    };
+    area.tension = function(_) {
+      if (!arguments.length) return tension;
+      tension = _;
+      return area;
+    };
+    return area;
+  }
+  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;
+  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;
+  d3.svg.area = function() {
+    return d3_svg_area(d3_identity);
+  };
+  d3.svg.area.radial = function() {
+    var area = d3_svg_area(d3_svg_lineRadial);
+    area.radius = area.x, delete area.x;
+    area.innerRadius = area.x0, delete area.x0;
+    area.outerRadius = area.x1, delete area.x1;
+    area.angle = area.y, delete area.y;
+    area.startAngle = area.y0, delete area.y0;
+    area.endAngle = area.y1, delete area.y1;
+    return area;
+  };
+  d3.svg.chord = function() {
+    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;
+    function chord(d, i) {
+      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);
+      return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z";
+    }
+    function subgroup(self, f, d, i) {
+      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset;
+      return {
+        r: r,
+        a0: a0,
+        a1: a1,
+        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],
+        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]
+      };
+    }
+    function equals(a, b) {
+      return a.a0 == b.a0 && a.a1 == b.a1;
+    }
+    function arc(r, p, a) {
+      return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p;
+    }
+    function curve(r0, p0, r1, p1) {
+      return "Q 0,0 " + p1;
+    }
+    chord.radius = function(v) {
+      if (!arguments.length) return radius;
+      radius = d3_functor(v);
+      return chord;
+    };
+    chord.source = function(v) {
+      if (!arguments.length) return source;
+      source = d3_functor(v);
+      return chord;
+    };
+    chord.target = function(v) {
+      if (!arguments.length) return target;
+      target = d3_functor(v);
+      return chord;
+    };
+    chord.startAngle = function(v) {
+      if (!arguments.length) return startAngle;
+      startAngle = d3_functor(v);
+      return chord;
+    };
+    chord.endAngle = function(v) {
+      if (!arguments.length) return endAngle;
+      endAngle = d3_functor(v);
+      return chord;
+    };
+    return chord;
+  };
+  function d3_svg_chordRadius(d) {
+    return d.radius;
+  }
+  d3.svg.diagonal = function() {
+    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;
+    function diagonal(d, i) {
+      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {
+        x: p0.x,
+        y: m
+      }, {
+        x: p3.x,
+        y: m
+      }, p3 ];
+      p = p.map(projection);
+      return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3];
+    }
+    diagonal.source = function(x) {
+      if (!arguments.length) return source;
+      source = d3_functor(x);
+      return diagonal;
+    };
+    diagonal.target = function(x) {
+      if (!arguments.length) return target;
+      target = d3_functor(x);
+      return diagonal;
+    };
+    diagonal.projection = function(x) {
+      if (!arguments.length) return projection;
+      projection = x;
+      return diagonal;
+    };
+    return diagonal;
+  };
+  function d3_svg_diagonalProjection(d) {
+    return [ d.x, d.y ];
+  }
+  d3.svg.diagonal.radial = function() {
+    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;
+    diagonal.projection = function(x) {
+      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;
+    };
+    return diagonal;
+  };
+  function d3_svg_diagonalRadialProjection(projection) {
+    return function() {
+      var d = projection.apply(this, arguments), r = d[0], a = d[1] + d3_svg_arcOffset;
+      return [ r * Math.cos(a), r * Math.sin(a) ];
+    };
+  }
+  d3.svg.symbol = function() {
+    var type = d3_svg_symbolType, size = d3_svg_symbolSize;
+    function symbol(d, i) {
+      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));
+    }
+    symbol.type = function(x) {
+      if (!arguments.length) return type;
+      type = d3_functor(x);
+      return symbol;
+    };
+    symbol.size = function(x) {
+      if (!arguments.length) return size;
+      size = d3_functor(x);
+      return symbol;
+    };
+    return symbol;
+  };
+  function d3_svg_symbolSize() {
+    return 64;
+  }
+  function d3_svg_symbolType() {
+    return "circle";
+  }
+  function d3_svg_symbolCircle(size) {
+    var r = Math.sqrt(size / π);
+    return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z";
+  }
+  var d3_svg_symbols = d3.map({
+    circle: d3_svg_symbolCircle,
+    cross: function(size) {
+      var r = Math.sqrt(size / 5) / 2;
+      return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z";
+    },
+    diamond: function(size) {
+      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;
+      return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z";
+    },
+    square: function(size) {
+      var r = Math.sqrt(size) / 2;
+      return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z";
+    },
+    "triangle-down": function(size) {
+      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
+      return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z";
+    },
+    "triangle-up": function(size) {
+      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
+      return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z";
+    }
+  });
+  d3.svg.symbolTypes = d3_svg_symbols.keys();
+  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);
+  d3.svg.axis = function() {
+    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, tickMajorSize = 6, tickMinorSize = 6, tickEndSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_, tickSubdivide = 0;
+    function axis(g) {
+      g.each(function() {
+        var g = d3.select(this);
+        var ticks = tickValues == null ? scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain() : tickValues, tickFormat = tickFormat_ == null ? scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String : tickFormat_;
+        var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), subtick = g.selectAll(".tick.minor").data(subticks, String), subtickEnter = subtick.enter().insert("line", ".tick").attr("class", "tick minor").style("opacity", 1e-6), subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(), subtickUpdate = d3.transition(subtick).style("opacity", 1);
+        var tick = g.selectAll(".tick.major").data(ticks, String), tickEnter = tick.enter().insert("g", "path").attr("class", "tick major").style("opacity", 1e-6), tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(), tickUpdate = d3.transition(tick).style("opacity", 1), tickTransform;
+        var range = d3_scaleRange(scale), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"), 
+        d3.transition(path));
+        var scale1 = scale.copy(), scale0 = this.__chart__ || scale1;
+        this.__chart__ = scale1;
+        tickEnter.append("line");
+        tickEnter.append("text");
+        var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text");
+        switch (orient) {
+         case "bottom":
+          {
+            tickTransform = d3_svg_axisX;
+            subtickEnter.attr("y2", tickMinorSize);
+            subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize);
+            lineEnter.attr("y2", tickMajorSize);
+            textEnter.attr("y", Math.max(tickMajorSize, 0) + tickPadding);
+            lineUpdate.attr("x2", 0).attr("y2", tickMajorSize);
+            textUpdate.attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding);
+            text.attr("dy", ".71em").style("text-anchor", "middle");
+            pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize);
+            break;
+          }
+
+         case "top":
+          {
+            tickTransform = d3_svg_axisX;
+            subtickEnter.attr("y2", -tickMinorSize);
+            subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize);
+            lineEnter.attr("y2", -tickMajorSize);
+            textEnter.attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
+            lineUpdate.attr("x2", 0).attr("y2", -tickMajorSize);
+            textUpdate.attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
+            text.attr("dy", "0em").style("text-anchor", "middle");
+            pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize);
+            break;
+          }
+
+         case "left":
+          {
+            tickTransform = d3_svg_axisY;
+            subtickEnter.attr("x2", -tickMinorSize);
+            subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0);
+            lineEnter.attr("x2", -tickMajorSize);
+            textEnter.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding));
+            lineUpdate.attr("x2", -tickMajorSize).attr("y2", 0);
+            textUpdate.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0);
+            text.attr("dy", ".32em").style("text-anchor", "end");
+            pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize);
+            break;
+          }
+
+         case "right":
+          {
+            tickTransform = d3_svg_axisY;
+            subtickEnter.attr("x2", tickMinorSize);
+            subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0);
+            lineEnter.attr("x2", tickMajorSize);
+            textEnter.attr("x", Math.max(tickMajorSize, 0) + tickPadding);
+            lineUpdate.attr("x2", tickMajorSize).attr("y2", 0);
+            textUpdate.attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0);
+            text.attr("dy", ".32em").style("text-anchor", "start");
+            pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize);
+            break;
+          }
+        }
+        if (scale.ticks) {
+          tickEnter.call(tickTransform, scale0);
+          tickUpdate.call(tickTransform, scale1);
+          tickExit.call(tickTransform, scale1);
+          subtickEnter.call(tickTransform, scale0);
+          subtickUpdate.call(tickTransform, scale1);
+          subtickExit.call(tickTransform, scale1);
+        } else {
+          var dx = scale1.rangeBand() / 2, x = function(d) {
+            return scale1(d) + dx;
+          };
+          tickEnter.call(tickTransform, x);
+          tickUpdate.call(tickTransform, x);
+        }
+      });
+    }
+    axis.scale = function(x) {
+      if (!arguments.length) return scale;
+      scale = x;
+      return axis;
+    };
+    axis.orient = function(x) {
+      if (!arguments.length) return orient;
+      orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient;
+      return axis;
+    };
+    axis.ticks = function() {
+      if (!arguments.length) return tickArguments_;
+      tickArguments_ = arguments;
+      return axis;
+    };
+    axis.tickValues = function(x) {
+      if (!arguments.length) return tickValues;
+      tickValues = x;
+      return axis;
+    };
+    axis.tickFormat = function(x) {
+      if (!arguments.length) return tickFormat_;
+      tickFormat_ = x;
+      return axis;
+    };
+    axis.tickSize = function(x, y) {
+      if (!arguments.length) return tickMajorSize;
+      var n = arguments.length - 1;
+      tickMajorSize = +x;
+      tickMinorSize = n > 1 ? +y : tickMajorSize;
+      tickEndSize = n > 0 ? +arguments[n] : tickMajorSize;
+      return axis;
+    };
+    axis.tickPadding = function(x) {
+      if (!arguments.length) return tickPadding;
+      tickPadding = +x;
+      return axis;
+    };
+    axis.tickSubdivide = function(x) {
+      if (!arguments.length) return tickSubdivide;
+      tickSubdivide = +x;
+      return axis;
+    };
+    return axis;
+  };
+  var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = {
+    top: 1,
+    right: 1,
+    bottom: 1,
+    left: 1
+  };
+  function d3_svg_axisX(selection, x) {
+    selection.attr("transform", function(d) {
+      return "translate(" + x(d) + ",0)";
+    });
+  }
+  function d3_svg_axisY(selection, y) {
+    selection.attr("transform", function(d) {
+      return "translate(0," + y(d) + ")";
+    });
+  }
+  function d3_svg_axisSubdivide(scale, ticks, m) {
+    subticks = [];
+    if (m && ticks.length > 1) {
+      var extent = d3_scaleExtent(scale.domain()), subticks, i = -1, n = ticks.length, d = (ticks[1] - ticks[0]) / ++m, j, v;
+      while (++i < n) {
+        for (j = m; --j > 0; ) {
+          if ((v = +ticks[i] - j * d) >= extent[0]) {
+            subticks.push(v);
+          }
+        }
+      }
+      for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1]; ) {
+        subticks.push(v);
+      }
+    }
+    return subticks;
+  }
+  d3.svg.brush = function() {
+    var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, resizes = d3_svg_brushResizes[0], extent = [ [ 0, 0 ], [ 0, 0 ] ], extentDomain;
+    function brush(g) {
+      g.each(function() {
+        var g = d3.select(this), bg = g.selectAll(".background").data([ 0 ]), fg = g.selectAll(".extent").data([ 0 ]), tz = g.selectAll(".resize").data(resizes, String), e;
+        g.style("pointer-events", "all").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart);
+        bg.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair");
+        fg.enter().append("rect").attr("class", "extent").style("cursor", "move");
+        tz.enter().append("g").attr("class", function(d) {
+          return "resize " + d;
+        }).style("cursor", function(d) {
+          return d3_svg_brushCursor[d];
+        }).append("rect").attr("x", function(d) {
+          return /[ew]$/.test(d) ? -3 : null;
+        }).attr("y", function(d) {
+          return /^[ns]/.test(d) ? -3 : null;
+        }).attr("width", 6).attr("height", 6).style("visibility", "hidden");
+        tz.style("display", brush.empty() ? "none" : null);
+        tz.exit().remove();
+        if (x) {
+          e = d3_scaleRange(x);
+          bg.attr("x", e[0]).attr("width", e[1] - e[0]);
+          redrawX(g);
+        }
+        if (y) {
+          e = d3_scaleRange(y);
+          bg.attr("y", e[0]).attr("height", e[1] - e[0]);
+          redrawY(g);
+        }
+        redraw(g);
+      });
+    }
+    function redraw(g) {
+      g.selectAll(".resize").attr("transform", function(d) {
+        return "translate(" + extent[+/e$/.test(d)][0] + "," + extent[+/^s/.test(d)][1] + ")";
+      });
+    }
+    function redrawX(g) {
+      g.select(".extent").attr("x", extent[0][0]);
+      g.selectAll(".extent,.n>rect,.s>rect").attr("width", extent[1][0] - extent[0][0]);
+    }
+    function redrawY(g) {
+      g.select(".extent").attr("y", extent[0][1]);
+      g.selectAll(".extent,.e>rect,.w>rect").attr("height", extent[1][1] - extent[0][1]);
+    }
+    function brushstart() {
+      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), center, origin = mouse(), offset;
+      var w = d3.select(d3_window).on("mousemove.brush", brushmove).on("mouseup.brush", brushend).on("touchmove.brush", brushmove).on("touchend.brush", brushend).on("keydown.brush", keydown).on("keyup.brush", keyup);
+      if (dragging) {
+        origin[0] = extent[0][0] - origin[0];
+        origin[1] = extent[0][1] - origin[1];
+      } else if (resizing) {
+        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);
+        offset = [ extent[1 - ex][0] - origin[0], extent[1 - ey][1] - origin[1] ];
+        origin[0] = extent[ex][0];
+        origin[1] = extent[ey][1];
+      } else if (d3.event.altKey) center = origin.slice();
+      g.style("pointer-events", "none").selectAll(".resize").style("display", null);
+      d3.select("body").style("cursor", eventTarget.style("cursor"));
+      event_({
+        type: "brushstart"
+      });
+      brushmove();
+      d3_eventCancel();
+      function mouse() {
+        var touches = d3.event.changedTouches;
+        return touches ? d3.touches(target, touches)[0] : d3.mouse(target);
+      }
+      function keydown() {
+        if (d3.event.keyCode == 32) {
+          if (!dragging) {
+            center = null;
+            origin[0] -= extent[1][0];
+            origin[1] -= extent[1][1];
+            dragging = 2;
+          }
+          d3_eventCancel();
+        }
+      }
+      function keyup() {
+        if (d3.event.keyCode == 32 && dragging == 2) {
+          origin[0] += extent[1][0];
+          origin[1] += extent[1][1];
+          dragging = 0;
+          d3_eventCancel();
+        }
+      }
+      function brushmove() {
+        var point = mouse(), moved = false;
+        if (offset) {
+          point[0] += offset[0];
+          point[1] += offset[1];
+        }
+        if (!dragging) {
+          if (d3.event.altKey) {
+            if (!center) center = [ (extent[0][0] + extent[1][0]) / 2, (extent[0][1] + extent[1][1]) / 2 ];
+            origin[0] = extent[+(point[0] < center[0])][0];
+            origin[1] = extent[+(point[1] < center[1])][1];
+          } else center = null;
+        }
+        if (resizingX && move1(point, x, 0)) {
+          redrawX(g);
+          moved = true;
+        }
+        if (resizingY && move1(point, y, 1)) {
+          redrawY(g);
+          moved = true;
+        }
+        if (moved) {
+          redraw(g);
+          event_({
+            type: "brush",
+            mode: dragging ? "move" : "resize"
+          });
+        }
+      }
+      function move1(point, scale, i) {
+        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], size = extent[1][i] - extent[0][i], min, max;
+        if (dragging) {
+          r0 -= position;
+          r1 -= size + position;
+        }
+        min = Math.max(r0, Math.min(r1, point[i]));
+        if (dragging) {
+          max = (min += position) + size;
+        } else {
+          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));
+          if (position < min) {
+            max = min;
+            min = position;
+          } else {
+            max = position;
+          }
+        }
+        if (extent[0][i] !== min || extent[1][i] !== max) {
+          extentDomain = null;
+          extent[0][i] = min;
+          extent[1][i] = max;
+          return true;
+        }
+      }
+      function brushend() {
+        brushmove();
+        g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null);
+        d3.select("body").style("cursor", null);
+        w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null);
+        event_({
+          type: "brushend"
+        });
+        d3_eventCancel();
+      }
+    }
+    brush.x = function(z) {
+      if (!arguments.length) return x;
+      x = z;
+      resizes = d3_svg_brushResizes[!x << 1 | !y];
+      return brush;
+    };
+    brush.y = function(z) {
+      if (!arguments.length) return y;
+      y = z;
+      resizes = d3_svg_brushResizes[!x << 1 | !y];
+      return brush;
+    };
+    brush.extent = function(z) {
+      var x0, x1, y0, y1, t;
+      if (!arguments.length) {
+        z = extentDomain || extent;
+        if (x) {
+          x0 = z[0][0], x1 = z[1][0];
+          if (!extentDomain) {
+            x0 = extent[0][0], x1 = extent[1][0];
+            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
+            if (x1 < x0) t = x0, x0 = x1, x1 = t;
+          }
+        }
+        if (y) {
+          y0 = z[0][1], y1 = z[1][1];
+          if (!extentDomain) {
+            y0 = extent[0][1], y1 = extent[1][1];
+            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
+            if (y1 < y0) t = y0, y0 = y1, y1 = t;
+          }
+        }
+        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];
+      }
+      extentDomain = [ [ 0, 0 ], [ 0, 0 ] ];
+      if (x) {
+        x0 = z[0], x1 = z[1];
+        if (y) x0 = x0[0], x1 = x1[0];
+        extentDomain[0][0] = x0, extentDomain[1][0] = x1;
+        if (x.invert) x0 = x(x0), x1 = x(x1);
+        if (x1 < x0) t = x0, x0 = x1, x1 = t;
+        extent[0][0] = x0 | 0, extent[1][0] = x1 | 0;
+      }
+      if (y) {
+        y0 = z[0], y1 = z[1];
+        if (x) y0 = y0[1], y1 = y1[1];
+        extentDomain[0][1] = y0, extentDomain[1][1] = y1;
+        if (y.invert) y0 = y(y0), y1 = y(y1);
+        if (y1 < y0) t = y0, y0 = y1, y1 = t;
+        extent[0][1] = y0 | 0, extent[1][1] = y1 | 0;
+      }
+      return brush;
+    };
+    brush.clear = function() {
+      extentDomain = null;
+      extent[0][0] = extent[0][1] = extent[1][0] = extent[1][1] = 0;
+      return brush;
+    };
+    brush.empty = function() {
+      return x && extent[0][0] === extent[1][0] || y && extent[0][1] === extent[1][1];
+    };
+    return d3.rebind(brush, event, "on");
+  };
+  var d3_svg_brushCursor = {
+    n: "ns-resize",
+    e: "ew-resize",
+    s: "ns-resize",
+    w: "ew-resize",
+    nw: "nwse-resize",
+    ne: "nesw-resize",
+    se: "nwse-resize",
+    sw: "nesw-resize"
+  };
+  var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ];
+  d3.behavior = {};
+  d3.behavior.drag = function() {
+    var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null;
+    function drag() {
+      this.on("mousedown.drag", mousedown).on("touchstart.drag", mousedown);
+    }
+    function mousedown() {
+      var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null, offset, origin_ = point(), moved = 0;
+      var w = d3.select(d3_window).on(touchId != null ? "touchmove.drag-" + touchId : "mousemove.drag", dragmove).on(touchId != null ? "touchend.drag-" + touchId : "mouseup.drag", dragend, true);
+      if (origin) {
+        offset = origin.apply(target, arguments);
+        offset = [ offset.x - origin_[0], offset.y - origin_[1] ];
+      } else {
+        offset = [ 0, 0 ];
+      }
+      if (touchId == null) d3_eventCancel();
+      event_({
+        type: "dragstart"
+      });
+      function point() {
+        var p = target.parentNode;
+        return touchId != null ? d3.touches(p).filter(function(p) {
+          return p.identifier === touchId;
+        })[0] : d3.mouse(p);
+      }
+      function dragmove() {
+        if (!target.parentNode) return dragend();
+        var p = point(), dx = p[0] - origin_[0], dy = p[1] - origin_[1];
+        moved |= dx | dy;
+        origin_ = p;
+        d3_eventCancel();
+        event_({
+          type: "drag",
+          x: p[0] + offset[0],
+          y: p[1] + offset[1],
+          dx: dx,
+          dy: dy
+        });
+      }
+      function dragend() {
+        event_({
+          type: "dragend"
+        });
+        if (moved) {
+          d3_eventCancel();
+          if (d3.event.target === eventTarget) w.on("click.drag", click, true);
+        }
+        w.on(touchId != null ? "touchmove.drag-" + touchId : "mousemove.drag", null).on(touchId != null ? "touchend.drag-" + touchId : "mouseup.drag", null);
+      }
+      function click() {
+        d3_eventCancel();
+        w.on("click.drag", null);
+      }
+    }
+    drag.origin = function(x) {
+      if (!arguments.length) return origin;
+      origin = x;
+      return drag;
+    };
+    return d3.rebind(drag, event, "on");
+  };
+  d3.behavior.zoom = function() {
+    var translate = [ 0, 0 ], translate0, scale = 1, scale0, scaleExtent = d3_behavior_zoomInfinity, event = d3_eventDispatch(zoom, "zoom"), x0, x1, y0, y1, touchtime;
+    function zoom() {
+      this.on("mousedown.zoom", mousedown).on("mousemove.zoom", mousemove).on(d3_behavior_zoomWheel + ".zoom", mousewheel).on("dblclick.zoom", dblclick).on("touchstart.zoom", touchstart).on("touchmove.zoom", touchmove).on("touchend.zoom", touchstart);
+    }
+    zoom.translate = function(x) {
+      if (!arguments.length) return translate;
+      translate = x.map(Number);
+      rescale();
+      return zoom;
+    };
+    zoom.scale = function(x) {
+      if (!arguments.length) return scale;
+      scale = +x;
+      rescale();
+      return zoom;
+    };
+    zoom.scaleExtent = function(x) {
+      if (!arguments.length) return scaleExtent;
+      scaleExtent = x == null ? d3_behavior_zoomInfinity : x.map(Number);
+      return zoom;
+    };
+    zoom.x = function(z) {
+      if (!arguments.length) return x1;
+      x1 = z;
+      x0 = z.copy();
+      translate = [ 0, 0 ];
+      scale = 1;
+      return zoom;
+    };
+    zoom.y = function(z) {
+      if (!arguments.length) return y1;
+      y1 = z;
+      y0 = z.copy();
+      translate = [ 0, 0 ];
+      scale = 1;
+      return zoom;
+    };
+    function location(p) {
+      return [ (p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale ];
+    }
+    function point(l) {
+      return [ l[0] * scale + translate[0], l[1] * scale + translate[1] ];
+    }
+    function scaleTo(s) {
+      scale = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));
+    }
+    function translateTo(p, l) {
+      l = point(l);
+      translate[0] += p[0] - l[0];
+      translate[1] += p[1] - l[1];
+    }
+    function rescale() {
+      if (x1) x1.domain(x0.range().map(function(x) {
+        return (x - translate[0]) / scale;
+      }).map(x0.invert));
+      if (y1) y1.domain(y0.range().map(function(y) {
+        return (y - translate[1]) / scale;
+      }).map(y0.invert));
+    }
+    function dispatch(event) {
+      rescale();
+      d3.event.preventDefault();
+      event({
+        type: "zoom",
+        scale: scale,
+        translate: translate
+      });
+    }
+    function mousedown() {
+      var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, moved = 0, w = d3.select(d3_window).on("mousemove.zoom", mousemove).on("mouseup.zoom", mouseup), l = location(d3.mouse(target));
+      d3_window.focus();
+      d3_eventCancel();
+      function mousemove() {
+        moved = 1;
+        translateTo(d3.mouse(target), l);
+        dispatch(event_);
+      }
+      function mouseup() {
+        if (moved) d3_eventCancel();
+        w.on("mousemove.zoom", null).on("mouseup.zoom", null);
+        if (moved && d3.event.target === eventTarget) w.on("click.zoom", click, true);
+      }
+      function click() {
+        d3_eventCancel();
+        w.on("click.zoom", null);
+      }
+    }
+    function mousewheel() {
+      if (!translate0) translate0 = location(d3.mouse(this));
+      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * scale);
+      translateTo(d3.mouse(this), translate0);
+      dispatch(event.of(this, arguments));
+    }
+    function mousemove() {
+      translate0 = null;
+    }
+    function dblclick() {
+      var p = d3.mouse(this), l = location(p), k = Math.log(scale) / Math.LN2;
+      scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1));
+      translateTo(p, l);
+      dispatch(event.of(this, arguments));
+    }
+    function touchstart() {
+      var touches = d3.touches(this), now = Date.now();
+      scale0 = scale;
+      translate0 = {};
+      touches.forEach(function(t) {
+        translate0[t.identifier] = location(t);
+      });
+      d3_eventCancel();
+      if (touches.length === 1) {
+        if (now - touchtime < 500) {
+          var p = touches[0], l = location(touches[0]);
+          scaleTo(scale * 2);
+          translateTo(p, l);
+          dispatch(event.of(this, arguments));
+        }
+        touchtime = now;
+      }
+    }
+    function touchmove() {
+      var touches = d3.touches(this), p0 = touches[0], l0 = translate0[p0.identifier];
+      if (p1 = touches[1]) {
+        var p1, l1 = translate0[p1.identifier];
+        p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];
+        l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];
+        scaleTo(d3.event.scale * scale0);
+      }
+      translateTo(p0, l0);
+      touchtime = null;
+      dispatch(event.of(this, arguments));
+    }
+    return d3.rebind(zoom, event, "on");
+  };
+  var d3_behavior_zoomInfinity = [ 0, Infinity ];
+  var d3_behavior_zoomDelta, d3_behavior_zoomWheel = "onwheel" in document ? (d3_behavior_zoomDelta = function() {
+    return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);
+  }, "wheel") : "onmousewheel" in document ? (d3_behavior_zoomDelta = function() {
+    return d3.event.wheelDelta;
+  }, "mousewheel") : (d3_behavior_zoomDelta = function() {
+    return -d3.event.detail;
+  }, "MozMousePixelScroll");
+  d3.layout = {};
+  d3.layout.bundle = function() {
+    return function(links) {
+      var paths = [], i = -1, n = links.length;
+      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
+      return paths;
+    };
+  };
+  function d3_layout_bundlePath(link) {
+    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];
+    while (start !== lca) {
+      start = start.parent;
+      points.push(start);
+    }
+    var k = points.length;
+    while (end !== lca) {
+      points.splice(k, 0, end);
+      end = end.parent;
+    }
+    return points;
+  }
+  function d3_layout_bundleAncestors(node) {
+    var ancestors = [], parent = node.parent;
+    while (parent != null) {
+      ancestors.push(node);
+      node = parent;
+      parent = parent.parent;
+    }
+    ancestors.push(node);
+    return ancestors;
+  }
+  function d3_layout_bundleLeastCommonAncestor(a, b) {
+    if (a === b) return a;
+    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;
+    while (aNode === bNode) {
+      sharedNode = aNode;
+      aNode = aNodes.pop();
+      bNode = bNodes.pop();
+    }
+    return sharedNode;
+  }
+  d3.layout.chord = function() {
+    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;
+    function relayout() {
+      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;
+      chords = [];
+      groups = [];
+      k = 0, i = -1;
+      while (++i < n) {
+        x = 0, j = -1;
+        while (++j < n) {
+          x += matrix[i][j];
+        }
+        groupSums.push(x);
+        subgroupIndex.push(d3.range(n));
+        k += x;
+      }
+      if (sortGroups) {
+        groupIndex.sort(function(a, b) {
+          return sortGroups(groupSums[a], groupSums[b]);
+        });
+      }
+      if (sortSubgroups) {
+        subgroupIndex.forEach(function(d, i) {
+          d.sort(function(a, b) {
+            return sortSubgroups(matrix[i][a], matrix[i][b]);
+          });
+        });
+      }
+      k = (2 * π - padding * n) / k;
+      x = 0, i = -1;
+      while (++i < n) {
+        x0 = x, j = -1;
+        while (++j < n) {
+          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;
+          subgroups[di + "-" + dj] = {
+            index: di,
+            subindex: dj,
+            startAngle: a0,
+            endAngle: a1,
+            value: v
+          };
+        }
+        groups[di] = {
+          index: di,
+          startAngle: x0,
+          endAngle: x,
+          value: (x - x0) / k
+        };
+        x += padding;
+      }
+      i = -1;
+      while (++i < n) {
+        j = i - 1;
+        while (++j < n) {
+          var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i];
+          if (source.value || target.value) {
+            chords.push(source.value < target.value ? {
+              source: target,
+              target: source
+            } : {
+              source: source,
+              target: target
+            });
+          }
+        }
+      }
+      if (sortChords) resort();
+    }
+    function resort() {
+      chords.sort(function(a, b) {
+        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);
+      });
+    }
+    chord.matrix = function(x) {
+      if (!arguments.length) return matrix;
+      n = (matrix = x) && matrix.length;
+      chords = groups = null;
+      return chord;
+    };
+    chord.padding = function(x) {
+      if (!arguments.length) return padding;
+      padding = x;
+      chords = groups = null;
+      return chord;
+    };
+    chord.sortGroups = function(x) {
+      if (!arguments.length) return sortGroups;
+      sortGroups = x;
+      chords = groups = null;
+      return chord;
+    };
+    chord.sortSubgroups = function(x) {
+      if (!arguments.length) return sortSubgroups;
+      sortSubgroups = x;
+      chords = null;
+      return chord;
+    };
+    chord.sortChords = function(x) {
+      if (!arguments.length) return sortChords;
+      sortChords = x;
+      if (chords) resort();
+      return chord;
+    };
+    chord.chords = function() {
+      if (!chords) relayout();
+      return chords;
+    };
+    chord.groups = function() {
+      if (!groups) relayout();
+      return groups;
+    };
+    return chord;
+  };
+  d3.layout.force = function() {
+    var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, gravity = .1, theta = .8, nodes = [], links = [], distances, strengths, charges;
+    function repulse(node) {
+      return function(quad, x1, _, x2) {
+        if (quad.point !== node) {
+          var dx = quad.cx - node.x, dy = quad.cy - node.y, dn = 1 / Math.sqrt(dx * dx + dy * dy);
+          if ((x2 - x1) * dn < theta) {
+            var k = quad.charge * dn * dn;
+            node.px -= dx * k;
+            node.py -= dy * k;
+            return true;
+          }
+          if (quad.point && isFinite(dn)) {
+            var k = quad.pointCharge * dn * dn;
+            node.px -= dx * k;
+            node.py -= dy * k;
+          }
+        }
+        return !quad.charge;
+      };
+    }
+    force.tick = function() {
+      if ((alpha *= .99) < .005) {
+        event.end({
+          type: "end",
+          alpha: alpha = 0
+        });
+        return true;
+      }
+      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;
+      for (i = 0; i < m; ++i) {
+        o = links[i];
+        s = o.source;
+        t = o.target;
+        x = t.x - s.x;
+        y = t.y - s.y;
+        if (l = x * x + y * y) {
+          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
+          x *= l;
+          y *= l;
+          t.x -= x * (k = s.weight / (t.weight + s.weight));
+          t.y -= y * k;
+          s.x += x * (k = 1 - k);
+          s.y += y * k;
+        }
+      }
+      if (k = alpha * gravity) {
+        x = size[0] / 2;
+        y = size[1] / 2;
+        i = -1;
+        if (k) while (++i < n) {
+          o = nodes[i];
+          o.x += (x - o.x) * k;
+          o.y += (y - o.y) * k;
+        }
+      }
+      if (charge) {
+        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
+        i = -1;
+        while (++i < n) {
+          if (!(o = nodes[i]).fixed) {
+            q.visit(repulse(o));
+          }
+        }
+      }
+      i = -1;
+      while (++i < n) {
+        o = nodes[i];
+        if (o.fixed) {
+          o.x = o.px;
+          o.y = o.py;
+        } else {
+          o.x -= (o.px - (o.px = o.x)) * friction;
+          o.y -= (o.py - (o.py = o.y)) * friction;
+        }
+      }
+      event.tick({
+        type: "tick",
+        alpha: alpha
+      });
+    };
+    force.nodes = function(x) {
+      if (!arguments.length) return nodes;
+      nodes = x;
+      return force;
+    };
+    force.links = function(x) {
+      if (!arguments.length) return links;
+      links = x;
+      return force;
+    };
+    force.size = function(x) {
+      if (!arguments.length) return size;
+      size = x;
+      return force;
+    };
+    force.linkDistance = function(x) {
+      if (!arguments.length) return linkDistance;
+      linkDistance = typeof x === "function" ? x : +x;
+      return force;
+    };
+    force.distance = force.linkDistance;
+    force.linkStrength = function(x) {
+      if (!arguments.length) return linkStrength;
+      linkStrength = typeof x === "function" ? x : +x;
+      return force;
+    };
+    force.friction = function(x) {
+      if (!arguments.length) return friction;
+      friction = +x;
+      return force;
+    };
+    force.charge = function(x) {
+      if (!arguments.length) return charge;
+      charge = typeof x === "function" ? x : +x;
+      return force;
+    };
+    force.gravity = function(x) {
+      if (!arguments.length) return gravity;
+      gravity = +x;
+      return force;
+    };
+    force.theta = function(x) {
+      if (!arguments.length) return theta;
+      theta = +x;
+      return force;
+    };
+    force.alpha = function(x) {
+      if (!arguments.length) return alpha;
+      x = +x;
+      if (alpha) {
+        if (x > 0) alpha = x; else alpha = 0;
+      } else if (x > 0) {
+        event.start({
+          type: "start",
+          alpha: alpha = x
+        });
+        d3.timer(force.tick);
+      }
+      return force;
+    };
+    force.start = function() {
+      var i, j, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;
+      for (i = 0; i < n; ++i) {
+        (o = nodes[i]).index = i;
+        o.weight = 0;
+      }
+      for (i = 0; i < m; ++i) {
+        o = links[i];
+        if (typeof o.source == "number") o.source = nodes[o.source];
+        if (typeof o.target == "number") o.target = nodes[o.target];
+        ++o.source.weight;
+        ++o.target.weight;
+      }
+      for (i = 0; i < n; ++i) {
+        o = nodes[i];
+        if (isNaN(o.x)) o.x = position("x", w);
+        if (isNaN(o.y)) o.y = position("y", h);
+        if (isNaN(o.px)) o.px = o.x;
+        if (isNaN(o.py)) o.py = o.y;
+      }
+      distances = [];
+      if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;
+      strengths = [];
+      if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;
+      charges = [];
+      if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;
+      function position(dimension, size) {
+        var neighbors = neighbor(i), j = -1, m = neighbors.length, x;
+        while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x;
+        return Math.random() * size;
+      }
+      function neighbor() {
+        if (!neighbors) {
+          neighbors = [];
+          for (j = 0; j < n; ++j) {
+            neighbors[j] = [];
+          }
+          for (j = 0; j < m; ++j) {
+            var o = links[j];
+            neighbors[o.source.index].push(o.target);
+            neighbors[o.target.index].push(o.source);
+          }
+        }
+        return neighbors[i];
+      }
+      return force.resume();
+    };
+    force.resume = function() {
+      return force.alpha(.1);
+    };
+    force.stop = function() {
+      return force.alpha(0);
+    };
+    force.drag = function() {
+      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend);
+      if (!arguments.length) return drag;
+      this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag);
+    };
+    function dragmove(d) {
+      d.px = d3.event.x, d.py = d3.event.y;
+      force.resume();
+    }
+    return d3.rebind(force, event, "on");
+  };
+  function d3_layout_forceDragstart(d) {
+    d.fixed |= 2;
+  }
+  function d3_layout_forceDragend(d) {
+    d.fixed &= ~6;
+  }
+  function d3_layout_forceMouseover(d) {
+    d.fixed |= 4;
+    d.px = d.x, d.py = d.y;
+  }
+  function d3_layout_forceMouseout(d) {
+    d.fixed &= ~4;
+  }
+  function d3_layout_forceAccumulate(quad, alpha, charges) {
+    var cx = 0, cy = 0;
+    quad.charge = 0;
+    if (!quad.leaf) {
+      var nodes = quad.nodes, n = nodes.length, i = -1, c;
+      while (++i < n) {
+        c = nodes[i];
+        if (c == null) continue;
+        d3_layout_forceAccumulate(c, alpha, charges);
+        quad.charge += c.charge;
+        cx += c.charge * c.cx;
+        cy += c.charge * c.cy;
+      }
+    }
+    if (quad.point) {
+      if (!quad.leaf) {
+        quad.point.x += Math.random() - .5;
+        quad.point.y += Math.random() - .5;
+      }
+      var k = alpha * charges[quad.point.index];
+      quad.charge += quad.pointCharge = k;
+      cx += k * quad.point.x;
+      cy += k * quad.point.y;
+    }
+    quad.cx = cx / quad.charge;
+    quad.cy = cy / quad.charge;
+  }
+  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1;
+  d3.layout.partition = function() {
+    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];
+    function position(node, x, dx, dy) {
+      var children = node.children;
+      node.x = x;
+      node.y = node.depth * dy;
+      node.dx = dx;
+      node.dy = dy;
+      if (children && (n = children.length)) {
+        var i = -1, n, c, d;
+        dx = node.value ? dx / node.value : 0;
+        while (++i < n) {
+          position(c = children[i], x, d = c.value * dx, dy);
+          x += d;
+        }
+      }
+    }
+    function depth(node) {
+      var children = node.children, d = 0;
+      if (children && (n = children.length)) {
+        var i = -1, n;
+        while (++i < n) d = Math.max(d, depth(children[i]));
+      }
+      return 1 + d;
+    }
+    function partition(d, i) {
+      var nodes = hierarchy.call(this, d, i);
+      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
+      return nodes;
+    }
+    partition.size = function(x) {
+      if (!arguments.length) return size;
+      size = x;
+      return partition;
+    };
+    return d3_layout_hierarchyRebind(partition, hierarchy);
+  };
+  d3.layout.pie = function() {
+    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = 2 * π;
+    function pie(data) {
+      var values = data.map(function(d, i) {
+        return +value.call(pie, d, i);
+      });
+      var a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle);
+      var k = ((typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - startAngle) / d3.sum(values);
+      var index = d3.range(data.length);
+      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {
+        return values[j] - values[i];
+      } : function(i, j) {
+        return sort(data[i], data[j]);
+      });
+      var arcs = [];
+      index.forEach(function(i) {
+        var d;
+        arcs[i] = {
+          data: data[i],
+          value: d = values[i],
+          startAngle: a,
+          endAngle: a += d * k
+        };
+      });
+      return arcs;
+    }
+    pie.value = function(x) {
+      if (!arguments.length) return value;
+      value = x;
+      return pie;
+    };
+    pie.sort = function(x) {
+      if (!arguments.length) return sort;
+      sort = x;
+      return pie;
+    };
+    pie.startAngle = function(x) {
+      if (!arguments.length) return startAngle;
+      startAngle = x;
+      return pie;
+    };
+    pie.endAngle = function(x) {
+      if (!arguments.length) return endAngle;
+      endAngle = x;
+      return pie;
+    };
+    return pie;
+  };
+  var d3_layout_pieSortByValue = {};
+  d3.layout.stack = function() {
+    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;
+    function stack(data, index) {
+      var series = data.map(function(d, i) {
+        return values.call(stack, d, i);
+      });
+      var points = series.map(function(d) {
+        return d.map(function(v, i) {
+          return [ x.call(stack, v, i), y.call(stack, v, i) ];
+        });
+      });
+      var orders = order.call(stack, points, index);
+      series = d3.permute(series, orders);
+      points = d3.permute(points, orders);
+      var offsets = offset.call(stack, points, index);
+      var n = series.length, m = series[0].length, i, j, o;
+      for (j = 0; j < m; ++j) {
+        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
+        for (i = 1; i < n; ++i) {
+          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
+        }
+      }
+      return data;
+    }
+    stack.values = function(x) {
+      if (!arguments.length) return values;
+      values = x;
+      return stack;
+    };
+    stack.order = function(x) {
+      if (!arguments.length) return order;
+      order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;
+      return stack;
+    };
+    stack.offset = function(x) {
+      if (!arguments.length) return offset;
+      offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;
+      return stack;
+    };
+    stack.x = function(z) {
+      if (!arguments.length) return x;
+      x = z;
+      return stack;
+    };
+    stack.y = function(z) {
+      if (!arguments.length) return y;
+      y = z;
+      return stack;
+    };
+    stack.out = function(z) {
+      if (!arguments.length) return out;
+      out = z;
+      return stack;
+    };
+    return stack;
+  };
+  function d3_layout_stackX(d) {
+    return d.x;
+  }
+  function d3_layout_stackY(d) {
+    return d.y;
+  }
+  function d3_layout_stackOut(d, y0, y) {
+    d.y0 = y0;
+    d.y = y;
+  }
+  var d3_layout_stackOrders = d3.map({
+    "inside-out": function(data) {
+      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {
+        return max[a] - max[b];
+      }), top = 0, bottom = 0, tops = [], bottoms = [];
+      for (i = 0; i < n; ++i) {
+        j = index[i];
+        if (top < bottom) {
+          top += sums[j];
+          tops.push(j);
+        } else {
+          bottom += sums[j];
+          bottoms.push(j);
+        }
+      }
+      return bottoms.reverse().concat(tops);
+    },
+    reverse: function(data) {
+      return d3.range(data.length).reverse();
+    },
+    "default": d3_layout_stackOrderDefault
+  });
+  var d3_layout_stackOffsets = d3.map({
+    silhouette: function(data) {
+      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];
+      for (j = 0; j < m; ++j) {
+        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+        if (o > max) max = o;
+        sums.push(o);
+      }
+      for (j = 0; j < m; ++j) {
+        y0[j] = (max - sums[j]) / 2;
+      }
+      return y0;
+    },
+    wiggle: function(data) {
+      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];
+      y0[0] = o = o0 = 0;
+      for (j = 1; j < m; ++j) {
+        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
+        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
+          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
+            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
+          }
+          s2 += s3 * data[i][j][1];
+        }
+        y0[j] = o -= s1 ? s2 / s1 * dx : 0;
+        if (o < o0) o0 = o;
+      }
+      for (j = 0; j < m; ++j) y0[j] -= o0;
+      return y0;
+    },
+    expand: function(data) {
+      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];
+      for (j = 0; j < m; ++j) {
+        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;
+      }
+      for (j = 0; j < m; ++j) y0[j] = 0;
+      return y0;
+    },
+    zero: d3_layout_stackOffsetZero
+  });
+  function d3_layout_stackOrderDefault(data) {
+    return d3.range(data.length);
+  }
+  function d3_layout_stackOffsetZero(data) {
+    var j = -1, m = data[0].length, y0 = [];
+    while (++j < m) y0[j] = 0;
+    return y0;
+  }
+  function d3_layout_stackMaxIndex(array) {
+    var i = 1, j = 0, v = array[0][1], k, n = array.length;
+    for (;i < n; ++i) {
+      if ((k = array[i][1]) > v) {
+        j = i;
+        v = k;
+      }
+    }
+    return j;
+  }
+  function d3_layout_stackReduceSum(d) {
+    return d.reduce(d3_layout_stackSum, 0);
+  }
+  function d3_layout_stackSum(p, d) {
+    return p + d[1];
+  }
+  d3.layout.histogram = function() {
+    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;
+    function histogram(data, i) {
+      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;
+      while (++i < m) {
+        bin = bins[i] = [];
+        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
+        bin.y = 0;
+      }
+      if (m > 0) {
+        i = -1;
+        while (++i < n) {
+          x = values[i];
+          if (x >= range[0] && x <= range[1]) {
+            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
+            bin.y += k;
+            bin.push(data[i]);
+          }
+        }
+      }
+      return bins;
+    }
+    histogram.value = function(x) {
+      if (!arguments.length) return valuer;
+      valuer = x;
+      return histogram;
+    };
+    histogram.range = function(x) {
+      if (!arguments.length) return ranger;
+      ranger = d3_functor(x);
+      return histogram;
+    };
+    histogram.bins = function(x) {
+      if (!arguments.length) return binner;
+      binner = typeof x === "number" ? function(range) {
+        return d3_layout_histogramBinFixed(range, x);
+      } : d3_functor(x);
+      return histogram;
+    };
+    histogram.frequency = function(x) {
+      if (!arguments.length) return frequency;
+      frequency = !!x;
+      return histogram;
+    };
+    return histogram;
+  };
+  function d3_layout_histogramBinSturges(range, values) {
+    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
+  }
+  function d3_layout_histogramBinFixed(range, n) {
+    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];
+    while (++x <= n) f[x] = m * x + b;
+    return f;
+  }
+  function d3_layout_histogramRange(values) {
+    return [ d3.min(values), d3.max(values) ];
+  }
+  d3.layout.hierarchy = function() {
+    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;
+    function recurse(node, depth, nodes) {
+      var childs = children.call(hierarchy, node, depth);
+      node.depth = depth;
+      nodes.push(node);
+      if (childs && (n = childs.length)) {
+        var i = -1, n, c = node.children = [], v = 0, j = depth + 1, d;
+        while (++i < n) {
+          d = recurse(childs[i], j, nodes);
+          d.parent = node;
+          c.push(d);
+          v += d.value;
+        }
+        if (sort) c.sort(sort);
+        if (value) node.value = v;
+      } else if (value) {
+        node.value = +value.call(hierarchy, node, depth) || 0;
+      }
+      return node;
+    }
+    function revalue(node, depth) {
+      var children = node.children, v = 0;
+      if (children && (n = children.length)) {
+        var i = -1, n, j = depth + 1;
+        while (++i < n) v += revalue(children[i], j);
+      } else if (value) {
+        v = +value.call(hierarchy, node, depth) || 0;
+      }
+      if (value) node.value = v;
+      return v;
+    }
+    function hierarchy(d) {
+      var nodes = [];
+      recurse(d, 0, nodes);
+      return nodes;
+    }
+    hierarchy.sort = function(x) {
+      if (!arguments.length) return sort;
+      sort = x;
+      return hierarchy;
+    };
+    hierarchy.children = function(x) {
+      if (!arguments.length) return children;
+      children = x;
+      return hierarchy;
+    };
+    hierarchy.value = function(x) {
+      if (!arguments.length) return value;
+      value = x;
+      return hierarchy;
+    };
+    hierarchy.revalue = function(root) {
+      revalue(root, 0);
+      return root;
+    };
+    return hierarchy;
+  };
+  function d3_layout_hierarchyRebind(object, hierarchy) {
+    d3.rebind(object, hierarchy, "sort", "children", "value");
+    object.nodes = object;
+    object.links = d3_layout_hierarchyLinks;
+    return object;
+  }
+  function d3_layout_hierarchyChildren(d) {
+    return d.children;
+  }
+  function d3_layout_hierarchyValue(d) {
+    return d.value;
+  }
+  function d3_layout_hierarchySort(a, b) {
+    return b.value - a.value;
+  }
+  function d3_layout_hierarchyLinks(nodes) {
+    return d3.merge(nodes.map(function(parent) {
+      return (parent.children || []).map(function(child) {
+        return {
+          source: parent,
+          target: child
+        };
+      });
+    }));
+  }
+  d3.layout.pack = function() {
+    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ];
+    function pack(d, i) {
+      var nodes = hierarchy.call(this, d, i), root = nodes[0];
+      root.x = 0;
+      root.y = 0;
+      d3_layout_treeVisitAfter(root, function(d) {
+        d.r = Math.sqrt(d.value);
+      });
+      d3_layout_treeVisitAfter(root, d3_layout_packSiblings);
+      var w = size[0], h = size[1], k = Math.max(2 * root.r / w, 2 * root.r / h);
+      if (padding > 0) {
+        var dr = padding * k / 2;
+        d3_layout_treeVisitAfter(root, function(d) {
+          d.r += dr;
+        });
+        d3_layout_treeVisitAfter(root, d3_layout_packSiblings);
+        d3_layout_treeVisitAfter(root, function(d) {
+          d.r -= dr;
+        });
+        k = Math.max(2 * root.r / w, 2 * root.r / h);
+      }
+      d3_layout_packTransform(root, w / 2, h / 2, 1 / k);
+      return nodes;
+    }
+    pack.size = function(x) {
+      if (!arguments.length) return size;
+      size = x;
+      return pack;
+    };
+    pack.padding = function(_) {
+      if (!arguments.length) return padding;
+      padding = +_;
+      return pack;
+    };
+    return d3_layout_hierarchyRebind(pack, hierarchy);
+  };
+  function d3_layout_packSort(a, b) {
+    return a.value - b.value;
+  }
+  function d3_layout_packInsert(a, b) {
+    var c = a._pack_next;
+    a._pack_next = b;
+    b._pack_prev = a;
+    b._pack_next = c;
+    c._pack_prev = b;
+  }
+  function d3_layout_packSplice(a, b) {
+    a._pack_next = b;
+    b._pack_prev = a;
+  }
+  function d3_layout_packIntersects(a, b) {
+    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;
+    return dr * dr - dx * dx - dy * dy > .001;
+  }
+  function d3_layout_packSiblings(node) {
+    if (!(nodes = node.children) || !(n = nodes.length)) return;
+    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;
+    function bound(node) {
+      xMin = Math.min(node.x - node.r, xMin);
+      xMax = Math.max(node.x + node.r, xMax);
+      yMin = Math.min(node.y - node.r, yMin);
+      yMax = Math.max(node.y + node.r, yMax);
+    }
+    nodes.forEach(d3_layout_packLink);
+    a = nodes[0];
+    a.x = -a.r;
+    a.y = 0;
+    bound(a);
+    if (n > 1) {
+      b = nodes[1];
+      b.x = b.r;
+      b.y = 0;
+      bound(b);
+      if (n > 2) {
+        c = nodes[2];
+        d3_layout_packPlace(a, b, c);
+        bound(c);
+        d3_layout_packInsert(a, c);
+        a._pack_prev = c;
+        d3_layout_packInsert(c, b);
+        b = a._pack_next;
+        for (i = 3; i < n; i++) {
+          d3_layout_packPlace(a, b, c = nodes[i]);
+          var isect = 0, s1 = 1, s2 = 1;
+          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
+            if (d3_layout_packIntersects(j, c)) {
+              isect = 1;
+              break;
+            }
+          }
+          if (isect == 1) {
+            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
+              if (d3_layout_packIntersects(k, c)) {
+                break;
+              }
+            }
+          }
+          if (isect) {
+            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);
+            i--;
+          } else {
+            d3_layout_packInsert(a, c);
+            b = c;
+            bound(c);
+          }
+        }
+      }
+    }
+    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;
+    for (i = 0; i < n; i++) {
+      c = nodes[i];
+      c.x -= cx;
+      c.y -= cy;
+      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));
+    }
+    node.r = cr;
+    nodes.forEach(d3_layout_packUnlink);
+  }
+  function d3_layout_packLink(node) {
+    node._pack_next = node._pack_prev = node;
+  }
+  function d3_layout_packUnlink(node) {
+    delete node._pack_next;
+    delete node._pack_prev;
+  }
+  function d3_layout_packTransform(node, x, y, k) {
+    var children = node.children;
+    node.x = x += k * node.x;
+    node.y = y += k * node.y;
+    node.r *= k;
+    if (children) {
+      var i = -1, n = children.length;
+      while (++i < n) d3_layout_packTransform(children[i], x, y, k);
+    }
+  }
+  function d3_layout_packPlace(a, b, c) {
+    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;
+    if (db && (dx || dy)) {
+      var da = b.r + c.r, dc = dx * dx + dy * dy;
+      da *= da;
+      db *= db;
+      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
+      c.x = a.x + x * dx + y * dy;
+      c.y = a.y + x * dy - y * dx;
+    } else {
+      c.x = a.x + db;
+      c.y = a.y;
+    }
+  }
+  d3.layout.cluster = function() {
+    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ];
+    function cluster(d, i) {
+      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;
+      d3_layout_treeVisitAfter(root, function(node) {
+        var children = node.children;
+        if (children && children.length) {
+          node.x = d3_layout_clusterX(children);
+          node.y = d3_layout_clusterY(children);
+        } else {
+          node.x = previousNode ? x += separation(node, previousNode) : 0;
+          node.y = 0;
+          previousNode = node;
+        }
+      });
+      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;
+      d3_layout_treeVisitAfter(root, function(node) {
+        node.x = (node.x - x0) / (x1 - x0) * size[0];
+        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];
+      });
+      return nodes;
+    }
+    cluster.separation = function(x) {
+      if (!arguments.length) return separation;
+      separation = x;
+      return cluster;
+    };
+    cluster.size = function(x) {
+      if (!arguments.length) return size;
+      size = x;
+      return cluster;
+    };
+    return d3_layout_hierarchyRebind(cluster, hierarchy);
+  };
+  function d3_layout_clusterY(children) {
+    return 1 + d3.max(children, function(child) {
+      return child.y;
+    });
+  }
+  function d3_layout_clusterX(children) {
+    return children.reduce(function(x, child) {
+      return x + child.x;
+    }, 0) / children.length;
+  }
+  function d3_layout_clusterLeft(node) {
+    var children = node.children;
+    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
+  }
+  function d3_layout_clusterRight(node) {
+    var children = node.children, n;
+    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
+  }
+  d3.layout.tree = function() {
+    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ];
+    function tree(d, i) {
+      var nodes = hierarchy.call(this, d, i), root = nodes[0];
+      function firstWalk(node, previousSibling) {
+        var children = node.children, layout = node._tree;
+        if (children && (n = children.length)) {
+          var n, firstChild = children[0], previousChild, ancestor = firstChild, child, i = -1;
+          while (++i < n) {
+            child = children[i];
+            firstWalk(child, previousChild);
+            ancestor = apportion(child, previousChild, ancestor);
+            previousChild = child;
+          }
+          d3_layout_treeShift(node);
+          var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim);
+          if (previousSibling) {
+            layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
+            layout.mod = layout.prelim - midpoint;
+          } else {
+            layout.prelim = midpoint;
+          }
+        } else {
+          if (previousSibling) {
+            layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
+          }
+        }
+      }
+      function secondWalk(node, x) {
+        node.x = node._tree.prelim + x;
+        var children = node.children;
+        if (children && (n = children.length)) {
+          var i = -1, n;
+          x += node._tree.mod;
+          while (++i < n) {
+            secondWalk(children[i], x);
+          }
+        }
+      }
+      function apportion(node, previousSibling, ancestor) {
+        if (previousSibling) {
+          var vip = node, vop = node, vim = previousSibling, vom = node.parent.children[0], sip = vip._tree.mod, sop = vop._tree.mod, sim = vim._tree.mod, som = vom._tree.mod, shift;
+          while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
+            vom = d3_layout_treeLeft(vom);
+            vop = d3_layout_treeRight(vop);
+            vop._tree.ancestor = node;
+            shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip);
+            if (shift > 0) {
+              d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift);
+              sip += shift;
+              sop += shift;
+            }
+            sim += vim._tree.mod;
+            sip += vip._tree.mod;
+            som += vom._tree.mod;
+            sop += vop._tree.mod;
+          }
+          if (vim && !d3_layout_treeRight(vop)) {
+            vop._tree.thread = vim;
+            vop._tree.mod += sim - sop;
+          }
+          if (vip && !d3_layout_treeLeft(vom)) {
+            vom._tree.thread = vip;
+            vom._tree.mod += sip - som;
+            ancestor = node;
+          }
+        }
+        return ancestor;
+      }
+      d3_layout_treeVisitAfter(root, function(node, previousSibling) {
+        node._tree = {
+          ancestor: node,
+          prelim: 0,
+          mod: 0,
+          change: 0,
+          shift: 0,
+          number: previousSibling ? previousSibling._tree.number + 1 : 0
+        };
+      });
+      firstWalk(root);
+      secondWalk(root, -root._tree.prelim);
+      var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), right = d3_layout_treeSearch(root, d3_layout_treeRightmost), deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2, y1 = deep.depth || 1;
+      d3_layout_treeVisitAfter(root, function(node) {
+        node.x = (node.x - x0) / (x1 - x0) * size[0];
+        node.y = node.depth / y1 * size[1];
+        delete node._tree;
+      });
+      return nodes;
+    }
+    tree.separation = function(x) {
+      if (!arguments.length) return separation;
+      separation = x;
+      return tree;
+    };
+    tree.size = function(x) {
+      if (!arguments.length) return size;
+      size = x;
+      return tree;
+    };
+    return d3_layout_hierarchyRebind(tree, hierarchy);
+  };
+  function d3_layout_treeSeparation(a, b) {
+    return a.parent == b.parent ? 1 : 2;
+  }
+  function d3_layout_treeLeft(node) {
+    var children = node.children;
+    return children && children.length ? children[0] : node._tree.thread;
+  }
+  function d3_layout_treeRight(node) {
+    var children = node.children, n;
+    return children && (n = children.length) ? children[n - 1] : node._tree.thread;
+  }
+  function d3_layout_treeSearch(node, compare) {
+    var children = node.children;
+    if (children && (n = children.length)) {
+      var child, n, i = -1;
+      while (++i < n) {
+        if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) {
+          node = child;
+        }
+      }
+    }
+    return node;
+  }
+  function d3_layout_treeRightmost(a, b) {
+    return a.x - b.x;
+  }
+  function d3_layout_treeLeftmost(a, b) {
+    return b.x - a.x;
+  }
+  function d3_layout_treeDeepest(a, b) {
+    return a.depth - b.depth;
+  }
+  function d3_layout_treeVisitAfter(node, callback) {
+    function visit(node, previousSibling) {
+      var children = node.children;
+      if (children && (n = children.length)) {
+        var child, previousChild = null, i = -1, n;
+        while (++i < n) {
+          child = children[i];
+          visit(child, previousChild);
+          previousChild = child;
+        }
+      }
+      callback(node, previousSibling);
+    }
+    visit(node, null);
+  }
+  function d3_layout_treeShift(node) {
+    var shift = 0, change = 0, children = node.children, i = children.length, child;
+    while (--i >= 0) {
+      child = children[i]._tree;
+      child.prelim += shift;
+      child.mod += shift;
+      shift += child.shift + (change += child.change);
+    }
+  }
+  function d3_layout_treeMove(ancestor, node, shift) {
+    ancestor = ancestor._tree;
+    node = node._tree;
+    var change = shift / (node.number - ancestor.number);
+    ancestor.change += change;
+    node.change -= change;
+    node.shift += shift;
+    node.prelim += shift;
+    node.mod += shift;
+  }
+  function d3_layout_treeAncestor(vim, node, ancestor) {
+    return vim._tree.ancestor.parent == node.parent ? vim._tree.ancestor : ancestor;
+  }
+  d3.layout.treemap = function() {
+    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5));
+    function scale(children, k) {
+      var i = -1, n = children.length, child, area;
+      while (++i < n) {
+        area = (child = children[i]).value * (k < 0 ? 0 : k);
+        child.area = isNaN(area) || area <= 0 ? 0 : area;
+      }
+    }
+    function squarify(node) {
+      var children = node.children;
+      if (children && children.length) {
+        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;
+        scale(remaining, rect.dx * rect.dy / node.value);
+        row.area = 0;
+        while ((n = remaining.length) > 0) {
+          row.push(child = remaining[n - 1]);
+          row.area += child.area;
+          if (mode !== "squarify" || (score = worst(row, u)) <= best) {
+            remaining.pop();
+            best = score;
+          } else {
+            row.area -= row.pop().area;
+            position(row, u, rect, false);
+            u = Math.min(rect.dx, rect.dy);
+            row.length = row.area = 0;
+            best = Infinity;
+          }
+        }
+        if (row.length) {
+          position(row, u, rect, true);
+          row.length = row.area = 0;
+        }
+        children.forEach(squarify);
+      }
+    }
+    function stickify(node) {
+      var children = node.children;
+      if (children && children.length) {
+        var rect = pad(node), remaining = children.slice(), child, row = [];
+        scale(remaining, rect.dx * rect.dy / node.value);
+        row.area = 0;
+        while (child = remaining.pop()) {
+          row.push(child);
+          row.area += child.area;
+          if (child.z != null) {
+            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);
+            row.length = row.area = 0;
+          }
+        }
+        children.forEach(stickify);
+      }
+    }
+    function worst(row, u) {
+      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;
+      while (++i < n) {
+        if (!(r = row[i].area)) continue;
+        if (r < rmin) rmin = r;
+        if (r > rmax) rmax = r;
+      }
+      s *= s;
+      u *= u;
+      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;
+    }
+    function position(row, u, rect, flush) {
+      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;
+      if (u == rect.dx) {
+        if (flush || v > rect.dy) v = rect.dy;
+        while (++i < n) {
+          o = row[i];
+          o.x = x;
+          o.y = y;
+          o.dy = v;
+          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);
+        }
+        o.z = true;
+        o.dx += rect.x + rect.dx - x;
+        rect.y += v;
+        rect.dy -= v;
+      } else {
+        if (flush || v > rect.dx) v = rect.dx;
+        while (++i < n) {
+          o = row[i];
+          o.x = x;
+          o.y = y;
+          o.dx = v;
+          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);
+        }
+        o.z = false;
+        o.dy += rect.y + rect.dy - y;
+        rect.x += v;
+        rect.dx -= v;
+      }
+    }
+    function treemap(d) {
+      var nodes = stickies || hierarchy(d), root = nodes[0];
+      root.x = 0;
+      root.y = 0;
+      root.dx = size[0];
+      root.dy = size[1];
+      if (stickies) hierarchy.revalue(root);
+      scale([ root ], root.dx * root.dy / root.value);
+      (stickies ? stickify : squarify)(root);
+      if (sticky) stickies = nodes;
+      return nodes;
+    }
+    treemap.size = function(x) {
+      if (!arguments.length) return size;
+      size = x;
+      return treemap;
+    };
+    treemap.padding = function(x) {
+      if (!arguments.length) return padding;
+      function padFunction(node) {
+        var p = x.call(treemap, node, node.depth);
+        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p);
+      }
+      function padConstant(node) {
+        return d3_layout_treemapPad(node, x);
+      }
+      var type;
+      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ], 
+      padConstant) : padConstant;
+      return treemap;
+    };
+    treemap.round = function(x) {
+      if (!arguments.length) return round != Number;
+      round = x ? Math.round : Number;
+      return treemap;
+    };
+    treemap.sticky = function(x) {
+      if (!arguments.length) return sticky;
+      sticky = x;
+      stickies = null;
+      return treemap;
+    };
+    treemap.ratio = function(x) {
+      if (!arguments.length) return ratio;
+      ratio = x;
+      return treemap;
+    };
+    treemap.mode = function(x) {
+      if (!arguments.length) return mode;
+      mode = x + "";
+      return treemap;
+    };
+    return d3_layout_hierarchyRebind(treemap, hierarchy);
+  };
+  function d3_layout_treemapPadNull(node) {
+    return {
+      x: node.x,
+      y: node.y,
+      dx: node.dx,
+      dy: node.dy
+    };
+  }
+  function d3_layout_treemapPad(node, padding) {
+    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];
+    if (dx < 0) {
+      x += dx / 2;
+      dx = 0;
+    }
+    if (dy < 0) {
+      y += dy / 2;
+      dy = 0;
+    }
+    return {
+      x: x,
+      y: y,
+      dx: dx,
+      dy: dy
+    };
+  }
+  function d3_dsv(delimiter, mimeType) {
+    var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0);
+    function dsv(url, callback) {
+      return d3.xhr(url, mimeType, callback).response(response);
+    }
+    function response(request) {
+      return dsv.parse(request.responseText);
+    }
+    dsv.parse = function(text) {
+      var o;
+      return dsv.parseRows(text, function(row) {
+        if (o) return o(row);
+        o = new Function("d", "return {" + row.map(function(name, i) {
+          return JSON.stringify(name) + ": d[" + i + "]";
+        }).join(",") + "}");
+      });
+    };
+    dsv.parseRows = function(text, f) {
+      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;
+      function token() {
+        if (I >= N) return EOF;
+        if (eol) return eol = false, EOL;
+        var j = I;
+        if (text.charCodeAt(j) === 34) {
+          var i = j;
+          while (i++ < N) {
+            if (text.charCodeAt(i) === 34) {
+              if (text.charCodeAt(i + 1) !== 34) break;
+              ++i;
+            }
+          }
+          I = i + 2;
+          var c = text.charCodeAt(i + 1);
+          if (c === 13) {
+            eol = true;
+            if (text.charCodeAt(i + 2) === 10) ++I;
+          } else if (c === 10) {
+            eol = true;
+          }
+          return text.substring(j + 1, i).replace(/""/g, '"');
+        }
+        while (I < N) {
+          var c = text.charCodeAt(I++), k = 1;
+          if (c === 10) eol = true; else if (c === 13) {
+            eol = true;
+            if (text.charCodeAt(I) === 10) ++I, ++k;
+          } else if (c !== delimiterCode) continue;
+          return text.substring(j, I - k);
+        }
+        return text.substring(j);
+      }
+      while ((t = token()) !== EOF) {
+        var a = [];
+        while (t !== EOL && t !== EOF) {
+          a.push(t);
+          t = token();
+        }
+        if (f && !(a = f(a, n++))) continue;
+        rows.push(a);
+      }
+      return rows;
+    };
+    dsv.format = function(rows) {
+      return rows.map(formatRow).join("\n");
+    };
+    function formatRow(row) {
+      return row.map(formatValue).join(delimiter);
+    }
+    function formatValue(text) {
+      return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text;
+    }
+    return dsv;
+  }
+  d3.csv = d3_dsv(",", "text/csv");
+  d3.tsv = d3_dsv("	", "text/tab-separated-values");
+  d3.geo = {};
+  d3.geo.stream = function(object, listener) {
+    if (d3_geo_streamObjectType.hasOwnProperty(object.type)) {
+      d3_geo_streamObjectType[object.type](object, listener);
+    } else {
+      d3_geo_streamGeometry(object, listener);
+    }
+  };
+  function d3_geo_streamGeometry(geometry, listener) {
+    if (d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {
+      d3_geo_streamGeometryType[geometry.type](geometry, listener);
+    }
+  }
+  var d3_geo_streamObjectType = {
+    Feature: function(feature, listener) {
+      d3_geo_streamGeometry(feature.geometry, listener);
+    },
+    FeatureCollection: function(object, listener) {
+      var features = object.features, i = -1, n = features.length;
+      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);
+    }
+  };
+  var d3_geo_streamGeometryType = {
+    Sphere: function(object, listener) {
+      listener.sphere();
+    },
+    Point: function(object, listener) {
+      var coordinate = object.coordinates;
+      listener.point(coordinate[0], coordinate[1]);
+    },
+    MultiPoint: function(object, listener) {
+      var coordinates = object.coordinates, i = -1, n = coordinates.length, coordinate;
+      while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1]);
+    },
+    LineString: function(object, listener) {
+      d3_geo_streamLine(object.coordinates, listener, 0);
+    },
+    MultiLineString: function(object, listener) {
+      var coordinates = object.coordinates, i = -1, n = coordinates.length;
+      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);
+    },
+    Polygon: function(object, listener) {
+      d3_geo_streamPolygon(object.coordinates, listener);
+    },
+    MultiPolygon: function(object, listener) {
+      var coordinates = object.coordinates, i = -1, n = coordinates.length;
+      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);
+    },
+    GeometryCollection: function(object, listener) {
+      var geometries = object.geometries, i = -1, n = geometries.length;
+      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);
+    }
+  };
+  function d3_geo_streamLine(coordinates, listener, closed) {
+    var i = -1, n = coordinates.length - closed, coordinate;
+    listener.lineStart();
+    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1]);
+    listener.lineEnd();
+  }
+  function d3_geo_streamPolygon(coordinates, listener) {
+    var i = -1, n = coordinates.length;
+    listener.polygonStart();
+    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);
+    listener.polygonEnd();
+  }
+  function d3_geo_spherical(cartesian) {
+    return [ Math.atan2(cartesian[1], cartesian[0]), Math.asin(Math.max(-1, Math.min(1, cartesian[2]))) ];
+  }
+  function d3_geo_sphericalEqual(a, b) {
+    return Math.abs(a[0] - b[0]) < ε && Math.abs(a[1] - b[1]) < ε;
+  }
+  function d3_geo_cartesian(spherical) {
+    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);
+    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];
+  }
+  function d3_geo_cartesianDot(a, b) {
+    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+  }
+  function d3_geo_cartesianCross(a, b) {
+    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];
+  }
+  function d3_geo_cartesianAdd(a, b) {
+    a[0] += b[0];
+    a[1] += b[1];
+    a[2] += b[2];
+  }
+  function d3_geo_cartesianScale(vector, k) {
+    return [ vector[0] * k, vector[1] * k, vector[2] * k ];
+  }
+  function d3_geo_cartesianNormalize(d) {
+    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
+    d[0] /= l;
+    d[1] /= l;
+    d[2] /= l;
+  }
+  function d3_geo_resample(project) {
+    var δ2 = .5, maxDepth = 16;
+    function resample(stream) {
+      var λ0, x0, y0, a0, b0, c0;
+      var resample = {
+        point: point,
+        lineStart: lineStart,
+        lineEnd: lineEnd,
+        polygonStart: function() {
+          stream.polygonStart();
+          resample.lineStart = polygonLineStart;
+        },
+        polygonEnd: function() {
+          stream.polygonEnd();
+          resample.lineStart = lineStart;
+        }
+      };
+      function point(x, y) {
+        x = project(x, y);
+        stream.point(x[0], x[1]);
+      }
+      function lineStart() {
+        x0 = NaN;
+        resample.point = linePoint;
+        stream.lineStart();
+      }
+      function linePoint(λ, φ) {
+        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);
+        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
+        stream.point(x0, y0);
+      }
+      function lineEnd() {
+        resample.point = point;
+        stream.lineEnd();
+      }
+      function polygonLineStart() {
+        var λ00, φ00, x00, y00, a00, b00, c00;
+        lineStart();
+        resample.point = function(λ, φ) {
+          linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
+          resample.point = linePoint;
+        };
+        resample.lineEnd = function() {
+          resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);
+          resample.lineEnd = lineEnd;
+          lineEnd();
+        };
+      }
+      return resample;
+    }
+    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {
+      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;
+      if (d2 > 4 * δ2 && depth--) {
+        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = Math.abs(Math.abs(c) - 1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;
+        if (dz * dz / d2 > δ2 || Math.abs((dx * dx2 + dy * dy2) / d2 - .5) > .3) {
+          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);
+          stream.point(x2, y2);
+          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);
+        }
+      }
+    }
+    resample.precision = function(_) {
+      if (!arguments.length) return Math.sqrt(δ2);
+      maxDepth = (δ2 = _ * _) > 0 && 16;
+      return resample;
+    };
+    return resample;
+  }
+  d3.geo.albersUsa = function() {
+    var lower48 = d3.geo.albers();
+    var alaska = d3.geo.albers().rotate([ 160, 0 ]).center([ 0, 60 ]).parallels([ 55, 65 ]);
+    var hawaii = d3.geo.albers().rotate([ 160, 0 ]).center([ 0, 20 ]).parallels([ 8, 18 ]);
+    var puertoRico = d3.geo.albers().rotate([ 60, 0 ]).center([ 0, 10 ]).parallels([ 8, 18 ]);
+    function albersUsa(coordinates) {
+      return projection(coordinates)(coordinates);
+    }
+    function projection(point) {
+      var lon = point[0], lat = point[1];
+      return lat > 50 ? alaska : lon < -140 ? hawaii : lat < 21 ? puertoRico : lower48;
+    }
+    albersUsa.scale = function(x) {
+      if (!arguments.length) return lower48.scale();
+      lower48.scale(x);
+      alaska.scale(x * .6);
+      hawaii.scale(x);
+      puertoRico.scale(x * 1.5);
+      return albersUsa.translate(lower48.translate());
+    };
+    albersUsa.translate = function(x) {
+      if (!arguments.length) return lower48.translate();
+      var dz = lower48.scale(), dx = x[0], dy = x[1];
+      lower48.translate(x);
+      alaska.translate([ dx - .4 * dz, dy + .17 * dz ]);
+      hawaii.translate([ dx - .19 * dz, dy + .2 * dz ]);
+      puertoRico.translate([ dx + .58 * dz, dy + .43 * dz ]);
+      return albersUsa;
+    };
+    return albersUsa.scale(lower48.scale());
+  };
+  function d3_geo_albers(φ0, φ1) {
+    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;
+    function albers(λ, φ) {
+      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;
+      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];
+    }
+    albers.invert = function(x, y) {
+      var ρ0_y = ρ0 - y;
+      return [ Math.atan2(x, ρ0_y) / n, Math.asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];
+    };
+    return albers;
+  }
+  (d3.geo.albers = function() {
+    var φ0 = 29.5 * d3_radians, φ1 = 45.5 * d3_radians, m = d3_geo_projectionMutator(d3_geo_albers), p = m(φ0, φ1);
+    p.parallels = function(_) {
+      if (!arguments.length) return [ φ0 * d3_degrees, φ1 * d3_degrees ];
+      return m(φ0 = _[0] * d3_radians, φ1 = _[1] * d3_radians);
+    };
+    return p.rotate([ 98, 0 ]).center([ 0, 38 ]).scale(1e3);
+  }).raw = d3_geo_albers;
+  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {
+    return Math.sqrt(2 / (1 + cosλcosφ));
+  }, function(ρ) {
+    return 2 * Math.asin(ρ / 2);
+  });
+  (d3.geo.azimuthalEqualArea = function() {
+    return d3_geo_projection(d3_geo_azimuthalEqualArea);
+  }).raw = d3_geo_azimuthalEqualArea;
+  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {
+    var c = Math.acos(cosλcosφ);
+    return c && c / Math.sin(c);
+  }, d3_identity);
+  (d3.geo.azimuthalEquidistant = function() {
+    return d3_geo_projection(d3_geo_azimuthalEquidistant);
+  }).raw = d3_geo_azimuthalEquidistant;
+  d3.geo.bounds = d3_geo_bounds(d3_identity);
+  function d3_geo_bounds(projectStream) {
+    var x0, y0, x1, y1;
+    var bound = {
+      point: boundPoint,
+      lineStart: d3_noop,
+      lineEnd: d3_noop,
+      polygonStart: function() {
+        bound.lineEnd = boundPolygonLineEnd;
+      },
+      polygonEnd: function() {
+        bound.point = boundPoint;
+      }
+    };
+    function boundPoint(x, y) {
+      if (x < x0) x0 = x;
+      if (x > x1) x1 = x;
+      if (y < y0) y0 = y;
+      if (y > y1) y1 = y;
+    }
+    function boundPolygonLineEnd() {
+      bound.point = bound.lineEnd = d3_noop;
+    }
+    return function(feature) {
+      y1 = x1 = -(x0 = y0 = Infinity);
+      d3.geo.stream(feature, projectStream(bound));
+      return [ [ x0, y0 ], [ x1, y1 ] ];
+    };
+  }
+  d3.geo.centroid = function(object) {
+    d3_geo_centroidDimension = d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+    d3.geo.stream(object, d3_geo_centroid);
+    var m;
+    if (d3_geo_centroidW && Math.abs(m = Math.sqrt(d3_geo_centroidX * d3_geo_centroidX + d3_geo_centroidY * d3_geo_centroidY + d3_geo_centroidZ * d3_geo_centroidZ)) > ε) {
+      return [ Math.atan2(d3_geo_centroidY, d3_geo_centroidX) * d3_degrees, Math.asin(Math.max(-1, Math.min(1, d3_geo_centroidZ / m))) * d3_degrees ];
+    }
+  };
+  var d3_geo_centroidDimension, d3_geo_centroidW, d3_geo_centroidX, d3_geo_centroidY, d3_geo_centroidZ;
+  var d3_geo_centroid = {
+    sphere: function() {
+      if (d3_geo_centroidDimension < 2) {
+        d3_geo_centroidDimension = 2;
+        d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+      }
+    },
+    point: d3_geo_centroidPoint,
+    lineStart: d3_geo_centroidLineStart,
+    lineEnd: d3_geo_centroidLineEnd,
+    polygonStart: function() {
+      if (d3_geo_centroidDimension < 2) {
+        d3_geo_centroidDimension = 2;
+        d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+      }
+      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;
+    },
+    polygonEnd: function() {
+      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;
+    }
+  };
+  function d3_geo_centroidPoint(λ, φ) {
+    if (d3_geo_centroidDimension) return;
+    ++d3_geo_centroidW;
+    λ *= d3_radians;
+    var cosφ = Math.cos(φ *= d3_radians);
+    d3_geo_centroidX += (cosφ * Math.cos(λ) - d3_geo_centroidX) / d3_geo_centroidW;
+    d3_geo_centroidY += (cosφ * Math.sin(λ) - d3_geo_centroidY) / d3_geo_centroidW;
+    d3_geo_centroidZ += (Math.sin(φ) - d3_geo_centroidZ) / d3_geo_centroidW;
+  }
+  function d3_geo_centroidRingStart() {
+    var λ00, φ00;
+    d3_geo_centroidDimension = 1;
+    d3_geo_centroidLineStart();
+    d3_geo_centroidDimension = 2;
+    var linePoint = d3_geo_centroid.point;
+    d3_geo_centroid.point = function(λ, φ) {
+      linePoint(λ00 = λ, φ00 = φ);
+    };
+    d3_geo_centroid.lineEnd = function() {
+      d3_geo_centroid.point(λ00, φ00);
+      d3_geo_centroidLineEnd();
+      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;
+    };
+  }
+  function d3_geo_centroidLineStart() {
+    var x0, y0, z0;
+    if (d3_geo_centroidDimension > 1) return;
+    if (d3_geo_centroidDimension < 1) {
+      d3_geo_centroidDimension = 1;
+      d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+    }
+    d3_geo_centroid.point = function(λ, φ) {
+      λ *= d3_radians;
+      var cosφ = Math.cos(φ *= d3_radians);
+      x0 = cosφ * Math.cos(λ);
+      y0 = cosφ * Math.sin(λ);
+      z0 = Math.sin(φ);
+      d3_geo_centroid.point = nextPoint;
+    };
+    function nextPoint(λ, φ) {
+      λ *= d3_radians;
+      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
+      d3_geo_centroidW += w;
+      d3_geo_centroidX += w * (x0 + (x0 = x));
+      d3_geo_centroidY += w * (y0 + (y0 = y));
+      d3_geo_centroidZ += w * (z0 + (z0 = z));
+    }
+  }
+  function d3_geo_centroidLineEnd() {
+    d3_geo_centroid.point = d3_geo_centroidPoint;
+  }
+  d3.geo.circle = function() {
+    var origin = [ 0, 0 ], angle, precision = 6, interpolate;
+    function circle() {
+      var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];
+      interpolate(null, null, 1, {
+        point: function(x, y) {
+          ring.push(x = rotate(x, y));
+          x[0] *= d3_degrees, x[1] *= d3_degrees;
+        }
+      });
+      return {
+        type: "Polygon",
+        coordinates: [ ring ]
+      };
+    }
+    circle.origin = function(x) {
+      if (!arguments.length) return origin;
+      origin = x;
+      return circle;
+    };
+    circle.angle = function(x) {
+      if (!arguments.length) return angle;
+      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);
+      return circle;
+    };
+    circle.precision = function(_) {
+      if (!arguments.length) return precision;
+      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);
+      return circle;
+    };
+    return circle.angle(90);
+  };
+  function d3_geo_circleInterpolate(radians, precision) {
+    var cr = Math.cos(radians), sr = Math.sin(radians);
+    return function(from, to, direction, listener) {
+      if (from != null) {
+        from = d3_geo_circleAngle(cr, from);
+        to = d3_geo_circleAngle(cr, to);
+        if (direction > 0 ? from < to : from > to) from += direction * 2 * π;
+      } else {
+        from = radians + direction * 2 * π;
+        to = radians;
+      }
+      var point;
+      for (var step = direction * precision, t = from; direction > 0 ? t > to : t < to; t -= step) {
+        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);
+      }
+    };
+  }
+  function d3_geo_circleAngle(cr, point) {
+    var a = d3_geo_cartesian(point);
+    a[0] -= cr;
+    d3_geo_cartesianNormalize(a);
+    var angle = Math.acos(Math.max(-1, Math.min(1, -a[1])));
+    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);
+  }
+  function d3_geo_clip(pointVisible, clipLine, interpolate) {
+    return function(listener) {
+      var line = clipLine(listener);
+      var clip = {
+        point: point,
+        lineStart: lineStart,
+        lineEnd: lineEnd,
+        polygonStart: function() {
+          clip.point = pointRing;
+          clip.lineStart = ringStart;
+          clip.lineEnd = ringEnd;
+          invisible = false;
+          invisibleArea = visibleArea = 0;
+          segments = [];
+          listener.polygonStart();
+        },
+        polygonEnd: function() {
+          clip.point = point;
+          clip.lineStart = lineStart;
+          clip.lineEnd = lineEnd;
+          segments = d3.merge(segments);
+          if (segments.length) {
+            d3_geo_clipPolygon(segments, interpolate, listener);
+          } else if (visibleArea < -ε || invisible && invisibleArea < -ε) {
+            listener.lineStart();
+            interpolate(null, null, 1, listener);
+            listener.lineEnd();
+          }
+          listener.polygonEnd();
+          segments = null;
+        },
+        sphere: function() {
+          listener.polygonStart();
+          listener.lineStart();
+          interpolate(null, null, 1, listener);
+          listener.lineEnd();
+          listener.polygonEnd();
+        }
+      };
+      function point(λ, φ) {
+        if (pointVisible(λ, φ)) listener.point(λ, φ);
+      }
+      function pointLine(λ, φ) {
+        line.point(λ, φ);
+      }
+      function lineStart() {
+        clip.point = pointLine;
+        line.lineStart();
+      }
+      function lineEnd() {
+        clip.point = point;
+        line.lineEnd();
+      }
+      var segments, visibleArea, invisibleArea, invisible;
+      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), ring;
+      function pointRing(λ, φ) {
+        ringListener.point(λ, φ);
+        ring.push([ λ, φ ]);
+      }
+      function ringStart() {
+        ringListener.lineStart();
+        ring = [];
+      }
+      function ringEnd() {
+        pointRing(ring[0][0], ring[0][1]);
+        ringListener.lineEnd();
+        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;
+        if (!n) {
+          invisible = true;
+          invisibleArea += d3_geo_clipAreaRing(ring, -1);
+          ring = null;
+          return;
+        }
+        ring = null;
+        if (clean & 1) {
+          segment = ringSegments[0];
+          visibleArea += d3_geo_clipAreaRing(segment, 1);
+          var n = segment.length - 1, i = -1, point;
+          listener.lineStart();
+          while (++i < n) listener.point((point = segment[i])[0], point[1]);
+          listener.lineEnd();
+          return;
+        }
+        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
+        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));
+      }
+      return clip;
+    };
+  }
+  function d3_geo_clipPolygon(segments, interpolate, listener) {
+    var subject = [], clip = [];
+    segments.forEach(function(segment) {
+      if ((n = segment.length) <= 1) return;
+      var n, p0 = segment[0], p1 = segment[n - 1];
+      if (d3_geo_sphericalEqual(p0, p1)) {
+        listener.lineStart();
+        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);
+        listener.lineEnd();
+        return;
+      }
+      var a = {
+        point: p0,
+        points: segment,
+        other: null,
+        visited: false,
+        entry: true,
+        subject: true
+      }, b = {
+        point: p0,
+        points: [ p0 ],
+        other: a,
+        visited: false,
+        entry: false,
+        subject: false
+      };
+      a.other = b;
+      subject.push(a);
+      clip.push(b);
+      a = {
+        point: p1,
+        points: [ p1 ],
+        other: null,
+        visited: false,
+        entry: false,
+        subject: true
+      };
+      b = {
+        point: p1,
+        points: [ p1 ],
+        other: a,
+        visited: false,
+        entry: true,
+        subject: false
+      };
+      a.other = b;
+      subject.push(a);
+      clip.push(b);
+    });
+    clip.sort(d3_geo_clipSort);
+    d3_geo_clipLinkCircular(subject);
+    d3_geo_clipLinkCircular(clip);
+    if (!subject.length) return;
+    var start = subject[0], current, points, point;
+    while (1) {
+      current = start;
+      while (current.visited) if ((current = current.next) === start) return;
+      points = current.points;
+      listener.lineStart();
+      do {
+        current.visited = current.other.visited = true;
+        if (current.entry) {
+          if (current.subject) {
+            for (var i = 0; i < points.length; i++) listener.point((point = points[i])[0], point[1]);
+          } else {
+            interpolate(current.point, current.next.point, 1, listener);
+          }
+          current = current.next;
+        } else {
+          if (current.subject) {
+            points = current.prev.points;
+            for (var i = points.length; --i >= 0; ) listener.point((point = points[i])[0], point[1]);
+          } else {
+            interpolate(current.point, current.prev.point, -1, listener);
+          }
+          current = current.prev;
+        }
+        current = current.other;
+        points = current.points;
+      } while (!current.visited);
+      listener.lineEnd();
+    }
+  }
+  function d3_geo_clipLinkCircular(array) {
+    if (!(n = array.length)) return;
+    var n, i = 0, a = array[0], b;
+    while (++i < n) {
+      a.next = b = array[i];
+      b.prev = a;
+      a = b;
+    }
+    a.next = b = array[0];
+    b.prev = a;
+  }
+  function d3_geo_clipSort(a, b) {
+    return ((a = a.point)[0] < 0 ? a[1] - π / 2 - ε : π / 2 - a[1]) - ((b = b.point)[0] < 0 ? b[1] - π / 2 - ε : π / 2 - b[1]);
+  }
+  function d3_geo_clipSegmentLength1(segment) {
+    return segment.length > 1;
+  }
+  function d3_geo_clipBufferListener() {
+    var lines = [], line;
+    return {
+      lineStart: function() {
+        lines.push(line = []);
+      },
+      point: function(λ, φ) {
+        line.push([ λ, φ ]);
+      },
+      lineEnd: d3_noop,
+      buffer: function() {
+        var buffer = lines;
+        lines = [];
+        line = null;
+        return buffer;
+      }
+    };
+  }
+  function d3_geo_clipAreaRing(ring, invisible) {
+    if (!(n = ring.length)) return 0;
+    var n, i = 0, area = 0, p = ring[0], λ = p[0], φ = p[1], cosφ = Math.cos(φ), x0 = Math.atan2(invisible * Math.sin(λ) * cosφ, Math.sin(φ)), y0 = 1 - invisible * Math.cos(λ) * cosφ, x1 = x0, x, y;
+    while (++i < n) {
+      p = ring[i];
+      cosφ = Math.cos(φ = p[1]);
+      x = Math.atan2(invisible * Math.sin(λ = p[0]) * cosφ, Math.sin(φ));
+      y = 1 - invisible * Math.cos(λ) * cosφ;
+      if (Math.abs(y0 - 2) < ε && Math.abs(y - 2) < ε) continue;
+      if (Math.abs(y) < ε || Math.abs(y0) < ε) {} else if (Math.abs(Math.abs(x - x0) - π) < ε) {
+        if (y + y0 > 2) area += 4 * (x - x0);
+      } else if (Math.abs(y0 - 2) < ε) area += 4 * (x - x1); else area += ((3 * π + x - x0) % (2 * π) - π) * (y0 + y);
+      x1 = x0, x0 = x, y0 = y;
+    }
+    return area;
+  }
+  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate);
+  function d3_geo_clipAntimeridianLine(listener) {
+    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;
+    return {
+      lineStart: function() {
+        listener.lineStart();
+        clean = 1;
+      },
+      point: function(λ1, φ1) {
+        var sλ1 = λ1 > 0 ? π : -π, dλ = Math.abs(λ1 - λ0);
+        if (Math.abs(dλ - π) < ε) {
+          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? π / 2 : -π / 2);
+          listener.point(sλ0, φ0);
+          listener.lineEnd();
+          listener.lineStart();
+          listener.point(sλ1, φ0);
+          listener.point(λ1, φ0);
+          clean = 0;
+        } else if (sλ0 !== sλ1 && dλ >= π) {
+          if (Math.abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;
+          if (Math.abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;
+          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);
+          listener.point(sλ0, φ0);
+          listener.lineEnd();
+          listener.lineStart();
+          listener.point(sλ1, φ0);
+          clean = 0;
+        }
+        listener.point(λ0 = λ1, φ0 = φ1);
+        sλ0 = sλ1;
+      },
+      lineEnd: function() {
+        listener.lineEnd();
+        λ0 = φ0 = NaN;
+      },
+      clean: function() {
+        return 2 - clean;
+      }
+    };
+  }
+  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
+    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);
+    return Math.abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;
+  }
+  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {
+    var φ;
+    if (from == null) {
+      φ = direction * π / 2;
+      listener.point(-π, φ);
+      listener.point(0, φ);
+      listener.point(π, φ);
+      listener.point(Ï€, 0);
+      listener.point(π, -φ);
+      listener.point(0, -φ);
+      listener.point(-π, -φ);
+      listener.point(-Ï€, 0);
+      listener.point(-π, φ);
+    } else if (Math.abs(from[0] - to[0]) > ε) {
+      var s = (from[0] < to[0] ? 1 : -1) * π;
+      φ = direction * s / 2;
+      listener.point(-s, φ);
+      listener.point(0, φ);
+      listener.point(s, φ);
+    } else {
+      listener.point(to[0], to[1]);
+    }
+  }
+  function d3_geo_clipCircle(degrees) {
+    var radians = degrees * d3_radians, cr = Math.cos(radians), interpolate = d3_geo_circleInterpolate(radians, 6 * d3_radians);
+    return d3_geo_clip(visible, clipLine, interpolate);
+    function visible(λ, φ) {
+      return Math.cos(λ) * Math.cos(φ) > cr;
+    }
+    function clipLine(listener) {
+      var point0, v0, v00, clean;
+      return {
+        lineStart: function() {
+          v00 = v0 = false;
+          clean = 1;
+        },
+        point: function(λ, φ) {
+          var point1 = [ λ, φ ], point2, v = visible(λ, φ);
+          if (!point0 && (v00 = v0 = v)) listener.lineStart();
+          if (v !== v0) {
+            point2 = intersect(point0, point1);
+            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {
+              point1[0] += ε;
+              point1[1] += ε;
+              v = visible(point1[0], point1[1]);
+            }
+          }
+          if (v !== v0) {
+            clean = 0;
+            if (v0 = v) {
+              listener.lineStart();
+              point2 = intersect(point1, point0);
+              listener.point(point2[0], point2[1]);
+            } else {
+              point2 = intersect(point0, point1);
+              listener.point(point2[0], point2[1]);
+              listener.lineEnd();
+            }
+            point0 = point2;
+          }
+          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) listener.point(point1[0], point1[1]);
+          point0 = point1;
+        },
+        lineEnd: function() {
+          if (v0) listener.lineEnd();
+          point0 = null;
+        },
+        clean: function() {
+          return clean | (v00 && v0) << 1;
+        }
+      };
+    }
+    function intersect(a, b) {
+      var pa = d3_geo_cartesian(a, 0), pb = d3_geo_cartesian(b, 0);
+      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;
+      if (!determinant) return a;
+      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);
+      d3_geo_cartesianAdd(A, B);
+      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t = Math.sqrt(w * w - uu * (d3_geo_cartesianDot(A, A) - 1)), q = d3_geo_cartesianScale(u, (-w - t) / uu);
+      d3_geo_cartesianAdd(q, A);
+      return d3_geo_spherical(q);
+    }
+  }
+  function d3_geo_compose(a, b) {
+    function compose(x, y) {
+      return x = a(x, y), b(x[0], x[1]);
+    }
+    if (a.invert && b.invert) compose.invert = function(x, y) {
+      return x = b.invert(x, y), x && a.invert(x[0], x[1]);
+    };
+    return compose;
+  }
+  function d3_geo_equirectangular(λ, φ) {
+    return [ λ, φ ];
+  }
+  (d3.geo.equirectangular = function() {
+    return d3_geo_projection(d3_geo_equirectangular).scale(250 / π);
+  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;
+  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {
+    return 1 / cosλcosφ;
+  }, Math.atan);
+  (d3.geo.gnomonic = function() {
+    return d3_geo_projection(d3_geo_gnomonic);
+  }).raw = d3_geo_gnomonic;
+  d3.geo.graticule = function() {
+    var x1, x0, y1, y0, dx = 22.5, dy = dx, x, y, precision = 2.5;
+    function graticule() {
+      return {
+        type: "MultiLineString",
+        coordinates: lines()
+      };
+    }
+    function lines() {
+      return d3.range(Math.ceil(x0 / dx) * dx, x1, dx).map(x).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).map(y));
+    }
+    graticule.lines = function() {
+      return lines().map(function(coordinates) {
+        return {
+          type: "LineString",
+          coordinates: coordinates
+        };
+      });
+    };
+    graticule.outline = function() {
+      return {
+        type: "Polygon",
+        coordinates: [ x(x0).concat(y(y1).slice(1), x(x1).reverse().slice(1), y(y0).reverse().slice(1)) ]
+      };
+    };
+    graticule.extent = function(_) {
+      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
+      x0 = +_[0][0], x1 = +_[1][0];
+      y0 = +_[0][1], y1 = +_[1][1];
+      if (x0 > x1) _ = x0, x0 = x1, x1 = _;
+      if (y0 > y1) _ = y0, y0 = y1, y1 = _;
+      return graticule.precision(precision);
+    };
+    graticule.step = function(_) {
+      if (!arguments.length) return [ dx, dy ];
+      dx = +_[0], dy = +_[1];
+      return graticule;
+    };
+    graticule.precision = function(_) {
+      if (!arguments.length) return precision;
+      precision = +_;
+      x = d3_geo_graticuleX(y0, y1, precision);
+      y = d3_geo_graticuleY(x0, x1, precision);
+      return graticule;
+    };
+    return graticule.extent([ [ -180 + ε, -90 + ε ], [ 180 - ε, 90 - ε ] ]);
+  };
+  function d3_geo_graticuleX(y0, y1, dy) {
+    var y = d3.range(y0, y1 - ε, dy).concat(y1);
+    return function(x) {
+      return y.map(function(y) {
+        return [ x, y ];
+      });
+    };
+  }
+  function d3_geo_graticuleY(x0, x1, dx) {
+    var x = d3.range(x0, x1 - ε, dx).concat(x1);
+    return function(y) {
+      return x.map(function(x) {
+        return [ x, y ];
+      });
+    };
+  }
+  function d3_geo_haversin(x) {
+    return (x = Math.sin(x / 2)) * x;
+  }
+  d3.geo.interpolate = function(source, target) {
+    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);
+  };
+  function d3_geo_interpolate(x0, y0, x1, y1) {
+    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_geo_haversin(y1 - y0) + cy0 * cy1 * d3_geo_haversin(x1 - x0))), k = 1 / Math.sin(d);
+    var interpolate = d ? function(t) {
+      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;
+      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];
+    } : function() {
+      return [ x0 * d3_degrees, y0 * d3_degrees ];
+    };
+    interpolate.distance = d;
+    return interpolate;
+  }
+  d3.geo.greatArc = function() {
+    var source = d3_source, source_, target = d3_target, target_, precision = 6 * d3_radians, interpolate;
+    function greatArc() {
+      var p0 = source_ || source.apply(this, arguments), p1 = target_ || target.apply(this, arguments), i = interpolate || d3.geo.interpolate(p0, p1), t = 0, dt = precision / i.distance, coordinates = [ p0 ];
+      while ((t += dt) < 1) coordinates.push(i(t));
+      coordinates.push(p1);
+      return {
+        type: "LineString",
+        coordinates: coordinates
+      };
+    }
+    greatArc.distance = function() {
+      return (interpolate || d3.geo.interpolate(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments))).distance;
+    };
+    greatArc.source = function(_) {
+      if (!arguments.length) return source;
+      source = _, source_ = typeof _ === "function" ? null : _;
+      interpolate = source_ && target_ ? d3.geo.interpolate(source_, target_) : null;
+      return greatArc;
+    };
+    greatArc.target = function(_) {
+      if (!arguments.length) return target;
+      target = _, target_ = typeof _ === "function" ? null : _;
+      interpolate = source_ && target_ ? d3.geo.interpolate(source_, target_) : null;
+      return greatArc;
+    };
+    greatArc.precision = function(_) {
+      if (!arguments.length) return precision / d3_radians;
+      precision = _ * d3_radians;
+      return greatArc;
+    };
+    return greatArc;
+  };
+  function d3_geo_mercator(λ, φ) {
+    return [ λ / (2 * π), Math.max(-.5, Math.min(+.5, Math.log(Math.tan(π / 4 + φ / 2)) / (2 * π))) ];
+  }
+  d3_geo_mercator.invert = function(x, y) {
+    return [ 2 * π * x, 2 * Math.atan(Math.exp(2 * π * y)) - π / 2 ];
+  };
+  (d3.geo.mercator = function() {
+    return d3_geo_projection(d3_geo_mercator).scale(500);
+  }).raw = d3_geo_mercator;
+  var d3_geo_orthographic = d3_geo_azimuthal(function() {
+    return 1;
+  }, Math.asin);
+  (d3.geo.orthographic = function() {
+    return d3_geo_projection(d3_geo_orthographic);
+  }).raw = d3_geo_orthographic;
+  d3.geo.path = function() {
+    var pointRadius = 4.5, projection, context, projectStream, contextStream;
+    function path(object) {
+      if (object) d3.geo.stream(object, projectStream(contextStream.pointRadius(typeof pointRadius === "function" ? +pointRadius.apply(this, arguments) : pointRadius)));
+      return contextStream.result();
+    }
+    path.area = function(object) {
+      d3_geo_pathAreaSum = 0;
+      d3.geo.stream(object, projectStream(d3_geo_pathArea));
+      return d3_geo_pathAreaSum;
+    };
+    path.centroid = function(object) {
+      d3_geo_centroidDimension = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));
+      return d3_geo_centroidZ ? [ d3_geo_centroidX / d3_geo_centroidZ, d3_geo_centroidY / d3_geo_centroidZ ] : undefined;
+    };
+    path.bounds = function(object) {
+      return d3_geo_bounds(projectStream)(object);
+    };
+    path.projection = function(_) {
+      if (!arguments.length) return projection;
+      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;
+      return path;
+    };
+    path.context = function(_) {
+      if (!arguments.length) return context;
+      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);
+      return path;
+    };
+    path.pointRadius = function(_) {
+      if (!arguments.length) return pointRadius;
+      pointRadius = typeof _ === "function" ? _ : +_;
+      return path;
+    };
+    return path.projection(d3.geo.albersUsa()).context(null);
+  };
+  function d3_geo_pathCircle(radius) {
+    return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + +2 * radius + "z";
+  }
+  function d3_geo_pathProjectStream(project) {
+    var resample = d3_geo_resample(function(λ, φ) {
+      return project([ λ * d3_degrees, φ * d3_degrees ]);
+    });
+    return function(stream) {
+      stream = resample(stream);
+      return {
+        point: function(λ, φ) {
+          stream.point(λ * d3_radians, φ * d3_radians);
+        },
+        sphere: function() {
+          stream.sphere();
+        },
+        lineStart: function() {
+          stream.lineStart();
+        },
+        lineEnd: function() {
+          stream.lineEnd();
+        },
+        polygonStart: function() {
+          stream.polygonStart();
+        },
+        polygonEnd: function() {
+          stream.polygonEnd();
+        }
+      };
+    };
+  }
+  function d3_geo_pathBuffer() {
+    var pointCircle = d3_geo_pathCircle(4.5), buffer = [];
+    var stream = {
+      point: point,
+      lineStart: function() {
+        stream.point = pointLineStart;
+      },
+      lineEnd: lineEnd,
+      polygonStart: function() {
+        stream.lineEnd = lineEndPolygon;
+      },
+      polygonEnd: function() {
+        stream.lineEnd = lineEnd;
+        stream.point = point;
+      },
+      pointRadius: function(_) {
+        pointCircle = d3_geo_pathCircle(_);
+        return stream;
+      },
+      result: function() {
+        if (buffer.length) {
+          var result = buffer.join("");
+          buffer = [];
+          return result;
+        }
+      }
+    };
+    function point(x, y) {
+      buffer.push("M", x, ",", y, pointCircle);
+    }
+    function pointLineStart(x, y) {
+      buffer.push("M", x, ",", y);
+      stream.point = pointLine;
+    }
+    function pointLine(x, y) {
+      buffer.push("L", x, ",", y);
+    }
+    function lineEnd() {
+      stream.point = point;
+    }
+    function lineEndPolygon() {
+      buffer.push("Z");
+    }
+    return stream;
+  }
+  function d3_geo_pathContext(context) {
+    var pointRadius = 4.5;
+    var stream = {
+      point: point,
+      lineStart: function() {
+        stream.point = pointLineStart;
+      },
+      lineEnd: lineEnd,
+      polygonStart: function() {
+        stream.lineEnd = lineEndPolygon;
+      },
+      polygonEnd: function() {
+        stream.lineEnd = lineEnd;
+        stream.point = point;
+      },
+      pointRadius: function(_) {
+        pointRadius = _;
+        return stream;
+      },
+      result: d3_noop
+    };
+    function point(x, y) {
+      context.moveTo(x, y);
+      context.arc(x, y, pointRadius, 0, 2 * π);
+    }
+    function pointLineStart(x, y) {
+      context.moveTo(x, y);
+      stream.point = pointLine;
+    }
+    function pointLine(x, y) {
+      context.lineTo(x, y);
+    }
+    function lineEnd() {
+      stream.point = point;
+    }
+    function lineEndPolygon() {
+      context.closePath();
+    }
+    return stream;
+  }
+  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {
+    point: d3_noop,
+    lineStart: d3_noop,
+    lineEnd: d3_noop,
+    polygonStart: function() {
+      d3_geo_pathAreaPolygon = 0;
+      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;
+    },
+    polygonEnd: function() {
+      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
+      d3_geo_pathAreaSum += Math.abs(d3_geo_pathAreaPolygon / 2);
+    }
+  };
+  function d3_geo_pathAreaRingStart() {
+    var x00, y00, x0, y0;
+    d3_geo_pathArea.point = function(x, y) {
+      d3_geo_pathArea.point = nextPoint;
+      x00 = x0 = x, y00 = y0 = y;
+    };
+    function nextPoint(x, y) {
+      d3_geo_pathAreaPolygon += y0 * x - x0 * y;
+      x0 = x, y0 = y;
+    }
+    d3_geo_pathArea.lineEnd = function() {
+      nextPoint(x00, y00);
+    };
+  }
+  var d3_geo_pathCentroid = {
+    point: d3_geo_pathCentroidPoint,
+    lineStart: d3_geo_pathCentroidLineStart,
+    lineEnd: d3_geo_pathCentroidLineEnd,
+    polygonStart: function() {
+      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;
+    },
+    polygonEnd: function() {
+      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
+      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;
+      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;
+    }
+  };
+  function d3_geo_pathCentroidPoint(x, y) {
+    if (d3_geo_centroidDimension) return;
+    d3_geo_centroidX += x;
+    d3_geo_centroidY += y;
+    ++d3_geo_centroidZ;
+  }
+  function d3_geo_pathCentroidLineStart() {
+    var x0, y0;
+    if (d3_geo_centroidDimension !== 1) {
+      if (d3_geo_centroidDimension < 1) {
+        d3_geo_centroidDimension = 1;
+        d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+      } else return;
+    }
+    d3_geo_pathCentroid.point = function(x, y) {
+      d3_geo_pathCentroid.point = nextPoint;
+      x0 = x, y0 = y;
+    };
+    function nextPoint(x, y) {
+      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
+      d3_geo_centroidX += z * (x0 + x) / 2;
+      d3_geo_centroidY += z * (y0 + y) / 2;
+      d3_geo_centroidZ += z;
+      x0 = x, y0 = y;
+    }
+  }
+  function d3_geo_pathCentroidLineEnd() {
+    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
+  }
+  function d3_geo_pathCentroidRingStart() {
+    var x00, y00, x0, y0;
+    if (d3_geo_centroidDimension < 2) {
+      d3_geo_centroidDimension = 2;
+      d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+    }
+    d3_geo_pathCentroid.point = function(x, y) {
+      d3_geo_pathCentroid.point = nextPoint;
+      x00 = x0 = x, y00 = y0 = y;
+    };
+    function nextPoint(x, y) {
+      var z = y0 * x - x0 * y;
+      d3_geo_centroidX += z * (x0 + x);
+      d3_geo_centroidY += z * (y0 + y);
+      d3_geo_centroidZ += z * 3;
+      x0 = x, y0 = y;
+    }
+    d3_geo_pathCentroid.lineEnd = function() {
+      nextPoint(x00, y00);
+    };
+  }
+  d3.geo.area = function(object) {
+    d3_geo_areaSum = 0;
+    d3.geo.stream(object, d3_geo_area);
+    return d3_geo_areaSum;
+  };
+  var d3_geo_areaSum, d3_geo_areaRingU, d3_geo_areaRingV;
+  var d3_geo_area = {
+    sphere: function() {
+      d3_geo_areaSum += 4 * π;
+    },
+    point: d3_noop,
+    lineStart: d3_noop,
+    lineEnd: d3_noop,
+    polygonStart: function() {
+      d3_geo_areaRingU = 1, d3_geo_areaRingV = 0;
+      d3_geo_area.lineStart = d3_geo_areaRingStart;
+    },
+    polygonEnd: function() {
+      var area = 2 * Math.atan2(d3_geo_areaRingV, d3_geo_areaRingU);
+      d3_geo_areaSum += area < 0 ? 4 * π + area : area;
+      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;
+    }
+  };
+  function d3_geo_areaRingStart() {
+    var λ00, φ00, λ0, cosφ0, sinφ0;
+    d3_geo_area.point = function(λ, φ) {
+      d3_geo_area.point = nextPoint;
+      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), 
+      sinφ0 = Math.sin(φ);
+    };
+    function nextPoint(λ, φ) {
+      λ *= d3_radians;
+      φ = φ * d3_radians / 2 + π / 4;
+      var dλ = λ - λ0, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u0 = d3_geo_areaRingU, v0 = d3_geo_areaRingV, u = cosφ0 * cosφ + k * Math.cos(dλ), v = k * Math.sin(dλ);
+      d3_geo_areaRingU = u0 * u - v0 * v;
+      d3_geo_areaRingV = v0 * u + u0 * v;
+      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;
+    }
+    d3_geo_area.lineEnd = function() {
+      nextPoint(λ00, φ00);
+    };
+  }
+  d3.geo.projection = d3_geo_projection;
+  d3.geo.projectionMutator = d3_geo_projectionMutator;
+  function d3_geo_projection(project) {
+    return d3_geo_projectionMutator(function() {
+      return project;
+    })();
+  }
+  function d3_geo_projectionMutator(projectAt) {
+    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {
+      x = project(x, y);
+      return [ x[0] * k + δx, δy - x[1] * k ];
+    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, clip = d3_geo_clipAntimeridian, clipAngle = null;
+    function projection(point) {
+      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);
+      return [ point[0] * k + δx, δy - point[1] * k ];
+    }
+    function invert(point) {
+      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);
+      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];
+    }
+    projection.stream = function(stream) {
+      return d3_geo_projectionRadiansRotate(rotate, clip(projectResample(stream)));
+    };
+    projection.clipAngle = function(_) {
+      if (!arguments.length) return clipAngle;
+      clip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle(clipAngle = +_);
+      return projection;
+    };
+    projection.scale = function(_) {
+      if (!arguments.length) return k;
+      k = +_;
+      return reset();
+    };
+    projection.translate = function(_) {
+      if (!arguments.length) return [ x, y ];
+      x = +_[0];
+      y = +_[1];
+      return reset();
+    };
+    projection.center = function(_) {
+      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];
+      λ = _[0] % 360 * d3_radians;
+      φ = _[1] % 360 * d3_radians;
+      return reset();
+    };
+    projection.rotate = function(_) {
+      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];
+      δλ = _[0] % 360 * d3_radians;
+      δφ = _[1] % 360 * d3_radians;
+      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;
+      return reset();
+    };
+    d3.rebind(projection, projectResample, "precision");
+    function reset() {
+      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);
+      var center = project(λ, φ);
+      δx = x - center[0] * k;
+      δy = y + center[1] * k;
+      return projection;
+    }
+    return function() {
+      project = projectAt.apply(this, arguments);
+      projection.invert = project.invert && invert;
+      return reset();
+    };
+  }
+  function d3_geo_projectionRadiansRotate(rotate, stream) {
+    return {
+      point: function(x, y) {
+        y = rotate(x * d3_radians, y * d3_radians), x = y[0];
+        stream.point(x > π ? x - 2 * π : x < -π ? x + 2 * π : x, y[1]);
+      },
+      sphere: function() {
+        stream.sphere();
+      },
+      lineStart: function() {
+        stream.lineStart();
+      },
+      lineEnd: function() {
+        stream.lineEnd();
+      },
+      polygonStart: function() {
+        stream.polygonStart();
+      },
+      polygonEnd: function() {
+        stream.polygonEnd();
+      }
+    };
+  }
+  function d3_geo_rotation(δλ, δφ, δγ) {
+    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_equirectangular;
+  }
+  function d3_geo_forwardRotationλ(δλ) {
+    return function(λ, φ) {
+      return λ += δλ, [ λ > π ? λ - 2 * π : λ < -π ? λ + 2 * π : λ, φ ];
+    };
+  }
+  function d3_geo_rotationλ(δλ) {
+    var rotation = d3_geo_forwardRotationλ(δλ);
+    rotation.invert = d3_geo_forwardRotationλ(-δλ);
+    return rotation;
+  }
+  function d3_geo_rotationφγ(δφ, δγ) {
+    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);
+    function rotation(λ, φ) {
+      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;
+      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), Math.asin(Math.max(-1, Math.min(1, k * cosδγ + y * sinδγ))) ];
+    }
+    rotation.invert = function(λ, φ) {
+      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;
+      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), Math.asin(Math.max(-1, Math.min(1, k * cosδφ - x * sinδφ))) ];
+    };
+    return rotation;
+  }
+  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {
+    return 1 / (1 + cosλcosφ);
+  }, function(ρ) {
+    return 2 * Math.atan(ρ);
+  });
+  (d3.geo.stereographic = function() {
+    return d3_geo_projection(d3_geo_stereographic);
+  }).raw = d3_geo_stereographic;
+  function d3_geo_azimuthal(scale, angle) {
+    function azimuthal(λ, φ) {
+      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);
+      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];
+    }
+    azimuthal.invert = function(x, y) {
+      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);
+      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];
+    };
+    return azimuthal;
+  }
+  d3.geom = {};
+  d3.geom.hull = function(vertices) {
+    if (vertices.length < 3) return [];
+    var len = vertices.length, plen = len - 1, points = [], stack = [], i, j, h = 0, x1, y1, x2, y2, u, v, a, sp;
+    for (i = 1; i < len; ++i) {
+      if (vertices[i][1] < vertices[h][1]) {
+        h = i;
+      } else if (vertices[i][1] == vertices[h][1]) {
+        h = vertices[i][0] < vertices[h][0] ? i : h;
+      }
+    }
+    for (i = 0; i < len; ++i) {
+      if (i === h) continue;
+      y1 = vertices[i][1] - vertices[h][1];
+      x1 = vertices[i][0] - vertices[h][0];
+      points.push({
+        angle: Math.atan2(y1, x1),
+        index: i
+      });
+    }
+    points.sort(function(a, b) {
+      return a.angle - b.angle;
+    });
+    a = points[0].angle;
+    v = points[0].index;
+    u = 0;
+    for (i = 1; i < plen; ++i) {
+      j = points[i].index;
+      if (a == points[i].angle) {
+        x1 = vertices[v][0] - vertices[h][0];
+        y1 = vertices[v][1] - vertices[h][1];
+        x2 = vertices[j][0] - vertices[h][0];
+        y2 = vertices[j][1] - vertices[h][1];
+        if (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2) {
+          points[i].index = -1;
+        } else {
+          points[u].index = -1;
+          a = points[i].angle;
+          u = i;
+          v = j;
+        }
+      } else {
+        a = points[i].angle;
+        u = i;
+        v = j;
+      }
+    }
+    stack.push(h);
+    for (i = 0, j = 0; i < 2; ++j) {
+      if (points[j].index !== -1) {
+        stack.push(points[j].index);
+        i++;
+      }
+    }
+    sp = stack.length;
+    for (;j < plen; ++j) {
+      if (points[j].index === -1) continue;
+      while (!d3_geom_hullCCW(stack[sp - 2], stack[sp - 1], points[j].index, vertices)) {
+        --sp;
+      }
+      stack[sp++] = points[j].index;
+    }
+    var poly = [];
+    for (i = 0; i < sp; ++i) {
+      poly.push(vertices[stack[i]]);
+    }
+    return poly;
+  };
+  function d3_geom_hullCCW(i1, i2, i3, v) {
+    var t, a, b, c, d, e, f;
+    t = v[i1];
+    a = t[0];
+    b = t[1];
+    t = v[i2];
+    c = t[0];
+    d = t[1];
+    t = v[i3];
+    e = t[0];
+    f = t[1];
+    return (f - b) * (c - a) - (d - b) * (e - a) > 0;
+  }
+  d3.geom.polygon = function(coordinates) {
+    coordinates.area = function() {
+      var i = 0, n = coordinates.length, area = coordinates[n - 1][1] * coordinates[0][0] - coordinates[n - 1][0] * coordinates[0][1];
+      while (++i < n) {
+        area += coordinates[i - 1][1] * coordinates[i][0] - coordinates[i - 1][0] * coordinates[i][1];
+      }
+      return area * .5;
+    };
+    coordinates.centroid = function(k) {
+      var i = -1, n = coordinates.length, x = 0, y = 0, a, b = coordinates[n - 1], c;
+      if (!arguments.length) k = -1 / (6 * coordinates.area());
+      while (++i < n) {
+        a = b;
+        b = coordinates[i];
+        c = a[0] * b[1] - b[0] * a[1];
+        x += (a[0] + b[0]) * c;
+        y += (a[1] + b[1]) * c;
+      }
+      return [ x * k, y * k ];
+    };
+    coordinates.clip = function(subject) {
+      var input, i = -1, n = coordinates.length, j, m, a = coordinates[n - 1], b, c, d;
+      while (++i < n) {
+        input = subject.slice();
+        subject.length = 0;
+        b = coordinates[i];
+        c = input[(m = input.length) - 1];
+        j = -1;
+        while (++j < m) {
+          d = input[j];
+          if (d3_geom_polygonInside(d, a, b)) {
+            if (!d3_geom_polygonInside(c, a, b)) {
+              subject.push(d3_geom_polygonIntersect(c, d, a, b));
+            }
+            subject.push(d);
+          } else if (d3_geom_polygonInside(c, a, b)) {
+            subject.push(d3_geom_polygonIntersect(c, d, a, b));
+          }
+          c = d;
+        }
+        a = b;
+      }
+      return subject;
+    };
+    return coordinates;
+  };
+  function d3_geom_polygonInside(p, a, b) {
+    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
+  }
+  function d3_geom_polygonIntersect(c, d, a, b) {
+    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);
+    return [ x1 + ua * x21, y1 + ua * y21 ];
+  }
+  d3.geom.voronoi = function(vertices) {
+    var polygons = vertices.map(function() {
+      return [];
+    }), Z = 1e6;
+    d3_voronoi_tessellate(vertices, function(e) {
+      var s1, s2, x1, x2, y1, y2;
+      if (e.a === 1 && e.b >= 0) {
+        s1 = e.ep.r;
+        s2 = e.ep.l;
+      } else {
+        s1 = e.ep.l;
+        s2 = e.ep.r;
+      }
+      if (e.a === 1) {
+        y1 = s1 ? s1.y : -Z;
+        x1 = e.c - e.b * y1;
+        y2 = s2 ? s2.y : Z;
+        x2 = e.c - e.b * y2;
+      } else {
+        x1 = s1 ? s1.x : -Z;
+        y1 = e.c - e.a * x1;
+        x2 = s2 ? s2.x : Z;
+        y2 = e.c - e.a * x2;
+      }
+      var v1 = [ x1, y1 ], v2 = [ x2, y2 ];
+      polygons[e.region.l.index].push(v1, v2);
+      polygons[e.region.r.index].push(v1, v2);
+    });
+    polygons = polygons.map(function(polygon, i) {
+      var cx = vertices[i][0], cy = vertices[i][1], angle = polygon.map(function(v) {
+        return Math.atan2(v[0] - cx, v[1] - cy);
+      }), order = d3.range(polygon.length).sort(function(a, b) {
+        return angle[a] - angle[b];
+      });
+      return order.filter(function(d, i) {
+        return !i || angle[d] - angle[order[i - 1]] > ε;
+      }).map(function(d) {
+        return polygon[d];
+      });
+    });
+    polygons.forEach(function(polygon, i) {
+      var n = polygon.length;
+      if (!n) return polygon.push([ -Z, -Z ], [ -Z, Z ], [ Z, Z ], [ Z, -Z ]);
+      if (n > 2) return;
+      var p0 = vertices[i], p1 = polygon[0], p2 = polygon[1], x0 = p0[0], y0 = p0[1], x1 = p1[0], y1 = p1[1], x2 = p2[0], y2 = p2[1], dx = Math.abs(x2 - x1), dy = y2 - y1;
+      if (Math.abs(dy) < ε) {
+        var y = y0 < y1 ? -Z : Z;
+        polygon.push([ -Z, y ], [ Z, y ]);
+      } else if (dx < ε) {
+        var x = x0 < x1 ? -Z : Z;
+        polygon.push([ x, -Z ], [ x, Z ]);
+      } else {
+        var y = (x2 - x1) * (y1 - y0) < (x1 - x0) * (y2 - y1) ? Z : -Z, z = Math.abs(dy) - dx;
+        if (Math.abs(z) < ε) {
+          polygon.push([ dy < 0 ? y : -y, y ]);
+        } else {
+          if (z > 0) y *= -1;
+          polygon.push([ -Z, y ], [ Z, y ]);
+        }
+      }
+    });
+    return polygons;
+  };
+  var d3_voronoi_opposite = {
+    l: "r",
+    r: "l"
+  };
+  function d3_voronoi_tessellate(vertices, callback) {
+    var Sites = {
+      list: vertices.map(function(v, i) {
+        return {
+          index: i,
+          x: v[0],
+          y: v[1]
+        };
+      }).sort(function(a, b) {
+        return a.y < b.y ? -1 : a.y > b.y ? 1 : a.x < b.x ? -1 : a.x > b.x ? 1 : 0;
+      }),
+      bottomSite: null
+    };
+    var EdgeList = {
+      list: [],
+      leftEnd: null,
+      rightEnd: null,
+      init: function() {
+        EdgeList.leftEnd = EdgeList.createHalfEdge(null, "l");
+        EdgeList.rightEnd = EdgeList.createHalfEdge(null, "l");
+        EdgeList.leftEnd.r = EdgeList.rightEnd;
+        EdgeList.rightEnd.l = EdgeList.leftEnd;
+        EdgeList.list.unshift(EdgeList.leftEnd, EdgeList.rightEnd);
+      },
+      createHalfEdge: function(edge, side) {
+        return {
+          edge: edge,
+          side: side,
+          vertex: null,
+          l: null,
+          r: null
+        };
+      },
+      insert: function(lb, he) {
+        he.l = lb;
+        he.r = lb.r;
+        lb.r.l = he;
+        lb.r = he;
+      },
+      leftBound: function(p) {
+        var he = EdgeList.leftEnd;
+        do {
+          he = he.r;
+        } while (he != EdgeList.rightEnd && Geom.rightOf(he, p));
+        he = he.l;
+        return he;
+      },
+      del: function(he) {
+        he.l.r = he.r;
+        he.r.l = he.l;
+        he.edge = null;
+      },
+      right: function(he) {
+        return he.r;
+      },
+      left: function(he) {
+        return he.l;
+      },
+      leftRegion: function(he) {
+        return he.edge == null ? Sites.bottomSite : he.edge.region[he.side];
+      },
+      rightRegion: function(he) {
+        return he.edge == null ? Sites.bottomSite : he.edge.region[d3_voronoi_opposite[he.side]];
+      }
+    };
+    var Geom = {
+      bisect: function(s1, s2) {
+        var newEdge = {
+          region: {
+            l: s1,
+            r: s2
+          },
+          ep: {
+            l: null,
+            r: null
+          }
+        };
+        var dx = s2.x - s1.x, dy = s2.y - s1.y, adx = dx > 0 ? dx : -dx, ady = dy > 0 ? dy : -dy;
+        newEdge.c = s1.x * dx + s1.y * dy + (dx * dx + dy * dy) * .5;
+        if (adx > ady) {
+          newEdge.a = 1;
+          newEdge.b = dy / dx;
+          newEdge.c /= dx;
+        } else {
+          newEdge.b = 1;
+          newEdge.a = dx / dy;
+          newEdge.c /= dy;
+        }
+        return newEdge;
+      },
+      intersect: function(el1, el2) {
+        var e1 = el1.edge, e2 = el2.edge;
+        if (!e1 || !e2 || e1.region.r == e2.region.r) {
+          return null;
+        }
+        var d = e1.a * e2.b - e1.b * e2.a;
+        if (Math.abs(d) < 1e-10) {
+          return null;
+        }
+        var xint = (e1.c * e2.b - e2.c * e1.b) / d, yint = (e2.c * e1.a - e1.c * e2.a) / d, e1r = e1.region.r, e2r = e2.region.r, el, e;
+        if (e1r.y < e2r.y || e1r.y == e2r.y && e1r.x < e2r.x) {
+          el = el1;
+          e = e1;
+        } else {
+          el = el2;
+          e = e2;
+        }
+        var rightOfSite = xint >= e.region.r.x;
+        if (rightOfSite && el.side === "l" || !rightOfSite && el.side === "r") {
+          return null;
+        }
+        return {
+          x: xint,
+          y: yint
+        };
+      },
+      rightOf: function(he, p) {
+        var e = he.edge, topsite = e.region.r, rightOfSite = p.x > topsite.x;
+        if (rightOfSite && he.side === "l") {
+          return 1;
+        }
+        if (!rightOfSite && he.side === "r") {
+          return 0;
+        }
+        if (e.a === 1) {
+          var dyp = p.y - topsite.y, dxp = p.x - topsite.x, fast = 0, above = 0;
+          if (!rightOfSite && e.b < 0 || rightOfSite && e.b >= 0) {
+            above = fast = dyp >= e.b * dxp;
+          } else {
+            above = p.x + p.y * e.b > e.c;
+            if (e.b < 0) {
+              above = !above;
+            }
+            if (!above) {
+              fast = 1;
+            }
+          }
+          if (!fast) {
+            var dxs = topsite.x - e.region.l.x;
+            above = e.b * (dxp * dxp - dyp * dyp) < dxs * dyp * (1 + 2 * dxp / dxs + e.b * e.b);
+            if (e.b < 0) {
+              above = !above;
+            }
+          }
+        } else {
+          var yl = e.c - e.a * p.x, t1 = p.y - yl, t2 = p.x - topsite.x, t3 = yl - topsite.y;
+          above = t1 * t1 > t2 * t2 + t3 * t3;
+        }
+        return he.side === "l" ? above : !above;
+      },
+      endPoint: function(edge, side, site) {
+        edge.ep[side] = site;
+        if (!edge.ep[d3_voronoi_opposite[side]]) return;
+        callback(edge);
+      },
+      distance: function(s, t) {
+        var dx = s.x - t.x, dy = s.y - t.y;
+        return Math.sqrt(dx * dx + dy * dy);
+      }
+    };
+    var EventQueue = {
+      list: [],
+      insert: function(he, site, offset) {
+        he.vertex = site;
+        he.ystar = site.y + offset;
+        for (var i = 0, list = EventQueue.list, l = list.length; i < l; i++) {
+          var next = list[i];
+          if (he.ystar > next.ystar || he.ystar == next.ystar && site.x > next.vertex.x) {
+            continue;
+          } else {
+            break;
+          }
+        }
+        list.splice(i, 0, he);
+      },
+      del: function(he) {
+        for (var i = 0, ls = EventQueue.list, l = ls.length; i < l && ls[i] != he; ++i) {}
+        ls.splice(i, 1);
+      },
+      empty: function() {
+        return EventQueue.list.length === 0;
+      },
+      nextEvent: function(he) {
+        for (var i = 0, ls = EventQueue.list, l = ls.length; i < l; ++i) {
+          if (ls[i] == he) return ls[i + 1];
+        }
+        return null;
+      },
+      min: function() {
+        var elem = EventQueue.list[0];
+        return {
+          x: elem.vertex.x,
+          y: elem.ystar
+        };
+      },
+      extractMin: function() {
+        return EventQueue.list.shift();
+      }
+    };
+    EdgeList.init();
+    Sites.bottomSite = Sites.list.shift();
+    var newSite = Sites.list.shift(), newIntStar;
+    var lbnd, rbnd, llbnd, rrbnd, bisector;
+    var bot, top, temp, p, v;
+    var e, pm;
+    while (true) {
+      if (!EventQueue.empty()) {
+        newIntStar = EventQueue.min();
+      }
+      if (newSite && (EventQueue.empty() || newSite.y < newIntStar.y || newSite.y == newIntStar.y && newSite.x < newIntStar.x)) {
+        lbnd = EdgeList.leftBound(newSite);
+        rbnd = EdgeList.right(lbnd);
+        bot = EdgeList.rightRegion(lbnd);
+        e = Geom.bisect(bot, newSite);
+        bisector = EdgeList.createHalfEdge(e, "l");
+        EdgeList.insert(lbnd, bisector);
+        p = Geom.intersect(lbnd, bisector);
+        if (p) {
+          EventQueue.del(lbnd);
+          EventQueue.insert(lbnd, p, Geom.distance(p, newSite));
+        }
+        lbnd = bisector;
+        bisector = EdgeList.createHalfEdge(e, "r");
+        EdgeList.insert(lbnd, bisector);
+        p = Geom.intersect(bisector, rbnd);
+        if (p) {
+          EventQueue.insert(bisector, p, Geom.distance(p, newSite));
+        }
+        newSite = Sites.list.shift();
+      } else if (!EventQueue.empty()) {
+        lbnd = EventQueue.extractMin();
+        llbnd = EdgeList.left(lbnd);
+        rbnd = EdgeList.right(lbnd);
+        rrbnd = EdgeList.right(rbnd);
+        bot = EdgeList.leftRegion(lbnd);
+        top = EdgeList.rightRegion(rbnd);
+        v = lbnd.vertex;
+        Geom.endPoint(lbnd.edge, lbnd.side, v);
+        Geom.endPoint(rbnd.edge, rbnd.side, v);
+        EdgeList.del(lbnd);
+        EventQueue.del(rbnd);
+        EdgeList.del(rbnd);
+        pm = "l";
+        if (bot.y > top.y) {
+          temp = bot;
+          bot = top;
+          top = temp;
+          pm = "r";
+        }
+        e = Geom.bisect(bot, top);
+        bisector = EdgeList.createHalfEdge(e, pm);
+        EdgeList.insert(llbnd, bisector);
+        Geom.endPoint(e, d3_voronoi_opposite[pm], v);
+        p = Geom.intersect(llbnd, bisector);
+        if (p) {
+          EventQueue.del(llbnd);
+          EventQueue.insert(llbnd, p, Geom.distance(p, bot));
+        }
+        p = Geom.intersect(bisector, rrbnd);
+        if (p) {
+          EventQueue.insert(bisector, p, Geom.distance(p, bot));
+        }
+      } else {
+        break;
+      }
+    }
+    for (lbnd = EdgeList.right(EdgeList.leftEnd); lbnd != EdgeList.rightEnd; lbnd = EdgeList.right(lbnd)) {
+      callback(lbnd.edge);
+    }
+  }
+  d3.geom.delaunay = function(vertices) {
+    var edges = vertices.map(function() {
+      return [];
+    }), triangles = [];
+    d3_voronoi_tessellate(vertices, function(e) {
+      edges[e.region.l.index].push(vertices[e.region.r.index]);
+    });
+    edges.forEach(function(edge, i) {
+      var v = vertices[i], cx = v[0], cy = v[1];
+      edge.forEach(function(v) {
+        v.angle = Math.atan2(v[0] - cx, v[1] - cy);
+      });
+      edge.sort(function(a, b) {
+        return a.angle - b.angle;
+      });
+      for (var j = 0, m = edge.length - 1; j < m; j++) {
+        triangles.push([ v, edge[j], edge[j + 1] ]);
+      }
+    });
+    return triangles;
+  };
+  d3.geom.quadtree = function(points, x1, y1, x2, y2) {
+    var p, i = -1, n = points.length;
+    if (arguments.length < 5) {
+      if (arguments.length === 3) {
+        y2 = y1;
+        x2 = x1;
+        y1 = x1 = 0;
+      } else {
+        x1 = y1 = Infinity;
+        x2 = y2 = -Infinity;
+        while (++i < n) {
+          p = points[i];
+          if (p.x < x1) x1 = p.x;
+          if (p.y < y1) y1 = p.y;
+          if (p.x > x2) x2 = p.x;
+          if (p.y > y2) y2 = p.y;
+        }
+      }
+    }
+    var dx = x2 - x1, dy = y2 - y1;
+    if (dx > dy) y2 = y1 + dx; else x2 = x1 + dy;
+    function insert(n, p, x1, y1, x2, y2) {
+      if (isNaN(p.x) || isNaN(p.y)) return;
+      if (n.leaf) {
+        var v = n.point;
+        if (v) {
+          if (Math.abs(v.x - p.x) + Math.abs(v.y - p.y) < .01) {
+            insertChild(n, p, x1, y1, x2, y2);
+          } else {
+            n.point = null;
+            insertChild(n, v, x1, y1, x2, y2);
+            insertChild(n, p, x1, y1, x2, y2);
+          }
+        } else {
+          n.point = p;
+        }
+      } else {
+        insertChild(n, p, x1, y1, x2, y2);
+      }
+    }
+    function insertChild(n, p, x1, y1, x2, y2) {
+      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, right = p.x >= sx, bottom = p.y >= sy, i = (bottom << 1) + right;
+      n.leaf = false;
+      n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());
+      if (right) x1 = sx; else x2 = sx;
+      if (bottom) y1 = sy; else y2 = sy;
+      insert(n, p, x1, y1, x2, y2);
+    }
+    var root = d3_geom_quadtreeNode();
+    root.add = function(p) {
+      insert(root, p, x1, y1, x2, y2);
+    };
+    root.visit = function(f) {
+      d3_geom_quadtreeVisit(f, root, x1, y1, x2, y2);
+    };
+    points.forEach(root.add);
+    return root;
+  };
+  function d3_geom_quadtreeNode() {
+    return {
+      leaf: true,
+      nodes: [],
+      point: null
+    };
+  }
+  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {
+    if (!f(node, x1, y1, x2, y2)) {
+      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;
+      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);
+      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);
+      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);
+      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);
+    }
+  }
+  d3.time = {};
+  var d3_time = Date, d3_time_daySymbols = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ];
+  function d3_time_utc() {
+    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);
+  }
+  d3_time_utc.prototype = {
+    getDate: function() {
+      return this._.getUTCDate();
+    },
+    getDay: function() {
+      return this._.getUTCDay();
+    },
+    getFullYear: function() {
+      return this._.getUTCFullYear();
+    },
+    getHours: function() {
+      return this._.getUTCHours();
+    },
+    getMilliseconds: function() {
+      return this._.getUTCMilliseconds();
+    },
+    getMinutes: function() {
+      return this._.getUTCMinutes();
+    },
+    getMonth: function() {
+      return this._.getUTCMonth();
+    },
+    getSeconds: function() {
+      return this._.getUTCSeconds();
+    },
+    getTime: function() {
+      return this._.getTime();
+    },
+    getTimezoneOffset: function() {
+      return 0;
+    },
+    valueOf: function() {
+      return this._.valueOf();
+    },
+    setDate: function() {
+      d3_time_prototype.setUTCDate.apply(this._, arguments);
+    },
+    setDay: function() {
+      d3_time_prototype.setUTCDay.apply(this._, arguments);
+    },
+    setFullYear: function() {
+      d3_time_prototype.setUTCFullYear.apply(this._, arguments);
+    },
+    setHours: function() {
+      d3_time_prototype.setUTCHours.apply(this._, arguments);
+    },
+    setMilliseconds: function() {
+      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);
+    },
+    setMinutes: function() {
+      d3_time_prototype.setUTCMinutes.apply(this._, arguments);
+    },
+    setMonth: function() {
+      d3_time_prototype.setUTCMonth.apply(this._, arguments);
+    },
+    setSeconds: function() {
+      d3_time_prototype.setUTCSeconds.apply(this._, arguments);
+    },
+    setTime: function() {
+      d3_time_prototype.setTime.apply(this._, arguments);
+    }
+  };
+  var d3_time_prototype = Date.prototype;
+  var d3_time_formatDateTime = "%a %b %e %X %Y", d3_time_formatDate = "%m/%d/%Y", d3_time_formatTime = "%H:%M:%S";
+  var d3_time_days = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], d3_time_dayAbbreviations = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], d3_time_months = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], d3_time_monthAbbreviations = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
+  d3.time.format = function(template) {
+    var n = template.length;
+    function format(date) {
+      var string = [], i = -1, j = 0, c, p, f;
+      while (++i < n) {
+        if (template.charCodeAt(i) === 37) {
+          string.push(template.substring(j, i));
+          if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);
+          if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p);
+          string.push(c);
+          j = i + 1;
+        }
+      }
+      string.push(template.substring(j, i));
+      return string.join("");
+    }
+    format.parse = function(string) {
+      var d = {
+        y: 1900,
+        m: 0,
+        d: 1,
+        H: 0,
+        M: 0,
+        S: 0,
+        L: 0
+      }, i = d3_time_parse(d, template, string, 0);
+      if (i != string.length) return null;
+      if ("p" in d) d.H = d.H % 12 + d.p * 12;
+      var date = new d3_time();
+      date.setFullYear(d.y, d.m, d.d);
+      date.setHours(d.H, d.M, d.S, d.L);
+      return date;
+    };
+    format.toString = function() {
+      return template;
+    };
+    return format;
+  };
+  function d3_time_parse(date, template, string, j) {
+    var c, p, i = 0, n = template.length, m = string.length;
+    while (i < n) {
+      if (j >= m) return -1;
+      c = template.charCodeAt(i++);
+      if (c === 37) {
+        p = d3_time_parsers[template.charAt(i++)];
+        if (!p || (j = p(date, string, j)) < 0) return -1;
+      } else if (c != string.charCodeAt(j++)) {
+        return -1;
+      }
+    }
+    return j;
+  }
+  function d3_time_formatRe(names) {
+    return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i");
+  }
+  function d3_time_formatLookup(names) {
+    var map = new d3_Map(), i = -1, n = names.length;
+    while (++i < n) map.set(names[i].toLowerCase(), i);
+    return map;
+  }
+  function d3_time_formatPad(value, fill, width) {
+    value += "";
+    var length = value.length;
+    return length < width ? new Array(width - length + 1).join(fill) + value : value;
+  }
+  var d3_time_dayRe = d3_time_formatRe(d3_time_days), d3_time_dayAbbrevRe = d3_time_formatRe(d3_time_dayAbbreviations), d3_time_monthRe = d3_time_formatRe(d3_time_months), d3_time_monthLookup = d3_time_formatLookup(d3_time_months), d3_time_monthAbbrevRe = d3_time_formatRe(d3_time_monthAbbreviations), d3_time_monthAbbrevLookup = d3_time_formatLookup(d3_time_monthAbbreviations);
+  var d3_time_formatPads = {
+    "-": "",
+    _: " ",
+    "0": "0"
+  };
+  var d3_time_formats = {
+    a: function(d) {
+      return d3_time_dayAbbreviations[d.getDay()];
+    },
+    A: function(d) {
+      return d3_time_days[d.getDay()];
+    },
+    b: function(d) {
+      return d3_time_monthAbbreviations[d.getMonth()];
+    },
+    B: function(d) {
+      return d3_time_months[d.getMonth()];
+    },
+    c: d3.time.format(d3_time_formatDateTime),
+    d: function(d, p) {
+      return d3_time_formatPad(d.getDate(), p, 2);
+    },
+    e: function(d, p) {
+      return d3_time_formatPad(d.getDate(), p, 2);
+    },
+    H: function(d, p) {
+      return d3_time_formatPad(d.getHours(), p, 2);
+    },
+    I: function(d, p) {
+      return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);
+    },
+    j: function(d, p) {
+      return d3_time_formatPad(1 + d3.time.dayOfYear(d), p, 3);
+    },
+    L: function(d, p) {
+      return d3_time_formatPad(d.getMilliseconds(), p, 3);
+    },
+    m: function(d, p) {
+      return d3_time_formatPad(d.getMonth() + 1, p, 2);
+    },
+    M: function(d, p) {
+      return d3_time_formatPad(d.getMinutes(), p, 2);
+    },
+    p: function(d) {
+      return d.getHours() >= 12 ? "PM" : "AM";
+    },
+    S: function(d, p) {
+      return d3_time_formatPad(d.getSeconds(), p, 2);
+    },
+    U: function(d, p) {
+      return d3_time_formatPad(d3.time.sundayOfYear(d), p, 2);
+    },
+    w: function(d) {
+      return d.getDay();
+    },
+    W: function(d, p) {
+      return d3_time_formatPad(d3.time.mondayOfYear(d), p, 2);
+    },
+    x: d3.time.format(d3_time_formatDate),
+    X: d3.time.format(d3_time_formatTime),
+    y: function(d, p) {
+      return d3_time_formatPad(d.getFullYear() % 100, p, 2);
+    },
+    Y: function(d, p) {
+      return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);
+    },
+    Z: d3_time_zone,
+    "%": function() {
+      return "%";
+    }
+  };
+  var d3_time_parsers = {
+    a: d3_time_parseWeekdayAbbrev,
+    A: d3_time_parseWeekday,
+    b: d3_time_parseMonthAbbrev,
+    B: d3_time_parseMonth,
+    c: d3_time_parseLocaleFull,
+    d: d3_time_parseDay,
+    e: d3_time_parseDay,
+    H: d3_time_parseHour24,
+    I: d3_time_parseHour24,
+    L: d3_time_parseMilliseconds,
+    m: d3_time_parseMonthNumber,
+    M: d3_time_parseMinutes,
+    p: d3_time_parseAmPm,
+    S: d3_time_parseSeconds,
+    x: d3_time_parseLocaleDate,
+    X: d3_time_parseLocaleTime,
+    y: d3_time_parseYear,
+    Y: d3_time_parseFullYear
+  };
+  function d3_time_parseWeekdayAbbrev(date, string, i) {
+    d3_time_dayAbbrevRe.lastIndex = 0;
+    var n = d3_time_dayAbbrevRe.exec(string.substring(i));
+    return n ? i += n[0].length : -1;
+  }
+  function d3_time_parseWeekday(date, string, i) {
+    d3_time_dayRe.lastIndex = 0;
+    var n = d3_time_dayRe.exec(string.substring(i));
+    return n ? i += n[0].length : -1;
+  }
+  function d3_time_parseMonthAbbrev(date, string, i) {
+    d3_time_monthAbbrevRe.lastIndex = 0;
+    var n = d3_time_monthAbbrevRe.exec(string.substring(i));
+    return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i += n[0].length) : -1;
+  }
+  function d3_time_parseMonth(date, string, i) {
+    d3_time_monthRe.lastIndex = 0;
+    var n = d3_time_monthRe.exec(string.substring(i));
+    return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i += n[0].length) : -1;
+  }
+  function d3_time_parseLocaleFull(date, string, i) {
+    return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
+  }
+  function d3_time_parseLocaleDate(date, string, i) {
+    return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
+  }
+  function d3_time_parseLocaleTime(date, string, i) {
+    return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
+  }
+  function d3_time_parseFullYear(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.substring(i, i + 4));
+    return n ? (date.y = +n[0], i += n[0].length) : -1;
+  }
+  function d3_time_parseYear(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+    return n ? (date.y = d3_time_expandYear(+n[0]), i += n[0].length) : -1;
+  }
+  function d3_time_expandYear(d) {
+    return d + (d > 68 ? 1900 : 2e3);
+  }
+  function d3_time_parseMonthNumber(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+    return n ? (date.m = n[0] - 1, i += n[0].length) : -1;
+  }
+  function d3_time_parseDay(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+    return n ? (date.d = +n[0], i += n[0].length) : -1;
+  }
+  function d3_time_parseHour24(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+    return n ? (date.H = +n[0], i += n[0].length) : -1;
+  }
+  function d3_time_parseMinutes(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+    return n ? (date.M = +n[0], i += n[0].length) : -1;
+  }
+  function d3_time_parseSeconds(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+    return n ? (date.S = +n[0], i += n[0].length) : -1;
+  }
+  function d3_time_parseMilliseconds(date, string, i) {
+    d3_time_numberRe.lastIndex = 0;
+    var n = d3_time_numberRe.exec(string.substring(i, i + 3));
+    return n ? (date.L = +n[0], i += n[0].length) : -1;
+  }
+  var d3_time_numberRe = /^\s*\d+/;
+  function d3_time_parseAmPm(date, string, i) {
+    var n = d3_time_amPmLookup.get(string.substring(i, i += 2).toLowerCase());
+    return n == null ? -1 : (date.p = n, i);
+  }
+  var d3_time_amPmLookup = d3.map({
+    am: 0,
+    pm: 1
+  });
+  function d3_time_zone(d) {
+    var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = ~~(Math.abs(z) / 60), zm = Math.abs(z) % 60;
+    return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2);
+  }
+  d3.time.format.utc = function(template) {
+    var local = d3.time.format(template);
+    function format(date) {
+      try {
+        d3_time = d3_time_utc;
+        var utc = new d3_time();
+        utc._ = date;
+        return local(utc);
+      } finally {
+        d3_time = Date;
+      }
+    }
+    format.parse = function(string) {
+      try {
+        d3_time = d3_time_utc;
+        var date = local.parse(string);
+        return date && date._;
+      } finally {
+        d3_time = Date;
+      }
+    };
+    format.toString = local.toString;
+    return format;
+  };
+  var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");
+  d3.time.format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso;
+  function d3_time_formatIsoNative(date) {
+    return date.toISOString();
+  }
+  d3_time_formatIsoNative.parse = function(string) {
+    var date = new Date(string);
+    return isNaN(date) ? null : date;
+  };
+  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;
+  function d3_time_interval(local, step, number) {
+    function round(date) {
+      var d0 = local(date), d1 = offset(d0, 1);
+      return date - d0 < d1 - date ? d0 : d1;
+    }
+    function ceil(date) {
+      step(date = local(new d3_time(date - 1)), 1);
+      return date;
+    }
+    function offset(date, k) {
+      step(date = new d3_time(+date), k);
+      return date;
+    }
+    function range(t0, t1, dt) {
+      var time = ceil(t0), times = [];
+      if (dt > 1) {
+        while (time < t1) {
+          if (!(number(time) % dt)) times.push(new Date(+time));
+          step(time, 1);
+        }
+      } else {
+        while (time < t1) times.push(new Date(+time)), step(time, 1);
+      }
+      return times;
+    }
+    function range_utc(t0, t1, dt) {
+      try {
+        d3_time = d3_time_utc;
+        var utc = new d3_time_utc();
+        utc._ = t0;
+        return range(utc, t1, dt);
+      } finally {
+        d3_time = Date;
+      }
+    }
+    local.floor = local;
+    local.round = round;
+    local.ceil = ceil;
+    local.offset = offset;
+    local.range = range;
+    var utc = local.utc = d3_time_interval_utc(local);
+    utc.floor = utc;
+    utc.round = d3_time_interval_utc(round);
+    utc.ceil = d3_time_interval_utc(ceil);
+    utc.offset = d3_time_interval_utc(offset);
+    utc.range = range_utc;
+    return local;
+  }
+  function d3_time_interval_utc(method) {
+    return function(date, k) {
+      try {
+        d3_time = d3_time_utc;
+        var utc = new d3_time_utc();
+        utc._ = date;
+        return method(utc, k)._;
+      } finally {
+        d3_time = Date;
+      }
+    };
+  }
+  d3.time.second = d3_time_interval(function(date) {
+    return new d3_time(Math.floor(date / 1e3) * 1e3);
+  }, function(date, offset) {
+    date.setTime(date.getTime() + Math.floor(offset) * 1e3);
+  }, function(date) {
+    return date.getSeconds();
+  });
+  d3.time.seconds = d3.time.second.range;
+  d3.time.seconds.utc = d3.time.second.utc.range;
+  d3.time.minute = d3_time_interval(function(date) {
+    return new d3_time(Math.floor(date / 6e4) * 6e4);
+  }, function(date, offset) {
+    date.setTime(date.getTime() + Math.floor(offset) * 6e4);
+  }, function(date) {
+    return date.getMinutes();
+  });
+  d3.time.minutes = d3.time.minute.range;
+  d3.time.minutes.utc = d3.time.minute.utc.range;
+  d3.time.hour = d3_time_interval(function(date) {
+    var timezone = date.getTimezoneOffset() / 60;
+    return new d3_time((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);
+  }, function(date, offset) {
+    date.setTime(date.getTime() + Math.floor(offset) * 36e5);
+  }, function(date) {
+    return date.getHours();
+  });
+  d3.time.hours = d3.time.hour.range;
+  d3.time.hours.utc = d3.time.hour.utc.range;
+  d3.time.day = d3_time_interval(function(date) {
+    var day = new d3_time(1970, 0);
+    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
+    return day;
+  }, function(date, offset) {
+    date.setDate(date.getDate() + offset);
+  }, function(date) {
+    return date.getDate() - 1;
+  });
+  d3.time.days = d3.time.day.range;
+  d3.time.days.utc = d3.time.day.utc.range;
+  d3.time.dayOfYear = function(date) {
+    var year = d3.time.year(date);
+    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);
+  };
+  d3_time_daySymbols.forEach(function(day, i) {
+    day = day.toLowerCase();
+    i = 7 - i;
+    var interval = d3.time[day] = d3_time_interval(function(date) {
+      (date = d3.time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);
+      return date;
+    }, function(date, offset) {
+      date.setDate(date.getDate() + Math.floor(offset) * 7);
+    }, function(date) {
+      var day = d3.time.year(date).getDay();
+      return Math.floor((d3.time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);
+    });
+    d3.time[day + "s"] = interval.range;
+    d3.time[day + "s"].utc = interval.utc.range;
+    d3.time[day + "OfYear"] = function(date) {
+      var day = d3.time.year(date).getDay();
+      return Math.floor((d3.time.dayOfYear(date) + (day + i) % 7) / 7);
+    };
+  });
+  d3.time.week = d3.time.sunday;
+  d3.time.weeks = d3.time.sunday.range;
+  d3.time.weeks.utc = d3.time.sunday.utc.range;
+  d3.time.weekOfYear = d3.time.sundayOfYear;
+  d3.time.month = d3_time_interval(function(date) {
+    date = d3.time.day(date);
+    date.setDate(1);
+    return date;
+  }, function(date, offset) {
+    date.setMonth(date.getMonth() + offset);
+  }, function(date) {
+    return date.getMonth();
+  });
+  d3.time.months = d3.time.month.range;
+  d3.time.months.utc = d3.time.month.utc.range;
+  d3.time.year = d3_time_interval(function(date) {
+    date = d3.time.day(date);
+    date.setMonth(0, 1);
+    return date;
+  }, function(date, offset) {
+    date.setFullYear(date.getFullYear() + offset);
+  }, function(date) {
+    return date.getFullYear();
+  });
+  d3.time.years = d3.time.year.range;
+  d3.time.years.utc = d3.time.year.utc.range;
+  function d3_time_scale(linear, methods, format) {
+    function scale(x) {
+      return linear(x);
+    }
+    scale.invert = function(x) {
+      return d3_time_scaleDate(linear.invert(x));
+    };
+    scale.domain = function(x) {
+      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);
+      linear.domain(x);
+      return scale;
+    };
+    scale.nice = function(m) {
+      return scale.domain(d3_scale_nice(scale.domain(), function() {
+        return m;
+      }));
+    };
+    scale.ticks = function(m, k) {
+      var extent = d3_time_scaleExtent(scale.domain());
+      if (typeof m !== "function") {
+        var span = extent[1] - extent[0], target = span / m, i = d3.bisect(d3_time_scaleSteps, target);
+        if (i == d3_time_scaleSteps.length) return methods.year(extent, m);
+        if (!i) return linear.ticks(m).map(d3_time_scaleDate);
+        if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i;
+        m = methods[i];
+        k = m[1];
+        m = m[0].range;
+      }
+      return m(extent[0], new Date(+extent[1] + 1), k);
+    };
+    scale.tickFormat = function() {
+      return format;
+    };
+    scale.copy = function() {
+      return d3_time_scale(linear.copy(), methods, format);
+    };
+    return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
+  }
+  function d3_time_scaleExtent(domain) {
+    var start = domain[0], stop = domain[domain.length - 1];
+    return start < stop ? [ start, stop ] : [ stop, start ];
+  }
+  function d3_time_scaleDate(t) {
+    return new Date(t);
+  }
+  function d3_time_scaleFormat(formats) {
+    return function(date) {
+      var i = formats.length - 1, f = formats[i];
+      while (!f[1](date)) f = formats[--i];
+      return f[0](date);
+    };
+  }
+  function d3_time_scaleSetYear(y) {
+    var d = new Date(y, 0, 1);
+    d.setFullYear(y);
+    return d;
+  }
+  function d3_time_scaleGetYear(d) {
+    var y = d.getFullYear(), d0 = d3_time_scaleSetYear(y), d1 = d3_time_scaleSetYear(y + 1);
+    return y + (d - d0) / (d1 - d0);
+  }
+  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];
+  var d3_time_scaleLocalMethods = [ [ d3.time.second, 1 ], [ d3.time.second, 5 ], [ d3.time.second, 15 ], [ d3.time.second, 30 ], [ d3.time.minute, 1 ], [ d3.time.minute, 5 ], [ d3.time.minute, 15 ], [ d3.time.minute, 30 ], [ d3.time.hour, 1 ], [ d3.time.hour, 3 ], [ d3.time.hour, 6 ], [ d3.time.hour, 12 ], [ d3.time.day, 1 ], [ d3.time.day, 2 ], [ d3.time.week, 1 ], [ d3.time.month, 1 ], [ d3.time.month, 3 ], [ d3.time.year, 1 ] ];
+  var d3_time_scaleLocalFormats = [ [ d3.time.format("%Y"), d3_true ], [ d3.time.format("%B"), function(d) {
+    return d.getMonth();
+  } ], [ d3.time.format("%b %d"), function(d) {
+    return d.getDate() != 1;
+  } ], [ d3.time.format("%a %d"), function(d) {
+    return d.getDay() && d.getDate() != 1;
+  } ], [ d3.time.format("%I %p"), function(d) {
+    return d.getHours();
+  } ], [ d3.time.format("%I:%M"), function(d) {
+    return d.getMinutes();
+  } ], [ d3.time.format(":%S"), function(d) {
+    return d.getSeconds();
+  } ], [ d3.time.format(".%L"), function(d) {
+    return d.getMilliseconds();
+  } ] ];
+  var d3_time_scaleLinear = d3.scale.linear(), d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats);
+  d3_time_scaleLocalMethods.year = function(extent, m) {
+    return d3_time_scaleLinear.domain(extent.map(d3_time_scaleGetYear)).ticks(m).map(d3_time_scaleSetYear);
+  };
+  d3.time.scale = function() {
+    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
+  };
+  var d3_time_scaleUTCMethods = d3_time_scaleLocalMethods.map(function(m) {
+    return [ m[0].utc, m[1] ];
+  });
+  var d3_time_scaleUTCFormats = [ [ d3.time.format.utc("%Y"), d3_true ], [ d3.time.format.utc("%B"), function(d) {
+    return d.getUTCMonth();
+  } ], [ d3.time.format.utc("%b %d"), function(d) {
+    return d.getUTCDate() != 1;
+  } ], [ d3.time.format.utc("%a %d"), function(d) {
+    return d.getUTCDay() && d.getUTCDate() != 1;
+  } ], [ d3.time.format.utc("%I %p"), function(d) {
+    return d.getUTCHours();
+  } ], [ d3.time.format.utc("%I:%M"), function(d) {
+    return d.getUTCMinutes();
+  } ], [ d3.time.format.utc(":%S"), function(d) {
+    return d.getUTCSeconds();
+  } ], [ d3.time.format.utc(".%L"), function(d) {
+    return d.getUTCMilliseconds();
+  } ] ];
+  var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats);
+  function d3_time_scaleUTCSetYear(y) {
+    var d = new Date(Date.UTC(y, 0, 1));
+    d.setUTCFullYear(y);
+    return d;
+  }
+  function d3_time_scaleUTCGetYear(d) {
+    var y = d.getUTCFullYear(), d0 = d3_time_scaleUTCSetYear(y), d1 = d3_time_scaleUTCSetYear(y + 1);
+    return y + (d - d0) / (d1 - d0);
+  }
+  d3_time_scaleUTCMethods.year = function(extent, m) {
+    return d3_time_scaleLinear.domain(extent.map(d3_time_scaleUTCGetYear)).ticks(m).map(d3_time_scaleUTCSetYear);
+  };
+  d3.time.scale.utc = function() {
+    return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat);
+  };
+  return d3;
+}();
\ No newline at end of file
diff --git a/static/demo/components/d3/d3.min.js b/static/demo/components/d3/d3.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f3faa422470240361459a0320de6595b3015efb
--- /dev/null
+++ b/static/demo/components/d3/d3.min.js
@@ -0,0 +1,4 @@
+d3=function(){function t(t){return t.target}function n(t){return t.source}function e(t,n){try{for(var e in n)Object.defineProperty(t.prototype,e,{value:n[e],enumerable:!1})}catch(r){t.prototype=n}}function r(t){for(var n=-1,e=t.length,r=[];e>++n;)r.push(t[n]);return r}function u(t){return Array.prototype.slice.call(t)}function i(){}function a(t){return t}function o(){return!0}function c(t){return"function"==typeof t?t:function(){return t}}function l(t,n,e){return function(){var r=e.apply(n,arguments);return r===n?t:r}}function f(t){return null!=t&&!isNaN(t)}function s(t){return t.length}function h(t){return t.trim().replace(/\s+/g," ")}function g(t){for(var n=1;t*n%1;)n*=10;return n}function p(t){return 1===t.length?function(n,e){t(null==n?e:null)}:t}function d(t){return t.responseText}function m(t){return JSON.parse(t.responseText)}function v(t){var n=Li.createRange();return n.selectNode(Li.body),n.createContextualFragment(t.responseText)}function y(t){return t.responseXML}function M(){}function b(t){function n(){for(var n,r=e,u=-1,i=r.length;i>++u;)(n=r[u].on)&&n.apply(this,arguments);return t}var e=[],r=new i;return n.on=function(n,u){var i,a=r.get(n);return 2>arguments.length?a&&a.on:(a&&(a.on=null,e=e.slice(0,i=e.indexOf(a)).concat(e.slice(i+1)),r.remove(n)),u&&e.push(r.set(n,{on:u})),t)},n}function x(t,n){return n-(t?Math.ceil(Math.log(t)/Math.LN10):1)}function _(t){return t+""}function w(t,n){var e=Math.pow(10,3*Math.abs(8-n));return{scale:n>8?function(t){return t/e}:function(t){return t*e},symbol:t}}function S(t){return function(n){return 0>=n?0:n>=1?1:t(n)}}function k(t){return function(n){return 1-t(1-n)}}function E(t){return function(n){return.5*(.5>n?t(2*n):2-t(2-2*n))}}function A(t){return t*t}function N(t){return t*t*t}function T(t){if(0>=t)return 0;if(t>=1)return 1;var n=t*t,e=n*t;return 4*(.5>t?e:3*(t-n)+e-.75)}function q(t){return function(n){return Math.pow(n,t)}}function C(t){return 1-Math.cos(t*Ti/2)}function z(t){return Math.pow(2,10*(t-1))}function D(t){return 1-Math.sqrt(1-t*t)}function L(t,n){var e;return 2>arguments.length&&(n=.45),arguments.length?e=n/(2*Ti)*Math.asin(1/t):(t=1,e=n/4),function(r){return 1+t*Math.pow(2,10*-r)*Math.sin(2*(r-e)*Ti/n)}}function F(t){return t||(t=1.70158),function(n){return n*n*((t+1)*n-t)}}function H(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function j(){Ci.event.stopPropagation(),Ci.event.preventDefault()}function P(){for(var t,n=Ci.event;t=n.sourceEvent;)n=t;return n}function R(t){for(var n=new M,e=0,r=arguments.length;r>++e;)n[arguments[e]]=b(n);return n.of=function(e,r){return function(u){try{var i=u.sourceEvent=Ci.event;u.target=t,Ci.event=u,n[u.type].apply(e,r)}finally{Ci.event=i}}},n}function O(t){var n=[t.a,t.b],e=[t.c,t.d],r=U(n),u=Y(n,e),i=U(I(e,n,-u))||0;n[0]*e[1]<e[0]*n[1]&&(n[0]*=-1,n[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(n[1],n[0]):Math.atan2(-e[0],e[1]))*Di,this.translate=[t.e,t.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Di:0}function Y(t,n){return t[0]*n[0]+t[1]*n[1]}function U(t){var n=Math.sqrt(Y(t,t));return n&&(t[0]/=n,t[1]/=n),n}function I(t,n,e){return t[0]+=e*n[0],t[1]+=e*n[1],t}function V(t){return"transform"==t?Ci.interpolateTransform:Ci.interpolate}function Z(t,n){return n=n-(t=+t)?1/(n-t):0,function(e){return(e-t)*n}}function X(t,n){return n=n-(t=+t)?1/(n-t):0,function(e){return Math.max(0,Math.min(1,(e-t)*n))}}function B(){}function $(t,n,e){return new J(t,n,e)}function J(t,n,e){this.r=t,this.g=n,this.b=e}function G(t){return 16>t?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function K(t,n,e){var r,u,i,a=0,o=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(t))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return n(nn(u[0]),nn(u[1]),nn(u[2]))}return(i=oa.get(t))?n(i.r,i.g,i.b):(null!=t&&"#"===t.charAt(0)&&(4===t.length?(a=t.charAt(1),a+=a,o=t.charAt(2),o+=o,c=t.charAt(3),c+=c):7===t.length&&(a=t.substring(1,3),o=t.substring(3,5),c=t.substring(5,7)),a=parseInt(a,16),o=parseInt(o,16),c=parseInt(c,16)),n(a,o,c))}function W(t,n,e){var r,u,i=Math.min(t/=255,n/=255,e/=255),a=Math.max(t,n,e),o=a-i,c=(a+i)/2;return o?(u=.5>c?o/(a+i):o/(2-a-i),r=t==a?(n-e)/o+(e>n?6:0):n==a?(e-t)/o+2:(t-n)/o+4,r*=60):u=r=0,en(r,u,c)}function Q(t,n,e){t=tn(t),n=tn(n),e=tn(e);var r=pn((.4124564*t+.3575761*n+.1804375*e)/sa),u=pn((.2126729*t+.7151522*n+.072175*e)/ha),i=pn((.0193339*t+.119192*n+.9503041*e)/ga);return ln(116*u-16,500*(r-u),200*(u-i))}function tn(t){return.04045>=(t/=255)?t/12.92:Math.pow((t+.055)/1.055,2.4)}function nn(t){var n=parseFloat(t);return"%"===t.charAt(t.length-1)?Math.round(2.55*n):n}function en(t,n,e){return new rn(t,n,e)}function rn(t,n,e){this.h=t,this.s=n,this.l=e}function un(t,n,e){function r(t){return t>360?t-=360:0>t&&(t+=360),60>t?i+(a-i)*t/60:180>t?a:240>t?i+(a-i)*(240-t)/60:i}function u(t){return Math.round(255*r(t))}var i,a;return t%=360,0>t&&(t+=360),n=0>n?0:n>1?1:n,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+n):e+n-e*n,i=2*e-a,$(u(t+120),u(t),u(t-120))}function an(t,n,e){return new on(t,n,e)}function on(t,n,e){this.h=t,this.c=n,this.l=e}function cn(t,n,e){return ln(e,Math.cos(t*=zi)*n,Math.sin(t)*n)}function ln(t,n,e){return new fn(t,n,e)}function fn(t,n,e){this.l=t,this.a=n,this.b=e}function sn(t,n,e){var r=(t+16)/116,u=r+n/500,i=r-e/200;return u=gn(u)*sa,r=gn(r)*ha,i=gn(i)*ga,$(dn(3.2404542*u-1.5371385*r-.4985314*i),dn(-.969266*u+1.8760108*r+.041556*i),dn(.0556434*u-.2040259*r+1.0572252*i))}function hn(t,n,e){return an(180*(Math.atan2(e,n)/Ti),Math.sqrt(n*n+e*e),t)}function gn(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function pn(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function dn(t){return Math.round(255*(.00304>=t?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function mn(t){return Vi(t,ba),t}function vn(t){return function(){return da(t,this)}}function yn(t){return function(){return ma(t,this)}}function Mn(t,n){function e(){this.removeAttribute(t)}function r(){this.removeAttributeNS(t.space,t.local)}function u(){this.setAttribute(t,n)}function i(){this.setAttributeNS(t.space,t.local,n)}function a(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}function o(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}return t=Ci.ns.qualify(t),null==n?t.local?r:e:"function"==typeof n?t.local?o:a:t.local?i:u}function bn(t){return RegExp("(?:^|\\s+)"+Ci.requote(t)+"(?:\\s+|$)","g")}function xn(t,n){function e(){for(var e=-1;u>++e;)t[e](this,n)}function r(){for(var e=-1,r=n.apply(this,arguments);u>++e;)t[e](this,r)}t=t.trim().split(/\s+/).map(_n);var u=t.length;return"function"==typeof n?r:e}function _n(t){var n=bn(t);return function(e,r){if(u=e.classList)return r?u.add(t):u.remove(t);var u=e.className,i=null!=u.baseVal,a=i?u.baseVal:u;r?(n.lastIndex=0,n.test(a)||(a=h(a+" "+t),i?u.baseVal=a:e.className=a)):a&&(a=h(a.replace(n," ")),i?u.baseVal=a:e.className=a)}}function wn(t,n,e){function r(){this.style.removeProperty(t)}function u(){this.style.setProperty(t,n,e)}function i(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}return null==n?r:"function"==typeof n?i:u}function Sn(t,n){function e(){delete this[t]}function r(){this[t]=n}function u(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}return null==n?e:"function"==typeof n?u:r}function kn(t){return{__data__:t}}function En(t){return function(){return Ma(this,t)}}function An(t){return arguments.length||(t=Ci.ascending),function(n,e){return!n-!e||t(n.__data__,e.__data__)}}function Nn(t,n,e){function r(){var n=this[i];n&&(this.removeEventListener(t,n,n.$),delete this[i])}function u(){function u(t){var e=Ci.event;Ci.event=t,o[0]=a.__data__;try{n.apply(a,o)}finally{Ci.event=e}}var a=this,o=Ui(arguments);r.call(this),this.addEventListener(t,this[i]=u,u.$=e),u._=n}var i="__on"+t,a=t.indexOf(".");return a>0&&(t=t.substring(0,a)),n?u:r}function Tn(t,n){for(var e=0,r=t.length;r>e;e++)for(var u,i=t[e],a=0,o=i.length;o>a;a++)(u=i[a])&&n(u,a,e);return t}function qn(t){return Vi(t,_a),t}function Cn(t,n){return Vi(t,Sa),t.id=n,t}function zn(t,n,e,r){var u=t.__transition__||(t.__transition__={active:0,count:0}),a=u[e];if(!a){var o=r.time;return a=u[e]={tween:new i,event:Ci.dispatch("start","end"),time:o,ease:r.ease,delay:r.delay,duration:r.duration},++u.count,Ci.timer(function(r){function i(r){return u.active>e?l():(u.active=e,h.start.call(t,f,n),a.tween.forEach(function(e,r){(r=r.call(t,f,n))&&d.push(r)}),c(r)||Ci.timer(c,0,o),1)}function c(r){if(u.active!==e)return l();for(var i=(r-g)/p,a=s(i),o=d.length;o>0;)d[--o].call(t,a);return i>=1?(l(),h.end.call(t,f,n),1):void 0}function l(){return--u.count?delete u[e]:delete t.__transition__,1}var f=t.__data__,s=a.ease,h=a.event,g=a.delay,p=a.duration,d=[];return r>=g?i(r):Ci.timer(i,g,o),1},0,o),a}}function Dn(t){return null==t&&(t=""),function(){this.textContent=t}}function Ln(t,n,e,r){var u=t.id;return Tn(t,"function"==typeof e?function(t,i,a){t.__transition__[u].tween.set(n,r(e.call(t,t.__data__,i,a)))}:(e=r(e),function(t){t.__transition__[u].tween.set(n,e)}))}function Fn(){for(var t,n=Date.now(),e=Ca;e;)t=n-e.then,t>=e.delay&&(e.flush=e.callback(t)),e=e.next;var r=Hn()-n;r>24?(isFinite(r)&&(clearTimeout(Na),Na=setTimeout(Fn,r)),Aa=0):(Aa=1,za(Fn))}function Hn(){for(var t=null,n=Ca,e=1/0;n;)n.flush?(delete qa[n.callback.id],n=t?t.next=n.next:Ca=n.next):(e=Math.min(e,n.then+n.delay),n=(t=n).next);return e}function jn(t,n){var e=t.ownerSVGElement||t;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>Da&&(Fi.scrollX||Fi.scrollY)){e=Ci.select(Li.body).append("svg").style("position","absolute").style("top",0).style("left",0);var u=e[0][0].getScreenCTM();Da=!(u.f||u.e),e.remove()}return Da?(r.x=n.pageX,r.y=n.pageY):(r.x=n.clientX,r.y=n.clientY),r=r.matrixTransform(t.getScreenCTM().inverse()),[r.x,r.y]}var i=t.getBoundingClientRect();return[n.clientX-i.left-t.clientLeft,n.clientY-i.top-t.clientTop]}function Pn(){}function Rn(t){var n=t[0],e=t[t.length-1];return e>n?[n,e]:[e,n]}function On(t){return t.rangeExtent?t.rangeExtent():Rn(t.range())}function Yn(t,n){var e,r=0,u=t.length-1,i=t[r],a=t[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),(n=n(a-i))&&(t[r]=n.floor(i),t[u]=n.ceil(a)),t}function Un(){return Math}function In(t,n,e,r){function u(){var u=Math.min(t.length,n.length)>2?Gn:Jn,c=r?X:Z;return a=u(t,n,c,e),o=u(n,t,c,Ci.interpolate),i}function i(t){return a(t)}var a,o;return i.invert=function(t){return o(t)},i.domain=function(n){return arguments.length?(t=n.map(Number),u()):t},i.range=function(t){return arguments.length?(n=t,u()):n},i.rangeRound=function(t){return i.range(t).interpolate(Ci.interpolateRound)},i.clamp=function(t){return arguments.length?(r=t,u()):r},i.interpolate=function(t){return arguments.length?(e=t,u()):e},i.ticks=function(n){return Bn(t,n)},i.tickFormat=function(n){return $n(t,n)},i.nice=function(){return Yn(t,Zn),u()},i.copy=function(){return In(t,n,e,r)},u()}function Vn(t,n){return Ci.rebind(t,n,"range","rangeRound","interpolate","clamp")}function Zn(t){return t=Math.pow(10,Math.round(Math.log(t)/Math.LN10)-1),t&&{floor:function(n){return Math.floor(n/t)*t},ceil:function(n){return Math.ceil(n/t)*t}}}function Xn(t,n){var e=Rn(t),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/n)/Math.LN10)),i=n/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Bn(t,n){return Ci.range.apply(Ci,Xn(t,n))}function $n(t,n){return Ci.format(",."+Math.max(0,-Math.floor(Math.log(Xn(t,n)[2])/Math.LN10+.01))+"f")}function Jn(t,n,e,r){var u=e(t[0],t[1]),i=r(n[0],n[1]);return function(t){return i(u(t))}}function Gn(t,n,e,r){var u=[],i=[],a=0,o=Math.min(t.length,n.length)-1;for(t[o]<t[0]&&(t=t.slice().reverse(),n=n.slice().reverse());o>=++a;)u.push(e(t[a-1],t[a])),i.push(r(n[a-1],n[a]));return function(n){var e=Ci.bisect(t,n,1,o)-1;return i[e](u[e](n))}}function Kn(t,n){function e(e){return t(n(e))}var r=n.pow;return e.invert=function(n){return r(t.invert(n))},e.domain=function(u){return arguments.length?(n=0>u[0]?Qn:Wn,r=n.pow,t.domain(u.map(n)),e):t.domain().map(r)},e.nice=function(){return t.domain(Yn(t.domain(),Un)),e},e.ticks=function(){var e=Rn(t.domain()),u=[];if(e.every(isFinite)){var i=Math.floor(e[0]),a=Math.ceil(e[1]),o=r(e[0]),c=r(e[1]);if(n===Qn)for(u.push(r(i));a>i++;)for(var l=9;l>0;l--)u.push(r(i)*l);else{for(;a>i;i++)for(var l=1;10>l;l++)u.push(r(i)*l);u.push(r(i))}for(i=0;o>u[i];i++);for(a=u.length;u[a-1]>c;a--);u=u.slice(i,a)}return u},e.tickFormat=function(t,u){if(2>arguments.length&&(u=La),!arguments.length)return u;var i,a=Math.max(.1,t/e.ticks().length),o=n===Qn?(i=-1e-12,Math.floor):(i=1e-12,Math.ceil);return function(t){return a>=t/r(o(n(t)+i))?u(t):""}},e.copy=function(){return Kn(t.copy(),n)},Vn(e,t)}function Wn(t){return Math.log(0>t?0:t)/Math.LN10}function Qn(t){return-Math.log(t>0?0:-t)/Math.LN10}function te(t,n){function e(n){return t(r(n))}var r=ne(n),u=ne(1/n);return e.invert=function(n){return u(t.invert(n))},e.domain=function(n){return arguments.length?(t.domain(n.map(r)),e):t.domain().map(u)},e.ticks=function(t){return Bn(e.domain(),t)},e.tickFormat=function(t){return $n(e.domain(),t)},e.nice=function(){return e.domain(Yn(e.domain(),Zn))},e.exponent=function(t){if(!arguments.length)return n;var i=e.domain();return r=ne(n=t),u=ne(1/n),e.domain(i)},e.copy=function(){return te(t.copy(),n)},Vn(e,t)}function ne(t){return function(n){return 0>n?-Math.pow(-n,t):Math.pow(n,t)}}function ee(t,n){function e(n){return a[((u.get(n)||u.set(n,t.push(n)))-1)%a.length]}function r(n,e){return Ci.range(t.length).map(function(t){return n+e*t})}var u,a,o;return e.domain=function(r){if(!arguments.length)return t;t=[],u=new i;for(var a,o=-1,c=r.length;c>++o;)u.has(a=r[o])||u.set(a,t.push(a));return e[n.t].apply(e,n.a)},e.range=function(t){return arguments.length?(a=t,o=0,n={t:"range",a:arguments},e):a},e.rangePoints=function(u,i){2>arguments.length&&(i=0);var c=u[0],l=u[1],f=(l-c)/(Math.max(1,t.length-1)+i);return a=r(2>t.length?(c+l)/2:c+f*i/2,f),o=0,n={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){2>arguments.length&&(i=0),3>arguments.length&&(c=i);var l=u[1]<u[0],f=u[l-0],s=u[1-l],h=(s-f)/(t.length-i+2*c);return a=r(f+h*c,h),l&&a.reverse(),o=h*(1-i),n={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){2>arguments.length&&(i=0),3>arguments.length&&(c=i);var l=u[1]<u[0],f=u[l-0],s=u[1-l],h=Math.floor((s-f)/(t.length-i+2*c)),g=s-f-(t.length-i)*h;return a=r(f+Math.round(g/2),h),l&&a.reverse(),o=Math.round(h*(1-i)),n={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return Rn(n.a[0])},e.copy=function(){return ee(t,n)},e.domain(t)}function re(t,n){function e(){var e=0,i=n.length;for(u=[];i>++e;)u[e-1]=Ci.quantile(t,e/i);return r}function r(t){return isNaN(t=+t)?0/0:n[Ci.bisect(u,t)]}var u;return r.domain=function(n){return arguments.length?(t=n.filter(function(t){return!isNaN(t)}).sort(Ci.ascending),e()):t},r.range=function(t){return arguments.length?(n=t,e()):n},r.quantiles=function(){return u},r.copy=function(){return re(t,n)},e()}function ue(t,n,e){function r(n){return e[Math.max(0,Math.min(a,Math.floor(i*(n-t))))]}function u(){return i=e.length/(n-t),a=e.length-1,r}var i,a;return r.domain=function(e){return arguments.length?(t=+e[0],n=+e[e.length-1],u()):[t,n]},r.range=function(t){return arguments.length?(e=t,u()):e},r.copy=function(){return ue(t,n,e)},u()}function ie(t,n){function e(e){return n[Ci.bisect(t,e)]}return e.domain=function(n){return arguments.length?(t=n,e):t},e.range=function(t){return arguments.length?(n=t,e):n},e.copy=function(){return ie(t,n)},e}function ae(t){function n(t){return+t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=e.map(n),n):t},n.ticks=function(n){return Bn(t,n)},n.tickFormat=function(n){return $n(t,n)},n.copy=function(){return ae(t)},n}function oe(t){return t.innerRadius}function ce(t){return t.outerRadius}function le(t){return t.startAngle}function fe(t){return t.endAngle}function se(t){function n(n){function a(){f.push("M",i(t(s),l))}for(var o,f=[],s=[],h=-1,g=n.length,p=c(e),d=c(r);g>++h;)u.call(this,o=n[h],h)?s.push([+p.call(this,o,h),+d.call(this,o,h)]):s.length&&(a(),s=[]);return s.length&&a(),f.length?f.join(""):null}var e=he,r=ge,u=o,i=pe,a=i.key,l=.7;return n.x=function(t){return arguments.length?(e=t,n):e},n.y=function(t){return arguments.length?(r=t,n):r},n.defined=function(t){return arguments.length?(u=t,n):u},n.interpolate=function(t){return arguments.length?(a="function"==typeof t?i=t:(i=Ya.get(t)||pe).key,n):a},n.tension=function(t){return arguments.length?(l=t,n):l},n}function he(t){return t[0]}function ge(t){return t[1]}function pe(t){return t.join("L")}function de(t){return pe(t)+"Z"}function me(t){for(var n=0,e=t.length,r=t[0],u=[r[0],",",r[1]];e>++n;)u.push("V",(r=t[n])[1],"H",r[0]);return u.join("")}function ve(t){for(var n=0,e=t.length,r=t[0],u=[r[0],",",r[1]];e>++n;)u.push("H",(r=t[n])[0],"V",r[1]);return u.join("")}function ye(t,n){return 4>t.length?pe(t):t[1]+xe(t.slice(1,t.length-1),_e(t,n))}function Me(t,n){return 3>t.length?pe(t):t[0]+xe((t.push(t[0]),t),_e([t[t.length-2]].concat(t,[t[1]]),n))}function be(t,n){return 3>t.length?pe(t):t[0]+xe(t,_e(t,n))}function xe(t,n){if(1>n.length||t.length!=n.length&&t.length!=n.length+2)return pe(t);var e=t.length!=n.length,r="",u=t[0],i=t[1],a=n[0],o=a,c=1;if(e&&(r+="Q"+(i[0]-2*a[0]/3)+","+(i[1]-2*a[1]/3)+","+i[0]+","+i[1],u=t[1],c=2),n.length>1){o=n[1],i=t[c],c++,r+="C"+(u[0]+a[0])+","+(u[1]+a[1])+","+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1];for(var l=2;n.length>l;l++,c++)i=t[c],o=n[l],r+="S"+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1]}if(e){var f=t[c];r+="Q"+(i[0]+2*o[0]/3)+","+(i[1]+2*o[1]/3)+","+f[0]+","+f[1]}return r}function _e(t,n){for(var e,r=[],u=(1-n)/2,i=t[0],a=t[1],o=1,c=t.length;c>++o;)e=i,i=a,a=t[o],r.push([u*(a[0]-e[0]),u*(a[1]-e[1])]);return r}function we(t){if(3>t.length)return pe(t);var n=1,e=t.length,r=t[0],u=r[0],i=r[1],a=[u,u,u,(r=t[1])[0]],o=[i,i,i,r[1]],c=[u,",",i];for(Ne(c,a,o);e>++n;)r=t[n],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ne(c,a,o);for(n=-1;2>++n;)a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ne(c,a,o);return c.join("")}function Se(t){if(4>t.length)return pe(t);for(var n,e=[],r=-1,u=t.length,i=[0],a=[0];3>++r;)n=t[r],i.push(n[0]),a.push(n[1]);for(e.push(Ae(Va,i)+","+Ae(Va,a)),--r;u>++r;)n=t[r],i.shift(),i.push(n[0]),a.shift(),a.push(n[1]),Ne(e,i,a);return e.join("")}function ke(t){for(var n,e,r=-1,u=t.length,i=u+4,a=[],o=[];4>++r;)e=t[r%u],a.push(e[0]),o.push(e[1]);for(n=[Ae(Va,a),",",Ae(Va,o)],--r;i>++r;)e=t[r%u],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),Ne(n,a,o);return n.join("")}function Ee(t,n){var e=t.length-1;if(e)for(var r,u,i=t[0][0],a=t[0][1],o=t[e][0]-i,c=t[e][1]-a,l=-1;e>=++l;)r=t[l],u=l/e,r[0]=n*r[0]+(1-n)*(i+u*o),r[1]=n*r[1]+(1-n)*(a+u*c);return we(t)}function Ae(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function Ne(t,n,e){t.push("C",Ae(Ua,n),",",Ae(Ua,e),",",Ae(Ia,n),",",Ae(Ia,e),",",Ae(Va,n),",",Ae(Va,e))}function Te(t,n){return(n[1]-t[1])/(n[0]-t[0])}function qe(t){for(var n=0,e=t.length-1,r=[],u=t[0],i=t[1],a=r[0]=Te(u,i);e>++n;)r[n]=(a+(a=Te(u=i,i=t[n+1])))/2;return r[n]=a,r}function Ce(t){for(var n,e,r,u,i=[],a=qe(t),o=-1,c=t.length-1;c>++o;)n=Te(t[o],t[o+1]),1e-6>Math.abs(n)?a[o]=a[o+1]=0:(e=a[o]/n,r=a[o+1]/n,u=e*e+r*r,u>9&&(u=3*n/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;c>=++o;)u=(t[Math.min(c,o+1)][0]-t[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function ze(t){return 3>t.length?pe(t):t[0]+xe(t,Ce(t))}function De(t){for(var n,e,r,u=-1,i=t.length;i>++u;)n=t[u],e=n[0],r=n[1]+Ra,n[0]=e*Math.cos(r),n[1]=e*Math.sin(r);return t}function Le(t){function n(n){function o(){m.push("M",l(t(y),g),h,s(t(v.reverse()),g),"Z")}for(var f,p,d,m=[],v=[],y=[],M=-1,b=n.length,x=c(e),_=c(u),w=e===r?function(){return p}:c(r),S=u===i?function(){return d}:c(i);b>++M;)a.call(this,f=n[M],M)?(v.push([p=+x.call(this,f,M),d=+_.call(this,f,M)]),y.push([+w.call(this,f,M),+S.call(this,f,M)])):v.length&&(o(),v=[],y=[]);return v.length&&o(),m.length?m.join(""):null}var e=he,r=he,u=0,i=ge,a=o,l=pe,f=l.key,s=l,h="L",g=.7;return n.x=function(t){return arguments.length?(e=r=t,n):r},n.x0=function(t){return arguments.length?(e=t,n):e},n.x1=function(t){return arguments.length?(r=t,n):r},n.y=function(t){return arguments.length?(u=i=t,n):i},n.y0=function(t){return arguments.length?(u=t,n):u},n.y1=function(t){return arguments.length?(i=t,n):i},n.defined=function(t){return arguments.length?(a=t,n):a},n.interpolate=function(t){return arguments.length?(f="function"==typeof t?l=t:(l=Ya.get(t)||pe).key,s=l.reverse||l,h=l.closed?"M":"L",n):f},n.tension=function(t){return arguments.length?(g=t,n):g},n}function Fe(t){return t.radius}function He(t){return[t.x,t.y]}function je(t){return function(){var n=t.apply(this,arguments),e=n[0],r=n[1]+Ra;return[e*Math.cos(r),e*Math.sin(r)]}}function Pe(){return 64}function Re(){return"circle"}function Oe(t){var n=Math.sqrt(t/Ti);return"M0,"+n+"A"+n+","+n+" 0 1,1 0,"+-n+"A"+n+","+n+" 0 1,1 0,"+n+"Z"}function Ye(t,n){t.attr("transform",function(t){return"translate("+n(t)+",0)"})}function Ue(t,n){t.attr("transform",function(t){return"translate(0,"+n(t)+")"})}function Ie(t,n,e){if(r=[],e&&n.length>1){for(var r,u,i,a=Rn(t.domain()),o=-1,c=n.length,l=(n[1]-n[0])/++e;c>++o;)for(u=e;--u>0;)(i=+n[o]-u*l)>=a[0]&&r.push(i);for(--o,u=0;e>++u&&(i=+n[o]+u*l)<a[1];)r.push(i)}return r}function Ve(t){for(var n=t.source,e=t.target,r=Xe(n,e),u=[n];n!==r;)n=n.parent,u.push(n);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Ze(t){for(var n=[],e=t.parent;null!=e;)n.push(t),t=e,e=e.parent;return n.push(t),n}function Xe(t,n){if(t===n)return t;for(var e=Ze(t),r=Ze(n),u=e.pop(),i=r.pop(),a=null;u===i;)a=u,u=e.pop(),i=r.pop();return a}function Be(t){t.fixed|=2}function $e(t){t.fixed&=-7}function Je(t){t.fixed|=4,t.px=t.x,t.py=t.y}function Ge(t){t.fixed&=-5}function Ke(t,n,e){var r=0,u=0;if(t.charge=0,!t.leaf)for(var i,a=t.nodes,o=a.length,c=-1;o>++c;)i=a[c],null!=i&&(Ke(i,n,e),t.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(t.point){t.leaf||(t.point.x+=Math.random()-.5,t.point.y+=Math.random()-.5);var l=n*e[t.point.index];t.charge+=t.pointCharge=l,r+=l*t.point.x,u+=l*t.point.y}t.cx=r/t.charge,t.cy=u/t.charge}function We(t){return t.x}function Qe(t){return t.y}function tr(t,n,e){t.y0=n,t.y=e}function nr(t){return Ci.range(t.length)}function er(t){for(var n=-1,e=t[0].length,r=[];e>++n;)r[n]=0;return r}function rr(t){for(var n,e=1,r=0,u=t[0][1],i=t.length;i>e;++e)(n=t[e][1])>u&&(r=e,u=n);return r}function ur(t){return t.reduce(ir,0)}function ir(t,n){return t+n[1]}function ar(t,n){return or(t,Math.ceil(Math.log(n.length)/Math.LN2+1))}function or(t,n){for(var e=-1,r=+t[0],u=(t[1]-r)/n,i=[];n>=++e;)i[e]=u*e+r;return i}function cr(t){return[Ci.min(t),Ci.max(t)]}function lr(t,n){return Ci.rebind(t,n,"sort","children","value"),t.nodes=t,t.links=gr,t}function fr(t){return t.children}function sr(t){return t.value}function hr(t,n){return n.value-t.value}function gr(t){return Ci.merge(t.map(function(t){return(t.children||[]).map(function(n){return{source:t,target:n}})}))}function pr(t,n){return t.value-n.value}function dr(t,n){var e=t._pack_next;t._pack_next=n,n._pack_prev=t,n._pack_next=e,e._pack_prev=n}function mr(t,n){t._pack_next=n,n._pack_prev=t}function vr(t,n){var e=n.x-t.x,r=n.y-t.y,u=t.r+n.r;return u*u-e*e-r*r>.001}function yr(t){function n(t){f=Math.min(t.x-t.r,f),s=Math.max(t.x+t.r,s),h=Math.min(t.y-t.r,h),g=Math.max(t.y+t.r,g)}if((e=t.children)&&(l=e.length)){var e,r,u,i,a,o,c,l,f=1/0,s=-1/0,h=1/0,g=-1/0;if(e.forEach(Mr),r=e[0],r.x=-r.r,r.y=0,n(r),l>1&&(u=e[1],u.x=u.r,u.y=0,n(u),l>2))for(i=e[2],_r(r,u,i),n(i),dr(r,i),r._pack_prev=i,dr(i,u),u=r._pack_next,a=3;l>a;a++){_r(r,u,i=e[a]);var p=0,d=1,m=1;for(o=u._pack_next;o!==u;o=o._pack_next,d++)if(vr(o,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==o._pack_prev&&!vr(c,i);c=c._pack_prev,m++);p?(m>d||d==m&&u.r<r.r?mr(r,u=o):mr(r=c,u),a--):(dr(r,i),u=i,n(i))}var v=(f+s)/2,y=(h+g)/2,M=0;for(a=0;l>a;a++)i=e[a],i.x-=v,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));t.r=M,e.forEach(br)}}function Mr(t){t._pack_next=t._pack_prev=t}function br(t){delete t._pack_next,delete t._pack_prev}function xr(t,n,e,r){var u=t.children;if(t.x=n+=r*t.x,t.y=e+=r*t.y,t.r*=r,u)for(var i=-1,a=u.length;a>++i;)xr(u[i],n,e,r)}function _r(t,n,e){var r=t.r+e.r,u=n.x-t.x,i=n.y-t.y;if(r&&(u||i)){var a=n.r+e.r,o=u*u+i*i;a*=a,r*=r;var c=.5+(r-a)/(2*o),l=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=t.x+c*u+l*i,e.y=t.y+c*i-l*u}else e.x=t.x+r,e.y=t.y}function wr(t){return 1+Ci.max(t,function(t){return t.y})}function Sr(t){return t.reduce(function(t,n){return t+n.x},0)/t.length}function kr(t){var n=t.children;return n&&n.length?kr(n[0]):t}function Er(t){var n,e=t.children;return e&&(n=e.length)?Er(e[n-1]):t}function Ar(t,n){return t.parent==n.parent?1:2}function Nr(t){var n=t.children;return n&&n.length?n[0]:t._tree.thread}function Tr(t){var n,e=t.children;return e&&(n=e.length)?e[n-1]:t._tree.thread}function qr(t,n){var e=t.children;if(e&&(u=e.length))for(var r,u,i=-1;u>++i;)n(r=qr(e[i],n),t)>0&&(t=r);return t}function Cr(t,n){return t.x-n.x}function zr(t,n){return n.x-t.x}function Dr(t,n){return t.depth-n.depth}function Lr(t,n){function e(t,r){var u=t.children;if(u&&(a=u.length))for(var i,a,o=null,c=-1;a>++c;)i=u[c],e(i,o),o=i;n(t,r)}e(t,null)}function Fr(t){for(var n,e=0,r=0,u=t.children,i=u.length;--i>=0;)n=u[i]._tree,n.prelim+=e,n.mod+=e,e+=n.shift+(r+=n.change)}function Hr(t,n,e){t=t._tree,n=n._tree;var r=e/(n.number-t.number);t.change+=r,n.change-=r,n.shift+=e,n.prelim+=e,n.mod+=e}function jr(t,n,e){return t._tree.ancestor.parent==n.parent?t._tree.ancestor:e}function Pr(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function Rr(t,n){var e=t.x+n[3],r=t.y+n[0],u=t.dx-n[1]-n[3],i=t.dy-n[0]-n[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Or(t,n){function e(t,e){return Ci.xhr(t,n,e).response(r)}function r(t){return e.parse(t.responseText)}function u(n){return n.map(i).join(t)}function i(t){return a.test(t)?'"'+t.replace(/\"/g,'""')+'"':t}var a=RegExp('["'+t+"\n]"),o=t.charCodeAt(0);return e.parse=function(t){var n;return e.parseRows(t,function(t){return n?n(t):(n=Function("d","return {"+t.map(function(t,n){return JSON.stringify(t)+": d["+n+"]"}).join(",")+"}"),void 0)})},e.parseRows=function(t,n){function e(){if(f>=l)return a;if(u)return u=!1,i;var n=f;if(34===t.charCodeAt(n)){for(var e=n;l>e++;)if(34===t.charCodeAt(e)){if(34!==t.charCodeAt(e+1))break;++e}f=e+2;var r=t.charCodeAt(e+1);return 13===r?(u=!0,10===t.charCodeAt(e+2)&&++f):10===r&&(u=!0),t.substring(n+1,e).replace(/""/g,'"')}for(;l>f;){var r=t.charCodeAt(f++),c=1;if(10===r)u=!0;else if(13===r)u=!0,10===t.charCodeAt(f)&&(++f,++c);else if(r!==o)continue;return t.substring(n,f-c)}return t.substring(n)}for(var r,u,i={},a={},c=[],l=t.length,f=0,s=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();(!n||(h=n(h,s++)))&&c.push(h)}return c},e.format=function(t){return t.map(u).join("\n")},e}function Yr(t,n){oo.hasOwnProperty(t.type)&&oo[t.type](t,n)}function Ur(t,n,e){var r,u=-1,i=t.length-e;for(n.lineStart();i>++u;)r=t[u],n.point(r[0],r[1]);n.lineEnd()}function Ir(t,n){var e=-1,r=t.length;for(n.polygonStart();r>++e;)Ur(t[e],n,1);n.polygonEnd()}function Vr(t){return[Math.atan2(t[1],t[0]),Math.asin(Math.max(-1,Math.min(1,t[2])))]}function Zr(t,n){return qi>Math.abs(t[0]-n[0])&&qi>Math.abs(t[1]-n[1])}function Xr(t){var n=t[0],e=t[1],r=Math.cos(e);return[r*Math.cos(n),r*Math.sin(n),Math.sin(e)]}function Br(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function $r(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Jr(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Gr(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function Kr(t){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}function Wr(t){function n(n){function r(e,r){e=t(e,r),n.point(e[0],e[1])}function i(){f=0/0,d.point=a,n.lineStart()}function a(r,i){var a=Xr([r,i]),o=t(r,i);e(f,s,l,h,g,p,f=o[0],s=o[1],l=r,h=a[0],g=a[1],p=a[2],u,n),n.point(f,s)}function o(){d.point=r,n.lineEnd()}function c(){var t,r,c,m,v,y,M;i(),d.point=function(n,e){a(t=n,r=e),c=f,m=s,v=h,y=g,M=p,d.point=a},d.lineEnd=function(){e(f,s,l,h,g,p,c,m,t,v,y,M,u,n),d.lineEnd=o,o()}}var l,f,s,h,g,p,d={point:r,lineStart:i,lineEnd:o,polygonStart:function(){n.polygonStart(),d.lineStart=c},polygonEnd:function(){n.polygonEnd(),d.lineStart=i}};return d}function e(n,u,i,a,o,c,l,f,s,h,g,p,d,m){var v=l-n,y=f-u,M=v*v+y*y;if(M>4*r&&d--){var b=a+h,x=o+g,_=c+p,w=Math.sqrt(b*b+x*x+_*_),S=Math.asin(_/=w),k=qi>Math.abs(Math.abs(_)-1)?(i+s)/2:Math.atan2(x,b),E=t(k,S),A=E[0],N=E[1],T=A-n,q=N-u,C=y*T-v*q;(C*C/M>r||Math.abs((v*T+y*q)/M-.5)>.3)&&(e(n,u,i,a,o,c,A,N,k,b/=w,x/=w,_,d,m),m.point(A,N),e(A,N,k,b,x,_,l,f,s,h,g,p,d,m))}}var r=.5,u=16;return n.precision=function(t){return arguments.length?(u=(r=t*t)>0&&16,n):Math.sqrt(r)},n}function Qr(t,n){function e(t,n){var e=Math.sqrt(i-2*u*Math.sin(n))/u;return[e*Math.sin(t*=u),a-e*Math.cos(t)]}var r=Math.sin(t),u=(r+Math.sin(n))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(t,n){var e=a-n;return[Math.atan2(t,e)/u,Math.asin((i-(t*t+e*e)*u*u)/(2*u))]},e}function tu(t){function n(t,n){r>t&&(r=t),t>i&&(i=t),u>n&&(u=n),n>a&&(a=n)}function e(){o.point=o.lineEnd=Pn}var r,u,i,a,o={point:n,lineStart:Pn,lineEnd:Pn,polygonStart:function(){o.lineEnd=e},polygonEnd:function(){o.point=n}};return function(n){return a=i=-(r=u=1/0),Ci.geo.stream(n,t(o)),[[r,u],[i,a]]}}function nu(t,n){if(!fo){++so,t*=zi;var e=Math.cos(n*=zi);ho+=(e*Math.cos(t)-ho)/so,go+=(e*Math.sin(t)-go)/so,po+=(Math.sin(n)-po)/so}}function eu(){var t,n;fo=1,ru(),fo=2;var e=mo.point;mo.point=function(r,u){e(t=r,n=u)},mo.lineEnd=function(){mo.point(t,n),uu(),mo.lineEnd=uu}}function ru(){function t(t,u){t*=zi;var i=Math.cos(u*=zi),a=i*Math.cos(t),o=i*Math.sin(t),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*o)*l+(l=r*a-n*c)*l+(l=n*o-e*a)*l),n*a+e*o+r*c);so+=l,ho+=l*(n+(n=a)),go+=l*(e+(e=o)),po+=l*(r+(r=c))}var n,e,r;fo>1||(1>fo&&(fo=1,so=ho=go=po=0),mo.point=function(u,i){u*=zi;var a=Math.cos(i*=zi);n=a*Math.cos(u),e=a*Math.sin(u),r=Math.sin(i),mo.point=t})}function uu(){mo.point=nu}function iu(t,n){var e=Math.cos(t),r=Math.sin(t);return function(u,i,a,o){null!=u?(u=au(e,u),i=au(e,i),(a>0?i>u:u>i)&&(u+=2*a*Ti)):(u=t+2*a*Ti,i=t);for(var c,l=a*n,f=u;a>0?f>i:i>f;f-=l)o.point((c=Vr([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function au(t,n){var e=Xr(n);e[0]-=t,Kr(e);var r=Math.acos(Math.max(-1,Math.min(1,-e[1])));return((0>-e[2]?-r:r)+2*Math.PI-qi)%(2*Math.PI)}function ou(t,n,e){return function(r){function u(n,e){t(n,e)&&r.point(n,e)}function i(t,n){m.point(t,n)}function a(){v.point=i,m.lineStart()}function o(){v.point=u,m.lineEnd()}function c(t,n){M.point(t,n),d.push([t,n])}function l(){M.lineStart(),d=[]}function f(){c(d[0][0],d[0][1]),M.lineEnd();var t,n=M.clean(),e=y.buffer(),u=e.length;if(!u)return p=!0,g+=gu(d,-1),d=null,void 0;if(d=null,1&n){t=e[0],h+=gu(t,1);var i,u=t.length-1,a=-1;for(r.lineStart();u>++a;)r.point((i=t[a])[0],i[1]);return r.lineEnd(),void 0}u>1&&2&n&&e.push(e.pop().concat(e.shift())),s.push(e.filter(su))}var s,h,g,p,d,m=n(r),v={point:u,lineStart:a,lineEnd:o,polygonStart:function(){v.point=c,v.lineStart=l,v.lineEnd=f,p=!1,g=h=0,s=[],r.polygonStart()},polygonEnd:function(){v.point=u,v.lineStart=a,v.lineEnd=o,s=Ci.merge(s),s.length?cu(s,e,r):(-qi>h||p&&-qi>g)&&(r.lineStart(),e(null,null,1,r),r.lineEnd()),r.polygonEnd(),s=null},sphere:function(){r.polygonStart(),r.lineStart(),e(null,null,1,r),r.lineEnd(),r.polygonEnd()}},y=hu(),M=n(y);return v}}function cu(t,n,e){var r=[],u=[];if(t.forEach(function(t){if(!(1>=(n=t.length))){var n,i=t[0],a=t[n-1];if(Zr(i,a)){e.lineStart();
+for(var o=0;n>o;++o)e.point((i=t[o])[0],i[1]);return e.lineEnd(),void 0}var c={point:i,points:t,other:null,visited:!1,entry:!0,subject:!0},l={point:i,points:[i],other:c,visited:!1,entry:!1,subject:!1};c.other=l,r.push(c),u.push(l),c={point:a,points:[a],other:null,visited:!1,entry:!1,subject:!0},l={point:a,points:[a],other:c,visited:!1,entry:!0,subject:!1},c.other=l,r.push(c),u.push(l)}}),u.sort(fu),lu(r),lu(u),r.length)for(var i,a,o,c=r[0];;){for(i=c;i.visited;)if((i=i.next)===c)return;a=i.points,e.lineStart();do{if(i.visited=i.other.visited=!0,i.entry){if(i.subject)for(var l=0;a.length>l;l++)e.point((o=a[l])[0],o[1]);else n(i.point,i.next.point,1,e);i=i.next}else{if(i.subject){a=i.prev.points;for(var l=a.length;--l>=0;)e.point((o=a[l])[0],o[1])}else n(i.point,i.prev.point,-1,e);i=i.prev}i=i.other,a=i.points}while(!i.visited);e.lineEnd()}}function lu(t){if(n=t.length){for(var n,e,r=0,u=t[0];n>++r;)u.next=e=t[r],e.prev=u,u=e;u.next=e=t[0],e.prev=u}}function fu(t,n){return(0>(t=t.point)[0]?t[1]-Ti/2-qi:Ti/2-t[1])-(0>(n=n.point)[0]?n[1]-Ti/2-qi:Ti/2-n[1])}function su(t){return t.length>1}function hu(){var t,n=[];return{lineStart:function(){n.push(t=[])},point:function(n,e){t.push([n,e])},lineEnd:Pn,buffer:function(){var e=n;return n=[],t=null,e}}}function gu(t,n){if(!(e=t.length))return 0;for(var e,r,u,i=0,a=0,o=t[0],c=o[0],l=o[1],f=Math.cos(l),s=Math.atan2(n*Math.sin(c)*f,Math.sin(l)),h=1-n*Math.cos(c)*f,g=s;e>++i;)o=t[i],f=Math.cos(l=o[1]),r=Math.atan2(n*Math.sin(c=o[0])*f,Math.sin(l)),u=1-n*Math.cos(c)*f,qi>Math.abs(h-2)&&qi>Math.abs(u-2)||(qi>Math.abs(u)||qi>Math.abs(h)||(qi>Math.abs(Math.abs(r-s)-Ti)?u+h>2&&(a+=4*(r-s)):a+=qi>Math.abs(h-2)?4*(r-g):((3*Ti+r-s)%(2*Ti)-Ti)*(h+u)),g=s,s=r,h=u);return a}function pu(t){var n,e=0/0,r=0/0,u=0/0;return{lineStart:function(){t.lineStart(),n=1},point:function(i,a){var o=i>0?Ti:-Ti,c=Math.abs(i-e);qi>Math.abs(c-Ti)?(t.point(e,r=(r+a)/2>0?Ti/2:-Ti/2),t.point(u,r),t.lineEnd(),t.lineStart(),t.point(o,r),t.point(i,r),n=0):u!==o&&c>=Ti&&(qi>Math.abs(e-u)&&(e-=u*qi),qi>Math.abs(i-o)&&(i-=o*qi),r=du(e,r,i,a),t.point(u,r),t.lineEnd(),t.lineStart(),t.point(o,r),n=0),t.point(e=i,r=a),u=o},lineEnd:function(){t.lineEnd(),e=r=0/0},clean:function(){return 2-n}}}function du(t,n,e,r){var u,i,a=Math.sin(t-e);return Math.abs(a)>qi?Math.atan((Math.sin(n)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(n))*Math.sin(t))/(u*i*a)):(n+r)/2}function mu(t,n,e,r){var u;if(null==t)u=e*Ti/2,r.point(-Ti,u),r.point(0,u),r.point(Ti,u),r.point(Ti,0),r.point(Ti,-u),r.point(0,-u),r.point(-Ti,-u),r.point(-Ti,0),r.point(-Ti,u);else if(Math.abs(t[0]-n[0])>qi){var i=(t[0]<n[0]?1:-1)*Ti;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(n[0],n[1])}function vu(t){function n(t,n){return Math.cos(t)*Math.cos(n)>i}function e(t){var e,u,i,a;return{lineStart:function(){i=u=!1,a=1},point:function(o,c){var l,f=[o,c],s=n(o,c);!e&&(i=u=s)&&t.lineStart(),s!==u&&(l=r(e,f),(Zr(e,l)||Zr(f,l))&&(f[0]+=qi,f[1]+=qi,s=n(f[0],f[1]))),s!==u&&(a=0,(u=s)?(t.lineStart(),l=r(f,e),t.point(l[0],l[1])):(l=r(e,f),t.point(l[0],l[1]),t.lineEnd()),e=l),!s||e&&Zr(e,f)||t.point(f[0],f[1]),e=f},lineEnd:function(){u&&t.lineEnd(),e=null},clean:function(){return a|(i&&u)<<1}}}function r(t,n){var e=Xr(t,0),r=Xr(n,0),u=[1,0,0],a=$r(e,r),o=Br(a,a),c=a[0],l=o-c*c;if(!l)return t;var f=i*o/l,s=-i*c/l,h=$r(u,a),g=Gr(u,f),p=Gr(a,s);Jr(g,p);var d=h,m=Br(g,d),v=Br(d,d),y=Math.sqrt(m*m-v*(Br(g,g)-1)),M=Gr(d,(-m-y)/v);return Jr(M,g),Vr(M)}var u=t*zi,i=Math.cos(u),a=iu(u,6*zi);return ou(n,e,a)}function yu(t,n){function e(e,r){return e=t(e,r),n(e[0],e[1])}return t.invert&&n.invert&&(e.invert=function(e,r){return e=n.invert(e,r),e&&t.invert(e[0],e[1])}),e}function Mu(t,n){return[t,n]}function bu(t,n,e){var r=Ci.range(t,n-qi,e).concat(n);return function(t){return r.map(function(n){return[t,n]})}}function xu(t,n,e){var r=Ci.range(t,n-qi,e).concat(n);return function(t){return r.map(function(n){return[n,t]})}}function _u(t){return(t=Math.sin(t/2))*t}function wu(t,n,e,r){var u=Math.cos(n),i=Math.sin(n),a=Math.cos(r),o=Math.sin(r),c=u*Math.cos(t),l=u*Math.sin(t),f=a*Math.cos(e),s=a*Math.sin(e),h=2*Math.asin(Math.sqrt(_u(r-n)+u*a*_u(e-t))),g=1/Math.sin(h),p=h?function(t){var n=Math.sin(t*=h)*g,e=Math.sin(h-t)*g,r=e*c+n*f,u=e*l+n*s,a=e*i+n*o;return[Math.atan2(u,r)*Di,Math.atan2(a,Math.sqrt(r*r+u*u))*Di]}:function(){return[t*Di,n*Di]};return p.distance=h,p}function Su(t,n){return[t/(2*Ti),Math.max(-.5,Math.min(.5,Math.log(Math.tan(Ti/4+n/2))/(2*Ti)))]}function ku(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Eu(t){var n=Wr(function(n,e){return t([n*Di,e*Di])});return function(t){return t=n(t),{point:function(n,e){t.point(n*zi,e*zi)},sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}}function Au(){function t(t,n){a.push("M",t,",",n,i)}function n(t,n){a.push("M",t,",",n),o.point=e}function e(t,n){a.push("L",t,",",n)}function r(){o.point=t}function u(){a.push("Z")}var i=ku(4.5),a=[],o={point:t,lineStart:function(){o.point=n},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=t},pointRadius:function(t){return i=ku(t),o},result:function(){if(a.length){var t=a.join("");return a=[],t}}};return o}function Nu(t){function n(n,e){t.moveTo(n,e),t.arc(n,e,a,0,2*Ti)}function e(n,e){t.moveTo(n,e),o.point=r}function r(n,e){t.lineTo(n,e)}function u(){o.point=n}function i(){t.closePath()}var a=4.5,o={point:n,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=n},pointRadius:function(t){return a=t,o},result:Pn};return o}function Tu(){function t(t,n){xo+=u*t-r*n,r=t,u=n}var n,e,r,u;_o.point=function(i,a){_o.point=t,n=r=i,e=u=a},_o.lineEnd=function(){t(n,e)}}function qu(t,n){fo||(ho+=t,go+=n,++po)}function Cu(){function t(t,r){var u=t-n,i=r-e,a=Math.sqrt(u*u+i*i);ho+=a*(n+t)/2,go+=a*(e+r)/2,po+=a,n=t,e=r}var n,e;if(1!==fo){if(!(1>fo))return;fo=1,ho=go=po=0}wo.point=function(r,u){wo.point=t,n=r,e=u}}function zu(){wo.point=qu}function Du(){function t(t,n){var e=u*t-r*n;ho+=e*(r+t),go+=e*(u+n),po+=3*e,r=t,u=n}var n,e,r,u;2>fo&&(fo=2,ho=go=po=0),wo.point=function(i,a){wo.point=t,n=r=i,e=u=a},wo.lineEnd=function(){t(n,e)}}function Lu(){function t(t,n){t*=zi,n=n*zi/2+Ti/4;var e=t-r,a=Math.cos(n),o=Math.sin(n),c=i*o,l=ko,f=Eo,s=u*a+c*Math.cos(e),h=c*Math.sin(e);ko=l*s-f*h,Eo=f*s+l*h,r=t,u=a,i=o}var n,e,r,u,i;Ao.point=function(a,o){Ao.point=t,r=(n=a)*zi,u=Math.cos(o=(e=o)*zi/2+Ti/4),i=Math.sin(o)},Ao.lineEnd=function(){t(n,e)}}function Fu(t){return Hu(function(){return t})()}function Hu(t){function n(t){return t=a(t[0]*zi,t[1]*zi),[t[0]*f+o,c-t[1]*f]}function e(t){return t=a.invert((t[0]-o)/f,(c-t[1])/f),t&&[t[0]*Di,t[1]*Di]}function r(){a=yu(i=Pu(d,m,v),u);var t=u(g,p);return o=s-t[0]*f,c=h+t[1]*f,n}var u,i,a,o,c,l=Wr(function(t,n){return t=u(t,n),[t[0]*f+o,c-t[1]*f]}),f=150,s=480,h=250,g=0,p=0,d=0,m=0,v=0,y=vo,M=null;return n.stream=function(t){return ju(i,y(l(t)))},n.clipAngle=function(t){return arguments.length?(y=null==t?(M=t,vo):vu(M=+t),n):M},n.scale=function(t){return arguments.length?(f=+t,r()):f},n.translate=function(t){return arguments.length?(s=+t[0],h=+t[1],r()):[s,h]},n.center=function(t){return arguments.length?(g=t[0]%360*zi,p=t[1]%360*zi,r()):[g*Di,p*Di]},n.rotate=function(t){return arguments.length?(d=t[0]%360*zi,m=t[1]%360*zi,v=t.length>2?t[2]%360*zi:0,r()):[d*Di,m*Di,v*Di]},Ci.rebind(n,l,"precision"),function(){return u=t.apply(this,arguments),n.invert=u.invert&&e,r()}}function ju(t,n){return{point:function(e,r){r=t(e*zi,r*zi),e=r[0],n.point(e>Ti?e-2*Ti:-Ti>e?e+2*Ti:e,r[1])},sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Pu(t,n,e){return t?n||e?yu(Ou(t),Yu(n,e)):Ou(t):n||e?Yu(n,e):Mu}function Ru(t){return function(n,e){return n+=t,[n>Ti?n-2*Ti:-Ti>n?n+2*Ti:n,e]}}function Ou(t){var n=Ru(t);return n.invert=Ru(-t),n}function Yu(t,n){function e(t,n){var e=Math.cos(n),o=Math.cos(t)*e,c=Math.sin(t)*e,l=Math.sin(n),f=l*r+o*u;return[Math.atan2(c*i-f*a,o*r-l*u),Math.asin(Math.max(-1,Math.min(1,f*i+c*a)))]}var r=Math.cos(t),u=Math.sin(t),i=Math.cos(n),a=Math.sin(n);return e.invert=function(t,n){var e=Math.cos(n),o=Math.cos(t)*e,c=Math.sin(t)*e,l=Math.sin(n),f=l*i-c*a;return[Math.atan2(c*i+l*a,o*r+f*u),Math.asin(Math.max(-1,Math.min(1,f*r-o*u)))]},e}function Uu(t,n){function e(n,e){var r=Math.cos(n),u=Math.cos(e),i=t(r*u);return[i*u*Math.sin(n),i*Math.sin(e)]}return e.invert=function(t,e){var r=Math.sqrt(t*t+e*e),u=n(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(t*i,r*a),Math.asin(r&&e*i/r)]},e}function Iu(t,n,e,r){var u,i,a,o,c,l,f;return u=r[t],i=u[0],a=u[1],u=r[n],o=u[0],c=u[1],u=r[e],l=u[0],f=u[1],(f-a)*(o-i)-(c-a)*(l-i)>0}function Vu(t,n,e){return(e[0]-n[0])*(t[1]-n[1])<(e[1]-n[1])*(t[0]-n[0])}function Zu(t,n,e,r){var u=t[0],i=e[0],a=n[0]-u,o=r[0]-i,c=t[1],l=e[1],f=n[1]-c,s=r[1]-l,h=(o*(c-l)-s*(u-i))/(s*a-o*f);return[u+h*a,c+h*f]}function Xu(t,n){var e={list:t.map(function(t,n){return{index:n,x:t[0],y:t[1]}}).sort(function(t,n){return t.y<n.y?-1:t.y>n.y?1:t.x<n.x?-1:t.x>n.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(t,n){return{edge:t,side:n,vertex:null,l:null,r:null}},insert:function(t,n){n.l=t,n.r=t.r,t.r.l=n,t.r=n},leftBound:function(t){var n=r.leftEnd;do n=n.r;while(n!=r.rightEnd&&u.rightOf(n,t));return n=n.l},del:function(t){t.l.r=t.r,t.r.l=t.l,t.edge=null},right:function(t){return t.r},left:function(t){return t.l},leftRegion:function(t){return null==t.edge?e.bottomSite:t.edge.region[t.side]},rightRegion:function(t){return null==t.edge?e.bottomSite:t.edge.region[To[t.side]]}},u={bisect:function(t,n){var e={region:{l:t,r:n},ep:{l:null,r:null}},r=n.x-t.x,u=n.y-t.y,i=r>0?r:-r,a=u>0?u:-u;return e.c=t.x*r+t.y*u+.5*(r*r+u*u),i>a?(e.a=1,e.b=u/r,e.c/=r):(e.b=1,e.a=r/u,e.c/=u),e},intersect:function(t,n){var e=t.edge,r=n.edge;if(!e||!r||e.region.r==r.region.r)return null;var u=e.a*r.b-e.b*r.a;if(1e-10>Math.abs(u))return null;var i,a,o=(e.c*r.b-r.c*e.b)/u,c=(r.c*e.a-e.c*r.a)/u,l=e.region.r,f=r.region.r;l.y<f.y||l.y==f.y&&l.x<f.x?(i=t,a=e):(i=n,a=r);var s=o>=a.region.r.x;return s&&"l"===i.side||!s&&"r"===i.side?null:{x:o,y:c}},rightOf:function(t,n){var e=t.edge,r=e.region.r,u=n.x>r.x;if(u&&"l"===t.side)return 1;if(!u&&"r"===t.side)return 0;if(1===e.a){var i=n.y-r.y,a=n.x-r.x,o=0,c=0;if(!u&&0>e.b||u&&e.b>=0?c=o=i>=e.b*a:(c=n.x+n.y*e.b>e.c,0>e.b&&(c=!c),c||(o=1)),!o){var l=r.x-e.region.l.x;c=e.b*(a*a-i*i)<l*i*(1+2*a/l+e.b*e.b),0>e.b&&(c=!c)}}else{var f=e.c-e.a*n.x,s=n.y-f,h=n.x-r.x,g=f-r.y;c=s*s>h*h+g*g}return"l"===t.side?c:!c},endPoint:function(t,e,r){t.ep[e]=r,t.ep[To[e]]&&n(t)},distance:function(t,n){var e=t.x-n.x,r=t.y-n.y;return Math.sqrt(e*e+r*r)}},i={list:[],insert:function(t,n,e){t.vertex=n,t.ystar=n.y+e;for(var r=0,u=i.list,a=u.length;a>r;r++){var o=u[r];if(!(t.ystar>o.ystar||t.ystar==o.ystar&&n.x>o.vertex.x))break}u.splice(r,0,t)},del:function(t){for(var n=0,e=i.list,r=e.length;r>n&&e[n]!=t;++n);e.splice(n,1)},empty:function(){return 0===i.list.length},nextEvent:function(t){for(var n=0,e=i.list,r=e.length;r>n;++n)if(e[n]==t)return e[n+1];return null},min:function(){var t=i.list[0];return{x:t.vertex.x,y:t.ystar}},extractMin:function(){return i.list.shift()}};r.init(),e.bottomSite=e.list.shift();for(var a,o,c,l,f,s,h,g,p,d,m,v,y,M=e.list.shift();;)if(i.empty()||(a=i.min()),M&&(i.empty()||M.y<a.y||M.y==a.y&&M.x<a.x))o=r.leftBound(M),c=r.right(o),h=r.rightRegion(o),v=u.bisect(h,M),s=r.createHalfEdge(v,"l"),r.insert(o,s),d=u.intersect(o,s),d&&(i.del(o),i.insert(o,d,u.distance(d,M))),o=s,s=r.createHalfEdge(v,"r"),r.insert(o,s),d=u.intersect(s,c),d&&i.insert(s,d,u.distance(d,M)),M=e.list.shift();else{if(i.empty())break;o=i.extractMin(),l=r.left(o),c=r.right(o),f=r.right(c),h=r.leftRegion(o),g=r.rightRegion(c),m=o.vertex,u.endPoint(o.edge,o.side,m),u.endPoint(c.edge,c.side,m),r.del(o),i.del(c),r.del(c),y="l",h.y>g.y&&(p=h,h=g,g=p,y="r"),v=u.bisect(h,g),s=r.createHalfEdge(v,y),r.insert(l,s),u.endPoint(v,To[y],m),d=u.intersect(l,s),d&&(i.del(l),i.insert(l,d,u.distance(d,h))),d=u.intersect(s,f),d&&i.insert(s,d,u.distance(d,h))}for(o=r.right(r.leftEnd);o!=r.rightEnd;o=r.right(o))n(o.edge)}function Bu(){return{leaf:!0,nodes:[],point:null}}function $u(t,n,e,r,u,i){if(!t(n,e,r,u,i)){var a=.5*(e+u),o=.5*(r+i),c=n.nodes;c[0]&&$u(t,c[0],e,r,a,o),c[1]&&$u(t,c[1],a,r,u,o),c[2]&&$u(t,c[2],e,o,a,i),c[3]&&$u(t,c[3],a,o,u,i)}}function Ju(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Gu(t,n,e,r){for(var u,i,a=0,o=n.length,c=e.length;o>a;){if(r>=c)return-1;if(u=n.charCodeAt(a++),37===u){if(i=$o[n.charAt(a++)],!i||0>(r=i(t,e,r)))return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function Ku(t){return RegExp("^(?:"+t.map(Ci.requote).join("|")+")","i")}function Wu(t){for(var n=new i,e=-1,r=t.length;r>++e;)n.set(t[e].toLowerCase(),e);return n}function Qu(t,n,e){t+="";var r=t.length;return e>r?Array(e-r+1).join(n)+t:t}function ti(t,n,e){Yo.lastIndex=0;var r=Yo.exec(n.substring(e));return r?e+=r[0].length:-1}function ni(t,n,e){Oo.lastIndex=0;var r=Oo.exec(n.substring(e));return r?e+=r[0].length:-1}function ei(t,n,e){Vo.lastIndex=0;var r=Vo.exec(n.substring(e));return r?(t.m=Zo.get(r[0].toLowerCase()),e+=r[0].length):-1}function ri(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e));return r?(t.m=Io.get(r[0].toLowerCase()),e+=r[0].length):-1}function ui(t,n,e){return Gu(t,""+Bo.c,n,e)}function ii(t,n,e){return Gu(t,""+Bo.x,n,e)}function ai(t,n,e){return Gu(t,""+Bo.X,n,e)}function oi(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+4));return r?(t.y=+r[0],e+=r[0].length):-1}function ci(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.y=li(+r[0]),e+=r[0].length):-1}function li(t){return t+(t>68?1900:2e3)}function fi(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.m=r[0]-1,e+=r[0].length):-1}function si(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.d=+r[0],e+=r[0].length):-1}function hi(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.H=+r[0],e+=r[0].length):-1}function gi(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.M=+r[0],e+=r[0].length):-1}function pi(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+2));return r?(t.S=+r[0],e+=r[0].length):-1}function di(t,n,e){Jo.lastIndex=0;var r=Jo.exec(n.substring(e,e+3));return r?(t.L=+r[0],e+=r[0].length):-1}function mi(t,n,e){var r=Go.get(n.substring(e,e+=2).toLowerCase());return null==r?-1:(t.p=r,e)}function vi(t){var n=t.getTimezoneOffset(),e=n>0?"-":"+",r=~~(Math.abs(n)/60),u=Math.abs(n)%60;return e+Qu(r,"0",2)+Qu(u,"0",2)}function yi(t){return t.toISOString()}function Mi(t,n,e){function r(n){var e=t(n),r=i(e,1);return r-n>n-e?e:r}function u(e){return n(e=t(new qo(e-1)),1),e}function i(t,e){return n(t=new qo(+t),e),t}function a(t,r,i){var a=u(t),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),n(a,1);else for(;r>a;)o.push(new Date(+a)),n(a,1);return o}function o(t,n,e){try{qo=Ju;var r=new Ju;return r._=t,a(r,n,e)}finally{qo=Date}}t.floor=t,t.round=r,t.ceil=u,t.offset=i,t.range=a;var c=t.utc=bi(t);return c.floor=c,c.round=bi(r),c.ceil=bi(u),c.offset=bi(i),c.range=o,t}function bi(t){return function(n,e){try{qo=Ju;var r=new Ju;return r._=n,t(r,e)._}finally{qo=Date}}}function xi(t,n,e){function r(n){return t(n)}return r.invert=function(n){return wi(t.invert(n))},r.domain=function(n){return arguments.length?(t.domain(n),r):t.domain().map(wi)},r.nice=function(t){return r.domain(Yn(r.domain(),function(){return t}))},r.ticks=function(e,u){var i=_i(r.domain());if("function"!=typeof e){var a=i[1]-i[0],o=a/e,c=Ci.bisect(Wo,o);if(c==Wo.length)return n.year(i,e);if(!c)return t.ticks(e).map(wi);Math.log(o/Wo[c-1])<Math.log(Wo[c]/o)&&--c,e=n[c],u=e[1],e=e[0].range}return e(i[0],new Date(+i[1]+1),u)},r.tickFormat=function(){return e},r.copy=function(){return xi(t.copy(),n,e)},Ci.rebind(r,t,"range","rangeRound","interpolate","clamp")}function _i(t){var n=t[0],e=t[t.length-1];return e>n?[n,e]:[e,n]}function wi(t){return new Date(t)}function Si(t){return function(n){for(var e=t.length-1,r=t[e];!r[1](n);)r=t[--e];return r[0](n)}}function ki(t){var n=new Date(t,0,1);return n.setFullYear(t),n}function Ei(t){var n=t.getFullYear(),e=ki(n),r=ki(n+1);return n+(t-e)/(r-e)}function Ai(t){var n=new Date(Date.UTC(t,0,1));return n.setUTCFullYear(t),n}function Ni(t){var n=t.getUTCFullYear(),e=Ai(n),r=Ai(n+1);return n+(t-e)/(r-e)}var Ti=Math.PI,qi=1e-6,Ci={version:"3.0.8"},zi=Ti/180,Di=180/Ti,Li=document,Fi=window,Hi=".",ji=",",Pi=[3,3];Date.now||(Date.now=function(){return+new Date});try{Li.createElement("div").style.setProperty("opacity",0,"")}catch(Ri){var Oi=Fi.CSSStyleDeclaration.prototype,Yi=Oi.setProperty;Oi.setProperty=function(t,n,e){Yi.call(this,t,n+"",e)}}var Ui=u;try{Ui(Li.documentElement.childNodes)[0].nodeType}catch(Ii){Ui=r}var Vi=[].__proto__?function(t,n){t.__proto__=n}:function(t,n){for(var e in n)t[e]=n[e]};Ci.map=function(t){var n=new i;for(var e in t)n.set(e,t[e]);return n},e(i,{has:function(t){return Zi+t in this},get:function(t){return this[Zi+t]},set:function(t,n){return this[Zi+t]=n},remove:function(t){return t=Zi+t,t in this&&delete this[t]},keys:function(){var t=[];return this.forEach(function(n){t.push(n)}),t},values:function(){var t=[];return this.forEach(function(n,e){t.push(e)}),t},entries:function(){var t=[];return this.forEach(function(n,e){t.push({key:n,value:e})}),t},forEach:function(t){for(var n in this)n.charCodeAt(0)===Xi&&t.call(this,n.substring(1),this[n])}});var Zi="\0",Xi=Zi.charCodeAt(0);Ci.functor=c,Ci.rebind=function(t,n){for(var e,r=1,u=arguments.length;u>++r;)t[e=arguments[r]]=l(t,n,n[e]);return t},Ci.ascending=function(t,n){return n>t?-1:t>n?1:t>=n?0:0/0},Ci.descending=function(t,n){return t>n?-1:n>t?1:n>=t?0:0/0},Ci.mean=function(t,n){var e,r=t.length,u=0,i=-1,a=0;if(1===arguments.length)for(;r>++i;)f(e=t[i])&&(u+=(e-u)/++a);else for(;r>++i;)f(e=n.call(t,t[i],i))&&(u+=(e-u)/++a);return a?u:void 0},Ci.median=function(t,n){return arguments.length>1&&(t=t.map(n)),t=t.filter(f),t.length?Ci.quantile(t.sort(Ci.ascending),.5):void 0},Ci.min=function(t,n){var e,r,u=-1,i=t.length;if(1===arguments.length){for(;i>++u&&(null==(e=t[u])||e!=e);)e=void 0;for(;i>++u;)null!=(r=t[u])&&e>r&&(e=r)}else{for(;i>++u&&(null==(e=n.call(t,t[u],u))||e!=e);)e=void 0;for(;i>++u;)null!=(r=n.call(t,t[u],u))&&e>r&&(e=r)}return e},Ci.max=function(t,n){var e,r,u=-1,i=t.length;if(1===arguments.length){for(;i>++u&&(null==(e=t[u])||e!=e);)e=void 0;for(;i>++u;)null!=(r=t[u])&&r>e&&(e=r)}else{for(;i>++u&&(null==(e=n.call(t,t[u],u))||e!=e);)e=void 0;for(;i>++u;)null!=(r=n.call(t,t[u],u))&&r>e&&(e=r)}return e},Ci.extent=function(t,n){var e,r,u,i=-1,a=t.length;if(1===arguments.length){for(;a>++i&&(null==(e=u=t[i])||e!=e);)e=u=void 0;for(;a>++i;)null!=(r=t[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;a>++i&&(null==(e=u=n.call(t,t[i],i))||e!=e);)e=void 0;for(;a>++i;)null!=(r=n.call(t,t[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},Ci.random={normal:function(t,n){var e=arguments.length;return 2>e&&(n=1),1>e&&(t=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return t+n*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var t=Ci.random.normal.apply(Ci,arguments);return function(){return Math.exp(t())}},irwinHall:function(t){return function(){for(var n=0,e=0;t>e;e++)n+=Math.random();return n/t}}},Ci.sum=function(t,n){var e,r=0,u=t.length,i=-1;if(1===arguments.length)for(;u>++i;)isNaN(e=+t[i])||(r+=e);else for(;u>++i;)isNaN(e=+n.call(t,t[i],i))||(r+=e);return r},Ci.quantile=function(t,n){var e=(t.length-1)*n+1,r=Math.floor(e),u=+t[r-1],i=e-r;return i?u+i*(t[r]-u):u},Ci.shuffle=function(t){for(var n,e,r=t.length;r;)e=0|Math.random()*r--,n=t[r],t[r]=t[e],t[e]=n;return t},Ci.transpose=function(t){return Ci.zip.apply(Ci,t)},Ci.zip=function(){if(!(r=arguments.length))return[];for(var t=-1,n=Ci.min(arguments,s),e=Array(n);n>++t;)for(var r,u=-1,i=e[t]=Array(r);r>++u;)i[u]=arguments[u][t];return e},Ci.bisector=function(t){return{left:function(n,e,r,u){for(3>arguments.length&&(r=0),4>arguments.length&&(u=n.length);u>r;){var i=r+u>>>1;e>t.call(n,n[i],i)?r=i+1:u=i}return r},right:function(n,e,r,u){for(3>arguments.length&&(r=0),4>arguments.length&&(u=n.length);u>r;){var i=r+u>>>1;t.call(n,n[i],i)>e?u=i:r=i+1}return r}}};var Bi=Ci.bisector(function(t){return t});Ci.bisectLeft=Bi.left,Ci.bisect=Ci.bisectRight=Bi.right,Ci.nest=function(){function t(n,o){if(o>=a.length)return r?r.call(u,n):e?n.sort(e):n;for(var c,l,f,s=-1,h=n.length,g=a[o++],p=new i,d={};h>++s;)(f=p.get(c=g(l=n[s])))?f.push(l):p.set(c,[l]);return p.forEach(function(n,e){d[n]=t(e,o)}),d}function n(t,e){if(e>=a.length)return t;var r,u=[],i=o[e++];for(r in t)u.push({key:r,values:n(t[r],e)});return i&&u.sort(function(t,n){return i(t.key,n.key)}),u}var e,r,u={},a=[],o=[];return u.map=function(n){return t(n,0)},u.entries=function(e){return n(t(e,0),0)},u.key=function(t){return a.push(t),u},u.sortKeys=function(t){return o[a.length-1]=t,u},u.sortValues=function(t){return e=t,u},u.rollup=function(t){return r=t,u},u},Ci.keys=function(t){var n=[];for(var e in t)n.push(e);return n},Ci.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},Ci.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},Ci.permute=function(t,n){for(var e=[],r=-1,u=n.length;u>++r;)e[r]=t[n[r]];return e},Ci.merge=function(t){return Array.prototype.concat.apply([],t)},Ci.range=function(t,n,e){if(3>arguments.length&&(e=1,2>arguments.length&&(n=t,t=0)),1/0===(n-t)/e)throw Error("infinite range");var r,u=[],i=g(Math.abs(e)),a=-1;if(t*=i,n*=i,e*=i,0>e)for(;(r=t+e*++a)>n;)u.push(r/i);else for(;n>(r=t+e*++a);)u.push(r/i);return u},Ci.requote=function(t){return t.replace($i,"\\$&")};var $i=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;Ci.round=function(t,n){return n?Math.round(t*(n=Math.pow(10,n)))/n:Math.round(t)},Ci.xhr=function(t,n,e){function r(){var t=l.status;!t&&l.responseText||t>=200&&300>t||304===t?i.load.call(u,c.call(u,l)):i.error.call(u,l)}var u={},i=Ci.dispatch("progress","load","error"),o={},c=a,l=new(Fi.XDomainRequest&&/^(http(s)?:)?\/\//.test(t)?XDomainRequest:XMLHttpRequest);return"onload"in l?l.onload=l.onerror=r:l.onreadystatechange=function(){l.readyState>3&&r()},l.onprogress=function(t){var n=Ci.event;Ci.event=t;try{i.progress.call(u,l)}finally{Ci.event=n}},u.header=function(t,n){return t=(t+"").toLowerCase(),2>arguments.length?o[t]:(null==n?delete o[t]:o[t]=n+"",u)},u.mimeType=function(t){return arguments.length?(n=null==t?null:t+"",u):n},u.response=function(t){return c=t,u},["get","post"].forEach(function(t){u[t]=function(){return u.send.apply(u,[t].concat(Ui(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,t,!0),null==n||"accept"in o||(o.accept=n+",*/*"),l.setRequestHeader)for(var a in o)l.setRequestHeader(a,o[a]);return null!=n&&l.overrideMimeType&&l.overrideMimeType(n),null!=i&&u.on("error",i).on("load",function(t){i(null,t)}),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},Ci.rebind(u,i,"on"),2===arguments.length&&"function"==typeof n&&(e=n,n=null),null==e?u:u.get(p(e))},Ci.text=function(){return Ci.xhr.apply(Ci,arguments).response(d)},Ci.json=function(t,n){return Ci.xhr(t,"application/json",n).response(m)},Ci.html=function(t,n){return Ci.xhr(t,"text/html",n).response(v)},Ci.xml=function(){return Ci.xhr.apply(Ci,arguments).response(y)};var Ji={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};Ci.ns={prefix:Ji,qualify:function(t){var n=t.indexOf(":"),e=t;return n>=0&&(e=t.substring(0,n),t=t.substring(n+1)),Ji.hasOwnProperty(e)?{space:Ji[e],local:t}:t}},Ci.dispatch=function(){for(var t=new M,n=-1,e=arguments.length;e>++n;)t[arguments[n]]=b(t);return t},M.prototype.on=function(t,n){var e=t.indexOf("."),r="";return e>0&&(r=t.substring(e+1),t=t.substring(0,e)),2>arguments.length?this[t].on(r):this[t].on(r,n)},Ci.format=function(t){var n=Gi.exec(t),e=n[1]||" ",r=n[2]||">",u=n[3]||"",i=n[4]||"",a=n[5],o=+n[6],c=n[7],l=n[8],f=n[9],s=1,h="",g=!1;switch(l&&(l=+l.substring(1)),(a||"0"===e&&"="===r)&&(a=e="0",r="=",c&&(o-=Math.floor((o-1)/4))),f){case"n":c=!0,f="g";break;case"%":s=100,h="%",f="f";break;case"p":s=100,h="%",f="r";break;case"b":case"o":case"x":case"X":i&&(i="0"+f.toLowerCase());case"c":case"d":g=!0,l=0;break;case"s":s=-1,f="r"}"#"===i&&(i=""),"r"!=f||l||(f="g"),f=Ki.get(f)||_;var p=a&&c;return function(t){if(g&&t%1)return"";var n=0>t||0===t&&0>1/t?(t=-t,"-"):u;if(0>s){var d=Ci.formatPrefix(t,l);t=d.scale(t),h=d.symbol}else t*=s;t=f(t,l),!a&&c&&(t=Wi(t));var m=i.length+t.length+(p?0:n.length),v=o>m?Array(m=o-m+1).join(e):"";return p&&(t=Wi(v+t)),Hi&&t.replace(".",Hi),n+=i,("<"===r?n+t+v:">"===r?v+n+t:"^"===r?v.substring(0,m>>=1)+n+t+v.substring(m):n+(p?t:v+t))+h}};var Gi=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,Ki=Ci.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,n){return t.toPrecision(n)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},r:function(t,n){return(t=Ci.round(t,x(t,n))).toFixed(Math.max(0,Math.min(20,x(t*(1+1e-15),n))))}}),Wi=a;if(Pi){var Qi=Pi.length;Wi=function(t){for(var n=t.lastIndexOf("."),e=n>=0?"."+t.substring(n+1):(n=t.length,""),r=[],u=0,i=Pi[0];n>0&&i>0;)r.push(t.substring(n-=i,n+i)),i=Pi[u=(u+1)%Qi];return r.reverse().join(ji||"")+e}}var ta=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(w);Ci.formatPrefix=function(t,n){var e=0;return t&&(0>t&&(t*=-1),n&&(t=Ci.round(t,x(t,n))),e=1+Math.floor(1e-12+Math.log(t)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),ta[8+e/3]};var na=function(){return a},ea=Ci.map({linear:na,poly:q,quad:function(){return A},cubic:function(){return N},sin:function(){return C},exp:function(){return z},circle:function(){return D},elastic:L,back:F,bounce:function(){return H}}),ra=Ci.map({"in":a,out:k,"in-out":E,"out-in":function(t){return E(k(t))}});Ci.ease=function(t){var n=t.indexOf("-"),e=n>=0?t.substring(0,n):t,r=n>=0?t.substring(n+1):"in";return e=ea.get(e)||na,r=ra.get(r)||a,S(r(e.apply(null,Array.prototype.slice.call(arguments,1))))},Ci.event=null,Ci.transform=function(t){var n=Li.createElementNS(Ci.ns.prefix.svg,"g");return(Ci.transform=function(t){n.setAttribute("transform",t);var e=n.transform.baseVal.consolidate();return new O(e?e.matrix:ua)})(t)},O.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ua={a:1,b:0,c:0,d:1,e:0,f:0};Ci.interpolate=function(t,n){for(var e,r=Ci.interpolators.length;--r>=0&&!(e=Ci.interpolators[r](t,n)););return e},Ci.interpolateNumber=function(t,n){return n-=t,function(e){return t+n*e}},Ci.interpolateRound=function(t,n){return n-=t,function(e){return Math.round(t+n*e)}},Ci.interpolateString=function(t,n){var e,r,u,i,a,o=0,c=0,l=[],f=[];for(ia.lastIndex=0,r=0;e=ia.exec(n);++r)e.index&&l.push(n.substring(o,c=e.index)),f.push({i:l.length,x:e[0]}),l.push(null),o=ia.lastIndex;for(n.length>o&&l.push(n.substring(o)),r=0,i=f.length;(e=ia.exec(t))&&i>r;++r)if(a=f[r],a.x==e[0]){if(a.i)if(null==l[a.i+1])for(l[a.i-1]+=a.x,l.splice(a.i,1),u=r+1;i>u;++u)f[u].i--;else for(l[a.i-1]+=a.x+l[a.i+1],l.splice(a.i,2),u=r+1;i>u;++u)f[u].i-=2;else if(null==l[a.i+1])l[a.i]=a.x;else for(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1),u=r+1;i>u;++u)f[u].i--;f.splice(r,1),i--,r--}else a.x=Ci.interpolateNumber(parseFloat(e[0]),parseFloat(a.x));for(;i>r;)a=f.pop(),null==l[a.i+1]?l[a.i]=a.x:(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1)),i--;return 1===l.length?null==l[0]?f[0].x:function(){return n}:function(t){for(r=0;i>r;++r)l[(a=f[r]).i]=a.x(t);return l.join("")}},Ci.interpolateTransform=function(t,n){var e,r=[],u=[],i=Ci.transform(t),a=Ci.transform(n),o=i.translate,c=a.translate,l=i.rotate,f=a.rotate,s=i.skew,h=a.skew,g=i.scale,p=a.scale;return o[0]!=c[0]||o[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:Ci.interpolateNumber(o[0],c[0])},{i:3,x:Ci.interpolateNumber(o[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=f?(l-f>180?f+=360:f-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:Ci.interpolateNumber(l,f)})):f&&r.push(r.pop()+"rotate("+f+")"),s!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:Ci.interpolateNumber(s,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:Ci.interpolateNumber(g[0],p[0])},{i:e-2,x:Ci.interpolateNumber(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(t){for(var n,i=-1;e>++i;)r[(n=u[i]).i]=n.x(t);return r.join("")}},Ci.interpolateRgb=function(t,n){t=Ci.rgb(t),n=Ci.rgb(n);var e=t.r,r=t.g,u=t.b,i=n.r-e,a=n.g-r,o=n.b-u;return function(t){return"#"+G(Math.round(e+i*t))+G(Math.round(r+a*t))+G(Math.round(u+o*t))}},Ci.interpolateHsl=function(t,n){t=Ci.hsl(t),n=Ci.hsl(n);var e=t.h,r=t.s,u=t.l,i=n.h-e,a=n.s-r,o=n.l-u;return i>180?i-=360:-180>i&&(i+=360),function(t){return un(e+i*t,r+a*t,u+o*t)+""}},Ci.interpolateLab=function(t,n){t=Ci.lab(t),n=Ci.lab(n);var e=t.l,r=t.a,u=t.b,i=n.l-e,a=n.a-r,o=n.b-u;return function(t){return sn(e+i*t,r+a*t,u+o*t)+""}},Ci.interpolateHcl=function(t,n){t=Ci.hcl(t),n=Ci.hcl(n);var e=t.h,r=t.c,u=t.l,i=n.h-e,a=n.c-r,o=n.l-u;return i>180?i-=360:-180>i&&(i+=360),function(t){return cn(e+i*t,r+a*t,u+o*t)+""}},Ci.interpolateArray=function(t,n){var e,r=[],u=[],i=t.length,a=n.length,o=Math.min(t.length,n.length);for(e=0;o>e;++e)r.push(Ci.interpolate(t[e],n[e]));for(;i>e;++e)u[e]=t[e];for(;a>e;++e)u[e]=n[e];return function(t){for(e=0;o>e;++e)u[e]=r[e](t);return u}},Ci.interpolateObject=function(t,n){var e,r={},u={};for(e in t)e in n?r[e]=V(e)(t[e],n[e]):u[e]=t[e];for(e in n)e in t||(u[e]=n[e]);return function(t){for(e in r)u[e]=r[e](t);return u}};var ia=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;Ci.interpolators=[Ci.interpolateObject,function(t,n){return n instanceof Array&&Ci.interpolateArray(t,n)},function(t,n){return("string"==typeof t||"string"==typeof n)&&Ci.interpolateString(t+"",n+"")},function(t,n){return("string"==typeof n?oa.has(n)||/^(#|rgb\(|hsl\()/.test(n):n instanceof B)&&Ci.interpolateRgb(t,n)},function(t,n){return!isNaN(t=+t)&&!isNaN(n=+n)&&Ci.interpolateNumber(t,n)}],B.prototype.toString=function(){return this.rgb()+""},Ci.rgb=function(t,n,e){return 1===arguments.length?t instanceof J?$(t.r,t.g,t.b):K(""+t,$,un):$(~~t,~~n,~~e)};var aa=J.prototype=new B;aa.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var n=this.r,e=this.g,r=this.b,u=30;return n||e||r?(n&&u>n&&(n=u),e&&u>e&&(e=u),r&&u>r&&(r=u),$(Math.min(255,Math.floor(n/t)),Math.min(255,Math.floor(e/t)),Math.min(255,Math.floor(r/t)))):$(u,u,u)},aa.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),$(Math.floor(t*this.r),Math.floor(t*this.g),Math.floor(t*this.b))},aa.hsl=function(){return W(this.r,this.g,this.b)},aa.toString=function(){return"#"+G(this.r)+G(this.g)+G(this.b)};var oa=Ci.map({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",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#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",grey:"#808080",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",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",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:"#db7093",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",slategrey:"#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"});
+oa.forEach(function(t,n){oa.set(t,K(n,$,un))}),Ci.hsl=function(t,n,e){return 1===arguments.length?t instanceof rn?en(t.h,t.s,t.l):K(""+t,W,en):en(+t,+n,+e)};var ca=rn.prototype=new B;ca.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),en(this.h,this.s,this.l/t)},ca.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),en(this.h,this.s,t*this.l)},ca.rgb=function(){return un(this.h,this.s,this.l)},Ci.hcl=function(t,n,e){return 1===arguments.length?t instanceof on?an(t.h,t.c,t.l):t instanceof fn?hn(t.l,t.a,t.b):hn((t=Q((t=Ci.rgb(t)).r,t.g,t.b)).l,t.a,t.b):an(+t,+n,+e)};var la=on.prototype=new B;la.brighter=function(t){return an(this.h,this.c,Math.min(100,this.l+fa*(arguments.length?t:1)))},la.darker=function(t){return an(this.h,this.c,Math.max(0,this.l-fa*(arguments.length?t:1)))},la.rgb=function(){return cn(this.h,this.c,this.l).rgb()},Ci.lab=function(t,n,e){return 1===arguments.length?t instanceof fn?ln(t.l,t.a,t.b):t instanceof on?cn(t.l,t.c,t.h):Q((t=Ci.rgb(t)).r,t.g,t.b):ln(+t,+n,+e)};var fa=18,sa=.95047,ha=1,ga=1.08883,pa=fn.prototype=new B;pa.brighter=function(t){return ln(Math.min(100,this.l+fa*(arguments.length?t:1)),this.a,this.b)},pa.darker=function(t){return ln(Math.max(0,this.l-fa*(arguments.length?t:1)),this.a,this.b)},pa.rgb=function(){return sn(this.l,this.a,this.b)};var da=function(t,n){return n.querySelector(t)},ma=function(t,n){return n.querySelectorAll(t)},va=Li.documentElement,ya=va.matchesSelector||va.webkitMatchesSelector||va.mozMatchesSelector||va.msMatchesSelector||va.oMatchesSelector,Ma=function(t,n){return ya.call(t,n)};"function"==typeof Sizzle&&(da=function(t,n){return Sizzle(t,n)[0]||null},ma=function(t,n){return Sizzle.uniqueSort(Sizzle(t,n))},Ma=Sizzle.matchesSelector);var ba=[];Ci.selection=function(){return xa},Ci.selection.prototype=ba,ba.select=function(t){var n,e,r,u,i=[];"function"!=typeof t&&(t=vn(t));for(var a=-1,o=this.length;o>++a;){i.push(n=[]),n.parentNode=(r=this[a]).parentNode;for(var c=-1,l=r.length;l>++c;)(u=r[c])?(n.push(e=t.call(u,u.__data__,c)),e&&"__data__"in u&&(e.__data__=u.__data__)):n.push(null)}return mn(i)},ba.selectAll=function(t){var n,e,r=[];"function"!=typeof t&&(t=yn(t));for(var u=-1,i=this.length;i>++u;)for(var a=this[u],o=-1,c=a.length;c>++o;)(e=a[o])&&(r.push(n=Ui(t.call(e,e.__data__,o))),n.parentNode=e);return mn(r)},ba.attr=function(t,n){if(2>arguments.length){if("string"==typeof t){var e=this.node();return t=Ci.ns.qualify(t),t.local?e.getAttributeNS(t.space,t.local):e.getAttribute(t)}for(n in t)this.each(Mn(n,t[n]));return this}return this.each(Mn(t,n))},ba.classed=function(t,n){if(2>arguments.length){if("string"==typeof t){var e=this.node(),r=(t=t.trim().split(/^|\s+/g)).length,u=-1;if(n=e.classList){for(;r>++u;)if(!n.contains(t[u]))return!1}else for(n=e.className,null!=n.baseVal&&(n=n.baseVal);r>++u;)if(!bn(t[u]).test(n))return!1;return!0}for(n in t)this.each(xn(n,t[n]));return this}return this.each(xn(t,n))},ba.style=function(t,n,e){var r=arguments.length;if(3>r){if("string"!=typeof t){2>r&&(n="");for(e in t)this.each(wn(e,t[e],n));return this}if(2>r)return Fi.getComputedStyle(this.node(),null).getPropertyValue(t);e=""}return this.each(wn(t,n,e))},ba.property=function(t,n){if(2>arguments.length){if("string"==typeof t)return this.node()[t];for(n in t)this.each(Sn(n,t[n]));return this}return this.each(Sn(t,n))},ba.text=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.textContent=null==n?"":n}:null==t?function(){this.textContent=""}:function(){this.textContent=t}):this.node().textContent},ba.html=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.innerHTML=null==n?"":n}:null==t?function(){this.innerHTML=""}:function(){this.innerHTML=t}):this.node().innerHTML},ba.append=function(t){function n(){return this.appendChild(Li.createElementNS(this.namespaceURI,t))}function e(){return this.appendChild(Li.createElementNS(t.space,t.local))}return t=Ci.ns.qualify(t),this.select(t.local?e:n)},ba.insert=function(t,n){function e(){return this.insertBefore(Li.createElementNS(this.namespaceURI,t),da(n,this))}function r(){return this.insertBefore(Li.createElementNS(t.space,t.local),da(n,this))}return t=Ci.ns.qualify(t),this.select(t.local?r:e)},ba.remove=function(){return this.each(function(){var t=this.parentNode;t&&t.removeChild(this)})},ba.data=function(t,n){function e(t,e){var r,u,a,o=t.length,s=e.length,h=Math.min(o,s),g=Array(s),p=Array(s),d=Array(o);if(n){var m,v=new i,y=new i,M=[];for(r=-1;o>++r;)m=n.call(u=t[r],u.__data__,r),v.has(m)?d[r]=u:v.set(m,u),M.push(m);for(r=-1;s>++r;)m=n.call(e,a=e[r],r),(u=v.get(m))?(g[r]=u,u.__data__=a):y.has(m)||(p[r]=kn(a)),y.set(m,a),v.remove(m);for(r=-1;o>++r;)v.has(M[r])&&(d[r]=t[r])}else{for(r=-1;h>++r;)u=t[r],a=e[r],u?(u.__data__=a,g[r]=u):p[r]=kn(a);for(;s>r;++r)p[r]=kn(e[r]);for(;o>r;++r)d[r]=t[r]}p.update=g,p.parentNode=g.parentNode=d.parentNode=t.parentNode,c.push(p),l.push(g),f.push(d)}var r,u,a=-1,o=this.length;if(!arguments.length){for(t=Array(o=(r=this[0]).length);o>++a;)(u=r[a])&&(t[a]=u.__data__);return t}var c=qn([]),l=mn([]),f=mn([]);if("function"==typeof t)for(;o>++a;)e(r=this[a],t.call(r,r.parentNode.__data__,a));else for(;o>++a;)e(r=this[a],t);return l.enter=function(){return c},l.exit=function(){return f},l},ba.datum=function(t){return arguments.length?this.property("__data__",t):this.property("__data__")},ba.filter=function(t){var n,e,r,u=[];"function"!=typeof t&&(t=En(t));for(var i=0,a=this.length;a>i;i++){u.push(n=[]),n.parentNode=(e=this[i]).parentNode;for(var o=0,c=e.length;c>o;o++)(r=e[o])&&t.call(r,r.__data__,o)&&n.push(r)}return mn(u)},ba.order=function(){for(var t=-1,n=this.length;n>++t;)for(var e,r=this[t],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},ba.sort=function(t){t=An.apply(this,arguments);for(var n=-1,e=this.length;e>++n;)this[n].sort(t);return this.order()},ba.on=function(t,n,e){var r=arguments.length;if(3>r){if("string"!=typeof t){2>r&&(n=!1);for(e in t)this.each(Nn(e,t[e],n));return this}if(2>r)return(r=this.node()["__on"+t])&&r._;e=!1}return this.each(Nn(t,n,e))},ba.each=function(t){return Tn(this,function(n,e,r){t.call(n,n.__data__,e,r)})},ba.call=function(t){var n=Ui(arguments);return t.apply(n[0]=this,n),this},ba.empty=function(){return!this.node()},ba.node=function(){for(var t=0,n=this.length;n>t;t++)for(var e=this[t],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},ba.transition=function(){var t,n,e=wa||++ka,r=[],u=Object.create(Ea);u.time=Date.now();for(var i=-1,a=this.length;a>++i;){r.push(t=[]);for(var o=this[i],c=-1,l=o.length;l>++c;)(n=o[c])&&zn(n,c,e,u),t.push(n)}return Cn(r,e)};var xa=mn([[Li]]);xa[0].parentNode=va,Ci.select=function(t){return"string"==typeof t?xa.select(t):mn([[t]])},Ci.selectAll=function(t){return"string"==typeof t?xa.selectAll(t):mn([Ui(t)])};var _a=[];Ci.selection.enter=qn,Ci.selection.enter.prototype=_a,_a.append=ba.append,_a.insert=ba.insert,_a.empty=ba.empty,_a.node=ba.node,_a.select=function(t){for(var n,e,r,u,i,a=[],o=-1,c=this.length;c>++o;){r=(u=this[o]).update,a.push(n=[]),n.parentNode=u.parentNode;for(var l=-1,f=u.length;f>++l;)(i=u[l])?(n.push(r[l]=e=t.call(u.parentNode,i.__data__,l)),e.__data__=i.__data__):n.push(null)}return mn(a)};var wa,Sa=[],ka=0,Ea={ease:T,delay:0,duration:250};Sa.call=ba.call,Sa.empty=ba.empty,Sa.node=ba.node,Ci.transition=function(t){return arguments.length?wa?t.transition():t:xa.transition()},Ci.transition.prototype=Sa,Sa.select=function(t){var n,e,r,u=this.id,i=[];"function"!=typeof t&&(t=vn(t));for(var a=-1,o=this.length;o>++a;){i.push(n=[]);for(var c=this[a],l=-1,f=c.length;f>++l;)(r=c[l])&&(e=t.call(r,r.__data__,l))?("__data__"in r&&(e.__data__=r.__data__),zn(e,l,u,r.__transition__[u]),n.push(e)):n.push(null)}return Cn(i,u)},Sa.selectAll=function(t){var n,e,r,u,i,a=this.id,o=[];"function"!=typeof t&&(t=yn(t));for(var c=-1,l=this.length;l>++c;)for(var f=this[c],s=-1,h=f.length;h>++s;)if(r=f[s]){i=r.__transition__[a],e=t.call(r,r.__data__,s),o.push(n=[]);for(var g=-1,p=e.length;p>++g;)zn(u=e[g],g,a,i),n.push(u)}return Cn(o,a)},Sa.filter=function(t){var n,e,r,u=[];"function"!=typeof t&&(t=En(t));for(var i=0,a=this.length;a>i;i++){u.push(n=[]);for(var e=this[i],o=0,c=e.length;c>o;o++)(r=e[o])&&t.call(r,r.__data__,o)&&n.push(r)}return Cn(u,this.id,this.time).ease(this.ease())},Sa.attr=function(t,n){function e(){this.removeAttribute(i)}function r(){this.removeAttributeNS(i.space,i.local)}if(2>arguments.length){for(n in t)this.attr(n,t[n]);return this}var u=V(t),i=Ci.ns.qualify(t);return Ln(this,"attr."+t,n,function(t){function n(){var n,e=this.getAttribute(i);return e!==t&&(n=u(e,t),function(t){this.setAttribute(i,n(t))})}function a(){var n,e=this.getAttributeNS(i.space,i.local);return e!==t&&(n=u(e,t),function(t){this.setAttributeNS(i.space,i.local,n(t))})}return null==t?i.local?r:e:(t+="",i.local?a:n)})},Sa.attrTween=function(t,n){function e(t,e){var r=n.call(this,t,e,this.getAttribute(u));return r&&function(t){this.setAttribute(u,r(t))}}function r(t,e){var r=n.call(this,t,e,this.getAttributeNS(u.space,u.local));return r&&function(t){this.setAttributeNS(u.space,u.local,r(t))}}var u=Ci.ns.qualify(t);return this.tween("attr."+t,u.local?r:e)},Sa.style=function(t,n,e){function r(){this.style.removeProperty(t)}var u=arguments.length;if(3>u){if("string"!=typeof t){2>u&&(n="");for(e in t)this.style(e,t[e],n);return this}e=""}var i=V(t);return Ln(this,"style."+t,n,function(n){function u(){var r,u=Fi.getComputedStyle(this,null).getPropertyValue(t);return u!==n&&(r=i(u,n),function(n){this.style.setProperty(t,r(n),e)})}return null==n?r:(n+="",u)})},Sa.styleTween=function(t,n,e){return 3>arguments.length&&(e=""),this.tween("style."+t,function(r,u){var i=n.call(this,r,u,Fi.getComputedStyle(this,null).getPropertyValue(t));return i&&function(n){this.style.setProperty(t,i(n),e)}})},Sa.text=function(t){return Ln(this,"text",t,Dn)},Sa.remove=function(){return this.each("end.transition",function(){var t;!this.__transition__&&(t=this.parentNode)&&t.removeChild(this)})},Sa.ease=function(t){var n=this.id;return 1>arguments.length?this.node().__transition__[n].ease:("function"!=typeof t&&(t=Ci.ease.apply(Ci,arguments)),Tn(this,function(e){e.__transition__[n].ease=t}))},Sa.delay=function(t){var n=this.id;return Tn(this,"function"==typeof t?function(e,r,u){e.__transition__[n].delay=0|t.call(e,e.__data__,r,u)}:(t|=0,function(e){e.__transition__[n].delay=t}))},Sa.duration=function(t){var n=this.id;return Tn(this,"function"==typeof t?function(e,r,u){e.__transition__[n].duration=Math.max(1,0|t.call(e,e.__data__,r,u))}:(t=Math.max(1,0|t),function(e){e.__transition__[n].duration=t}))},Sa.each=function(t,n){var e=this.id;if(2>arguments.length){var r=Ea,u=wa;wa=e,Tn(this,function(n,r,u){Ea=n.__transition__[e],t.call(n,n.__data__,r,u)}),Ea=r,wa=u}else Tn(this,function(r){r.__transition__[e].event.on(t,n)});return this},Sa.transition=function(){for(var t,n,e,r,u=this.id,i=++ka,a=[],o=0,c=this.length;c>o;o++){a.push(t=[]);for(var n=this[o],l=0,f=n.length;f>l;l++)(e=n[l])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,zn(e,l,i,r)),t.push(e)}return Cn(a,i)},Sa.tween=function(t,n){var e=this.id;return 2>arguments.length?this.node().__transition__[e].tween.get(t):Tn(this,null==n?function(n){n.__transition__[e].tween.remove(t)}:function(r){r.__transition__[e].tween.set(t,n)})};var Aa,Na,Ta=0,qa={},Ca=null;Ci.timer=function(t,n,e){if(3>arguments.length){if(2>arguments.length)n=0;else if(!isFinite(n))return;e=Date.now()}var r=qa[t.id];r&&r.callback===t?(r.then=e,r.delay=n):qa[t.id=++Ta]=Ca={callback:t,then:e,delay:n,next:Ca},Aa||(Na=clearTimeout(Na),Aa=1,za(Fn))},Ci.timer.flush=function(){for(var t,n=Date.now(),e=Ca;e;)t=n-e.then,e.delay||(e.flush=e.callback(t)),e=e.next;Hn()};var za=Fi.requestAnimationFrame||Fi.webkitRequestAnimationFrame||Fi.mozRequestAnimationFrame||Fi.oRequestAnimationFrame||Fi.msRequestAnimationFrame||function(t){setTimeout(t,17)};Ci.mouse=function(t){return jn(t,P())};var Da=/WebKit/.test(Fi.navigator.userAgent)?-1:0;Ci.touches=function(t,n){return 2>arguments.length&&(n=P().touches),n?Ui(n).map(function(n){var e=jn(t,n);return e.identifier=n.identifier,e}):[]},Ci.scale={},Ci.scale.linear=function(){return In([0,1],[0,1],Ci.interpolate,!1)},Ci.scale.log=function(){return Kn(Ci.scale.linear(),Wn)};var La=Ci.format(".0e");Wn.pow=function(t){return Math.pow(10,t)},Qn.pow=function(t){return-Math.pow(10,-t)},Ci.scale.pow=function(){return te(Ci.scale.linear(),1)},Ci.scale.sqrt=function(){return Ci.scale.pow().exponent(.5)},Ci.scale.ordinal=function(){return ee([],{t:"range",a:[[]]})},Ci.scale.category10=function(){return Ci.scale.ordinal().range(Fa)},Ci.scale.category20=function(){return Ci.scale.ordinal().range(Ha)},Ci.scale.category20b=function(){return Ci.scale.ordinal().range(ja)},Ci.scale.category20c=function(){return Ci.scale.ordinal().range(Pa)};var Fa=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Ha=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],ja=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],Pa=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];Ci.scale.quantile=function(){return re([],[])},Ci.scale.quantize=function(){return ue(0,1,[0,1])},Ci.scale.threshold=function(){return ie([.5],[0,1])},Ci.scale.identity=function(){return ae([0,1])},Ci.svg={},Ci.svg.arc=function(){function t(){var t=n.apply(this,arguments),i=e.apply(this,arguments),a=r.apply(this,arguments)+Ra,o=u.apply(this,arguments)+Ra,c=(a>o&&(c=a,a=o,o=c),o-a),l=Ti>c?"0":"1",f=Math.cos(a),s=Math.sin(a),h=Math.cos(o),g=Math.sin(o);return c>=Oa?t?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+t+"A"+t+","+t+" 0 1,0 0,"+-t+"A"+t+","+t+" 0 1,0 0,"+t+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":t?"M"+i*f+","+i*s+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*g+"L"+t*h+","+t*g+"A"+t+","+t+" 0 "+l+",0 "+t*f+","+t*s+"Z":"M"+i*f+","+i*s+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*g+"L0,0"+"Z"}var n=oe,e=ce,r=le,u=fe;return t.innerRadius=function(e){return arguments.length?(n=c(e),t):n},t.outerRadius=function(n){return arguments.length?(e=c(n),t):e},t.startAngle=function(n){return arguments.length?(r=c(n),t):r},t.endAngle=function(n){return arguments.length?(u=c(n),t):u},t.centroid=function(){var t=(n.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+Ra;return[Math.cos(i)*t,Math.sin(i)*t]},t};var Ra=-Ti/2,Oa=2*Ti-1e-6;Ci.svg.line=function(){return se(a)};var Ya=Ci.map({linear:pe,"linear-closed":de,"step-before":me,"step-after":ve,basis:we,"basis-open":Se,"basis-closed":ke,bundle:Ee,cardinal:be,"cardinal-open":ye,"cardinal-closed":Me,monotone:ze});Ya.forEach(function(t,n){n.key=t,n.closed=/-closed$/.test(t)});var Ua=[0,2/3,1/3,0],Ia=[0,1/3,2/3,0],Va=[0,1/6,2/3,1/6];Ci.svg.line.radial=function(){var t=se(De);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},me.reverse=ve,ve.reverse=me,Ci.svg.area=function(){return Le(a)},Ci.svg.area.radial=function(){var t=Le(De);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},Ci.svg.chord=function(){function e(t,n){var e=r(this,o,t,n),c=r(this,l,t,n);return"M"+e.p0+i(e.r,e.p1,e.a1-e.a0)+(u(e,c)?a(e.r,e.p1,e.r,e.p0):a(e.r,e.p1,c.r,c.p0)+i(c.r,c.p1,c.a1-c.a0)+a(c.r,c.p1,e.r,e.p0))+"Z"}function r(t,n,e,r){var u=n.call(t,e,r),i=f.call(t,u,r),a=s.call(t,u,r)+Ra,o=h.call(t,u,r)+Ra;return{r:i,a0:a,a1:o,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(o),i*Math.sin(o)]}}function u(t,n){return t.a0==n.a0&&t.a1==n.a1}function i(t,n,e){return"A"+t+","+t+" 0 "+ +(e>Ti)+",1 "+n}function a(t,n,e,r){return"Q 0,0 "+r}var o=n,l=t,f=Fe,s=le,h=fe;return e.radius=function(t){return arguments.length?(f=c(t),e):f},e.source=function(t){return arguments.length?(o=c(t),e):o},e.target=function(t){return arguments.length?(l=c(t),e):l},e.startAngle=function(t){return arguments.length?(s=c(t),e):s},e.endAngle=function(t){return arguments.length?(h=c(t),e):h},e},Ci.svg.diagonal=function(){function e(t,n){var e=r.call(this,t,n),a=u.call(this,t,n),o=(e.y+a.y)/2,c=[e,{x:e.x,y:o},{x:a.x,y:o},a];return c=c.map(i),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var r=n,u=t,i=He;return e.source=function(t){return arguments.length?(r=c(t),e):r},e.target=function(t){return arguments.length?(u=c(t),e):u},e.projection=function(t){return arguments.length?(i=t,e):i},e},Ci.svg.diagonal.radial=function(){var t=Ci.svg.diagonal(),n=He,e=t.projection;return t.projection=function(t){return arguments.length?e(je(n=t)):n},t},Ci.svg.symbol=function(){function t(t,r){return(Za.get(n.call(this,t,r))||Oe)(e.call(this,t,r))}var n=Re,e=Pe;return t.type=function(e){return arguments.length?(n=c(e),t):n},t.size=function(n){return arguments.length?(e=c(n),t):e},t};var Za=Ci.map({circle:Oe,cross:function(t){var n=Math.sqrt(t/5)/2;return"M"+-3*n+","+-n+"H"+-n+"V"+-3*n+"H"+n+"V"+-n+"H"+3*n+"V"+n+"H"+n+"V"+3*n+"H"+-n+"V"+n+"H"+-3*n+"Z"},diamond:function(t){var n=Math.sqrt(t/(2*Ba)),e=n*Ba;return"M0,"+-n+"L"+e+",0"+" 0,"+n+" "+-e+",0"+"Z"},square:function(t){var n=Math.sqrt(t)/2;return"M"+-n+","+-n+"L"+n+","+-n+" "+n+","+n+" "+-n+","+n+"Z"},"triangle-down":function(t){var n=Math.sqrt(t/Xa),e=n*Xa/2;return"M0,"+e+"L"+n+","+-e+" "+-n+","+-e+"Z"},"triangle-up":function(t){var n=Math.sqrt(t/Xa),e=n*Xa/2;return"M0,"+-e+"L"+n+","+e+" "+-n+","+e+"Z"}});Ci.svg.symbolTypes=Za.keys();var Xa=Math.sqrt(3),Ba=Math.tan(30*zi);Ci.svg.axis=function(){function t(t){t.each(function(){var t,s=Ci.select(this),h=null==l?e.ticks?e.ticks.apply(e,c):e.domain():l,g=null==n?e.tickFormat?e.tickFormat.apply(e,c):String:n,p=Ie(e,h,f),d=s.selectAll(".tick.minor").data(p,String),m=d.enter().insert("line",".tick").attr("class","tick minor").style("opacity",1e-6),v=Ci.transition(d.exit()).style("opacity",1e-6).remove(),y=Ci.transition(d).style("opacity",1),M=s.selectAll(".tick.major").data(h,String),b=M.enter().insert("g","path").attr("class","tick major").style("opacity",1e-6),x=Ci.transition(M.exit()).style("opacity",1e-6).remove(),_=Ci.transition(M).style("opacity",1),w=On(e),S=s.selectAll(".domain").data([0]),k=(S.enter().append("path").attr("class","domain"),Ci.transition(S)),E=e.copy(),A=this.__chart__||E;this.__chart__=E,b.append("line"),b.append("text");var N=b.select("line"),T=_.select("line"),q=M.select("text").text(g),C=b.select("text"),z=_.select("text");switch(r){case"bottom":t=Ye,m.attr("y2",i),y.attr("x2",0).attr("y2",i),N.attr("y2",u),C.attr("y",Math.max(u,0)+o),T.attr("x2",0).attr("y2",u),z.attr("x",0).attr("y",Math.max(u,0)+o),q.attr("dy",".71em").style("text-anchor","middle"),k.attr("d","M"+w[0]+","+a+"V0H"+w[1]+"V"+a);break;case"top":t=Ye,m.attr("y2",-i),y.attr("x2",0).attr("y2",-i),N.attr("y2",-u),C.attr("y",-(Math.max(u,0)+o)),T.attr("x2",0).attr("y2",-u),z.attr("x",0).attr("y",-(Math.max(u,0)+o)),q.attr("dy","0em").style("text-anchor","middle"),k.attr("d","M"+w[0]+","+-a+"V0H"+w[1]+"V"+-a);break;case"left":t=Ue,m.attr("x2",-i),y.attr("x2",-i).attr("y2",0),N.attr("x2",-u),C.attr("x",-(Math.max(u,0)+o)),T.attr("x2",-u).attr("y2",0),z.attr("x",-(Math.max(u,0)+o)).attr("y",0),q.attr("dy",".32em").style("text-anchor","end"),k.attr("d","M"+-a+","+w[0]+"H0V"+w[1]+"H"+-a);break;case"right":t=Ue,m.attr("x2",i),y.attr("x2",i).attr("y2",0),N.attr("x2",u),C.attr("x",Math.max(u,0)+o),T.attr("x2",u).attr("y2",0),z.attr("x",Math.max(u,0)+o).attr("y",0),q.attr("dy",".32em").style("text-anchor","start"),k.attr("d","M"+a+","+w[0]+"H0V"+w[1]+"H"+a)}if(e.ticks)b.call(t,A),_.call(t,E),x.call(t,E),m.call(t,A),y.call(t,E),v.call(t,E);else{var D=E.rangeBand()/2,L=function(t){return E(t)+D};b.call(t,L),_.call(t,L)}})}var n,e=Ci.scale.linear(),r=$a,u=6,i=6,a=6,o=3,c=[10],l=null,f=0;return t.scale=function(n){return arguments.length?(e=n,t):e},t.orient=function(n){return arguments.length?(r=n in Ja?n+"":$a,t):r},t.ticks=function(){return arguments.length?(c=arguments,t):c},t.tickValues=function(n){return arguments.length?(l=n,t):l},t.tickFormat=function(e){return arguments.length?(n=e,t):n},t.tickSize=function(n,e){if(!arguments.length)return u;var r=arguments.length-1;return u=+n,i=r>1?+e:u,a=r>0?+arguments[r]:u,t},t.tickPadding=function(n){return arguments.length?(o=+n,t):o},t.tickSubdivide=function(n){return arguments.length?(f=+n,t):f},t};var $a="bottom",Ja={top:1,right:1,bottom:1,left:1};Ci.svg.brush=function(){function t(i){i.each(function(){var i,a=Ci.select(this),f=a.selectAll(".background").data([0]),s=a.selectAll(".extent").data([0]),h=a.selectAll(".resize").data(l,String);a.style("pointer-events","all").on("mousedown.brush",u).on("touchstart.brush",u),f.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),s.enter().append("rect").attr("class","extent").style("cursor","move"),h.enter().append("g").attr("class",function(t){return"resize "+t}).style("cursor",function(t){return Ga[t]}).append("rect").attr("x",function(t){return/[ew]$/.test(t)?-3:null}).attr("y",function(t){return/^[ns]/.test(t)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),h.style("display",t.empty()?"none":null),h.exit().remove(),o&&(i=On(o),f.attr("x",i[0]).attr("width",i[1]-i[0]),e(a)),c&&(i=On(c),f.attr("y",i[0]).attr("height",i[1]-i[0]),r(a)),n(a)})}function n(t){t.selectAll(".resize").attr("transform",function(t){return"translate("+f[+/e$/.test(t)][0]+","+f[+/^s/.test(t)][1]+")"})}function e(t){t.select(".extent").attr("x",f[0][0]),t.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1][0]-f[0][0])}function r(t){t.select(".extent").attr("y",f[0][1]),t.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1][1]-f[0][1])}function u(){function u(){var t=Ci.event.changedTouches;return t?Ci.touches(v,t)[0]:Ci.mouse(v)}function l(){32==Ci.event.keyCode&&(S||(d=null,k[0]-=f[1][0],k[1]-=f[1][1],S=2),j())}function s(){32==Ci.event.keyCode&&2==S&&(k[0]+=f[1][0],k[1]+=f[1][1],S=0,j())}function h(){var t=u(),i=!1;m&&(t[0]+=m[0],t[1]+=m[1]),S||(Ci.event.altKey?(d||(d=[(f[0][0]+f[1][0])/2,(f[0][1]+f[1][1])/2]),k[0]=f[+(t[0]<d[0])][0],k[1]=f[+(t[1]<d[1])][1]):d=null),_&&g(t,o,0)&&(e(b),i=!0),w&&g(t,c,1)&&(r(b),i=!0),i&&(n(b),M({type:"brush",mode:S?"move":"resize"}))}function g(t,n,e){var r,u,a=On(n),o=a[0],c=a[1],l=k[e],s=f[1][e]-f[0][e];return S&&(o-=l,c-=s+l),r=Math.max(o,Math.min(c,t[e])),S?u=(r+=l)+s:(d&&(l=Math.max(o,Math.min(c,2*d[e]-r))),r>l?(u=r,r=l):u=l),f[0][e]!==r||f[1][e]!==u?(i=null,f[0][e]=r,f[1][e]=u,!0):void 0}function p(){h(),b.style("pointer-events","all").selectAll(".resize").style("display",t.empty()?"none":null),Ci.select("body").style("cursor",null),E.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),M({type:"brushend"}),j()}var d,m,v=this,y=Ci.select(Ci.event.target),M=a.of(v,arguments),b=Ci.select(v),x=y.datum(),_=!/^(n|s)$/.test(x)&&o,w=!/^(e|w)$/.test(x)&&c,S=y.classed("extent"),k=u(),E=Ci.select(Fi).on("mousemove.brush",h).on("mouseup.brush",p).on("touchmove.brush",h).on("touchend.brush",p).on("keydown.brush",l).on("keyup.brush",s);if(S)k[0]=f[0][0]-k[0],k[1]=f[0][1]-k[1];else if(x){var A=+/w$/.test(x),N=+/^n/.test(x);m=[f[1-A][0]-k[0],f[1-N][1]-k[1]],k[0]=f[A][0],k[1]=f[N][1]}else Ci.event.altKey&&(d=k.slice());b.style("pointer-events","none").selectAll(".resize").style("display",null),Ci.select("body").style("cursor",y.style("cursor")),M({type:"brushstart"}),h(),j()}var i,a=R(t,"brushstart","brush","brushend"),o=null,c=null,l=Ka[0],f=[[0,0],[0,0]];return t.x=function(n){return arguments.length?(o=n,l=Ka[!o<<1|!c],t):o},t.y=function(n){return arguments.length?(c=n,l=Ka[!o<<1|!c],t):c},t.extent=function(n){var e,r,u,a,l;return arguments.length?(i=[[0,0],[0,0]],o&&(e=n[0],r=n[1],c&&(e=e[0],r=r[0]),i[0][0]=e,i[1][0]=r,o.invert&&(e=o(e),r=o(r)),e>r&&(l=e,e=r,r=l),f[0][0]=0|e,f[1][0]=0|r),c&&(u=n[0],a=n[1],o&&(u=u[1],a=a[1]),i[0][1]=u,i[1][1]=a,c.invert&&(u=c(u),a=c(a)),u>a&&(l=u,u=a,a=l),f[0][1]=0|u,f[1][1]=0|a),t):(n=i||f,o&&(e=n[0][0],r=n[1][0],i||(e=f[0][0],r=f[1][0],o.invert&&(e=o.invert(e),r=o.invert(r)),e>r&&(l=e,e=r,r=l))),c&&(u=n[0][1],a=n[1][1],i||(u=f[0][1],a=f[1][1],c.invert&&(u=c.invert(u),a=c.invert(a)),u>a&&(l=u,u=a,a=l))),o&&c?[[e,u],[r,a]]:o?[e,r]:c&&[u,a])},t.clear=function(){return i=null,f[0][0]=f[0][1]=f[1][0]=f[1][1]=0,t},t.empty=function(){return o&&f[0][0]===f[1][0]||c&&f[0][1]===f[1][1]},Ci.rebind(t,a,"on")};var Ga={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ka=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];Ci.behavior={},Ci.behavior.drag=function(){function t(){this.on("mousedown.drag",n).on("touchstart.drag",n)}function n(){function t(){var t=o.parentNode;return null!=f?Ci.touches(t).filter(function(t){return t.identifier===f})[0]:Ci.mouse(t)}function n(){if(!o.parentNode)return u();var n=t(),e=n[0]-s[0],r=n[1]-s[1];h|=e|r,s=n,j(),c({type:"drag",x:n[0]+a[0],y:n[1]+a[1],dx:e,dy:r})}function u(){c({type:"dragend"}),h&&(j(),Ci.event.target===l&&g.on("click.drag",i,!0)),g.on(null!=f?"touchmove.drag-"+f:"mousemove.drag",null).on(null!=f?"touchend.drag-"+f:"mouseup.drag",null)}function i(){j(),g.on("click.drag",null)}var a,o=this,c=e.of(o,arguments),l=Ci.event.target,f=Ci.event.touches?Ci.event.changedTouches[0].identifier:null,s=t(),h=0,g=Ci.select(Fi).on(null!=f?"touchmove.drag-"+f:"mousemove.drag",n).on(null!=f?"touchend.drag-"+f:"mouseup.drag",u,!0);r?(a=r.apply(o,arguments),a=[a.x-s[0],a.y-s[1]]):a=[0,0],null==f&&j(),c({type:"dragstart"})}var e=R(t,"drag","dragstart","dragend"),r=null;return t.origin=function(n){return arguments.length?(r=n,t):r},Ci.rebind(t,e,"on")},Ci.behavior.zoom=function(){function t(){this.on("mousedown.zoom",o).on("mousemove.zoom",l).on(to+".zoom",c).on("dblclick.zoom",f).on("touchstart.zoom",s).on("touchmove.zoom",h).on("touchend.zoom",s)}function n(t){return[(t[0]-b[0])/x,(t[1]-b[1])/x]}function e(t){return[t[0]*x+b[0],t[1]*x+b[1]]}function r(t){x=Math.max(_[0],Math.min(_[1],t))}function u(t,n){n=e(n),b[0]+=t[0]-n[0],b[1]+=t[1]-n[1]}function i(){m&&m.domain(d.range().map(function(t){return(t-b[0])/x}).map(d.invert)),y&&y.domain(v.range().map(function(t){return(t-b[1])/x}).map(v.invert))}function a(t){i(),Ci.event.preventDefault(),t({type:"zoom",scale:x,translate:b})}function o(){function t(){l=1,u(Ci.mouse(i),s),a(o)}function e(){l&&j(),f.on("mousemove.zoom",null).on("mouseup.zoom",null),l&&Ci.event.target===c&&f.on("click.zoom",r,!0)}function r(){j(),f.on("click.zoom",null)}var i=this,o=w.of(i,arguments),c=Ci.event.target,l=0,f=Ci.select(Fi).on("mousemove.zoom",t).on("mouseup.zoom",e),s=n(Ci.mouse(i));Fi.focus(),j()}function c(){g||(g=n(Ci.mouse(this))),r(Math.pow(2,.002*Wa())*x),u(Ci.mouse(this),g),a(w.of(this,arguments))}function l(){g=null}function f(){var t=Ci.mouse(this),e=n(t),i=Math.log(x)/Math.LN2;r(Math.pow(2,Ci.event.shiftKey?Math.ceil(i)-1:Math.floor(i)+1)),u(t,e),a(w.of(this,arguments))}function s(){var t=Ci.touches(this),e=Date.now();if(p=x,g={},t.forEach(function(t){g[t.identifier]=n(t)}),j(),1===t.length){if(500>e-M){var i=t[0],o=n(t[0]);r(2*x),u(i,o),a(w.of(this,arguments))}M=e}}function h(){var t=Ci.touches(this),n=t[0],e=g[n.identifier];if(i=t[1]){var i,o=g[i.identifier];n=[(n[0]+i[0])/2,(n[1]+i[1])/2],e=[(e[0]+o[0])/2,(e[1]+o[1])/2],r(Ci.event.scale*p)}u(n,e),M=null,a(w.of(this,arguments))}var g,p,d,m,v,y,M,b=[0,0],x=1,_=Qa,w=R(t,"zoom");return t.translate=function(n){return arguments.length?(b=n.map(Number),i(),t):b},t.scale=function(n){return arguments.length?(x=+n,i(),t):x},t.scaleExtent=function(n){return arguments.length?(_=null==n?Qa:n.map(Number),t):_},t.x=function(n){return arguments.length?(m=n,d=n.copy(),b=[0,0],x=1,t):m},t.y=function(n){return arguments.length?(y=n,v=n.copy(),b=[0,0],x=1,t):y},Ci.rebind(t,w,"on")};var Wa,Qa=[0,1/0],to="onwheel"in document?(Wa=function(){return-Ci.event.deltaY*(Ci.event.deltaMode?120:1)},"wheel"):"onmousewheel"in document?(Wa=function(){return Ci.event.wheelDelta},"mousewheel"):(Wa=function(){return-Ci.event.detail},"MozMousePixelScroll");Ci.layout={},Ci.layout.bundle=function(){return function(t){for(var n=[],e=-1,r=t.length;r>++e;)n.push(Ve(t[e]));return n}},Ci.layout.chord=function(){function t(){var t,l,s,h,g,p={},d=[],m=Ci.range(i),v=[];for(e=[],r=[],t=0,h=-1;i>++h;){for(l=0,g=-1;i>++g;)l+=u[h][g];d.push(l),v.push(Ci.range(i)),t+=l}for(a&&m.sort(function(t,n){return a(d[t],d[n])}),o&&v.forEach(function(t,n){t.sort(function(t,e){return o(u[n][t],u[n][e])})}),t=(2*Ti-f*i)/t,l=0,h=-1;i>++h;){for(s=l,g=-1;i>++g;){var y=m[h],M=v[y][g],b=u[y][M],x=l,_=l+=b*t;p[y+"-"+M]={index:y,subindex:M,startAngle:x,endAngle:_,value:b}}r[y]={index:y,startAngle:s,endAngle:l,value:(l-s)/t},l+=f}for(h=-1;i>++h;)for(g=h-1;i>++g;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&n()}function n(){e.sort(function(t,n){return c((t.source.value+t.target.value)/2,(n.source.value+n.target.value)/2)})}var e,r,u,i,a,o,c,l={},f=0;return l.matrix=function(t){return arguments.length?(i=(u=t)&&u.length,e=r=null,l):u},l.padding=function(t){return arguments.length?(f=t,e=r=null,l):f},l.sortGroups=function(t){return arguments.length?(a=t,e=r=null,l):a},l.sortSubgroups=function(t){return arguments.length?(o=t,e=null,l):o},l.sortChords=function(t){return arguments.length?(c=t,e&&n(),l):c},l.chords=function(){return e||t(),e},l.groups=function(){return r||t(),r},l},Ci.layout.force=function(){function t(t){return function(n,e,r,u){if(n.point!==t){var i=n.cx-t.x,a=n.cy-t.y,o=1/Math.sqrt(i*i+a*a);if(m>(u-e)*o){var c=n.charge*o*o;return t.px-=i*c,t.py-=a*c,!0}if(n.point&&isFinite(o)){var c=n.pointCharge*o*o;t.px-=i*c,t.py-=a*c}}return!n.charge}}function n(t){t.px=Ci.event.x,t.py=Ci.event.y,c.resume()}var e,r,u,i,o,c={},l=Ci.dispatch("start","tick","end"),f=[1,1],s=.9,h=no,g=eo,p=-30,d=.1,m=.8,v=[],y=[];return c.tick=function(){if(.005>(r*=.99))return l.end({type:"end",alpha:r=0}),!0;var n,e,a,c,h,g,m,M,b,x=v.length,_=y.length;for(e=0;_>e;++e)a=y[e],c=a.source,h=a.target,M=h.x-c.x,b=h.y-c.y,(g=M*M+b*b)&&(g=r*i[e]*((g=Math.sqrt(g))-u[e])/g,M*=g,b*=g,h.x-=M*(m=c.weight/(h.weight+c.weight)),h.y-=b*m,c.x+=M*(m=1-m),c.y+=b*m);if((m=r*d)&&(M=f[0]/2,b=f[1]/2,e=-1,m))for(;x>++e;)a=v[e],a.x+=(M-a.x)*m,a.y+=(b-a.y)*m;if(p)for(Ke(n=Ci.geom.quadtree(v),r,o),e=-1;x>++e;)(a=v[e]).fixed||n.visit(t(a));for(e=-1;x>++e;)a=v[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);l.tick({type:"tick",alpha:r})},c.nodes=function(t){return arguments.length?(v=t,c):v},c.links=function(t){return arguments.length?(y=t,c):y},c.size=function(t){return arguments.length?(f=t,c):f},c.linkDistance=function(t){return arguments.length?(h="function"==typeof t?t:+t,c):h},c.distance=c.linkDistance,c.linkStrength=function(t){return arguments.length?(g="function"==typeof t?t:+t,c):g},c.friction=function(t){return arguments.length?(s=+t,c):s},c.charge=function(t){return arguments.length?(p="function"==typeof t?t:+t,c):p},c.gravity=function(t){return arguments.length?(d=+t,c):d},c.theta=function(t){return arguments.length?(m=+t,c):m},c.alpha=function(t){return arguments.length?(t=+t,r?r=t>0?t:0:t>0&&(l.start({type:"start",alpha:r=t}),Ci.timer(c.tick)),c):r},c.start=function(){function t(t,r){for(var u,i=n(e),a=-1,o=i.length;o>++a;)if(!isNaN(u=i[a][t]))return u;
+return Math.random()*r}function n(){if(!a){for(a=[],r=0;s>r;++r)a[r]=[];for(r=0;d>r;++r){var t=y[r];a[t.source.index].push(t.target),a[t.target.index].push(t.source)}}return a[e]}var e,r,a,l,s=v.length,d=y.length,m=f[0],M=f[1];for(e=0;s>e;++e)(l=v[e]).index=e,l.weight=0;for(e=0;d>e;++e)l=y[e],"number"==typeof l.source&&(l.source=v[l.source]),"number"==typeof l.target&&(l.target=v[l.target]),++l.source.weight,++l.target.weight;for(e=0;s>e;++e)l=v[e],isNaN(l.x)&&(l.x=t("x",m)),isNaN(l.y)&&(l.y=t("y",M)),isNaN(l.px)&&(l.px=l.x),isNaN(l.py)&&(l.py=l.y);if(u=[],"function"==typeof h)for(e=0;d>e;++e)u[e]=+h.call(this,y[e],e);else for(e=0;d>e;++e)u[e]=h;if(i=[],"function"==typeof g)for(e=0;d>e;++e)i[e]=+g.call(this,y[e],e);else for(e=0;d>e;++e)i[e]=g;if(o=[],"function"==typeof p)for(e=0;s>e;++e)o[e]=+p.call(this,v[e],e);else for(e=0;s>e;++e)o[e]=p;return c.resume()},c.resume=function(){return c.alpha(.1)},c.stop=function(){return c.alpha(0)},c.drag=function(){return e||(e=Ci.behavior.drag().origin(a).on("dragstart.force",Be).on("drag.force",n).on("dragend.force",$e)),arguments.length?(this.on("mouseover.force",Je).on("mouseout.force",Ge).call(e),void 0):e},Ci.rebind(c,l,"on")};var no=20,eo=1;Ci.layout.partition=function(){function t(n,e,r,u){var i=n.children;if(n.x=e,n.y=n.depth*u,n.dx=r,n.dy=u,i&&(a=i.length)){var a,o,c,l=-1;for(r=n.value?r/n.value:0;a>++l;)t(o=i[l],e,c=o.value*r,u),e+=c}}function n(t){var e=t.children,r=0;if(e&&(u=e.length))for(var u,i=-1;u>++i;)r=Math.max(r,n(e[i]));return 1+r}function e(e,i){var a=r.call(this,e,i);return t(a[0],0,u[0],u[1]/n(a[0])),a}var r=Ci.layout.hierarchy(),u=[1,1];return e.size=function(t){return arguments.length?(u=t,e):u},lr(e,r)},Ci.layout.pie=function(){function t(i){var a=i.map(function(e,r){return+n.call(t,e,r)}),o=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-r)/Ci.sum(a),l=Ci.range(i.length);null!=e&&l.sort(e===ro?function(t,n){return a[n]-a[t]}:function(t,n){return e(i[t],i[n])});var f=[];return l.forEach(function(t){var n;f[t]={data:i[t],value:n=a[t],startAngle:o,endAngle:o+=n*c}}),f}var n=Number,e=ro,r=0,u=2*Ti;return t.value=function(e){return arguments.length?(n=e,t):n},t.sort=function(n){return arguments.length?(e=n,t):e},t.startAngle=function(n){return arguments.length?(r=n,t):r},t.endAngle=function(n){return arguments.length?(u=n,t):u},t};var ro={};Ci.layout.stack=function(){function t(a,c){var l=a.map(function(e,r){return n.call(t,e,r)}),f=l.map(function(n){return n.map(function(n,e){return[i.call(t,n,e),o.call(t,n,e)]})}),s=e.call(t,f,c);l=Ci.permute(l,s),f=Ci.permute(f,s);var h,g,p,d=r.call(t,f,c),m=l.length,v=l[0].length;for(g=0;v>g;++g)for(u.call(t,l[0][g],p=d[g],f[0][g][1]),h=1;m>h;++h)u.call(t,l[h][g],p+=f[h-1][g][1],f[h][g][1]);return a}var n=a,e=nr,r=er,u=tr,i=We,o=Qe;return t.values=function(e){return arguments.length?(n=e,t):n},t.order=function(n){return arguments.length?(e="function"==typeof n?n:uo.get(n)||nr,t):e},t.offset=function(n){return arguments.length?(r="function"==typeof n?n:io.get(n)||er,t):r},t.x=function(n){return arguments.length?(i=n,t):i},t.y=function(n){return arguments.length?(o=n,t):o},t.out=function(n){return arguments.length?(u=n,t):u},t};var uo=Ci.map({"inside-out":function(t){var n,e,r=t.length,u=t.map(rr),i=t.map(ur),a=Ci.range(r).sort(function(t,n){return u[t]-u[n]}),o=0,c=0,l=[],f=[];for(n=0;r>n;++n)e=a[n],c>o?(o+=i[e],l.push(e)):(c+=i[e],f.push(e));return f.reverse().concat(l)},reverse:function(t){return Ci.range(t.length).reverse()},"default":nr}),io=Ci.map({silhouette:function(t){var n,e,r,u=t.length,i=t[0].length,a=[],o=0,c=[];for(e=0;i>e;++e){for(n=0,r=0;u>n;n++)r+=t[n][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)c[e]=(o-a[e])/2;return c},wiggle:function(t){var n,e,r,u,i,a,o,c,l,f=t.length,s=t[0],h=s.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(n=0,u=0;f>n;++n)u+=t[n][e][1];for(n=0,i=0,o=s[e][0]-s[e-1][0];f>n;++n){for(r=0,a=(t[n][e][1]-t[n][e-1][1])/(2*o);n>r;++r)a+=(t[r][e][1]-t[r][e-1][1])/o;i+=a*t[n][e][1]}g[e]=c-=u?i/u*o:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(t){var n,e,r,u=t.length,i=t[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(n=0,r=0;u>n;n++)r+=t[n][e][1];if(r)for(n=0;u>n;n++)t[n][e][1]/=r;else for(n=0;u>n;n++)t[n][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:er});Ci.layout.histogram=function(){function t(t,i){for(var a,o,c=[],l=t.map(e,this),f=r.call(this,l,i),s=u.call(this,f,l,i),i=-1,h=l.length,g=s.length-1,p=n?1:1/h;g>++i;)a=c[i]=[],a.dx=s[i+1]-(a.x=s[i]),a.y=0;if(g>0)for(i=-1;h>++i;)o=l[i],o>=f[0]&&f[1]>=o&&(a=c[Ci.bisect(s,o,1,g)-1],a.y+=p,a.push(t[i]));return c}var n=!0,e=Number,r=cr,u=ar;return t.value=function(n){return arguments.length?(e=n,t):e},t.range=function(n){return arguments.length?(r=c(n),t):r},t.bins=function(n){return arguments.length?(u="number"==typeof n?function(t){return or(t,n)}:c(n),t):u},t.frequency=function(e){return arguments.length?(n=!!e,t):n},t},Ci.layout.hierarchy=function(){function t(n,a,o){var c=u.call(e,n,a);if(n.depth=a,o.push(n),c&&(l=c.length)){for(var l,f,s=-1,h=n.children=[],g=0,p=a+1;l>++s;)f=t(c[s],p,o),f.parent=n,h.push(f),g+=f.value;r&&h.sort(r),i&&(n.value=g)}else i&&(n.value=+i.call(e,n,a)||0);return n}function n(t,r){var u=t.children,a=0;if(u&&(o=u.length))for(var o,c=-1,l=r+1;o>++c;)a+=n(u[c],l);else i&&(a=+i.call(e,t,r)||0);return i&&(t.value=a),a}function e(n){var e=[];return t(n,0,e),e}var r=hr,u=fr,i=sr;return e.sort=function(t){return arguments.length?(r=t,e):r},e.children=function(t){return arguments.length?(u=t,e):u},e.value=function(t){return arguments.length?(i=t,e):i},e.revalue=function(t){return n(t,0),t},e},Ci.layout.pack=function(){function t(t,u){var i=n.call(this,t,u),a=i[0];a.x=0,a.y=0,Lr(a,function(t){t.r=Math.sqrt(t.value)}),Lr(a,yr);var o=r[0],c=r[1],l=Math.max(2*a.r/o,2*a.r/c);if(e>0){var f=e*l/2;Lr(a,function(t){t.r+=f}),Lr(a,yr),Lr(a,function(t){t.r-=f}),l=Math.max(2*a.r/o,2*a.r/c)}return xr(a,o/2,c/2,1/l),i}var n=Ci.layout.hierarchy().sort(pr),e=0,r=[1,1];return t.size=function(n){return arguments.length?(r=n,t):r},t.padding=function(n){return arguments.length?(e=+n,t):e},lr(t,n)},Ci.layout.cluster=function(){function t(t,u){var i,a=n.call(this,t,u),o=a[0],c=0;Lr(o,function(t){var n=t.children;n&&n.length?(t.x=Sr(n),t.y=wr(n)):(t.x=i?c+=e(t,i):0,t.y=0,i=t)});var l=kr(o),f=Er(o),s=l.x-e(l,f)/2,h=f.x+e(f,l)/2;return Lr(o,function(t){t.x=(t.x-s)/(h-s)*r[0],t.y=(1-(o.y?t.y/o.y:1))*r[1]}),a}var n=Ci.layout.hierarchy().sort(null).value(null),e=Ar,r=[1,1];return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(r=n,t):r},lr(t,n)},Ci.layout.tree=function(){function t(t,u){function i(t,n){var r=t.children,u=t._tree;if(r&&(a=r.length)){for(var a,c,l,f=r[0],s=f,h=-1;a>++h;)l=r[h],i(l,c),s=o(l,c,s),c=l;Fr(t);var g=.5*(f._tree.prelim+l._tree.prelim);n?(u.prelim=n._tree.prelim+e(t,n),u.mod=u.prelim-g):u.prelim=g}else n&&(u.prelim=n._tree.prelim+e(t,n))}function a(t,n){t.x=t._tree.prelim+n;var e=t.children;if(e&&(r=e.length)){var r,u=-1;for(n+=t._tree.mod;r>++u;)a(e[u],n)}}function o(t,n,r){if(n){for(var u,i=t,a=t,o=n,c=t.parent.children[0],l=i._tree.mod,f=a._tree.mod,s=o._tree.mod,h=c._tree.mod;o=Tr(o),i=Nr(i),o&&i;)c=Nr(c),a=Tr(a),a._tree.ancestor=t,u=o._tree.prelim+s-i._tree.prelim-l+e(o,i),u>0&&(Hr(jr(o,t,r),t,u),l+=u,f+=u),s+=o._tree.mod,l+=i._tree.mod,h+=c._tree.mod,f+=a._tree.mod;o&&!Tr(a)&&(a._tree.thread=o,a._tree.mod+=s-f),i&&!Nr(c)&&(c._tree.thread=i,c._tree.mod+=l-h,r=t)}return r}var c=n.call(this,t,u),l=c[0];Lr(l,function(t,n){t._tree={ancestor:t,prelim:0,mod:0,change:0,shift:0,number:n?n._tree.number+1:0}}),i(l),a(l,-l._tree.prelim);var f=qr(l,zr),s=qr(l,Cr),h=qr(l,Dr),g=f.x-e(f,s)/2,p=s.x+e(s,f)/2,d=h.depth||1;return Lr(l,function(t){t.x=(t.x-g)/(p-g)*r[0],t.y=t.depth/d*r[1],delete t._tree}),c}var n=Ci.layout.hierarchy().sort(null).value(null),e=Ar,r=[1,1];return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(r=n,t):r},lr(t,n)},Ci.layout.treemap=function(){function t(t,n){for(var e,r,u=-1,i=t.length;i>++u;)r=(e=t[u]).value*(0>n?0:n),e.area=isNaN(r)||0>=r?0:r}function n(e){var i=e.children;if(i&&i.length){var a,o,c,l=s(e),f=[],h=i.slice(),p=1/0,d="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(t(h,l.dx*l.dy/e.value),f.area=0;(c=h.length)>0;)f.push(a=h[c-1]),f.area+=a.area,"squarify"!==g||p>=(o=r(f,d))?(h.pop(),p=o):(f.area-=f.pop().area,u(f,d,l,!1),d=Math.min(l.dx,l.dy),f.length=f.area=0,p=1/0);f.length&&(u(f,d,l,!0),f.length=f.area=0),i.forEach(n)}}function e(n){var r=n.children;if(r&&r.length){var i,a=s(n),o=r.slice(),c=[];for(t(o,a.dx*a.dy/n.value),c.area=0;i=o.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?a.dx:a.dy,a,!o.length),c.length=c.area=0);r.forEach(e)}}function r(t,n){for(var e,r=t.area,u=0,i=1/0,a=-1,o=t.length;o>++a;)(e=t[a].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,n*=n,r?Math.max(n*u*p/r,r/(n*i*p)):1/0}function u(t,n,e,r){var u,i=-1,a=t.length,o=e.x,l=e.y,f=n?c(t.area/n):0;if(n==e.dx){for((r||f>e.dy)&&(f=e.dy);a>++i;)u=t[i],u.x=o,u.y=l,u.dy=f,o+=u.dx=Math.min(e.x+e.dx-o,f?c(u.area/f):0);u.z=!0,u.dx+=e.x+e.dx-o,e.y+=f,e.dy-=f}else{for((r||f>e.dx)&&(f=e.dx);a>++i;)u=t[i],u.x=o,u.y=l,u.dx=f,l+=u.dy=Math.min(e.y+e.dy-l,f?c(u.area/f):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=f,e.dx-=f}}function i(r){var u=a||o(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],a&&o.revalue(i),t([i],i.dx*i.dy/i.value),(a?e:n)(i),h&&(a=u),u}var a,o=Ci.layout.hierarchy(),c=Math.round,l=[1,1],f=null,s=Pr,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(t){return arguments.length?(l=t,i):l},i.padding=function(t){function n(n){var e=t.call(i,n,n.depth);return null==e?Pr(n):Rr(n,"number"==typeof e?[e,e,e,e]:e)}function e(n){return Rr(n,t)}if(!arguments.length)return f;var r;return s=null==(f=t)?Pr:"function"==(r=typeof t)?n:"number"===r?(t=[t,t,t,t],e):e,i},i.round=function(t){return arguments.length?(c=t?Math.round:Number,i):c!=Number},i.sticky=function(t){return arguments.length?(h=t,a=null,i):h},i.ratio=function(t){return arguments.length?(p=t,i):p},i.mode=function(t){return arguments.length?(g=t+"",i):g},lr(i,o)},Ci.csv=Or(",","text/csv"),Ci.tsv=Or("	","text/tab-separated-values"),Ci.geo={},Ci.geo.stream=function(t,n){ao.hasOwnProperty(t.type)?ao[t.type](t,n):Yr(t,n)};var ao={Feature:function(t,n){Yr(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,u=e.length;u>++r;)Yr(e[r].geometry,n)}},oo={Sphere:function(t,n){n.sphere()},Point:function(t,n){var e=t.coordinates;n.point(e[0],e[1])},MultiPoint:function(t,n){for(var e,r=t.coordinates,u=-1,i=r.length;i>++u;)e=r[u],n.point(e[0],e[1])},LineString:function(t,n){Ur(t.coordinates,n,0)},MultiLineString:function(t,n){for(var e=t.coordinates,r=-1,u=e.length;u>++r;)Ur(e[r],n,0)},Polygon:function(t,n){Ir(t.coordinates,n)},MultiPolygon:function(t,n){for(var e=t.coordinates,r=-1,u=e.length;u>++r;)Ir(e[r],n)},GeometryCollection:function(t,n){for(var e=t.geometries,r=-1,u=e.length;u>++r;)Yr(e[r],n)}};Ci.geo.albersUsa=function(){function t(t){return n(t)(t)}function n(t){var n=t[0],a=t[1];return a>50?r:-140>n?u:21>a?i:e}var e=Ci.geo.albers(),r=Ci.geo.albers().rotate([160,0]).center([0,60]).parallels([55,65]),u=Ci.geo.albers().rotate([160,0]).center([0,20]).parallels([8,18]),i=Ci.geo.albers().rotate([60,0]).center([0,10]).parallels([8,18]);return t.scale=function(n){return arguments.length?(e.scale(n),r.scale(.6*n),u.scale(n),i.scale(1.5*n),t.translate(e.translate())):e.scale()},t.translate=function(n){if(!arguments.length)return e.translate();var a=e.scale(),o=n[0],c=n[1];return e.translate(n),r.translate([o-.4*a,c+.17*a]),u.translate([o-.19*a,c+.2*a]),i.translate([o+.58*a,c+.43*a]),t},t.scale(e.scale())},(Ci.geo.albers=function(){var t=29.5*zi,n=45.5*zi,e=Hu(Qr),r=e(t,n);return r.parallels=function(r){return arguments.length?e(t=r[0]*zi,n=r[1]*zi):[t*Di,n*Di]},r.rotate([98,0]).center([0,38]).scale(1e3)}).raw=Qr;var co=Uu(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(Ci.geo.azimuthalEqualArea=function(){return Fu(co)}).raw=co;var lo=Uu(function(t){var n=Math.acos(t);return n&&n/Math.sin(n)},a);(Ci.geo.azimuthalEquidistant=function(){return Fu(lo)}).raw=lo,Ci.geo.bounds=tu(a),Ci.geo.centroid=function(t){fo=so=ho=go=po=0,Ci.geo.stream(t,mo);var n;return so&&Math.abs(n=Math.sqrt(ho*ho+go*go+po*po))>qi?[Math.atan2(go,ho)*Di,Math.asin(Math.max(-1,Math.min(1,po/n)))*Di]:void 0};var fo,so,ho,go,po,mo={sphere:function(){2>fo&&(fo=2,so=ho=go=po=0)},point:nu,lineStart:ru,lineEnd:uu,polygonStart:function(){2>fo&&(fo=2,so=ho=go=po=0),mo.lineStart=eu},polygonEnd:function(){mo.lineStart=ru}};Ci.geo.circle=function(){function t(){var t="function"==typeof r?r.apply(this,arguments):r,n=Pu(-t[0]*zi,-t[1]*zi,0).invert,u=[];return e(null,null,1,{point:function(t,e){u.push(t=n(t,e)),t[0]*=Di,t[1]*=Di}}),{type:"Polygon",coordinates:[u]}}var n,e,r=[0,0],u=6;return t.origin=function(n){return arguments.length?(r=n,t):r},t.angle=function(r){return arguments.length?(e=iu((n=+r)*zi,u*zi),t):n},t.precision=function(r){return arguments.length?(e=iu(n*zi,(u=+r)*zi),t):u},t.angle(90)};var vo=ou(o,pu,mu);(Ci.geo.equirectangular=function(){return Fu(Mu).scale(250/Ti)}).raw=Mu.invert=Mu;var yo=Uu(function(t){return 1/t},Math.atan);(Ci.geo.gnomonic=function(){return Fu(yo)}).raw=yo,Ci.geo.graticule=function(){function t(){return{type:"MultiLineString",coordinates:n()}}function n(){return Ci.range(Math.ceil(r/c)*c,e,c).map(a).concat(Ci.range(Math.ceil(i/l)*l,u,l).map(o))}var e,r,u,i,a,o,c=22.5,l=c,f=2.5;return t.lines=function(){return n().map(function(t){return{type:"LineString",coordinates:t}})},t.outline=function(){return{type:"Polygon",coordinates:[a(r).concat(o(u).slice(1),a(e).reverse().slice(1),o(i).reverse().slice(1))]}},t.extent=function(n){return arguments.length?(r=+n[0][0],e=+n[1][0],i=+n[0][1],u=+n[1][1],r>e&&(n=r,r=e,e=n),i>u&&(n=i,i=u,u=n),t.precision(f)):[[r,i],[e,u]]},t.step=function(n){return arguments.length?(c=+n[0],l=+n[1],t):[c,l]},t.precision=function(n){return arguments.length?(f=+n,a=bu(i,u,f),o=xu(r,e,f),t):f},t.extent([[-180+qi,-90+qi],[180-qi,90-qi]])},Ci.geo.interpolate=function(t,n){return wu(t[0]*zi,t[1]*zi,n[0]*zi,n[1]*zi)},Ci.geo.greatArc=function(){function e(){for(var t=r||a.apply(this,arguments),n=u||o.apply(this,arguments),e=i||Ci.geo.interpolate(t,n),l=0,f=c/e.distance,s=[t];1>(l+=f);)s.push(e(l));return s.push(n),{type:"LineString",coordinates:s}}var r,u,i,a=n,o=t,c=6*zi;return e.distance=function(){return(i||Ci.geo.interpolate(r||a.apply(this,arguments),u||o.apply(this,arguments))).distance},e.source=function(t){return arguments.length?(a=t,r="function"==typeof t?null:t,i=r&&u?Ci.geo.interpolate(r,u):null,e):a},e.target=function(t){return arguments.length?(o=t,u="function"==typeof t?null:t,i=r&&u?Ci.geo.interpolate(r,u):null,e):o},e.precision=function(t){return arguments.length?(c=t*zi,e):c/zi},e},Su.invert=function(t,n){return[2*Ti*t,2*Math.atan(Math.exp(2*Ti*n))-Ti/2]},(Ci.geo.mercator=function(){return Fu(Su).scale(500)}).raw=Su;var Mo=Uu(function(){return 1},Math.asin);(Ci.geo.orthographic=function(){return Fu(Mo)}).raw=Mo,Ci.geo.path=function(){function t(t){return t&&Ci.geo.stream(t,r(u.pointRadius("function"==typeof i?+i.apply(this,arguments):i))),u.result()}var n,e,r,u,i=4.5;return t.area=function(t){return bo=0,Ci.geo.stream(t,r(_o)),bo},t.centroid=function(t){return fo=ho=go=po=0,Ci.geo.stream(t,r(wo)),po?[ho/po,go/po]:void 0},t.bounds=function(t){return tu(r)(t)},t.projection=function(e){return arguments.length?(r=(n=e)?e.stream||Eu(e):a,t):n},t.context=function(n){return arguments.length?(u=null==(e=n)?new Au:new Nu(n),t):e},t.pointRadius=function(n){return arguments.length?(i="function"==typeof n?n:+n,t):i},t.projection(Ci.geo.albersUsa()).context(null)};var bo,xo,_o={point:Pn,lineStart:Pn,lineEnd:Pn,polygonStart:function(){xo=0,_o.lineStart=Tu},polygonEnd:function(){_o.lineStart=_o.lineEnd=_o.point=Pn,bo+=Math.abs(xo/2)}},wo={point:qu,lineStart:Cu,lineEnd:zu,polygonStart:function(){wo.lineStart=Du},polygonEnd:function(){wo.point=qu,wo.lineStart=Cu,wo.lineEnd=zu}};Ci.geo.area=function(t){return So=0,Ci.geo.stream(t,Ao),So};var So,ko,Eo,Ao={sphere:function(){So+=4*Ti},point:Pn,lineStart:Pn,lineEnd:Pn,polygonStart:function(){ko=1,Eo=0,Ao.lineStart=Lu},polygonEnd:function(){var t=2*Math.atan2(Eo,ko);So+=0>t?4*Ti+t:t,Ao.lineStart=Ao.lineEnd=Ao.point=Pn}};Ci.geo.projection=Fu,Ci.geo.projectionMutator=Hu;var No=Uu(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});(Ci.geo.stereographic=function(){return Fu(No)}).raw=No,Ci.geom={},Ci.geom.hull=function(t){if(3>t.length)return[];var n,e,r,u,i,a,o,c,l,f,s=t.length,h=s-1,g=[],p=[],d=0;for(n=1;s>n;++n)t[n][1]<t[d][1]?d=n:t[n][1]==t[d][1]&&(d=t[n][0]<t[d][0]?n:d);for(n=0;s>n;++n)n!==d&&(u=t[n][1]-t[d][1],r=t[n][0]-t[d][0],g.push({angle:Math.atan2(u,r),index:n}));for(g.sort(function(t,n){return t.angle-n.angle}),l=g[0].angle,c=g[0].index,o=0,n=1;h>n;++n)e=g[n].index,l==g[n].angle?(r=t[c][0]-t[d][0],u=t[c][1]-t[d][1],i=t[e][0]-t[d][0],a=t[e][1]-t[d][1],r*r+u*u>=i*i+a*a?g[n].index=-1:(g[o].index=-1,l=g[n].angle,o=n,c=e)):(l=g[n].angle,o=n,c=e);for(p.push(d),n=0,e=0;2>n;++e)-1!==g[e].index&&(p.push(g[e].index),n++);for(f=p.length;h>e;++e)if(-1!==g[e].index){for(;!Iu(p[f-2],p[f-1],g[e].index,t);)--f;p[f++]=g[e].index}var m=[];for(n=0;f>n;++n)m.push(t[p[n]]);return m},Ci.geom.polygon=function(t){return t.area=function(){for(var n=0,e=t.length,r=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];e>++n;)r+=t[n-1][1]*t[n][0]-t[n-1][0]*t[n][1];return.5*r},t.centroid=function(n){var e,r,u=-1,i=t.length,a=0,o=0,c=t[i-1];for(arguments.length||(n=-1/(6*t.area()));i>++u;)e=c,c=t[u],r=e[0]*c[1]-c[0]*e[1],a+=(e[0]+c[0])*r,o+=(e[1]+c[1])*r;return[a*n,o*n]},t.clip=function(n){for(var e,r,u,i,a,o,c=-1,l=t.length,f=t[l-1];l>++c;){for(e=n.slice(),n.length=0,i=t[c],a=e[(u=e.length)-1],r=-1;u>++r;)o=e[r],Vu(o,f,i)?(Vu(a,f,i)||n.push(Zu(a,o,f,i)),n.push(o)):Vu(a,f,i)&&n.push(Zu(a,o,f,i)),a=o;f=i}return n},t},Ci.geom.voronoi=function(t){var n=t.map(function(){return[]}),e=1e6;return Xu(t,function(t){var r,u,i,a,o,c;1===t.a&&t.b>=0?(r=t.ep.r,u=t.ep.l):(r=t.ep.l,u=t.ep.r),1===t.a?(o=r?r.y:-e,i=t.c-t.b*o,c=u?u.y:e,a=t.c-t.b*c):(i=r?r.x:-e,o=t.c-t.a*i,a=u?u.x:e,c=t.c-t.a*a);var l=[i,o],f=[a,c];n[t.region.l.index].push(l,f),n[t.region.r.index].push(l,f)}),n=n.map(function(n,e){var r=t[e][0],u=t[e][1],i=n.map(function(t){return Math.atan2(t[0]-r,t[1]-u)}),a=Ci.range(n.length).sort(function(t,n){return i[t]-i[n]});return a.filter(function(t,n){return!n||i[t]-i[a[n-1]]>qi}).map(function(t){return n[t]})}),n.forEach(function(n,r){var u=n.length;if(!u)return n.push([-e,-e],[-e,e],[e,e],[e,-e]);if(!(u>2)){var i=t[r],a=n[0],o=n[1],c=i[0],l=i[1],f=a[0],s=a[1],h=o[0],g=o[1],p=Math.abs(h-f),d=g-s;if(qi>Math.abs(d)){var m=s>l?-e:e;n.push([-e,m],[e,m])}else if(qi>p){var v=f>c?-e:e;n.push([v,-e],[v,e])}else{var m=(f-c)*(g-s)>(h-f)*(s-l)?e:-e,y=Math.abs(d)-p;qi>Math.abs(y)?n.push([0>d?m:-m,m]):(y>0&&(m*=-1),n.push([-e,m],[e,m]))}}}),n};var To={l:"r",r:"l"};Ci.geom.delaunay=function(t){var n=t.map(function(){return[]}),e=[];return Xu(t,function(e){n[e.region.l.index].push(t[e.region.r.index])}),n.forEach(function(n,r){var u=t[r],i=u[0],a=u[1];n.forEach(function(t){t.angle=Math.atan2(t[0]-i,t[1]-a)}),n.sort(function(t,n){return t.angle-n.angle});for(var o=0,c=n.length-1;c>o;o++)e.push([u,n[o],n[o+1]])}),e},Ci.geom.quadtree=function(t,n,e,r,u){function i(t,n,e,r,u,i){if(!isNaN(n.x)&&!isNaN(n.y))if(t.leaf){var o=t.point;o?.01>Math.abs(o.x-n.x)+Math.abs(o.y-n.y)?a(t,n,e,r,u,i):(t.point=null,a(t,o,e,r,u,i),a(t,n,e,r,u,i)):t.point=n}else a(t,n,e,r,u,i)}function a(t,n,e,r,u,a){var o=.5*(e+u),c=.5*(r+a),l=n.x>=o,f=n.y>=c,s=(f<<1)+l;t.leaf=!1,t=t.nodes[s]||(t.nodes[s]=Bu()),l?e=o:u=o,f?r=c:a=c,i(t,n,e,r,u,a)}var o,c=-1,l=t.length;if(5>arguments.length)if(3===arguments.length)u=e,r=n,e=n=0;else for(n=e=1/0,r=u=-1/0;l>++c;)o=t[c],n>o.x&&(n=o.x),e>o.y&&(e=o.y),o.x>r&&(r=o.x),o.y>u&&(u=o.y);var f=r-n,s=u-e;f>s?u=e+f:r=n+s;var h=Bu();return h.add=function(t){i(h,t,n,e,r,u)},h.visit=function(t){$u(t,h,n,e,r,u)},t.forEach(h.add),h},Ci.time={};var qo=Date,Co=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];Ju.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){zo.setUTCDate.apply(this._,arguments)},setDay:function(){zo.setUTCDay.apply(this._,arguments)},setFullYear:function(){zo.setUTCFullYear.apply(this._,arguments)},setHours:function(){zo.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){zo.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){zo.setUTCMinutes.apply(this._,arguments)},setMonth:function(){zo.setUTCMonth.apply(this._,arguments)},setSeconds:function(){zo.setUTCSeconds.apply(this._,arguments)},setTime:function(){zo.setTime.apply(this._,arguments)}};var zo=Date.prototype,Do="%a %b %e %X %Y",Lo="%m/%d/%Y",Fo="%H:%M:%S",Ho=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],jo=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Po=["January","February","March","April","May","June","July","August","September","October","November","December"],Ro=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];Ci.time.format=function(t){function n(n){for(var r,u,i,a=[],o=-1,c=0;e>++o;)37===t.charCodeAt(o)&&(a.push(t.substring(c,o)),null!=(u=Xo[r=t.charAt(++o)])&&(r=t.charAt(++o)),(i=Bo[r])&&(r=i(n,null==u?"e"===r?" ":"0":u)),a.push(r),c=o+1);return a.push(t.substring(c,o)),a.join("")}var e=t.length;return n.parse=function(n){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=Gu(e,t,n,0);if(r!=n.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var u=new qo;return u.setFullYear(e.y,e.m,e.d),u.setHours(e.H,e.M,e.S,e.L),u},n.toString=function(){return t},n};var Oo=Ku(Ho),Yo=Ku(jo),Uo=Ku(Po),Io=Wu(Po),Vo=Ku(Ro),Zo=Wu(Ro),Xo={"-":"",_:" ",0:"0"},Bo={a:function(t){return jo[t.getDay()]},A:function(t){return Ho[t.getDay()]},b:function(t){return Ro[t.getMonth()]},B:function(t){return Po[t.getMonth()]},c:Ci.time.format(Do),d:function(t,n){return Qu(t.getDate(),n,2)},e:function(t,n){return Qu(t.getDate(),n,2)},H:function(t,n){return Qu(t.getHours(),n,2)},I:function(t,n){return Qu(t.getHours()%12||12,n,2)},j:function(t,n){return Qu(1+Ci.time.dayOfYear(t),n,3)},L:function(t,n){return Qu(t.getMilliseconds(),n,3)},m:function(t,n){return Qu(t.getMonth()+1,n,2)},M:function(t,n){return Qu(t.getMinutes(),n,2)},p:function(t){return t.getHours()>=12?"PM":"AM"},S:function(t,n){return Qu(t.getSeconds(),n,2)},U:function(t,n){return Qu(Ci.time.sundayOfYear(t),n,2)},w:function(t){return t.getDay()},W:function(t,n){return Qu(Ci.time.mondayOfYear(t),n,2)},x:Ci.time.format(Lo),X:Ci.time.format(Fo),y:function(t,n){return Qu(t.getFullYear()%100,n,2)},Y:function(t,n){return Qu(t.getFullYear()%1e4,n,4)},Z:vi,"%":function(){return"%"}},$o={a:ti,A:ni,b:ei,B:ri,c:ui,d:si,e:si,H:hi,I:hi,L:di,m:fi,M:gi,p:mi,S:pi,x:ii,X:ai,y:ci,Y:oi},Jo=/^\s*\d+/,Go=Ci.map({am:0,pm:1});Ci.time.format.utc=function(t){function n(t){try{qo=Ju;var n=new qo;return n._=t,e(n)}finally{qo=Date}}var e=Ci.time.format(t);return n.parse=function(t){try{qo=Ju;var n=e.parse(t);return n&&n._}finally{qo=Date}},n.toString=e.toString,n};var Ko=Ci.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");Ci.time.format.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?yi:Ko,yi.parse=function(t){var n=new Date(t);return isNaN(n)?null:n},yi.toString=Ko.toString,Ci.time.second=Mi(function(t){return new qo(1e3*Math.floor(t/1e3))},function(t,n){t.setTime(t.getTime()+1e3*Math.floor(n))},function(t){return t.getSeconds()}),Ci.time.seconds=Ci.time.second.range,Ci.time.seconds.utc=Ci.time.second.utc.range,Ci.time.minute=Mi(function(t){return new qo(6e4*Math.floor(t/6e4))},function(t,n){t.setTime(t.getTime()+6e4*Math.floor(n))},function(t){return t.getMinutes()}),Ci.time.minutes=Ci.time.minute.range,Ci.time.minutes.utc=Ci.time.minute.utc.range,Ci.time.hour=Mi(function(t){var n=t.getTimezoneOffset()/60;return new qo(36e5*(Math.floor(t/36e5-n)+n))},function(t,n){t.setTime(t.getTime()+36e5*Math.floor(n))},function(t){return t.getHours()}),Ci.time.hours=Ci.time.hour.range,Ci.time.hours.utc=Ci.time.hour.utc.range,Ci.time.day=Mi(function(t){var n=new qo(1970,0);return n.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),n},function(t,n){t.setDate(t.getDate()+n)},function(t){return t.getDate()-1}),Ci.time.days=Ci.time.day.range,Ci.time.days.utc=Ci.time.day.utc.range,Ci.time.dayOfYear=function(t){var n=Ci.time.year(t);return Math.floor((t-n-6e4*(t.getTimezoneOffset()-n.getTimezoneOffset()))/864e5)},Co.forEach(function(t,n){t=t.toLowerCase(),n=7-n;var e=Ci.time[t]=Mi(function(t){return(t=Ci.time.day(t)).setDate(t.getDate()-(t.getDay()+n)%7),t},function(t,n){t.setDate(t.getDate()+7*Math.floor(n))},function(t){var e=Ci.time.year(t).getDay();return Math.floor((Ci.time.dayOfYear(t)+(e+n)%7)/7)-(e!==n)});Ci.time[t+"s"]=e.range,Ci.time[t+"s"].utc=e.utc.range,Ci.time[t+"OfYear"]=function(t){var e=Ci.time.year(t).getDay();return Math.floor((Ci.time.dayOfYear(t)+(e+n)%7)/7)}}),Ci.time.week=Ci.time.sunday,Ci.time.weeks=Ci.time.sunday.range,Ci.time.weeks.utc=Ci.time.sunday.utc.range,Ci.time.weekOfYear=Ci.time.sundayOfYear,Ci.time.month=Mi(function(t){return t=Ci.time.day(t),t.setDate(1),t},function(t,n){t.setMonth(t.getMonth()+n)},function(t){return t.getMonth()}),Ci.time.months=Ci.time.month.range,Ci.time.months.utc=Ci.time.month.utc.range,Ci.time.year=Mi(function(t){return t=Ci.time.day(t),t.setMonth(0,1),t},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t){return t.getFullYear()}),Ci.time.years=Ci.time.year.range,Ci.time.years.utc=Ci.time.year.utc.range;var Wo=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Qo=[[Ci.time.second,1],[Ci.time.second,5],[Ci.time.second,15],[Ci.time.second,30],[Ci.time.minute,1],[Ci.time.minute,5],[Ci.time.minute,15],[Ci.time.minute,30],[Ci.time.hour,1],[Ci.time.hour,3],[Ci.time.hour,6],[Ci.time.hour,12],[Ci.time.day,1],[Ci.time.day,2],[Ci.time.week,1],[Ci.time.month,1],[Ci.time.month,3],[Ci.time.year,1]],tc=[[Ci.time.format("%Y"),o],[Ci.time.format("%B"),function(t){return t.getMonth()}],[Ci.time.format("%b %d"),function(t){return 1!=t.getDate()}],[Ci.time.format("%a %d"),function(t){return t.getDay()&&1!=t.getDate()}],[Ci.time.format("%I %p"),function(t){return t.getHours()}],[Ci.time.format("%I:%M"),function(t){return t.getMinutes()}],[Ci.time.format(":%S"),function(t){return t.getSeconds()}],[Ci.time.format(".%L"),function(t){return t.getMilliseconds()}]],nc=Ci.scale.linear(),ec=Si(tc);Qo.year=function(t,n){return nc.domain(t.map(Ei)).ticks(n).map(ki)},Ci.time.scale=function(){return xi(Ci.scale.linear(),Qo,ec)};var rc=Qo.map(function(t){return[t[0].utc,t[1]]}),uc=[[Ci.time.format.utc("%Y"),o],[Ci.time.format.utc("%B"),function(t){return t.getUTCMonth()}],[Ci.time.format.utc("%b %d"),function(t){return 1!=t.getUTCDate()}],[Ci.time.format.utc("%a %d"),function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],[Ci.time.format.utc("%I %p"),function(t){return t.getUTCHours()}],[Ci.time.format.utc("%I:%M"),function(t){return t.getUTCMinutes()}],[Ci.time.format.utc(":%S"),function(t){return t.getUTCSeconds()}],[Ci.time.format.utc(".%L"),function(t){return t.getUTCMilliseconds()}]],ic=Si(uc);return rc.year=function(t,n){return nc.domain(t.map(Ni)).ticks(n).map(Ai)},Ci.time.scale.utc=function(){return xi(Ci.scale.linear(),rc,ic)},Ci}();
\ No newline at end of file
diff --git a/static/demo/components/d3/globals.js b/static/demo/components/d3/globals.js
new file mode 100644
index 0000000000000000000000000000000000000000..dbfc45ff6d6590c33ec4cfaff0345db1514a6b76
--- /dev/null
+++ b/static/demo/components/d3/globals.js
@@ -0,0 +1,9 @@
+var document = global.document = require("jsdom").jsdom("<html><head></head><body></body></html>"),
+    window = global.window = document.createWindow();
+
+// https://github.com/chad3814/CSSStyleDeclaration/issues/3
+var CSSStyleDeclaration_prototype = window.CSSStyleDeclaration.prototype,
+    CSSStyleDeclaration_setProperty = CSSStyleDeclaration_prototype.setProperty;
+CSSStyleDeclaration_prototype.setProperty = function(name, value, priority) {
+  return CSSStyleDeclaration_setProperty.call(this, name + "", value == null ? null : value + "", priority == null ? null : priority + "");
+};
diff --git a/static/demo/components/d3/index-browserify.js b/static/demo/components/d3/index-browserify.js
new file mode 100644
index 0000000000000000000000000000000000000000..9a4ff6989430bbb2191f140ebd65ddbb596b2ba3
--- /dev/null
+++ b/static/demo/components/d3/index-browserify.js
@@ -0,0 +1,2 @@
+require("./d3");
+module.exports = d3;
\ No newline at end of file
diff --git a/static/demo/components/d3/index.js b/static/demo/components/d3/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..0d52833edd0f29c2b6548b6484885518926b9073
--- /dev/null
+++ b/static/demo/components/d3/index.js
@@ -0,0 +1,16 @@
+var globals = ["document", "window", "d3"],
+    globalValues = {};
+
+globals.forEach(function(g) {
+  if (g in global) globalValues[g] = global[g];
+});
+
+require("./globals");
+require("./d3");
+
+module.exports = d3;
+
+globals.forEach(function(g) {
+  if (g in globalValues) global[g] = globalValues[g];
+  else delete global[g];
+});
diff --git a/static/demo/components/d3/lib/colorbrewer/LICENSE b/static/demo/components/d3/lib/colorbrewer/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..2ac775d6e36c0e2929eb03462067518d66638c31
--- /dev/null
+++ b/static/demo/components/d3/lib/colorbrewer/LICENSE
@@ -0,0 +1,38 @@
+Apache-Style Software License for ColorBrewer software and ColorBrewer Color
+Schemes
+
+Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State
+University.
+
+Licensed under the Apache License, Version 2.0 (the "License"); you may not
+use this file except in compliance with the License. You may obtain a copy of
+the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+License for the specific language governing permissions and limitations under
+the License.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions as source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. The end-user documentation included with the redistribution, if any, must
+include the following acknowledgment: "This product includes color
+specifications and designs developed by Cynthia Brewer
+(http://colorbrewer.org/)." Alternately, this acknowledgment may appear in the
+software itself, if and wherever such third-party acknowledgments normally
+appear.
+
+4. The name "ColorBrewer" must not be used to endorse or promote products
+derived from this software without prior written permission. For written
+permission, please contact Cynthia Brewer at cbrewer@psu.edu.
+
+5. Products derived from this software may not be called "ColorBrewer", nor
+may "ColorBrewer" appear in their name, without prior written permission of
+Cynthia Brewer.
diff --git a/static/demo/components/d3/lib/colorbrewer/colorbrewer.css b/static/demo/components/d3/lib/colorbrewer/colorbrewer.css
new file mode 100644
index 0000000000000000000000000000000000000000..e11948cd7c2de769bc67c73e09e48b32a24a5e41
--- /dev/null
+++ b/static/demo/components/d3/lib/colorbrewer/colorbrewer.css
@@ -0,0 +1,1324 @@
+/* This product includes color specifications and designs developed by Cynthia Brewer (http://colorbrewer.org/). */
+.YlGn .q0-3{fill:rgb(247,252,185)}
+.YlGn .q1-3{fill:rgb(173,221,142)}
+.YlGn .q2-3{fill:rgb(49,163,84)}
+.YlGn .q0-4{fill:rgb(255,255,204)}
+.YlGn .q1-4{fill:rgb(194,230,153)}
+.YlGn .q2-4{fill:rgb(120,198,121)}
+.YlGn .q3-4{fill:rgb(35,132,67)}
+.YlGn .q0-5{fill:rgb(255,255,204)}
+.YlGn .q1-5{fill:rgb(194,230,153)}
+.YlGn .q2-5{fill:rgb(120,198,121)}
+.YlGn .q3-5{fill:rgb(49,163,84)}
+.YlGn .q4-5{fill:rgb(0,104,55)}
+.YlGn .q0-6{fill:rgb(255,255,204)}
+.YlGn .q1-6{fill:rgb(217,240,163)}
+.YlGn .q2-6{fill:rgb(173,221,142)}
+.YlGn .q3-6{fill:rgb(120,198,121)}
+.YlGn .q4-6{fill:rgb(49,163,84)}
+.YlGn .q5-6{fill:rgb(0,104,55)}
+.YlGn .q0-7{fill:rgb(255,255,204)}
+.YlGn .q1-7{fill:rgb(217,240,163)}
+.YlGn .q2-7{fill:rgb(173,221,142)}
+.YlGn .q3-7{fill:rgb(120,198,121)}
+.YlGn .q4-7{fill:rgb(65,171,93)}
+.YlGn .q5-7{fill:rgb(35,132,67)}
+.YlGn .q6-7{fill:rgb(0,90,50)}
+.YlGn .q0-8{fill:rgb(255,255,229)}
+.YlGn .q1-8{fill:rgb(247,252,185)}
+.YlGn .q2-8{fill:rgb(217,240,163)}
+.YlGn .q3-8{fill:rgb(173,221,142)}
+.YlGn .q4-8{fill:rgb(120,198,121)}
+.YlGn .q5-8{fill:rgb(65,171,93)}
+.YlGn .q6-8{fill:rgb(35,132,67)}
+.YlGn .q7-8{fill:rgb(0,90,50)}
+.YlGn .q0-9{fill:rgb(255,255,229)}
+.YlGn .q1-9{fill:rgb(247,252,185)}
+.YlGn .q2-9{fill:rgb(217,240,163)}
+.YlGn .q3-9{fill:rgb(173,221,142)}
+.YlGn .q4-9{fill:rgb(120,198,121)}
+.YlGn .q5-9{fill:rgb(65,171,93)}
+.YlGn .q6-9{fill:rgb(35,132,67)}
+.YlGn .q7-9{fill:rgb(0,104,55)}
+.YlGn .q8-9{fill:rgb(0,69,41)}
+.YlGnBu .q0-3{fill:rgb(237,248,177)}
+.YlGnBu .q1-3{fill:rgb(127,205,187)}
+.YlGnBu .q2-3{fill:rgb(44,127,184)}
+.YlGnBu .q0-4{fill:rgb(255,255,204)}
+.YlGnBu .q1-4{fill:rgb(161,218,180)}
+.YlGnBu .q2-4{fill:rgb(65,182,196)}
+.YlGnBu .q3-4{fill:rgb(34,94,168)}
+.YlGnBu .q0-5{fill:rgb(255,255,204)}
+.YlGnBu .q1-5{fill:rgb(161,218,180)}
+.YlGnBu .q2-5{fill:rgb(65,182,196)}
+.YlGnBu .q3-5{fill:rgb(44,127,184)}
+.YlGnBu .q4-5{fill:rgb(37,52,148)}
+.YlGnBu .q0-6{fill:rgb(255,255,204)}
+.YlGnBu .q1-6{fill:rgb(199,233,180)}
+.YlGnBu .q2-6{fill:rgb(127,205,187)}
+.YlGnBu .q3-6{fill:rgb(65,182,196)}
+.YlGnBu .q4-6{fill:rgb(44,127,184)}
+.YlGnBu .q5-6{fill:rgb(37,52,148)}
+.YlGnBu .q0-7{fill:rgb(255,255,204)}
+.YlGnBu .q1-7{fill:rgb(199,233,180)}
+.YlGnBu .q2-7{fill:rgb(127,205,187)}
+.YlGnBu .q3-7{fill:rgb(65,182,196)}
+.YlGnBu .q4-7{fill:rgb(29,145,192)}
+.YlGnBu .q5-7{fill:rgb(34,94,168)}
+.YlGnBu .q6-7{fill:rgb(12,44,132)}
+.YlGnBu .q0-8{fill:rgb(255,255,217)}
+.YlGnBu .q1-8{fill:rgb(237,248,177)}
+.YlGnBu .q2-8{fill:rgb(199,233,180)}
+.YlGnBu .q3-8{fill:rgb(127,205,187)}
+.YlGnBu .q4-8{fill:rgb(65,182,196)}
+.YlGnBu .q5-8{fill:rgb(29,145,192)}
+.YlGnBu .q6-8{fill:rgb(34,94,168)}
+.YlGnBu .q7-8{fill:rgb(12,44,132)}
+.YlGnBu .q0-9{fill:rgb(255,255,217)}
+.YlGnBu .q1-9{fill:rgb(237,248,177)}
+.YlGnBu .q2-9{fill:rgb(199,233,180)}
+.YlGnBu .q3-9{fill:rgb(127,205,187)}
+.YlGnBu .q4-9{fill:rgb(65,182,196)}
+.YlGnBu .q5-9{fill:rgb(29,145,192)}
+.YlGnBu .q6-9{fill:rgb(34,94,168)}
+.YlGnBu .q7-9{fill:rgb(37,52,148)}
+.YlGnBu .q8-9{fill:rgb(8,29,88)}
+.GnBu .q0-3{fill:rgb(224,243,219)}
+.GnBu .q1-3{fill:rgb(168,221,181)}
+.GnBu .q2-3{fill:rgb(67,162,202)}
+.GnBu .q0-4{fill:rgb(240,249,232)}
+.GnBu .q1-4{fill:rgb(186,228,188)}
+.GnBu .q2-4{fill:rgb(123,204,196)}
+.GnBu .q3-4{fill:rgb(43,140,190)}
+.GnBu .q0-5{fill:rgb(240,249,232)}
+.GnBu .q1-5{fill:rgb(186,228,188)}
+.GnBu .q2-5{fill:rgb(123,204,196)}
+.GnBu .q3-5{fill:rgb(67,162,202)}
+.GnBu .q4-5{fill:rgb(8,104,172)}
+.GnBu .q0-6{fill:rgb(240,249,232)}
+.GnBu .q1-6{fill:rgb(204,235,197)}
+.GnBu .q2-6{fill:rgb(168,221,181)}
+.GnBu .q3-6{fill:rgb(123,204,196)}
+.GnBu .q4-6{fill:rgb(67,162,202)}
+.GnBu .q5-6{fill:rgb(8,104,172)}
+.GnBu .q0-7{fill:rgb(240,249,232)}
+.GnBu .q1-7{fill:rgb(204,235,197)}
+.GnBu .q2-7{fill:rgb(168,221,181)}
+.GnBu .q3-7{fill:rgb(123,204,196)}
+.GnBu .q4-7{fill:rgb(78,179,211)}
+.GnBu .q5-7{fill:rgb(43,140,190)}
+.GnBu .q6-7{fill:rgb(8,88,158)}
+.GnBu .q0-8{fill:rgb(247,252,240)}
+.GnBu .q1-8{fill:rgb(224,243,219)}
+.GnBu .q2-8{fill:rgb(204,235,197)}
+.GnBu .q3-8{fill:rgb(168,221,181)}
+.GnBu .q4-8{fill:rgb(123,204,196)}
+.GnBu .q5-8{fill:rgb(78,179,211)}
+.GnBu .q6-8{fill:rgb(43,140,190)}
+.GnBu .q7-8{fill:rgb(8,88,158)}
+.GnBu .q0-9{fill:rgb(247,252,240)}
+.GnBu .q1-9{fill:rgb(224,243,219)}
+.GnBu .q2-9{fill:rgb(204,235,197)}
+.GnBu .q3-9{fill:rgb(168,221,181)}
+.GnBu .q4-9{fill:rgb(123,204,196)}
+.GnBu .q5-9{fill:rgb(78,179,211)}
+.GnBu .q6-9{fill:rgb(43,140,190)}
+.GnBu .q7-9{fill:rgb(8,104,172)}
+.GnBu .q8-9{fill:rgb(8,64,129)}
+.BuGn .q0-3{fill:rgb(229,245,249)}
+.BuGn .q1-3{fill:rgb(153,216,201)}
+.BuGn .q2-3{fill:rgb(44,162,95)}
+.BuGn .q0-4{fill:rgb(237,248,251)}
+.BuGn .q1-4{fill:rgb(178,226,226)}
+.BuGn .q2-4{fill:rgb(102,194,164)}
+.BuGn .q3-4{fill:rgb(35,139,69)}
+.BuGn .q0-5{fill:rgb(237,248,251)}
+.BuGn .q1-5{fill:rgb(178,226,226)}
+.BuGn .q2-5{fill:rgb(102,194,164)}
+.BuGn .q3-5{fill:rgb(44,162,95)}
+.BuGn .q4-5{fill:rgb(0,109,44)}
+.BuGn .q0-6{fill:rgb(237,248,251)}
+.BuGn .q1-6{fill:rgb(204,236,230)}
+.BuGn .q2-6{fill:rgb(153,216,201)}
+.BuGn .q3-6{fill:rgb(102,194,164)}
+.BuGn .q4-6{fill:rgb(44,162,95)}
+.BuGn .q5-6{fill:rgb(0,109,44)}
+.BuGn .q0-7{fill:rgb(237,248,251)}
+.BuGn .q1-7{fill:rgb(204,236,230)}
+.BuGn .q2-7{fill:rgb(153,216,201)}
+.BuGn .q3-7{fill:rgb(102,194,164)}
+.BuGn .q4-7{fill:rgb(65,174,118)}
+.BuGn .q5-7{fill:rgb(35,139,69)}
+.BuGn .q6-7{fill:rgb(0,88,36)}
+.BuGn .q0-8{fill:rgb(247,252,253)}
+.BuGn .q1-8{fill:rgb(229,245,249)}
+.BuGn .q2-8{fill:rgb(204,236,230)}
+.BuGn .q3-8{fill:rgb(153,216,201)}
+.BuGn .q4-8{fill:rgb(102,194,164)}
+.BuGn .q5-8{fill:rgb(65,174,118)}
+.BuGn .q6-8{fill:rgb(35,139,69)}
+.BuGn .q7-8{fill:rgb(0,88,36)}
+.BuGn .q0-9{fill:rgb(247,252,253)}
+.BuGn .q1-9{fill:rgb(229,245,249)}
+.BuGn .q2-9{fill:rgb(204,236,230)}
+.BuGn .q3-9{fill:rgb(153,216,201)}
+.BuGn .q4-9{fill:rgb(102,194,164)}
+.BuGn .q5-9{fill:rgb(65,174,118)}
+.BuGn .q6-9{fill:rgb(35,139,69)}
+.BuGn .q7-9{fill:rgb(0,109,44)}
+.BuGn .q8-9{fill:rgb(0,68,27)}
+.PuBuGn .q0-3{fill:rgb(236,226,240)}
+.PuBuGn .q1-3{fill:rgb(166,189,219)}
+.PuBuGn .q2-3{fill:rgb(28,144,153)}
+.PuBuGn .q0-4{fill:rgb(246,239,247)}
+.PuBuGn .q1-4{fill:rgb(189,201,225)}
+.PuBuGn .q2-4{fill:rgb(103,169,207)}
+.PuBuGn .q3-4{fill:rgb(2,129,138)}
+.PuBuGn .q0-5{fill:rgb(246,239,247)}
+.PuBuGn .q1-5{fill:rgb(189,201,225)}
+.PuBuGn .q2-5{fill:rgb(103,169,207)}
+.PuBuGn .q3-5{fill:rgb(28,144,153)}
+.PuBuGn .q4-5{fill:rgb(1,108,89)}
+.PuBuGn .q0-6{fill:rgb(246,239,247)}
+.PuBuGn .q1-6{fill:rgb(208,209,230)}
+.PuBuGn .q2-6{fill:rgb(166,189,219)}
+.PuBuGn .q3-6{fill:rgb(103,169,207)}
+.PuBuGn .q4-6{fill:rgb(28,144,153)}
+.PuBuGn .q5-6{fill:rgb(1,108,89)}
+.PuBuGn .q0-7{fill:rgb(246,239,247)}
+.PuBuGn .q1-7{fill:rgb(208,209,230)}
+.PuBuGn .q2-7{fill:rgb(166,189,219)}
+.PuBuGn .q3-7{fill:rgb(103,169,207)}
+.PuBuGn .q4-7{fill:rgb(54,144,192)}
+.PuBuGn .q5-7{fill:rgb(2,129,138)}
+.PuBuGn .q6-7{fill:rgb(1,100,80)}
+.PuBuGn .q0-8{fill:rgb(255,247,251)}
+.PuBuGn .q1-8{fill:rgb(236,226,240)}
+.PuBuGn .q2-8{fill:rgb(208,209,230)}
+.PuBuGn .q3-8{fill:rgb(166,189,219)}
+.PuBuGn .q4-8{fill:rgb(103,169,207)}
+.PuBuGn .q5-8{fill:rgb(54,144,192)}
+.PuBuGn .q6-8{fill:rgb(2,129,138)}
+.PuBuGn .q7-8{fill:rgb(1,100,80)}
+.PuBuGn .q0-9{fill:rgb(255,247,251)}
+.PuBuGn .q1-9{fill:rgb(236,226,240)}
+.PuBuGn .q2-9{fill:rgb(208,209,230)}
+.PuBuGn .q3-9{fill:rgb(166,189,219)}
+.PuBuGn .q4-9{fill:rgb(103,169,207)}
+.PuBuGn .q5-9{fill:rgb(54,144,192)}
+.PuBuGn .q6-9{fill:rgb(2,129,138)}
+.PuBuGn .q7-9{fill:rgb(1,108,89)}
+.PuBuGn .q8-9{fill:rgb(1,70,54)}
+.PuBu .q0-3{fill:rgb(236,231,242)}
+.PuBu .q1-3{fill:rgb(166,189,219)}
+.PuBu .q2-3{fill:rgb(43,140,190)}
+.PuBu .q0-4{fill:rgb(241,238,246)}
+.PuBu .q1-4{fill:rgb(189,201,225)}
+.PuBu .q2-4{fill:rgb(116,169,207)}
+.PuBu .q3-4{fill:rgb(5,112,176)}
+.PuBu .q0-5{fill:rgb(241,238,246)}
+.PuBu .q1-5{fill:rgb(189,201,225)}
+.PuBu .q2-5{fill:rgb(116,169,207)}
+.PuBu .q3-5{fill:rgb(43,140,190)}
+.PuBu .q4-5{fill:rgb(4,90,141)}
+.PuBu .q0-6{fill:rgb(241,238,246)}
+.PuBu .q1-6{fill:rgb(208,209,230)}
+.PuBu .q2-6{fill:rgb(166,189,219)}
+.PuBu .q3-6{fill:rgb(116,169,207)}
+.PuBu .q4-6{fill:rgb(43,140,190)}
+.PuBu .q5-6{fill:rgb(4,90,141)}
+.PuBu .q0-7{fill:rgb(241,238,246)}
+.PuBu .q1-7{fill:rgb(208,209,230)}
+.PuBu .q2-7{fill:rgb(166,189,219)}
+.PuBu .q3-7{fill:rgb(116,169,207)}
+.PuBu .q4-7{fill:rgb(54,144,192)}
+.PuBu .q5-7{fill:rgb(5,112,176)}
+.PuBu .q6-7{fill:rgb(3,78,123)}
+.PuBu .q0-8{fill:rgb(255,247,251)}
+.PuBu .q1-8{fill:rgb(236,231,242)}
+.PuBu .q2-8{fill:rgb(208,209,230)}
+.PuBu .q3-8{fill:rgb(166,189,219)}
+.PuBu .q4-8{fill:rgb(116,169,207)}
+.PuBu .q5-8{fill:rgb(54,144,192)}
+.PuBu .q6-8{fill:rgb(5,112,176)}
+.PuBu .q7-8{fill:rgb(3,78,123)}
+.PuBu .q0-9{fill:rgb(255,247,251)}
+.PuBu .q1-9{fill:rgb(236,231,242)}
+.PuBu .q2-9{fill:rgb(208,209,230)}
+.PuBu .q3-9{fill:rgb(166,189,219)}
+.PuBu .q4-9{fill:rgb(116,169,207)}
+.PuBu .q5-9{fill:rgb(54,144,192)}
+.PuBu .q6-9{fill:rgb(5,112,176)}
+.PuBu .q7-9{fill:rgb(4,90,141)}
+.PuBu .q8-9{fill:rgb(2,56,88)}
+.BuPu .q0-3{fill:rgb(224,236,244)}
+.BuPu .q1-3{fill:rgb(158,188,218)}
+.BuPu .q2-3{fill:rgb(136,86,167)}
+.BuPu .q0-4{fill:rgb(237,248,251)}
+.BuPu .q1-4{fill:rgb(179,205,227)}
+.BuPu .q2-4{fill:rgb(140,150,198)}
+.BuPu .q3-4{fill:rgb(136,65,157)}
+.BuPu .q0-5{fill:rgb(237,248,251)}
+.BuPu .q1-5{fill:rgb(179,205,227)}
+.BuPu .q2-5{fill:rgb(140,150,198)}
+.BuPu .q3-5{fill:rgb(136,86,167)}
+.BuPu .q4-5{fill:rgb(129,15,124)}
+.BuPu .q0-6{fill:rgb(237,248,251)}
+.BuPu .q1-6{fill:rgb(191,211,230)}
+.BuPu .q2-6{fill:rgb(158,188,218)}
+.BuPu .q3-6{fill:rgb(140,150,198)}
+.BuPu .q4-6{fill:rgb(136,86,167)}
+.BuPu .q5-6{fill:rgb(129,15,124)}
+.BuPu .q0-7{fill:rgb(237,248,251)}
+.BuPu .q1-7{fill:rgb(191,211,230)}
+.BuPu .q2-7{fill:rgb(158,188,218)}
+.BuPu .q3-7{fill:rgb(140,150,198)}
+.BuPu .q4-7{fill:rgb(140,107,177)}
+.BuPu .q5-7{fill:rgb(136,65,157)}
+.BuPu .q6-7{fill:rgb(110,1,107)}
+.BuPu .q0-8{fill:rgb(247,252,253)}
+.BuPu .q1-8{fill:rgb(224,236,244)}
+.BuPu .q2-8{fill:rgb(191,211,230)}
+.BuPu .q3-8{fill:rgb(158,188,218)}
+.BuPu .q4-8{fill:rgb(140,150,198)}
+.BuPu .q5-8{fill:rgb(140,107,177)}
+.BuPu .q6-8{fill:rgb(136,65,157)}
+.BuPu .q7-8{fill:rgb(110,1,107)}
+.BuPu .q0-9{fill:rgb(247,252,253)}
+.BuPu .q1-9{fill:rgb(224,236,244)}
+.BuPu .q2-9{fill:rgb(191,211,230)}
+.BuPu .q3-9{fill:rgb(158,188,218)}
+.BuPu .q4-9{fill:rgb(140,150,198)}
+.BuPu .q5-9{fill:rgb(140,107,177)}
+.BuPu .q6-9{fill:rgb(136,65,157)}
+.BuPu .q7-9{fill:rgb(129,15,124)}
+.BuPu .q8-9{fill:rgb(77,0,75)}
+.RdPu .q0-3{fill:rgb(253,224,221)}
+.RdPu .q1-3{fill:rgb(250,159,181)}
+.RdPu .q2-3{fill:rgb(197,27,138)}
+.RdPu .q0-4{fill:rgb(254,235,226)}
+.RdPu .q1-4{fill:rgb(251,180,185)}
+.RdPu .q2-4{fill:rgb(247,104,161)}
+.RdPu .q3-4{fill:rgb(174,1,126)}
+.RdPu .q0-5{fill:rgb(254,235,226)}
+.RdPu .q1-5{fill:rgb(251,180,185)}
+.RdPu .q2-5{fill:rgb(247,104,161)}
+.RdPu .q3-5{fill:rgb(197,27,138)}
+.RdPu .q4-5{fill:rgb(122,1,119)}
+.RdPu .q0-6{fill:rgb(254,235,226)}
+.RdPu .q1-6{fill:rgb(252,197,192)}
+.RdPu .q2-6{fill:rgb(250,159,181)}
+.RdPu .q3-6{fill:rgb(247,104,161)}
+.RdPu .q4-6{fill:rgb(197,27,138)}
+.RdPu .q5-6{fill:rgb(122,1,119)}
+.RdPu .q0-7{fill:rgb(254,235,226)}
+.RdPu .q1-7{fill:rgb(252,197,192)}
+.RdPu .q2-7{fill:rgb(250,159,181)}
+.RdPu .q3-7{fill:rgb(247,104,161)}
+.RdPu .q4-7{fill:rgb(221,52,151)}
+.RdPu .q5-7{fill:rgb(174,1,126)}
+.RdPu .q6-7{fill:rgb(122,1,119)}
+.RdPu .q0-8{fill:rgb(255,247,243)}
+.RdPu .q1-8{fill:rgb(253,224,221)}
+.RdPu .q2-8{fill:rgb(252,197,192)}
+.RdPu .q3-8{fill:rgb(250,159,181)}
+.RdPu .q4-8{fill:rgb(247,104,161)}
+.RdPu .q5-8{fill:rgb(221,52,151)}
+.RdPu .q6-8{fill:rgb(174,1,126)}
+.RdPu .q7-8{fill:rgb(122,1,119)}
+.RdPu .q0-9{fill:rgb(255,247,243)}
+.RdPu .q1-9{fill:rgb(253,224,221)}
+.RdPu .q2-9{fill:rgb(252,197,192)}
+.RdPu .q3-9{fill:rgb(250,159,181)}
+.RdPu .q4-9{fill:rgb(247,104,161)}
+.RdPu .q5-9{fill:rgb(221,52,151)}
+.RdPu .q6-9{fill:rgb(174,1,126)}
+.RdPu .q7-9{fill:rgb(122,1,119)}
+.RdPu .q8-9{fill:rgb(73,0,106)}
+.PuRd .q0-3{fill:rgb(231,225,239)}
+.PuRd .q1-3{fill:rgb(201,148,199)}
+.PuRd .q2-3{fill:rgb(221,28,119)}
+.PuRd .q0-4{fill:rgb(241,238,246)}
+.PuRd .q1-4{fill:rgb(215,181,216)}
+.PuRd .q2-4{fill:rgb(223,101,176)}
+.PuRd .q3-4{fill:rgb(206,18,86)}
+.PuRd .q0-5{fill:rgb(241,238,246)}
+.PuRd .q1-5{fill:rgb(215,181,216)}
+.PuRd .q2-5{fill:rgb(223,101,176)}
+.PuRd .q3-5{fill:rgb(221,28,119)}
+.PuRd .q4-5{fill:rgb(152,0,67)}
+.PuRd .q0-6{fill:rgb(241,238,246)}
+.PuRd .q1-6{fill:rgb(212,185,218)}
+.PuRd .q2-6{fill:rgb(201,148,199)}
+.PuRd .q3-6{fill:rgb(223,101,176)}
+.PuRd .q4-6{fill:rgb(221,28,119)}
+.PuRd .q5-6{fill:rgb(152,0,67)}
+.PuRd .q0-7{fill:rgb(241,238,246)}
+.PuRd .q1-7{fill:rgb(212,185,218)}
+.PuRd .q2-7{fill:rgb(201,148,199)}
+.PuRd .q3-7{fill:rgb(223,101,176)}
+.PuRd .q4-7{fill:rgb(231,41,138)}
+.PuRd .q5-7{fill:rgb(206,18,86)}
+.PuRd .q6-7{fill:rgb(145,0,63)}
+.PuRd .q0-8{fill:rgb(247,244,249)}
+.PuRd .q1-8{fill:rgb(231,225,239)}
+.PuRd .q2-8{fill:rgb(212,185,218)}
+.PuRd .q3-8{fill:rgb(201,148,199)}
+.PuRd .q4-8{fill:rgb(223,101,176)}
+.PuRd .q5-8{fill:rgb(231,41,138)}
+.PuRd .q6-8{fill:rgb(206,18,86)}
+.PuRd .q7-8{fill:rgb(145,0,63)}
+.PuRd .q0-9{fill:rgb(247,244,249)}
+.PuRd .q1-9{fill:rgb(231,225,239)}
+.PuRd .q2-9{fill:rgb(212,185,218)}
+.PuRd .q3-9{fill:rgb(201,148,199)}
+.PuRd .q4-9{fill:rgb(223,101,176)}
+.PuRd .q5-9{fill:rgb(231,41,138)}
+.PuRd .q6-9{fill:rgb(206,18,86)}
+.PuRd .q7-9{fill:rgb(152,0,67)}
+.PuRd .q8-9{fill:rgb(103,0,31)}
+.OrRd .q0-3{fill:rgb(254,232,200)}
+.OrRd .q1-3{fill:rgb(253,187,132)}
+.OrRd .q2-3{fill:rgb(227,74,51)}
+.OrRd .q0-4{fill:rgb(254,240,217)}
+.OrRd .q1-4{fill:rgb(253,204,138)}
+.OrRd .q2-4{fill:rgb(252,141,89)}
+.OrRd .q3-4{fill:rgb(215,48,31)}
+.OrRd .q0-5{fill:rgb(254,240,217)}
+.OrRd .q1-5{fill:rgb(253,204,138)}
+.OrRd .q2-5{fill:rgb(252,141,89)}
+.OrRd .q3-5{fill:rgb(227,74,51)}
+.OrRd .q4-5{fill:rgb(179,0,0)}
+.OrRd .q0-6{fill:rgb(254,240,217)}
+.OrRd .q1-6{fill:rgb(253,212,158)}
+.OrRd .q2-6{fill:rgb(253,187,132)}
+.OrRd .q3-6{fill:rgb(252,141,89)}
+.OrRd .q4-6{fill:rgb(227,74,51)}
+.OrRd .q5-6{fill:rgb(179,0,0)}
+.OrRd .q0-7{fill:rgb(254,240,217)}
+.OrRd .q1-7{fill:rgb(253,212,158)}
+.OrRd .q2-7{fill:rgb(253,187,132)}
+.OrRd .q3-7{fill:rgb(252,141,89)}
+.OrRd .q4-7{fill:rgb(239,101,72)}
+.OrRd .q5-7{fill:rgb(215,48,31)}
+.OrRd .q6-7{fill:rgb(153,0,0)}
+.OrRd .q0-8{fill:rgb(255,247,236)}
+.OrRd .q1-8{fill:rgb(254,232,200)}
+.OrRd .q2-8{fill:rgb(253,212,158)}
+.OrRd .q3-8{fill:rgb(253,187,132)}
+.OrRd .q4-8{fill:rgb(252,141,89)}
+.OrRd .q5-8{fill:rgb(239,101,72)}
+.OrRd .q6-8{fill:rgb(215,48,31)}
+.OrRd .q7-8{fill:rgb(153,0,0)}
+.OrRd .q0-9{fill:rgb(255,247,236)}
+.OrRd .q1-9{fill:rgb(254,232,200)}
+.OrRd .q2-9{fill:rgb(253,212,158)}
+.OrRd .q3-9{fill:rgb(253,187,132)}
+.OrRd .q4-9{fill:rgb(252,141,89)}
+.OrRd .q5-9{fill:rgb(239,101,72)}
+.OrRd .q6-9{fill:rgb(215,48,31)}
+.OrRd .q7-9{fill:rgb(179,0,0)}
+.OrRd .q8-9{fill:rgb(127,0,0)}
+.YlOrRd .q0-3{fill:rgb(255,237,160)}
+.YlOrRd .q1-3{fill:rgb(254,178,76)}
+.YlOrRd .q2-3{fill:rgb(240,59,32)}
+.YlOrRd .q0-4{fill:rgb(255,255,178)}
+.YlOrRd .q1-4{fill:rgb(254,204,92)}
+.YlOrRd .q2-4{fill:rgb(253,141,60)}
+.YlOrRd .q3-4{fill:rgb(227,26,28)}
+.YlOrRd .q0-5{fill:rgb(255,255,178)}
+.YlOrRd .q1-5{fill:rgb(254,204,92)}
+.YlOrRd .q2-5{fill:rgb(253,141,60)}
+.YlOrRd .q3-5{fill:rgb(240,59,32)}
+.YlOrRd .q4-5{fill:rgb(189,0,38)}
+.YlOrRd .q0-6{fill:rgb(255,255,178)}
+.YlOrRd .q1-6{fill:rgb(254,217,118)}
+.YlOrRd .q2-6{fill:rgb(254,178,76)}
+.YlOrRd .q3-6{fill:rgb(253,141,60)}
+.YlOrRd .q4-6{fill:rgb(240,59,32)}
+.YlOrRd .q5-6{fill:rgb(189,0,38)}
+.YlOrRd .q0-7{fill:rgb(255,255,178)}
+.YlOrRd .q1-7{fill:rgb(254,217,118)}
+.YlOrRd .q2-7{fill:rgb(254,178,76)}
+.YlOrRd .q3-7{fill:rgb(253,141,60)}
+.YlOrRd .q4-7{fill:rgb(252,78,42)}
+.YlOrRd .q5-7{fill:rgb(227,26,28)}
+.YlOrRd .q6-7{fill:rgb(177,0,38)}
+.YlOrRd .q0-8{fill:rgb(255,255,204)}
+.YlOrRd .q1-8{fill:rgb(255,237,160)}
+.YlOrRd .q2-8{fill:rgb(254,217,118)}
+.YlOrRd .q3-8{fill:rgb(254,178,76)}
+.YlOrRd .q4-8{fill:rgb(253,141,60)}
+.YlOrRd .q5-8{fill:rgb(252,78,42)}
+.YlOrRd .q6-8{fill:rgb(227,26,28)}
+.YlOrRd .q7-8{fill:rgb(177,0,38)}
+.YlOrRd .q0-9{fill:rgb(255,255,204)}
+.YlOrRd .q1-9{fill:rgb(255,237,160)}
+.YlOrRd .q2-9{fill:rgb(254,217,118)}
+.YlOrRd .q3-9{fill:rgb(254,178,76)}
+.YlOrRd .q4-9{fill:rgb(253,141,60)}
+.YlOrRd .q5-9{fill:rgb(252,78,42)}
+.YlOrRd .q6-9{fill:rgb(227,26,28)}
+.YlOrRd .q7-9{fill:rgb(189,0,38)}
+.YlOrRd .q8-9{fill:rgb(128,0,38)}
+.YlOrBr .q0-3{fill:rgb(255,247,188)}
+.YlOrBr .q1-3{fill:rgb(254,196,79)}
+.YlOrBr .q2-3{fill:rgb(217,95,14)}
+.YlOrBr .q0-4{fill:rgb(255,255,212)}
+.YlOrBr .q1-4{fill:rgb(254,217,142)}
+.YlOrBr .q2-4{fill:rgb(254,153,41)}
+.YlOrBr .q3-4{fill:rgb(204,76,2)}
+.YlOrBr .q0-5{fill:rgb(255,255,212)}
+.YlOrBr .q1-5{fill:rgb(254,217,142)}
+.YlOrBr .q2-5{fill:rgb(254,153,41)}
+.YlOrBr .q3-5{fill:rgb(217,95,14)}
+.YlOrBr .q4-5{fill:rgb(153,52,4)}
+.YlOrBr .q0-6{fill:rgb(255,255,212)}
+.YlOrBr .q1-6{fill:rgb(254,227,145)}
+.YlOrBr .q2-6{fill:rgb(254,196,79)}
+.YlOrBr .q3-6{fill:rgb(254,153,41)}
+.YlOrBr .q4-6{fill:rgb(217,95,14)}
+.YlOrBr .q5-6{fill:rgb(153,52,4)}
+.YlOrBr .q0-7{fill:rgb(255,255,212)}
+.YlOrBr .q1-7{fill:rgb(254,227,145)}
+.YlOrBr .q2-7{fill:rgb(254,196,79)}
+.YlOrBr .q3-7{fill:rgb(254,153,41)}
+.YlOrBr .q4-7{fill:rgb(236,112,20)}
+.YlOrBr .q5-7{fill:rgb(204,76,2)}
+.YlOrBr .q6-7{fill:rgb(140,45,4)}
+.YlOrBr .q0-8{fill:rgb(255,255,229)}
+.YlOrBr .q1-8{fill:rgb(255,247,188)}
+.YlOrBr .q2-8{fill:rgb(254,227,145)}
+.YlOrBr .q3-8{fill:rgb(254,196,79)}
+.YlOrBr .q4-8{fill:rgb(254,153,41)}
+.YlOrBr .q5-8{fill:rgb(236,112,20)}
+.YlOrBr .q6-8{fill:rgb(204,76,2)}
+.YlOrBr .q7-8{fill:rgb(140,45,4)}
+.YlOrBr .q0-9{fill:rgb(255,255,229)}
+.YlOrBr .q1-9{fill:rgb(255,247,188)}
+.YlOrBr .q2-9{fill:rgb(254,227,145)}
+.YlOrBr .q3-9{fill:rgb(254,196,79)}
+.YlOrBr .q4-9{fill:rgb(254,153,41)}
+.YlOrBr .q5-9{fill:rgb(236,112,20)}
+.YlOrBr .q6-9{fill:rgb(204,76,2)}
+.YlOrBr .q7-9{fill:rgb(153,52,4)}
+.YlOrBr .q8-9{fill:rgb(102,37,6)}
+.Purples .q0-3{fill:rgb(239,237,245)}
+.Purples .q1-3{fill:rgb(188,189,220)}
+.Purples .q2-3{fill:rgb(117,107,177)}
+.Purples .q0-4{fill:rgb(242,240,247)}
+.Purples .q1-4{fill:rgb(203,201,226)}
+.Purples .q2-4{fill:rgb(158,154,200)}
+.Purples .q3-4{fill:rgb(106,81,163)}
+.Purples .q0-5{fill:rgb(242,240,247)}
+.Purples .q1-5{fill:rgb(203,201,226)}
+.Purples .q2-5{fill:rgb(158,154,200)}
+.Purples .q3-5{fill:rgb(117,107,177)}
+.Purples .q4-5{fill:rgb(84,39,143)}
+.Purples .q0-6{fill:rgb(242,240,247)}
+.Purples .q1-6{fill:rgb(218,218,235)}
+.Purples .q2-6{fill:rgb(188,189,220)}
+.Purples .q3-6{fill:rgb(158,154,200)}
+.Purples .q4-6{fill:rgb(117,107,177)}
+.Purples .q5-6{fill:rgb(84,39,143)}
+.Purples .q0-7{fill:rgb(242,240,247)}
+.Purples .q1-7{fill:rgb(218,218,235)}
+.Purples .q2-7{fill:rgb(188,189,220)}
+.Purples .q3-7{fill:rgb(158,154,200)}
+.Purples .q4-7{fill:rgb(128,125,186)}
+.Purples .q5-7{fill:rgb(106,81,163)}
+.Purples .q6-7{fill:rgb(74,20,134)}
+.Purples .q0-8{fill:rgb(252,251,253)}
+.Purples .q1-8{fill:rgb(239,237,245)}
+.Purples .q2-8{fill:rgb(218,218,235)}
+.Purples .q3-8{fill:rgb(188,189,220)}
+.Purples .q4-8{fill:rgb(158,154,200)}
+.Purples .q5-8{fill:rgb(128,125,186)}
+.Purples .q6-8{fill:rgb(106,81,163)}
+.Purples .q7-8{fill:rgb(74,20,134)}
+.Purples .q0-9{fill:rgb(252,251,253)}
+.Purples .q1-9{fill:rgb(239,237,245)}
+.Purples .q2-9{fill:rgb(218,218,235)}
+.Purples .q3-9{fill:rgb(188,189,220)}
+.Purples .q4-9{fill:rgb(158,154,200)}
+.Purples .q5-9{fill:rgb(128,125,186)}
+.Purples .q6-9{fill:rgb(106,81,163)}
+.Purples .q7-9{fill:rgb(84,39,143)}
+.Purples .q8-9{fill:rgb(63,0,125)}
+.Blues .q0-3{fill:rgb(222,235,247)}
+.Blues .q1-3{fill:rgb(158,202,225)}
+.Blues .q2-3{fill:rgb(49,130,189)}
+.Blues .q0-4{fill:rgb(239,243,255)}
+.Blues .q1-4{fill:rgb(189,215,231)}
+.Blues .q2-4{fill:rgb(107,174,214)}
+.Blues .q3-4{fill:rgb(33,113,181)}
+.Blues .q0-5{fill:rgb(239,243,255)}
+.Blues .q1-5{fill:rgb(189,215,231)}
+.Blues .q2-5{fill:rgb(107,174,214)}
+.Blues .q3-5{fill:rgb(49,130,189)}
+.Blues .q4-5{fill:rgb(8,81,156)}
+.Blues .q0-6{fill:rgb(239,243,255)}
+.Blues .q1-6{fill:rgb(198,219,239)}
+.Blues .q2-6{fill:rgb(158,202,225)}
+.Blues .q3-6{fill:rgb(107,174,214)}
+.Blues .q4-6{fill:rgb(49,130,189)}
+.Blues .q5-6{fill:rgb(8,81,156)}
+.Blues .q0-7{fill:rgb(239,243,255)}
+.Blues .q1-7{fill:rgb(198,219,239)}
+.Blues .q2-7{fill:rgb(158,202,225)}
+.Blues .q3-7{fill:rgb(107,174,214)}
+.Blues .q4-7{fill:rgb(66,146,198)}
+.Blues .q5-7{fill:rgb(33,113,181)}
+.Blues .q6-7{fill:rgb(8,69,148)}
+.Blues .q0-8{fill:rgb(247,251,255)}
+.Blues .q1-8{fill:rgb(222,235,247)}
+.Blues .q2-8{fill:rgb(198,219,239)}
+.Blues .q3-8{fill:rgb(158,202,225)}
+.Blues .q4-8{fill:rgb(107,174,214)}
+.Blues .q5-8{fill:rgb(66,146,198)}
+.Blues .q6-8{fill:rgb(33,113,181)}
+.Blues .q7-8{fill:rgb(8,69,148)}
+.Blues .q0-9{fill:rgb(247,251,255)}
+.Blues .q1-9{fill:rgb(222,235,247)}
+.Blues .q2-9{fill:rgb(198,219,239)}
+.Blues .q3-9{fill:rgb(158,202,225)}
+.Blues .q4-9{fill:rgb(107,174,214)}
+.Blues .q5-9{fill:rgb(66,146,198)}
+.Blues .q6-9{fill:rgb(33,113,181)}
+.Blues .q7-9{fill:rgb(8,81,156)}
+.Blues .q8-9{fill:rgb(8,48,107)}
+.Greens .q0-3{fill:rgb(229,245,224)}
+.Greens .q1-3{fill:rgb(161,217,155)}
+.Greens .q2-3{fill:rgb(49,163,84)}
+.Greens .q0-4{fill:rgb(237,248,233)}
+.Greens .q1-4{fill:rgb(186,228,179)}
+.Greens .q2-4{fill:rgb(116,196,118)}
+.Greens .q3-4{fill:rgb(35,139,69)}
+.Greens .q0-5{fill:rgb(237,248,233)}
+.Greens .q1-5{fill:rgb(186,228,179)}
+.Greens .q2-5{fill:rgb(116,196,118)}
+.Greens .q3-5{fill:rgb(49,163,84)}
+.Greens .q4-5{fill:rgb(0,109,44)}
+.Greens .q0-6{fill:rgb(237,248,233)}
+.Greens .q1-6{fill:rgb(199,233,192)}
+.Greens .q2-6{fill:rgb(161,217,155)}
+.Greens .q3-6{fill:rgb(116,196,118)}
+.Greens .q4-6{fill:rgb(49,163,84)}
+.Greens .q5-6{fill:rgb(0,109,44)}
+.Greens .q0-7{fill:rgb(237,248,233)}
+.Greens .q1-7{fill:rgb(199,233,192)}
+.Greens .q2-7{fill:rgb(161,217,155)}
+.Greens .q3-7{fill:rgb(116,196,118)}
+.Greens .q4-7{fill:rgb(65,171,93)}
+.Greens .q5-7{fill:rgb(35,139,69)}
+.Greens .q6-7{fill:rgb(0,90,50)}
+.Greens .q0-8{fill:rgb(247,252,245)}
+.Greens .q1-8{fill:rgb(229,245,224)}
+.Greens .q2-8{fill:rgb(199,233,192)}
+.Greens .q3-8{fill:rgb(161,217,155)}
+.Greens .q4-8{fill:rgb(116,196,118)}
+.Greens .q5-8{fill:rgb(65,171,93)}
+.Greens .q6-8{fill:rgb(35,139,69)}
+.Greens .q7-8{fill:rgb(0,90,50)}
+.Greens .q0-9{fill:rgb(247,252,245)}
+.Greens .q1-9{fill:rgb(229,245,224)}
+.Greens .q2-9{fill:rgb(199,233,192)}
+.Greens .q3-9{fill:rgb(161,217,155)}
+.Greens .q4-9{fill:rgb(116,196,118)}
+.Greens .q5-9{fill:rgb(65,171,93)}
+.Greens .q6-9{fill:rgb(35,139,69)}
+.Greens .q7-9{fill:rgb(0,109,44)}
+.Greens .q8-9{fill:rgb(0,68,27)}
+.Oranges .q0-3{fill:rgb(254,230,206)}
+.Oranges .q1-3{fill:rgb(253,174,107)}
+.Oranges .q2-3{fill:rgb(230,85,13)}
+.Oranges .q0-4{fill:rgb(254,237,222)}
+.Oranges .q1-4{fill:rgb(253,190,133)}
+.Oranges .q2-4{fill:rgb(253,141,60)}
+.Oranges .q3-4{fill:rgb(217,71,1)}
+.Oranges .q0-5{fill:rgb(254,237,222)}
+.Oranges .q1-5{fill:rgb(253,190,133)}
+.Oranges .q2-5{fill:rgb(253,141,60)}
+.Oranges .q3-5{fill:rgb(230,85,13)}
+.Oranges .q4-5{fill:rgb(166,54,3)}
+.Oranges .q0-6{fill:rgb(254,237,222)}
+.Oranges .q1-6{fill:rgb(253,208,162)}
+.Oranges .q2-6{fill:rgb(253,174,107)}
+.Oranges .q3-6{fill:rgb(253,141,60)}
+.Oranges .q4-6{fill:rgb(230,85,13)}
+.Oranges .q5-6{fill:rgb(166,54,3)}
+.Oranges .q0-7{fill:rgb(254,237,222)}
+.Oranges .q1-7{fill:rgb(253,208,162)}
+.Oranges .q2-7{fill:rgb(253,174,107)}
+.Oranges .q3-7{fill:rgb(253,141,60)}
+.Oranges .q4-7{fill:rgb(241,105,19)}
+.Oranges .q5-7{fill:rgb(217,72,1)}
+.Oranges .q6-7{fill:rgb(140,45,4)}
+.Oranges .q0-8{fill:rgb(255,245,235)}
+.Oranges .q1-8{fill:rgb(254,230,206)}
+.Oranges .q2-8{fill:rgb(253,208,162)}
+.Oranges .q3-8{fill:rgb(253,174,107)}
+.Oranges .q4-8{fill:rgb(253,141,60)}
+.Oranges .q5-8{fill:rgb(241,105,19)}
+.Oranges .q6-8{fill:rgb(217,72,1)}
+.Oranges .q7-8{fill:rgb(140,45,4)}
+.Oranges .q0-9{fill:rgb(255,245,235)}
+.Oranges .q1-9{fill:rgb(254,230,206)}
+.Oranges .q2-9{fill:rgb(253,208,162)}
+.Oranges .q3-9{fill:rgb(253,174,107)}
+.Oranges .q4-9{fill:rgb(253,141,60)}
+.Oranges .q5-9{fill:rgb(241,105,19)}
+.Oranges .q6-9{fill:rgb(217,72,1)}
+.Oranges .q7-9{fill:rgb(166,54,3)}
+.Oranges .q8-9{fill:rgb(127,39,4)}
+.Reds .q0-3{fill:rgb(254,224,210)}
+.Reds .q1-3{fill:rgb(252,146,114)}
+.Reds .q2-3{fill:rgb(222,45,38)}
+.Reds .q0-4{fill:rgb(254,229,217)}
+.Reds .q1-4{fill:rgb(252,174,145)}
+.Reds .q2-4{fill:rgb(251,106,74)}
+.Reds .q3-4{fill:rgb(203,24,29)}
+.Reds .q0-5{fill:rgb(254,229,217)}
+.Reds .q1-5{fill:rgb(252,174,145)}
+.Reds .q2-5{fill:rgb(251,106,74)}
+.Reds .q3-5{fill:rgb(222,45,38)}
+.Reds .q4-5{fill:rgb(165,15,21)}
+.Reds .q0-6{fill:rgb(254,229,217)}
+.Reds .q1-6{fill:rgb(252,187,161)}
+.Reds .q2-6{fill:rgb(252,146,114)}
+.Reds .q3-6{fill:rgb(251,106,74)}
+.Reds .q4-6{fill:rgb(222,45,38)}
+.Reds .q5-6{fill:rgb(165,15,21)}
+.Reds .q0-7{fill:rgb(254,229,217)}
+.Reds .q1-7{fill:rgb(252,187,161)}
+.Reds .q2-7{fill:rgb(252,146,114)}
+.Reds .q3-7{fill:rgb(251,106,74)}
+.Reds .q4-7{fill:rgb(239,59,44)}
+.Reds .q5-7{fill:rgb(203,24,29)}
+.Reds .q6-7{fill:rgb(153,0,13)}
+.Reds .q0-8{fill:rgb(255,245,240)}
+.Reds .q1-8{fill:rgb(254,224,210)}
+.Reds .q2-8{fill:rgb(252,187,161)}
+.Reds .q3-8{fill:rgb(252,146,114)}
+.Reds .q4-8{fill:rgb(251,106,74)}
+.Reds .q5-8{fill:rgb(239,59,44)}
+.Reds .q6-8{fill:rgb(203,24,29)}
+.Reds .q7-8{fill:rgb(153,0,13)}
+.Reds .q0-9{fill:rgb(255,245,240)}
+.Reds .q1-9{fill:rgb(254,224,210)}
+.Reds .q2-9{fill:rgb(252,187,161)}
+.Reds .q3-9{fill:rgb(252,146,114)}
+.Reds .q4-9{fill:rgb(251,106,74)}
+.Reds .q5-9{fill:rgb(239,59,44)}
+.Reds .q6-9{fill:rgb(203,24,29)}
+.Reds .q7-9{fill:rgb(165,15,21)}
+.Reds .q8-9{fill:rgb(103,0,13)}
+.Greys .q0-3{fill:rgb(240,240,240)}
+.Greys .q1-3{fill:rgb(189,189,189)}
+.Greys .q2-3{fill:rgb(99,99,99)}
+.Greys .q0-4{fill:rgb(247,247,247)}
+.Greys .q1-4{fill:rgb(204,204,204)}
+.Greys .q2-4{fill:rgb(150,150,150)}
+.Greys .q3-4{fill:rgb(82,82,82)}
+.Greys .q0-5{fill:rgb(247,247,247)}
+.Greys .q1-5{fill:rgb(204,204,204)}
+.Greys .q2-5{fill:rgb(150,150,150)}
+.Greys .q3-5{fill:rgb(99,99,99)}
+.Greys .q4-5{fill:rgb(37,37,37)}
+.Greys .q0-6{fill:rgb(247,247,247)}
+.Greys .q1-6{fill:rgb(217,217,217)}
+.Greys .q2-6{fill:rgb(189,189,189)}
+.Greys .q3-6{fill:rgb(150,150,150)}
+.Greys .q4-6{fill:rgb(99,99,99)}
+.Greys .q5-6{fill:rgb(37,37,37)}
+.Greys .q0-7{fill:rgb(247,247,247)}
+.Greys .q1-7{fill:rgb(217,217,217)}
+.Greys .q2-7{fill:rgb(189,189,189)}
+.Greys .q3-7{fill:rgb(150,150,150)}
+.Greys .q4-7{fill:rgb(115,115,115)}
+.Greys .q5-7{fill:rgb(82,82,82)}
+.Greys .q6-7{fill:rgb(37,37,37)}
+.Greys .q0-8{fill:rgb(255,255,255)}
+.Greys .q1-8{fill:rgb(240,240,240)}
+.Greys .q2-8{fill:rgb(217,217,217)}
+.Greys .q3-8{fill:rgb(189,189,189)}
+.Greys .q4-8{fill:rgb(150,150,150)}
+.Greys .q5-8{fill:rgb(115,115,115)}
+.Greys .q6-8{fill:rgb(82,82,82)}
+.Greys .q7-8{fill:rgb(37,37,37)}
+.Greys .q0-9{fill:rgb(255,255,255)}
+.Greys .q1-9{fill:rgb(240,240,240)}
+.Greys .q2-9{fill:rgb(217,217,217)}
+.Greys .q3-9{fill:rgb(189,189,189)}
+.Greys .q4-9{fill:rgb(150,150,150)}
+.Greys .q5-9{fill:rgb(115,115,115)}
+.Greys .q6-9{fill:rgb(82,82,82)}
+.Greys .q7-9{fill:rgb(37,37,37)}
+.Greys .q8-9{fill:rgb(0,0,0)}
+.PuOr .q0-3{fill:rgb(241,163,64)}
+.PuOr .q1-3{fill:rgb(247,247,247)}
+.PuOr .q2-3{fill:rgb(153,142,195)}
+.PuOr .q0-4{fill:rgb(230,97,1)}
+.PuOr .q1-4{fill:rgb(253,184,99)}
+.PuOr .q2-4{fill:rgb(178,171,210)}
+.PuOr .q3-4{fill:rgb(94,60,153)}
+.PuOr .q0-5{fill:rgb(230,97,1)}
+.PuOr .q1-5{fill:rgb(253,184,99)}
+.PuOr .q2-5{fill:rgb(247,247,247)}
+.PuOr .q3-5{fill:rgb(178,171,210)}
+.PuOr .q4-5{fill:rgb(94,60,153)}
+.PuOr .q0-6{fill:rgb(179,88,6)}
+.PuOr .q1-6{fill:rgb(241,163,64)}
+.PuOr .q2-6{fill:rgb(254,224,182)}
+.PuOr .q3-6{fill:rgb(216,218,235)}
+.PuOr .q4-6{fill:rgb(153,142,195)}
+.PuOr .q5-6{fill:rgb(84,39,136)}
+.PuOr .q0-7{fill:rgb(179,88,6)}
+.PuOr .q1-7{fill:rgb(241,163,64)}
+.PuOr .q2-7{fill:rgb(254,224,182)}
+.PuOr .q3-7{fill:rgb(247,247,247)}
+.PuOr .q4-7{fill:rgb(216,218,235)}
+.PuOr .q5-7{fill:rgb(153,142,195)}
+.PuOr .q6-7{fill:rgb(84,39,136)}
+.PuOr .q0-8{fill:rgb(179,88,6)}
+.PuOr .q1-8{fill:rgb(224,130,20)}
+.PuOr .q2-8{fill:rgb(253,184,99)}
+.PuOr .q3-8{fill:rgb(254,224,182)}
+.PuOr .q4-8{fill:rgb(216,218,235)}
+.PuOr .q5-8{fill:rgb(178,171,210)}
+.PuOr .q6-8{fill:rgb(128,115,172)}
+.PuOr .q7-8{fill:rgb(84,39,136)}
+.PuOr .q0-9{fill:rgb(179,88,6)}
+.PuOr .q1-9{fill:rgb(224,130,20)}
+.PuOr .q2-9{fill:rgb(253,184,99)}
+.PuOr .q3-9{fill:rgb(254,224,182)}
+.PuOr .q4-9{fill:rgb(247,247,247)}
+.PuOr .q5-9{fill:rgb(216,218,235)}
+.PuOr .q6-9{fill:rgb(178,171,210)}
+.PuOr .q7-9{fill:rgb(128,115,172)}
+.PuOr .q8-9{fill:rgb(84,39,136)}
+.PuOr .q0-10{fill:rgb(127,59,8)}
+.PuOr .q1-10{fill:rgb(179,88,6)}
+.PuOr .q2-10{fill:rgb(224,130,20)}
+.PuOr .q3-10{fill:rgb(253,184,99)}
+.PuOr .q4-10{fill:rgb(254,224,182)}
+.PuOr .q5-10{fill:rgb(216,218,235)}
+.PuOr .q6-10{fill:rgb(178,171,210)}
+.PuOr .q7-10{fill:rgb(128,115,172)}
+.PuOr .q8-10{fill:rgb(84,39,136)}
+.PuOr .q9-10{fill:rgb(45,0,75)}
+.PuOr .q0-11{fill:rgb(127,59,8)}
+.PuOr .q1-11{fill:rgb(179,88,6)}
+.PuOr .q2-11{fill:rgb(224,130,20)}
+.PuOr .q3-11{fill:rgb(253,184,99)}
+.PuOr .q4-11{fill:rgb(254,224,182)}
+.PuOr .q5-11{fill:rgb(247,247,247)}
+.PuOr .q6-11{fill:rgb(216,218,235)}
+.PuOr .q7-11{fill:rgb(178,171,210)}
+.PuOr .q8-11{fill:rgb(128,115,172)}
+.PuOr .q9-11{fill:rgb(84,39,136)}
+.PuOr .q10-11{fill:rgb(45,0,75)}
+.BrBG .q0-3{fill:rgb(216,179,101)}
+.BrBG .q1-3{fill:rgb(245,245,245)}
+.BrBG .q2-3{fill:rgb(90,180,172)}
+.BrBG .q0-4{fill:rgb(166,97,26)}
+.BrBG .q1-4{fill:rgb(223,194,125)}
+.BrBG .q2-4{fill:rgb(128,205,193)}
+.BrBG .q3-4{fill:rgb(1,133,113)}
+.BrBG .q0-5{fill:rgb(166,97,26)}
+.BrBG .q1-5{fill:rgb(223,194,125)}
+.BrBG .q2-5{fill:rgb(245,245,245)}
+.BrBG .q3-5{fill:rgb(128,205,193)}
+.BrBG .q4-5{fill:rgb(1,133,113)}
+.BrBG .q0-6{fill:rgb(140,81,10)}
+.BrBG .q1-6{fill:rgb(216,179,101)}
+.BrBG .q2-6{fill:rgb(246,232,195)}
+.BrBG .q3-6{fill:rgb(199,234,229)}
+.BrBG .q4-6{fill:rgb(90,180,172)}
+.BrBG .q5-6{fill:rgb(1,102,94)}
+.BrBG .q0-7{fill:rgb(140,81,10)}
+.BrBG .q1-7{fill:rgb(216,179,101)}
+.BrBG .q2-7{fill:rgb(246,232,195)}
+.BrBG .q3-7{fill:rgb(245,245,245)}
+.BrBG .q4-7{fill:rgb(199,234,229)}
+.BrBG .q5-7{fill:rgb(90,180,172)}
+.BrBG .q6-7{fill:rgb(1,102,94)}
+.BrBG .q0-8{fill:rgb(140,81,10)}
+.BrBG .q1-8{fill:rgb(191,129,45)}
+.BrBG .q2-8{fill:rgb(223,194,125)}
+.BrBG .q3-8{fill:rgb(246,232,195)}
+.BrBG .q4-8{fill:rgb(199,234,229)}
+.BrBG .q5-8{fill:rgb(128,205,193)}
+.BrBG .q6-8{fill:rgb(53,151,143)}
+.BrBG .q7-8{fill:rgb(1,102,94)}
+.BrBG .q0-9{fill:rgb(140,81,10)}
+.BrBG .q1-9{fill:rgb(191,129,45)}
+.BrBG .q2-9{fill:rgb(223,194,125)}
+.BrBG .q3-9{fill:rgb(246,232,195)}
+.BrBG .q4-9{fill:rgb(245,245,245)}
+.BrBG .q5-9{fill:rgb(199,234,229)}
+.BrBG .q6-9{fill:rgb(128,205,193)}
+.BrBG .q7-9{fill:rgb(53,151,143)}
+.BrBG .q8-9{fill:rgb(1,102,94)}
+.BrBG .q0-10{fill:rgb(84,48,5)}
+.BrBG .q1-10{fill:rgb(140,81,10)}
+.BrBG .q2-10{fill:rgb(191,129,45)}
+.BrBG .q3-10{fill:rgb(223,194,125)}
+.BrBG .q4-10{fill:rgb(246,232,195)}
+.BrBG .q5-10{fill:rgb(199,234,229)}
+.BrBG .q6-10{fill:rgb(128,205,193)}
+.BrBG .q7-10{fill:rgb(53,151,143)}
+.BrBG .q8-10{fill:rgb(1,102,94)}
+.BrBG .q9-10{fill:rgb(0,60,48)}
+.BrBG .q0-11{fill:rgb(84,48,5)}
+.BrBG .q1-11{fill:rgb(140,81,10)}
+.BrBG .q2-11{fill:rgb(191,129,45)}
+.BrBG .q3-11{fill:rgb(223,194,125)}
+.BrBG .q4-11{fill:rgb(246,232,195)}
+.BrBG .q5-11{fill:rgb(245,245,245)}
+.BrBG .q6-11{fill:rgb(199,234,229)}
+.BrBG .q7-11{fill:rgb(128,205,193)}
+.BrBG .q8-11{fill:rgb(53,151,143)}
+.BrBG .q9-11{fill:rgb(1,102,94)}
+.BrBG .q10-11{fill:rgb(0,60,48)}
+.PRGn .q0-3{fill:rgb(175,141,195)}
+.PRGn .q1-3{fill:rgb(247,247,247)}
+.PRGn .q2-3{fill:rgb(127,191,123)}
+.PRGn .q0-4{fill:rgb(123,50,148)}
+.PRGn .q1-4{fill:rgb(194,165,207)}
+.PRGn .q2-4{fill:rgb(166,219,160)}
+.PRGn .q3-4{fill:rgb(0,136,55)}
+.PRGn .q0-5{fill:rgb(123,50,148)}
+.PRGn .q1-5{fill:rgb(194,165,207)}
+.PRGn .q2-5{fill:rgb(247,247,247)}
+.PRGn .q3-5{fill:rgb(166,219,160)}
+.PRGn .q4-5{fill:rgb(0,136,55)}
+.PRGn .q0-6{fill:rgb(118,42,131)}
+.PRGn .q1-6{fill:rgb(175,141,195)}
+.PRGn .q2-6{fill:rgb(231,212,232)}
+.PRGn .q3-6{fill:rgb(217,240,211)}
+.PRGn .q4-6{fill:rgb(127,191,123)}
+.PRGn .q5-6{fill:rgb(27,120,55)}
+.PRGn .q0-7{fill:rgb(118,42,131)}
+.PRGn .q1-7{fill:rgb(175,141,195)}
+.PRGn .q2-7{fill:rgb(231,212,232)}
+.PRGn .q3-7{fill:rgb(247,247,247)}
+.PRGn .q4-7{fill:rgb(217,240,211)}
+.PRGn .q5-7{fill:rgb(127,191,123)}
+.PRGn .q6-7{fill:rgb(27,120,55)}
+.PRGn .q0-8{fill:rgb(118,42,131)}
+.PRGn .q1-8{fill:rgb(153,112,171)}
+.PRGn .q2-8{fill:rgb(194,165,207)}
+.PRGn .q3-8{fill:rgb(231,212,232)}
+.PRGn .q4-8{fill:rgb(217,240,211)}
+.PRGn .q5-8{fill:rgb(166,219,160)}
+.PRGn .q6-8{fill:rgb(90,174,97)}
+.PRGn .q7-8{fill:rgb(27,120,55)}
+.PRGn .q0-9{fill:rgb(118,42,131)}
+.PRGn .q1-9{fill:rgb(153,112,171)}
+.PRGn .q2-9{fill:rgb(194,165,207)}
+.PRGn .q3-9{fill:rgb(231,212,232)}
+.PRGn .q4-9{fill:rgb(247,247,247)}
+.PRGn .q5-9{fill:rgb(217,240,211)}
+.PRGn .q6-9{fill:rgb(166,219,160)}
+.PRGn .q7-9{fill:rgb(90,174,97)}
+.PRGn .q8-9{fill:rgb(27,120,55)}
+.PRGn .q0-10{fill:rgb(64,0,75)}
+.PRGn .q1-10{fill:rgb(118,42,131)}
+.PRGn .q2-10{fill:rgb(153,112,171)}
+.PRGn .q3-10{fill:rgb(194,165,207)}
+.PRGn .q4-10{fill:rgb(231,212,232)}
+.PRGn .q5-10{fill:rgb(217,240,211)}
+.PRGn .q6-10{fill:rgb(166,219,160)}
+.PRGn .q7-10{fill:rgb(90,174,97)}
+.PRGn .q8-10{fill:rgb(27,120,55)}
+.PRGn .q9-10{fill:rgb(0,68,27)}
+.PRGn .q0-11{fill:rgb(64,0,75)}
+.PRGn .q1-11{fill:rgb(118,42,131)}
+.PRGn .q2-11{fill:rgb(153,112,171)}
+.PRGn .q3-11{fill:rgb(194,165,207)}
+.PRGn .q4-11{fill:rgb(231,212,232)}
+.PRGn .q5-11{fill:rgb(247,247,247)}
+.PRGn .q6-11{fill:rgb(217,240,211)}
+.PRGn .q7-11{fill:rgb(166,219,160)}
+.PRGn .q8-11{fill:rgb(90,174,97)}
+.PRGn .q9-11{fill:rgb(27,120,55)}
+.PRGn .q10-11{fill:rgb(0,68,27)}
+.PiYG .q0-3{fill:rgb(233,163,201)}
+.PiYG .q1-3{fill:rgb(247,247,247)}
+.PiYG .q2-3{fill:rgb(161,215,106)}
+.PiYG .q0-4{fill:rgb(208,28,139)}
+.PiYG .q1-4{fill:rgb(241,182,218)}
+.PiYG .q2-4{fill:rgb(184,225,134)}
+.PiYG .q3-4{fill:rgb(77,172,38)}
+.PiYG .q0-5{fill:rgb(208,28,139)}
+.PiYG .q1-5{fill:rgb(241,182,218)}
+.PiYG .q2-5{fill:rgb(247,247,247)}
+.PiYG .q3-5{fill:rgb(184,225,134)}
+.PiYG .q4-5{fill:rgb(77,172,38)}
+.PiYG .q0-6{fill:rgb(197,27,125)}
+.PiYG .q1-6{fill:rgb(233,163,201)}
+.PiYG .q2-6{fill:rgb(253,224,239)}
+.PiYG .q3-6{fill:rgb(230,245,208)}
+.PiYG .q4-6{fill:rgb(161,215,106)}
+.PiYG .q5-6{fill:rgb(77,146,33)}
+.PiYG .q0-7{fill:rgb(197,27,125)}
+.PiYG .q1-7{fill:rgb(233,163,201)}
+.PiYG .q2-7{fill:rgb(253,224,239)}
+.PiYG .q3-7{fill:rgb(247,247,247)}
+.PiYG .q4-7{fill:rgb(230,245,208)}
+.PiYG .q5-7{fill:rgb(161,215,106)}
+.PiYG .q6-7{fill:rgb(77,146,33)}
+.PiYG .q0-8{fill:rgb(197,27,125)}
+.PiYG .q1-8{fill:rgb(222,119,174)}
+.PiYG .q2-8{fill:rgb(241,182,218)}
+.PiYG .q3-8{fill:rgb(253,224,239)}
+.PiYG .q4-8{fill:rgb(230,245,208)}
+.PiYG .q5-8{fill:rgb(184,225,134)}
+.PiYG .q6-8{fill:rgb(127,188,65)}
+.PiYG .q7-8{fill:rgb(77,146,33)}
+.PiYG .q0-9{fill:rgb(197,27,125)}
+.PiYG .q1-9{fill:rgb(222,119,174)}
+.PiYG .q2-9{fill:rgb(241,182,218)}
+.PiYG .q3-9{fill:rgb(253,224,239)}
+.PiYG .q4-9{fill:rgb(247,247,247)}
+.PiYG .q5-9{fill:rgb(230,245,208)}
+.PiYG .q6-9{fill:rgb(184,225,134)}
+.PiYG .q7-9{fill:rgb(127,188,65)}
+.PiYG .q8-9{fill:rgb(77,146,33)}
+.PiYG .q0-10{fill:rgb(142,1,82)}
+.PiYG .q1-10{fill:rgb(197,27,125)}
+.PiYG .q2-10{fill:rgb(222,119,174)}
+.PiYG .q3-10{fill:rgb(241,182,218)}
+.PiYG .q4-10{fill:rgb(253,224,239)}
+.PiYG .q5-10{fill:rgb(230,245,208)}
+.PiYG .q6-10{fill:rgb(184,225,134)}
+.PiYG .q7-10{fill:rgb(127,188,65)}
+.PiYG .q8-10{fill:rgb(77,146,33)}
+.PiYG .q9-10{fill:rgb(39,100,25)}
+.PiYG .q0-11{fill:rgb(142,1,82)}
+.PiYG .q1-11{fill:rgb(197,27,125)}
+.PiYG .q2-11{fill:rgb(222,119,174)}
+.PiYG .q3-11{fill:rgb(241,182,218)}
+.PiYG .q4-11{fill:rgb(253,224,239)}
+.PiYG .q5-11{fill:rgb(247,247,247)}
+.PiYG .q6-11{fill:rgb(230,245,208)}
+.PiYG .q7-11{fill:rgb(184,225,134)}
+.PiYG .q8-11{fill:rgb(127,188,65)}
+.PiYG .q9-11{fill:rgb(77,146,33)}
+.PiYG .q10-11{fill:rgb(39,100,25)}
+.RdBu .q0-3{fill:rgb(239,138,98)}
+.RdBu .q1-3{fill:rgb(247,247,247)}
+.RdBu .q2-3{fill:rgb(103,169,207)}
+.RdBu .q0-4{fill:rgb(202,0,32)}
+.RdBu .q1-4{fill:rgb(244,165,130)}
+.RdBu .q2-4{fill:rgb(146,197,222)}
+.RdBu .q3-4{fill:rgb(5,113,176)}
+.RdBu .q0-5{fill:rgb(202,0,32)}
+.RdBu .q1-5{fill:rgb(244,165,130)}
+.RdBu .q2-5{fill:rgb(247,247,247)}
+.RdBu .q3-5{fill:rgb(146,197,222)}
+.RdBu .q4-5{fill:rgb(5,113,176)}
+.RdBu .q0-6{fill:rgb(178,24,43)}
+.RdBu .q1-6{fill:rgb(239,138,98)}
+.RdBu .q2-6{fill:rgb(253,219,199)}
+.RdBu .q3-6{fill:rgb(209,229,240)}
+.RdBu .q4-6{fill:rgb(103,169,207)}
+.RdBu .q5-6{fill:rgb(33,102,172)}
+.RdBu .q0-7{fill:rgb(178,24,43)}
+.RdBu .q1-7{fill:rgb(239,138,98)}
+.RdBu .q2-7{fill:rgb(253,219,199)}
+.RdBu .q3-7{fill:rgb(247,247,247)}
+.RdBu .q4-7{fill:rgb(209,229,240)}
+.RdBu .q5-7{fill:rgb(103,169,207)}
+.RdBu .q6-7{fill:rgb(33,102,172)}
+.RdBu .q0-8{fill:rgb(178,24,43)}
+.RdBu .q1-8{fill:rgb(214,96,77)}
+.RdBu .q2-8{fill:rgb(244,165,130)}
+.RdBu .q3-8{fill:rgb(253,219,199)}
+.RdBu .q4-8{fill:rgb(209,229,240)}
+.RdBu .q5-8{fill:rgb(146,197,222)}
+.RdBu .q6-8{fill:rgb(67,147,195)}
+.RdBu .q7-8{fill:rgb(33,102,172)}
+.RdBu .q0-9{fill:rgb(178,24,43)}
+.RdBu .q1-9{fill:rgb(214,96,77)}
+.RdBu .q2-9{fill:rgb(244,165,130)}
+.RdBu .q3-9{fill:rgb(253,219,199)}
+.RdBu .q4-9{fill:rgb(247,247,247)}
+.RdBu .q5-9{fill:rgb(209,229,240)}
+.RdBu .q6-9{fill:rgb(146,197,222)}
+.RdBu .q7-9{fill:rgb(67,147,195)}
+.RdBu .q8-9{fill:rgb(33,102,172)}
+.RdBu .q0-10{fill:rgb(103,0,31)}
+.RdBu .q1-10{fill:rgb(178,24,43)}
+.RdBu .q2-10{fill:rgb(214,96,77)}
+.RdBu .q3-10{fill:rgb(244,165,130)}
+.RdBu .q4-10{fill:rgb(253,219,199)}
+.RdBu .q5-10{fill:rgb(209,229,240)}
+.RdBu .q6-10{fill:rgb(146,197,222)}
+.RdBu .q7-10{fill:rgb(67,147,195)}
+.RdBu .q8-10{fill:rgb(33,102,172)}
+.RdBu .q9-10{fill:rgb(5,48,97)}
+.RdBu .q0-11{fill:rgb(103,0,31)}
+.RdBu .q1-11{fill:rgb(178,24,43)}
+.RdBu .q2-11{fill:rgb(214,96,77)}
+.RdBu .q3-11{fill:rgb(244,165,130)}
+.RdBu .q4-11{fill:rgb(253,219,199)}
+.RdBu .q5-11{fill:rgb(247,247,247)}
+.RdBu .q6-11{fill:rgb(209,229,240)}
+.RdBu .q7-11{fill:rgb(146,197,222)}
+.RdBu .q8-11{fill:rgb(67,147,195)}
+.RdBu .q9-11{fill:rgb(33,102,172)}
+.RdBu .q10-11{fill:rgb(5,48,97)}
+.RdGy .q0-3{fill:rgb(239,138,98)}
+.RdGy .q1-3{fill:rgb(255,255,255)}
+.RdGy .q2-3{fill:rgb(153,153,153)}
+.RdGy .q0-4{fill:rgb(202,0,32)}
+.RdGy .q1-4{fill:rgb(244,165,130)}
+.RdGy .q2-4{fill:rgb(186,186,186)}
+.RdGy .q3-4{fill:rgb(64,64,64)}
+.RdGy .q0-5{fill:rgb(202,0,32)}
+.RdGy .q1-5{fill:rgb(244,165,130)}
+.RdGy .q2-5{fill:rgb(255,255,255)}
+.RdGy .q3-5{fill:rgb(186,186,186)}
+.RdGy .q4-5{fill:rgb(64,64,64)}
+.RdGy .q0-6{fill:rgb(178,24,43)}
+.RdGy .q1-6{fill:rgb(239,138,98)}
+.RdGy .q2-6{fill:rgb(253,219,199)}
+.RdGy .q3-6{fill:rgb(224,224,224)}
+.RdGy .q4-6{fill:rgb(153,153,153)}
+.RdGy .q5-6{fill:rgb(77,77,77)}
+.RdGy .q0-7{fill:rgb(178,24,43)}
+.RdGy .q1-7{fill:rgb(239,138,98)}
+.RdGy .q2-7{fill:rgb(253,219,199)}
+.RdGy .q3-7{fill:rgb(255,255,255)}
+.RdGy .q4-7{fill:rgb(224,224,224)}
+.RdGy .q5-7{fill:rgb(153,153,153)}
+.RdGy .q6-7{fill:rgb(77,77,77)}
+.RdGy .q0-8{fill:rgb(178,24,43)}
+.RdGy .q1-8{fill:rgb(214,96,77)}
+.RdGy .q2-8{fill:rgb(244,165,130)}
+.RdGy .q3-8{fill:rgb(253,219,199)}
+.RdGy .q4-8{fill:rgb(224,224,224)}
+.RdGy .q5-8{fill:rgb(186,186,186)}
+.RdGy .q6-8{fill:rgb(135,135,135)}
+.RdGy .q7-8{fill:rgb(77,77,77)}
+.RdGy .q0-9{fill:rgb(178,24,43)}
+.RdGy .q1-9{fill:rgb(214,96,77)}
+.RdGy .q2-9{fill:rgb(244,165,130)}
+.RdGy .q3-9{fill:rgb(253,219,199)}
+.RdGy .q4-9{fill:rgb(255,255,255)}
+.RdGy .q5-9{fill:rgb(224,224,224)}
+.RdGy .q6-9{fill:rgb(186,186,186)}
+.RdGy .q7-9{fill:rgb(135,135,135)}
+.RdGy .q8-9{fill:rgb(77,77,77)}
+.RdGy .q0-10{fill:rgb(103,0,31)}
+.RdGy .q1-10{fill:rgb(178,24,43)}
+.RdGy .q2-10{fill:rgb(214,96,77)}
+.RdGy .q3-10{fill:rgb(244,165,130)}
+.RdGy .q4-10{fill:rgb(253,219,199)}
+.RdGy .q5-10{fill:rgb(224,224,224)}
+.RdGy .q6-10{fill:rgb(186,186,186)}
+.RdGy .q7-10{fill:rgb(135,135,135)}
+.RdGy .q8-10{fill:rgb(77,77,77)}
+.RdGy .q9-10{fill:rgb(26,26,26)}
+.RdGy .q0-11{fill:rgb(103,0,31)}
+.RdGy .q1-11{fill:rgb(178,24,43)}
+.RdGy .q2-11{fill:rgb(214,96,77)}
+.RdGy .q3-11{fill:rgb(244,165,130)}
+.RdGy .q4-11{fill:rgb(253,219,199)}
+.RdGy .q5-11{fill:rgb(255,255,255)}
+.RdGy .q6-11{fill:rgb(224,224,224)}
+.RdGy .q7-11{fill:rgb(186,186,186)}
+.RdGy .q8-11{fill:rgb(135,135,135)}
+.RdGy .q9-11{fill:rgb(77,77,77)}
+.RdGy .q10-11{fill:rgb(26,26,26)}
+.RdYlBu .q0-3{fill:rgb(252,141,89)}
+.RdYlBu .q1-3{fill:rgb(255,255,191)}
+.RdYlBu .q2-3{fill:rgb(145,191,219)}
+.RdYlBu .q0-4{fill:rgb(215,25,28)}
+.RdYlBu .q1-4{fill:rgb(253,174,97)}
+.RdYlBu .q2-4{fill:rgb(171,217,233)}
+.RdYlBu .q3-4{fill:rgb(44,123,182)}
+.RdYlBu .q0-5{fill:rgb(215,25,28)}
+.RdYlBu .q1-5{fill:rgb(253,174,97)}
+.RdYlBu .q2-5{fill:rgb(255,255,191)}
+.RdYlBu .q3-5{fill:rgb(171,217,233)}
+.RdYlBu .q4-5{fill:rgb(44,123,182)}
+.RdYlBu .q0-6{fill:rgb(215,48,39)}
+.RdYlBu .q1-6{fill:rgb(252,141,89)}
+.RdYlBu .q2-6{fill:rgb(254,224,144)}
+.RdYlBu .q3-6{fill:rgb(224,243,248)}
+.RdYlBu .q4-6{fill:rgb(145,191,219)}
+.RdYlBu .q5-6{fill:rgb(69,117,180)}
+.RdYlBu .q0-7{fill:rgb(215,48,39)}
+.RdYlBu .q1-7{fill:rgb(252,141,89)}
+.RdYlBu .q2-7{fill:rgb(254,224,144)}
+.RdYlBu .q3-7{fill:rgb(255,255,191)}
+.RdYlBu .q4-7{fill:rgb(224,243,248)}
+.RdYlBu .q5-7{fill:rgb(145,191,219)}
+.RdYlBu .q6-7{fill:rgb(69,117,180)}
+.RdYlBu .q0-8{fill:rgb(215,48,39)}
+.RdYlBu .q1-8{fill:rgb(244,109,67)}
+.RdYlBu .q2-8{fill:rgb(253,174,97)}
+.RdYlBu .q3-8{fill:rgb(254,224,144)}
+.RdYlBu .q4-8{fill:rgb(224,243,248)}
+.RdYlBu .q5-8{fill:rgb(171,217,233)}
+.RdYlBu .q6-8{fill:rgb(116,173,209)}
+.RdYlBu .q7-8{fill:rgb(69,117,180)}
+.RdYlBu .q0-9{fill:rgb(215,48,39)}
+.RdYlBu .q1-9{fill:rgb(244,109,67)}
+.RdYlBu .q2-9{fill:rgb(253,174,97)}
+.RdYlBu .q3-9{fill:rgb(254,224,144)}
+.RdYlBu .q4-9{fill:rgb(255,255,191)}
+.RdYlBu .q5-9{fill:rgb(224,243,248)}
+.RdYlBu .q6-9{fill:rgb(171,217,233)}
+.RdYlBu .q7-9{fill:rgb(116,173,209)}
+.RdYlBu .q8-9{fill:rgb(69,117,180)}
+.RdYlBu .q0-10{fill:rgb(165,0,38)}
+.RdYlBu .q1-10{fill:rgb(215,48,39)}
+.RdYlBu .q2-10{fill:rgb(244,109,67)}
+.RdYlBu .q3-10{fill:rgb(253,174,97)}
+.RdYlBu .q4-10{fill:rgb(254,224,144)}
+.RdYlBu .q5-10{fill:rgb(224,243,248)}
+.RdYlBu .q6-10{fill:rgb(171,217,233)}
+.RdYlBu .q7-10{fill:rgb(116,173,209)}
+.RdYlBu .q8-10{fill:rgb(69,117,180)}
+.RdYlBu .q9-10{fill:rgb(49,54,149)}
+.RdYlBu .q0-11{fill:rgb(165,0,38)}
+.RdYlBu .q1-11{fill:rgb(215,48,39)}
+.RdYlBu .q2-11{fill:rgb(244,109,67)}
+.RdYlBu .q3-11{fill:rgb(253,174,97)}
+.RdYlBu .q4-11{fill:rgb(254,224,144)}
+.RdYlBu .q5-11{fill:rgb(255,255,191)}
+.RdYlBu .q6-11{fill:rgb(224,243,248)}
+.RdYlBu .q7-11{fill:rgb(171,217,233)}
+.RdYlBu .q8-11{fill:rgb(116,173,209)}
+.RdYlBu .q9-11{fill:rgb(69,117,180)}
+.RdYlBu .q10-11{fill:rgb(49,54,149)}
+.Spectral .q0-3{fill:rgb(252,141,89)}
+.Spectral .q1-3{fill:rgb(255,255,191)}
+.Spectral .q2-3{fill:rgb(153,213,148)}
+.Spectral .q0-4{fill:rgb(215,25,28)}
+.Spectral .q1-4{fill:rgb(253,174,97)}
+.Spectral .q2-4{fill:rgb(171,221,164)}
+.Spectral .q3-4{fill:rgb(43,131,186)}
+.Spectral .q0-5{fill:rgb(215,25,28)}
+.Spectral .q1-5{fill:rgb(253,174,97)}
+.Spectral .q2-5{fill:rgb(255,255,191)}
+.Spectral .q3-5{fill:rgb(171,221,164)}
+.Spectral .q4-5{fill:rgb(43,131,186)}
+.Spectral .q0-6{fill:rgb(213,62,79)}
+.Spectral .q1-6{fill:rgb(252,141,89)}
+.Spectral .q2-6{fill:rgb(254,224,139)}
+.Spectral .q3-6{fill:rgb(230,245,152)}
+.Spectral .q4-6{fill:rgb(153,213,148)}
+.Spectral .q5-6{fill:rgb(50,136,189)}
+.Spectral .q0-7{fill:rgb(213,62,79)}
+.Spectral .q1-7{fill:rgb(252,141,89)}
+.Spectral .q2-7{fill:rgb(254,224,139)}
+.Spectral .q3-7{fill:rgb(255,255,191)}
+.Spectral .q4-7{fill:rgb(230,245,152)}
+.Spectral .q5-7{fill:rgb(153,213,148)}
+.Spectral .q6-7{fill:rgb(50,136,189)}
+.Spectral .q0-8{fill:rgb(213,62,79)}
+.Spectral .q1-8{fill:rgb(244,109,67)}
+.Spectral .q2-8{fill:rgb(253,174,97)}
+.Spectral .q3-8{fill:rgb(254,224,139)}
+.Spectral .q4-8{fill:rgb(230,245,152)}
+.Spectral .q5-8{fill:rgb(171,221,164)}
+.Spectral .q6-8{fill:rgb(102,194,165)}
+.Spectral .q7-8{fill:rgb(50,136,189)}
+.Spectral .q0-9{fill:rgb(213,62,79)}
+.Spectral .q1-9{fill:rgb(244,109,67)}
+.Spectral .q2-9{fill:rgb(253,174,97)}
+.Spectral .q3-9{fill:rgb(254,224,139)}
+.Spectral .q4-9{fill:rgb(255,255,191)}
+.Spectral .q5-9{fill:rgb(230,245,152)}
+.Spectral .q6-9{fill:rgb(171,221,164)}
+.Spectral .q7-9{fill:rgb(102,194,165)}
+.Spectral .q8-9{fill:rgb(50,136,189)}
+.Spectral .q0-10{fill:rgb(158,1,66)}
+.Spectral .q1-10{fill:rgb(213,62,79)}
+.Spectral .q2-10{fill:rgb(244,109,67)}
+.Spectral .q3-10{fill:rgb(253,174,97)}
+.Spectral .q4-10{fill:rgb(254,224,139)}
+.Spectral .q5-10{fill:rgb(230,245,152)}
+.Spectral .q6-10{fill:rgb(171,221,164)}
+.Spectral .q7-10{fill:rgb(102,194,165)}
+.Spectral .q8-10{fill:rgb(50,136,189)}
+.Spectral .q9-10{fill:rgb(94,79,162)}
+.Spectral .q0-11{fill:rgb(158,1,66)}
+.Spectral .q1-11{fill:rgb(213,62,79)}
+.Spectral .q2-11{fill:rgb(244,109,67)}
+.Spectral .q3-11{fill:rgb(253,174,97)}
+.Spectral .q4-11{fill:rgb(254,224,139)}
+.Spectral .q5-11{fill:rgb(255,255,191)}
+.Spectral .q6-11{fill:rgb(230,245,152)}
+.Spectral .q7-11{fill:rgb(171,221,164)}
+.Spectral .q8-11{fill:rgb(102,194,165)}
+.Spectral .q9-11{fill:rgb(50,136,189)}
+.Spectral .q10-11{fill:rgb(94,79,162)}
+.RdYlGn .q0-3{fill:rgb(252,141,89)}
+.RdYlGn .q1-3{fill:rgb(255,255,191)}
+.RdYlGn .q2-3{fill:rgb(145,207,96)}
+.RdYlGn .q0-4{fill:rgb(215,25,28)}
+.RdYlGn .q1-4{fill:rgb(253,174,97)}
+.RdYlGn .q2-4{fill:rgb(166,217,106)}
+.RdYlGn .q3-4{fill:rgb(26,150,65)}
+.RdYlGn .q0-5{fill:rgb(215,25,28)}
+.RdYlGn .q1-5{fill:rgb(253,174,97)}
+.RdYlGn .q2-5{fill:rgb(255,255,191)}
+.RdYlGn .q3-5{fill:rgb(166,217,106)}
+.RdYlGn .q4-5{fill:rgb(26,150,65)}
+.RdYlGn .q0-6{fill:rgb(215,48,39)}
+.RdYlGn .q1-6{fill:rgb(252,141,89)}
+.RdYlGn .q2-6{fill:rgb(254,224,139)}
+.RdYlGn .q3-6{fill:rgb(217,239,139)}
+.RdYlGn .q4-6{fill:rgb(145,207,96)}
+.RdYlGn .q5-6{fill:rgb(26,152,80)}
+.RdYlGn .q0-7{fill:rgb(215,48,39)}
+.RdYlGn .q1-7{fill:rgb(252,141,89)}
+.RdYlGn .q2-7{fill:rgb(254,224,139)}
+.RdYlGn .q3-7{fill:rgb(255,255,191)}
+.RdYlGn .q4-7{fill:rgb(217,239,139)}
+.RdYlGn .q5-7{fill:rgb(145,207,96)}
+.RdYlGn .q6-7{fill:rgb(26,152,80)}
+.RdYlGn .q0-8{fill:rgb(215,48,39)}
+.RdYlGn .q1-8{fill:rgb(244,109,67)}
+.RdYlGn .q2-8{fill:rgb(253,174,97)}
+.RdYlGn .q3-8{fill:rgb(254,224,139)}
+.RdYlGn .q4-8{fill:rgb(217,239,139)}
+.RdYlGn .q5-8{fill:rgb(166,217,106)}
+.RdYlGn .q6-8{fill:rgb(102,189,99)}
+.RdYlGn .q7-8{fill:rgb(26,152,80)}
+.RdYlGn .q0-9{fill:rgb(215,48,39)}
+.RdYlGn .q1-9{fill:rgb(244,109,67)}
+.RdYlGn .q2-9{fill:rgb(253,174,97)}
+.RdYlGn .q3-9{fill:rgb(254,224,139)}
+.RdYlGn .q4-9{fill:rgb(255,255,191)}
+.RdYlGn .q5-9{fill:rgb(217,239,139)}
+.RdYlGn .q6-9{fill:rgb(166,217,106)}
+.RdYlGn .q7-9{fill:rgb(102,189,99)}
+.RdYlGn .q8-9{fill:rgb(26,152,80)}
+.RdYlGn .q0-10{fill:rgb(165,0,38)}
+.RdYlGn .q1-10{fill:rgb(215,48,39)}
+.RdYlGn .q2-10{fill:rgb(244,109,67)}
+.RdYlGn .q3-10{fill:rgb(253,174,97)}
+.RdYlGn .q4-10{fill:rgb(254,224,139)}
+.RdYlGn .q5-10{fill:rgb(217,239,139)}
+.RdYlGn .q6-10{fill:rgb(166,217,106)}
+.RdYlGn .q7-10{fill:rgb(102,189,99)}
+.RdYlGn .q8-10{fill:rgb(26,152,80)}
+.RdYlGn .q9-10{fill:rgb(0,104,55)}
+.RdYlGn .q0-11{fill:rgb(165,0,38)}
+.RdYlGn .q1-11{fill:rgb(215,48,39)}
+.RdYlGn .q2-11{fill:rgb(244,109,67)}
+.RdYlGn .q3-11{fill:rgb(253,174,97)}
+.RdYlGn .q4-11{fill:rgb(254,224,139)}
+.RdYlGn .q5-11{fill:rgb(255,255,191)}
+.RdYlGn .q6-11{fill:rgb(217,239,139)}
+.RdYlGn .q7-11{fill:rgb(166,217,106)}
+.RdYlGn .q8-11{fill:rgb(102,189,99)}
+.RdYlGn .q9-11{fill:rgb(26,152,80)}
+.RdYlGn .q10-11{fill:rgb(0,104,55)}
diff --git a/static/demo/components/d3/lib/colorbrewer/colorbrewer.js b/static/demo/components/d3/lib/colorbrewer/colorbrewer.js
new file mode 100644
index 0000000000000000000000000000000000000000..7c45a48beb2328ede8bf0c9dfcc084d7dc2e18ab
--- /dev/null
+++ b/static/demo/components/d3/lib/colorbrewer/colorbrewer.js
@@ -0,0 +1,236 @@
+// This product includes color specifications and designs developed by Cynthia Brewer (http://colorbrewer.org/).
+var colorbrewer = {YlGn: {
+3: ["#f7fcb9","#addd8e","#31a354"],
+4: ["#ffffcc","#c2e699","#78c679","#238443"],
+5: ["#ffffcc","#c2e699","#78c679","#31a354","#006837"],
+6: ["#ffffcc","#d9f0a3","#addd8e","#78c679","#31a354","#006837"],
+7: ["#ffffcc","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#005a32"],
+8: ["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#005a32"],
+9: ["#ffffe5","#f7fcb9","#d9f0a3","#addd8e","#78c679","#41ab5d","#238443","#006837","#004529"]
+},YlGnBu: {
+3: ["#edf8b1","#7fcdbb","#2c7fb8"],
+4: ["#ffffcc","#a1dab4","#41b6c4","#225ea8"],
+5: ["#ffffcc","#a1dab4","#41b6c4","#2c7fb8","#253494"],
+6: ["#ffffcc","#c7e9b4","#7fcdbb","#41b6c4","#2c7fb8","#253494"],
+7: ["#ffffcc","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#0c2c84"],
+8: ["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#0c2c84"],
+9: ["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"]
+},GnBu: {
+3: ["#e0f3db","#a8ddb5","#43a2ca"],
+4: ["#f0f9e8","#bae4bc","#7bccc4","#2b8cbe"],
+5: ["#f0f9e8","#bae4bc","#7bccc4","#43a2ca","#0868ac"],
+6: ["#f0f9e8","#ccebc5","#a8ddb5","#7bccc4","#43a2ca","#0868ac"],
+7: ["#f0f9e8","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#08589e"],
+8: ["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#08589e"],
+9: ["#f7fcf0","#e0f3db","#ccebc5","#a8ddb5","#7bccc4","#4eb3d3","#2b8cbe","#0868ac","#084081"]
+},BuGn: {
+3: ["#e5f5f9","#99d8c9","#2ca25f"],
+4: ["#edf8fb","#b2e2e2","#66c2a4","#238b45"],
+5: ["#edf8fb","#b2e2e2","#66c2a4","#2ca25f","#006d2c"],
+6: ["#edf8fb","#ccece6","#99d8c9","#66c2a4","#2ca25f","#006d2c"],
+7: ["#edf8fb","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#005824"],
+8: ["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#005824"],
+9: ["#f7fcfd","#e5f5f9","#ccece6","#99d8c9","#66c2a4","#41ae76","#238b45","#006d2c","#00441b"]
+},PuBuGn: {
+3: ["#ece2f0","#a6bddb","#1c9099"],
+4: ["#f6eff7","#bdc9e1","#67a9cf","#02818a"],
+5: ["#f6eff7","#bdc9e1","#67a9cf","#1c9099","#016c59"],
+6: ["#f6eff7","#d0d1e6","#a6bddb","#67a9cf","#1c9099","#016c59"],
+7: ["#f6eff7","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016450"],
+8: ["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016450"],
+9: ["#fff7fb","#ece2f0","#d0d1e6","#a6bddb","#67a9cf","#3690c0","#02818a","#016c59","#014636"]
+},PuBu: {
+3: ["#ece7f2","#a6bddb","#2b8cbe"],
+4: ["#f1eef6","#bdc9e1","#74a9cf","#0570b0"],
+5: ["#f1eef6","#bdc9e1","#74a9cf","#2b8cbe","#045a8d"],
+6: ["#f1eef6","#d0d1e6","#a6bddb","#74a9cf","#2b8cbe","#045a8d"],
+7: ["#f1eef6","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#034e7b"],
+8: ["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#034e7b"],
+9: ["#fff7fb","#ece7f2","#d0d1e6","#a6bddb","#74a9cf","#3690c0","#0570b0","#045a8d","#023858"]
+},BuPu: {
+3: ["#e0ecf4","#9ebcda","#8856a7"],
+4: ["#edf8fb","#b3cde3","#8c96c6","#88419d"],
+5: ["#edf8fb","#b3cde3","#8c96c6","#8856a7","#810f7c"],
+6: ["#edf8fb","#bfd3e6","#9ebcda","#8c96c6","#8856a7","#810f7c"],
+7: ["#edf8fb","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#6e016b"],
+8: ["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#6e016b"],
+9: ["#f7fcfd","#e0ecf4","#bfd3e6","#9ebcda","#8c96c6","#8c6bb1","#88419d","#810f7c","#4d004b"]
+},RdPu: {
+3: ["#fde0dd","#fa9fb5","#c51b8a"],
+4: ["#feebe2","#fbb4b9","#f768a1","#ae017e"],
+5: ["#feebe2","#fbb4b9","#f768a1","#c51b8a","#7a0177"],
+6: ["#feebe2","#fcc5c0","#fa9fb5","#f768a1","#c51b8a","#7a0177"],
+7: ["#feebe2","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177"],
+8: ["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177"],
+9: ["#fff7f3","#fde0dd","#fcc5c0","#fa9fb5","#f768a1","#dd3497","#ae017e","#7a0177","#49006a"]
+},PuRd: {
+3: ["#e7e1ef","#c994c7","#dd1c77"],
+4: ["#f1eef6","#d7b5d8","#df65b0","#ce1256"],
+5: ["#f1eef6","#d7b5d8","#df65b0","#dd1c77","#980043"],
+6: ["#f1eef6","#d4b9da","#c994c7","#df65b0","#dd1c77","#980043"],
+7: ["#f1eef6","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#91003f"],
+8: ["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#91003f"],
+9: ["#f7f4f9","#e7e1ef","#d4b9da","#c994c7","#df65b0","#e7298a","#ce1256","#980043","#67001f"]
+},OrRd: {
+3: ["#fee8c8","#fdbb84","#e34a33"],
+4: ["#fef0d9","#fdcc8a","#fc8d59","#d7301f"],
+5: ["#fef0d9","#fdcc8a","#fc8d59","#e34a33","#b30000"],
+6: ["#fef0d9","#fdd49e","#fdbb84","#fc8d59","#e34a33","#b30000"],
+7: ["#fef0d9","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#990000"],
+8: ["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#990000"],
+9: ["#fff7ec","#fee8c8","#fdd49e","#fdbb84","#fc8d59","#ef6548","#d7301f","#b30000","#7f0000"]
+},YlOrRd: {
+3: ["#ffeda0","#feb24c","#f03b20"],
+4: ["#ffffb2","#fecc5c","#fd8d3c","#e31a1c"],
+5: ["#ffffb2","#fecc5c","#fd8d3c","#f03b20","#bd0026"],
+6: ["#ffffb2","#fed976","#feb24c","#fd8d3c","#f03b20","#bd0026"],
+7: ["#ffffb2","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#b10026"],
+8: ["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#b10026"],
+9: ["#ffffcc","#ffeda0","#fed976","#feb24c","#fd8d3c","#fc4e2a","#e31a1c","#bd0026","#800026"]
+},YlOrBr: {
+3: ["#fff7bc","#fec44f","#d95f0e"],
+4: ["#ffffd4","#fed98e","#fe9929","#cc4c02"],
+5: ["#ffffd4","#fed98e","#fe9929","#d95f0e","#993404"],
+6: ["#ffffd4","#fee391","#fec44f","#fe9929","#d95f0e","#993404"],
+7: ["#ffffd4","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#8c2d04"],
+8: ["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#8c2d04"],
+9: ["#ffffe5","#fff7bc","#fee391","#fec44f","#fe9929","#ec7014","#cc4c02","#993404","#662506"]
+},Purples: {
+3: ["#efedf5","#bcbddc","#756bb1"],
+4: ["#f2f0f7","#cbc9e2","#9e9ac8","#6a51a3"],
+5: ["#f2f0f7","#cbc9e2","#9e9ac8","#756bb1","#54278f"],
+6: ["#f2f0f7","#dadaeb","#bcbddc","#9e9ac8","#756bb1","#54278f"],
+7: ["#f2f0f7","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#4a1486"],
+8: ["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#4a1486"],
+9: ["#fcfbfd","#efedf5","#dadaeb","#bcbddc","#9e9ac8","#807dba","#6a51a3","#54278f","#3f007d"]
+},Blues: {
+3: ["#deebf7","#9ecae1","#3182bd"],
+4: ["#eff3ff","#bdd7e7","#6baed6","#2171b5"],
+5: ["#eff3ff","#bdd7e7","#6baed6","#3182bd","#08519c"],
+6: ["#eff3ff","#c6dbef","#9ecae1","#6baed6","#3182bd","#08519c"],
+7: ["#eff3ff","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#084594"],
+8: ["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#084594"],
+9: ["#f7fbff","#deebf7","#c6dbef","#9ecae1","#6baed6","#4292c6","#2171b5","#08519c","#08306b"]
+},Greens: {
+3: ["#e5f5e0","#a1d99b","#31a354"],
+4: ["#edf8e9","#bae4b3","#74c476","#238b45"],
+5: ["#edf8e9","#bae4b3","#74c476","#31a354","#006d2c"],
+6: ["#edf8e9","#c7e9c0","#a1d99b","#74c476","#31a354","#006d2c"],
+7: ["#edf8e9","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#005a32"],
+8: ["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#005a32"],
+9: ["#f7fcf5","#e5f5e0","#c7e9c0","#a1d99b","#74c476","#41ab5d","#238b45","#006d2c","#00441b"]
+},Oranges: {
+3: ["#fee6ce","#fdae6b","#e6550d"],
+4: ["#feedde","#fdbe85","#fd8d3c","#d94701"],
+5: ["#feedde","#fdbe85","#fd8d3c","#e6550d","#a63603"],
+6: ["#feedde","#fdd0a2","#fdae6b","#fd8d3c","#e6550d","#a63603"],
+7: ["#feedde","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#8c2d04"],
+8: ["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#8c2d04"],
+9: ["#fff5eb","#fee6ce","#fdd0a2","#fdae6b","#fd8d3c","#f16913","#d94801","#a63603","#7f2704"]
+},Reds: {
+3: ["#fee0d2","#fc9272","#de2d26"],
+4: ["#fee5d9","#fcae91","#fb6a4a","#cb181d"],
+5: ["#fee5d9","#fcae91","#fb6a4a","#de2d26","#a50f15"],
+6: ["#fee5d9","#fcbba1","#fc9272","#fb6a4a","#de2d26","#a50f15"],
+7: ["#fee5d9","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#99000d"],
+8: ["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#99000d"],
+9: ["#fff5f0","#fee0d2","#fcbba1","#fc9272","#fb6a4a","#ef3b2c","#cb181d","#a50f15","#67000d"]
+},Greys: {
+3: ["#f0f0f0","#bdbdbd","#636363"],
+4: ["#f7f7f7","#cccccc","#969696","#525252"],
+5: ["#f7f7f7","#cccccc","#969696","#636363","#252525"],
+6: ["#f7f7f7","#d9d9d9","#bdbdbd","#969696","#636363","#252525"],
+7: ["#f7f7f7","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525"],
+8: ["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525"],
+9: ["#ffffff","#f0f0f0","#d9d9d9","#bdbdbd","#969696","#737373","#525252","#252525","#000000"]
+},PuOr: {
+3: ["#f1a340","#f7f7f7","#998ec3"],
+4: ["#e66101","#fdb863","#b2abd2","#5e3c99"],
+5: ["#e66101","#fdb863","#f7f7f7","#b2abd2","#5e3c99"],
+6: ["#b35806","#f1a340","#fee0b6","#d8daeb","#998ec3","#542788"],
+7: ["#b35806","#f1a340","#fee0b6","#f7f7f7","#d8daeb","#998ec3","#542788"],
+8: ["#b35806","#e08214","#fdb863","#fee0b6","#d8daeb","#b2abd2","#8073ac","#542788"],
+9: ["#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788"],
+10: ["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"],
+11: ["#7f3b08","#b35806","#e08214","#fdb863","#fee0b6","#f7f7f7","#d8daeb","#b2abd2","#8073ac","#542788","#2d004b"]
+},BrBG: {
+3: ["#d8b365","#f5f5f5","#5ab4ac"],
+4: ["#a6611a","#dfc27d","#80cdc1","#018571"],
+5: ["#a6611a","#dfc27d","#f5f5f5","#80cdc1","#018571"],
+6: ["#8c510a","#d8b365","#f6e8c3","#c7eae5","#5ab4ac","#01665e"],
+7: ["#8c510a","#d8b365","#f6e8c3","#f5f5f5","#c7eae5","#5ab4ac","#01665e"],
+8: ["#8c510a","#bf812d","#dfc27d","#f6e8c3","#c7eae5","#80cdc1","#35978f","#01665e"],
+9: ["#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e"],
+10: ["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"],
+11: ["#543005","#8c510a","#bf812d","#dfc27d","#f6e8c3","#f5f5f5","#c7eae5","#80cdc1","#35978f","#01665e","#003c30"]
+},PRGn: {
+3: ["#af8dc3","#f7f7f7","#7fbf7b"],
+4: ["#7b3294","#c2a5cf","#a6dba0","#008837"],
+5: ["#7b3294","#c2a5cf","#f7f7f7","#a6dba0","#008837"],
+6: ["#762a83","#af8dc3","#e7d4e8","#d9f0d3","#7fbf7b","#1b7837"],
+7: ["#762a83","#af8dc3","#e7d4e8","#f7f7f7","#d9f0d3","#7fbf7b","#1b7837"],
+8: ["#762a83","#9970ab","#c2a5cf","#e7d4e8","#d9f0d3","#a6dba0","#5aae61","#1b7837"],
+9: ["#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837"],
+10: ["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"],
+11: ["#40004b","#762a83","#9970ab","#c2a5cf","#e7d4e8","#f7f7f7","#d9f0d3","#a6dba0","#5aae61","#1b7837","#00441b"]
+},PiYG: {
+3: ["#e9a3c9","#f7f7f7","#a1d76a"],
+4: ["#d01c8b","#f1b6da","#b8e186","#4dac26"],
+5: ["#d01c8b","#f1b6da","#f7f7f7","#b8e186","#4dac26"],
+6: ["#c51b7d","#e9a3c9","#fde0ef","#e6f5d0","#a1d76a","#4d9221"],
+7: ["#c51b7d","#e9a3c9","#fde0ef","#f7f7f7","#e6f5d0","#a1d76a","#4d9221"],
+8: ["#c51b7d","#de77ae","#f1b6da","#fde0ef","#e6f5d0","#b8e186","#7fbc41","#4d9221"],
+9: ["#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221"],
+10: ["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"],
+11: ["#8e0152","#c51b7d","#de77ae","#f1b6da","#fde0ef","#f7f7f7","#e6f5d0","#b8e186","#7fbc41","#4d9221","#276419"]
+},RdBu: {
+3: ["#ef8a62","#f7f7f7","#67a9cf"],
+4: ["#ca0020","#f4a582","#92c5de","#0571b0"],
+5: ["#ca0020","#f4a582","#f7f7f7","#92c5de","#0571b0"],
+6: ["#b2182b","#ef8a62","#fddbc7","#d1e5f0","#67a9cf","#2166ac"],
+7: ["#b2182b","#ef8a62","#fddbc7","#f7f7f7","#d1e5f0","#67a9cf","#2166ac"],
+8: ["#b2182b","#d6604d","#f4a582","#fddbc7","#d1e5f0","#92c5de","#4393c3","#2166ac"],
+9: ["#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac"],
+10: ["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"],
+11: ["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#f7f7f7","#d1e5f0","#92c5de","#4393c3","#2166ac","#053061"]
+},RdGy: {
+3: ["#ef8a62","#ffffff","#999999"],
+4: ["#ca0020","#f4a582","#bababa","#404040"],
+5: ["#ca0020","#f4a582","#ffffff","#bababa","#404040"],
+6: ["#b2182b","#ef8a62","#fddbc7","#e0e0e0","#999999","#4d4d4d"],
+7: ["#b2182b","#ef8a62","#fddbc7","#ffffff","#e0e0e0","#999999","#4d4d4d"],
+8: ["#b2182b","#d6604d","#f4a582","#fddbc7","#e0e0e0","#bababa","#878787","#4d4d4d"],
+9: ["#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d"],
+10: ["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"],
+11: ["#67001f","#b2182b","#d6604d","#f4a582","#fddbc7","#ffffff","#e0e0e0","#bababa","#878787","#4d4d4d","#1a1a1a"]
+},RdYlBu: {
+3: ["#fc8d59","#ffffbf","#91bfdb"],
+4: ["#d7191c","#fdae61","#abd9e9","#2c7bb6"],
+5: ["#d7191c","#fdae61","#ffffbf","#abd9e9","#2c7bb6"],
+6: ["#d73027","#fc8d59","#fee090","#e0f3f8","#91bfdb","#4575b4"],
+7: ["#d73027","#fc8d59","#fee090","#ffffbf","#e0f3f8","#91bfdb","#4575b4"],
+8: ["#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4"],
+9: ["#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4"],
+10: ["#a50026","#d73027","#f46d43","#fdae61","#fee090","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"],
+11: ["#a50026","#d73027","#f46d43","#fdae61","#fee090","#ffffbf","#e0f3f8","#abd9e9","#74add1","#4575b4","#313695"]
+},Spectral: {
+3: ["#fc8d59","#ffffbf","#99d594"],
+4: ["#d7191c","#fdae61","#abdda4","#2b83ba"],
+5: ["#d7191c","#fdae61","#ffffbf","#abdda4","#2b83ba"],
+6: ["#d53e4f","#fc8d59","#fee08b","#e6f598","#99d594","#3288bd"],
+7: ["#d53e4f","#fc8d59","#fee08b","#ffffbf","#e6f598","#99d594","#3288bd"],
+8: ["#d53e4f","#f46d43","#fdae61","#fee08b","#e6f598","#abdda4","#66c2a5","#3288bd"],
+9: ["#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd"],
+10: ["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"],
+11: ["#9e0142","#d53e4f","#f46d43","#fdae61","#fee08b","#ffffbf","#e6f598","#abdda4","#66c2a5","#3288bd","#5e4fa2"]
+},RdYlGn: {
+3: ["#fc8d59","#ffffbf","#91cf60"],
+4: ["#d7191c","#fdae61","#a6d96a","#1a9641"],
+5: ["#d7191c","#fdae61","#ffffbf","#a6d96a","#1a9641"],
+6: ["#d73027","#fc8d59","#fee08b","#d9ef8b","#91cf60","#1a9850"],
+7: ["#d73027","#fc8d59","#fee08b","#ffffbf","#d9ef8b","#91cf60","#1a9850"],
+8: ["#d73027","#f46d43","#fdae61","#fee08b","#d9ef8b","#a6d96a","#66bd63","#1a9850"],
+9: ["#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850"],
+10: ["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"],
+11: ["#a50026","#d73027","#f46d43","#fdae61","#fee08b","#ffffbf","#d9ef8b","#a6d96a","#66bd63","#1a9850","#006837"]
+}};
diff --git a/static/demo/components/d3/lib/jit/LICENSE b/static/demo/components/d3/lib/jit/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..e55999e5a48736fe4f888a435b399654fff409b2
--- /dev/null
+++ b/static/demo/components/d3/lib/jit/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2010, Nicolas Garcia Belmonte
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of the organization nor the names of its contributors may
+  be used to endorse or promote products derived from this software without
+  specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY NICOLAS GARCIA BELMONTE ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL NICOLAS GARCIA BELMONTE BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/static/demo/components/d3/lib/penner/LICENSE b/static/demo/components/d3/lib/penner/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..84296855b4ba0aba901edc416e501b7aa1fe48ad
--- /dev/null
+++ b/static/demo/components/d3/lib/penner/LICENSE
@@ -0,0 +1,31 @@
+TERMS OF USE - EASING EQUATIONS
+
+Open source under the BSD License.
+
+Copyright 2001 Robert Penner
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+- Neither the name of the author nor the names of contributors may be used to
+  endorse or promote products derived from this software without specific prior
+  written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/static/demo/components/d3/lib/polymaps/LICENSE b/static/demo/components/d3/lib/polymaps/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..df48fc514fae243faefebf02070a781d33402a20
--- /dev/null
+++ b/static/demo/components/d3/lib/polymaps/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2010, SimpleGeo and Stamen Design
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of SimpleGeo nor the names of its contributors may be used
+  to endorse or promote products derived from this software without specific
+  prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL SIMPLEGEO BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/static/demo/components/d3/lib/protovis/LICENSE b/static/demo/components/d3/lib/protovis/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..4c6e405592489a88979510664ca6042181a7c365
--- /dev/null
+++ b/static/demo/components/d3/lib/protovis/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2010, Stanford Visualization Group
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* Neither the name of Stanford University nor the names of its contributors
+  may be used to endorse or promote products derived from this software
+  without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/static/demo/components/d3/lib/queue/LICENSE b/static/demo/components/d3/lib/queue/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..cde4728a2cc06102b0c151af1047b96d54404fa4
--- /dev/null
+++ b/static/demo/components/d3/lib/queue/LICENSE
@@ -0,0 +1,26 @@
+Copyright (c) 2012, Michael Bostock
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* The name Michael Bostock may not be used to endorse or promote products
+  derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/static/demo/components/d3/lib/queue/queue.js b/static/demo/components/d3/lib/queue/queue.js
new file mode 100644
index 0000000000000000000000000000000000000000..52c99e32a80ddf0998a9bd2c326539e1a85926a6
--- /dev/null
+++ b/static/demo/components/d3/lib/queue/queue.js
@@ -0,0 +1,70 @@
+(function() {
+  if (typeof module === "undefined") self.queue = queue;
+  else module.exports = queue;
+
+  queue.version = "0.0.2";
+
+  function queue(parallelism) {
+    var queue = {},
+        active = 0, // number of in-flight deferrals
+        remaining = 0, // number of deferrals remaining
+        index = -1, // monotonically-increasing index
+        head, tail, // singly-linked list of deferrals
+        error = null,
+        results = [],
+        await = noop;
+
+    if (arguments.length < 1) parallelism = Infinity;
+
+    queue.defer = function() {
+      if (!error) {
+        var node = arguments;
+        node.index = ++index;
+        if (tail) tail.next = node, tail = tail.next;
+        else head = tail = node;
+        ++remaining;
+        pop();
+      }
+      return queue;
+    };
+
+    queue.await = function(f) {
+      await = f;
+      if (!remaining) await(error, results);
+      return queue;
+    };
+
+    function pop() {
+      if (head && active < parallelism) {
+        var node = head,
+            f = node[0],
+            a = Array.prototype.slice.call(node, 1),
+            i = node.index;
+        if (head === tail) head = tail = null;
+        else head = head.next;
+        ++active;
+        a.push(function(e, r) {
+          --active;
+          if (error) return;
+          if (e) {
+            if (remaining) {
+              // clearing remaining cancels subsequent callbacks
+              // clearing head stops queued tasks from being executed
+              // setting error ignores subsequent calls to defer
+              await(error = e, remaining = results = head = tail = null);
+            }
+          } else {
+            results[i] = r;
+            if (--remaining) pop();
+            else await(null, results);
+          }
+        });
+        f.apply(null, a);
+      }
+    }
+
+    return queue;
+  }
+
+  function noop() {}
+})();
diff --git a/static/demo/components/d3/lib/queue/queue.min.js b/static/demo/components/d3/lib/queue/queue.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..c3abacab803202778414c8916208b25589d4bfe8
--- /dev/null
+++ b/static/demo/components/d3/lib/queue/queue.min.js
@@ -0,0 +1 @@
+(function(){function a(a){function l(){if(g&&d<a){var b=g,c=b[0],f=Array.prototype.slice.call(b,1),m=b.index;g===h?g=h=null:g=g.next,++d,f.push(function(a,b){--d;if(i)return;a?e&&k(i=a,e=j=g=h=null):(j[m]=b,--e?l():k(null,j))}),c.apply(null,f)}}var c={},d=0,e=0,f=-1,g,h,i=null,j=[],k=b;return arguments.length<1&&(a=Infinity),c.defer=function(){if(!i){var a=arguments;a.index=++f,h?(h.next=a,h=h.next):g=h=a,++e,l()}return c},c.await=function(a){return k=a,e||k(i,j),c},c}function b(){}typeof module=="undefined"?self.queue=a:module.exports=a,a.version="0.0.2"})();
\ No newline at end of file
diff --git a/static/demo/components/d3/lib/science/LICENSE b/static/demo/components/d3/lib/science/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..a59d17ee6dff87b1a6bc9db4f0b38160bf97dfb8
--- /dev/null
+++ b/static/demo/components/d3/lib/science/LICENSE
@@ -0,0 +1,26 @@
+Copyright (c) 2011, Jason Davies
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+  * Redistributions of source code must retain the above copyright notice, this
+    list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.
+
+  * The name Jason Davies may not be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL JASON DAVIES BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/static/demo/components/d3/lib/science/science.js b/static/demo/components/d3/lib/science/science.js
new file mode 100644
index 0000000000000000000000000000000000000000..2f5556a22a38bccd1c6cd6da1a8f3f24affe8a8c
--- /dev/null
+++ b/static/demo/components/d3/lib/science/science.js
@@ -0,0 +1,225 @@
+(function(){science = {version: "1.7.0"}; // semver
+science.ascending = function(a, b) {
+  return a - b;
+};
+// Euler's constant.
+science.EULER = .5772156649015329;
+// Compute exp(x) - 1 accurately for small x.
+science.expm1 = function(x) {
+  return (x < 1e-5 && x > -1e-5) ? x + .5 * x * x : Math.exp(x) - 1;
+};
+science.functor = function(v) {
+  return typeof v === "function" ? v : function() { return v; };
+};
+// Based on:
+// http://www.johndcook.com/blog/2010/06/02/whats-so-hard-about-finding-a-hypotenuse/
+science.hypot = function(x, y) {
+  x = Math.abs(x);
+  y = Math.abs(y);
+  var max,
+      min;
+  if (x > y) { max = x; min = y; }
+  else       { max = y; min = x; }
+  var r = min / max;
+  return max * Math.sqrt(1 + r * r);
+};
+science.quadratic = function() {
+  var complex = false;
+
+  function quadratic(a, b, c) {
+    var d = b * b - 4 * a * c;
+    if (d > 0) {
+      d = Math.sqrt(d) / (2 * a);
+      return complex
+        ? [{r: -b - d, i: 0}, {r: -b + d, i: 0}]
+        : [-b - d, -b + d];
+    } else if (d === 0) {
+      d = -b / (2 * a);
+      return complex ? [{r: d, i: 0}] : [d];
+    } else {
+      if (complex) {
+        d = Math.sqrt(-d) / (2 * a);
+        return [
+          {r: -b, i: -d},
+          {r: -b, i: d}
+        ];
+      }
+      return [];
+    }
+  }
+
+  quadratic.complex = function(x) {
+    if (!arguments.length) return complex;
+    complex = x;
+    return quadratic;
+  };
+
+  return quadratic;
+};
+// Constructs a multi-dimensional array filled with zeroes.
+science.zeroes = function(n) {
+  var i = -1,
+      a = [];
+  if (arguments.length === 1)
+    while (++i < n)
+      a[i] = 0;
+  else
+    while (++i < n)
+      a[i] = science.zeroes.apply(
+        this, Array.prototype.slice.call(arguments, 1));
+  return a;
+};
+science.vector = {};
+science.vector.cross = function(a, b) {
+  // TODO how to handle non-3D vectors?
+  // TODO handle 7D vectors?
+  return [
+    a[1] * b[2] - a[2] * b[1],
+    a[2] * b[0] - a[0] * b[2],
+    a[0] * b[1] - a[1] * b[0]
+  ];
+};
+science.vector.dot = function(a, b) {
+  var s = 0,
+      i = -1,
+      n = Math.min(a.length, b.length);
+  while (++i < n) s += a[i] * b[i];
+  return s;
+};
+science.vector.length = function(p) {
+  return Math.sqrt(science.vector.dot(p, p));
+};
+science.vector.normalize = function(p) {
+  var length = science.vector.length(p);
+  return p.map(function(d) { return d / length; });
+};
+// 4x4 matrix determinant.
+science.vector.determinant = function(matrix) {
+  var m = matrix[0].concat(matrix[1]).concat(matrix[2]).concat(matrix[3]);
+  return (
+    m[12] * m[9]  * m[6]  * m[3]  - m[8] * m[13] * m[6]  * m[3]  -
+    m[12] * m[5]  * m[10] * m[3]  + m[4] * m[13] * m[10] * m[3]  +
+    m[8]  * m[5]  * m[14] * m[3]  - m[4] * m[9]  * m[14] * m[3]  -
+    m[12] * m[9]  * m[2]  * m[7]  + m[8] * m[13] * m[2]  * m[7]  +
+    m[12] * m[1]  * m[10] * m[7]  - m[0] * m[13] * m[10] * m[7]  -
+    m[8]  * m[1]  * m[14] * m[7]  + m[0] * m[9]  * m[14] * m[7]  +
+    m[12] * m[5]  * m[2]  * m[11] - m[4] * m[13] * m[2]  * m[11] -
+    m[12] * m[1]  * m[6]  * m[11] + m[0] * m[13] * m[6]  * m[11] +
+    m[4]  * m[1]  * m[14] * m[11] - m[0] * m[5]  * m[14] * m[11] -
+    m[8]  * m[5]  * m[2]  * m[15] + m[4] * m[9]  * m[2]  * m[15] +
+    m[8]  * m[1]  * m[6]  * m[15] - m[0] * m[9]  * m[6]  * m[15] -
+    m[4]  * m[1]  * m[10] * m[15] + m[0] * m[5]  * m[10] * m[15]);
+};
+// Performs in-place Gauss-Jordan elimination.
+//
+// Based on Jarno Elonen's Python version (public domain):
+// http://elonen.iki.fi/code/misc-notes/python-gaussj/index.html
+science.vector.gaussjordan = function(m, eps) {
+  if (!eps) eps = 1e-10;
+
+  var h = m.length,
+      w = m[0].length,
+      y = -1,
+      y2,
+      x;
+
+  while (++y < h) {
+    var maxrow = y;
+
+    // Find max pivot.
+    y2 = y; while (++y2 < h) {
+      if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))
+        maxrow = y2;
+    }
+
+    // Swap.
+    var tmp = m[y];
+    m[y] = m[maxrow];
+    m[maxrow] = tmp;
+
+    // Singular?
+    if (Math.abs(m[y][y]) <= eps) return false;
+
+    // Eliminate column y.
+    y2 = y; while (++y2 < h) {
+      var c = m[y2][y] / m[y][y];
+      x = y - 1; while (++x < w) {
+        m[y2][x] -= m[y][x] * c;
+      }
+    }
+  }
+
+  // Backsubstitute.
+  y = h; while (--y >= 0) {
+    var c = m[y][y];
+    y2 = -1; while (++y2 < y) {
+      x = w; while (--x >= y) {
+        m[y2][x] -=  m[y][x] * m[y2][y] / c;
+      }
+    }
+    m[y][y] /= c;
+    // Normalize row y.
+    x = h - 1; while (++x < w) {
+      m[y][x] /= c;
+    }
+  }
+  return true;
+};
+// Find matrix inverse using Gauss-Jordan.
+science.vector.inverse = function(m) {
+  var n = m.length
+      i = -1;
+
+  // Check if the matrix is square.
+  if (n !== m[0].length) return;
+
+  // Augment with identity matrix I to get AI.
+  m = m.map(function(row, i) {
+    var identity = new Array(n),
+        j = -1;
+    while (++j < n) identity[j] = i === j ? 1 : 0;
+    return row.concat(identity);
+  });
+
+  // Compute IA^-1.
+  science.vector.gaussjordan(m);
+
+  // Remove identity matrix I to get A^-1.
+  while (++i < n) {
+    m[i] = m[i].slice(n);
+  }
+
+  return m;
+};
+science.vector.multiply = function(a, b) {
+  var m = a.length,
+      n = b[0].length,
+      p = b.length,
+      i = -1,
+      j,
+      k;
+  if (p !== a[0].length) throw {"error": "columns(a) != rows(b); " + a[0].length + " != " + p};
+  var ab = new Array(m);
+  while (++i < m) {
+    ab[i] = new Array(n);
+    j = -1; while(++j < n) {
+      var s = 0;
+      k = -1; while (++k < p) s += a[i][k] * b[k][j];
+      ab[i][j] = s;
+    }
+  }
+  return ab;
+};
+science.vector.transpose = function(a) {
+  var m = a.length,
+      n = a[0].length,
+      i = -1,
+      j,
+      b = new Array(n);
+  while (++i < n) {
+    b[i] = new Array(m);
+    j = -1; while (++j < m) b[i][j] = a[j][i];
+  }
+  return b;
+};
+})()
\ No newline at end of file
diff --git a/static/demo/components/d3/lib/science/science.lin.js b/static/demo/components/d3/lib/science/science.lin.js
new file mode 100644
index 0000000000000000000000000000000000000000..cbdc2ac636f0ef9c1f1d1f1278b23ebe4c18a6af
--- /dev/null
+++ b/static/demo/components/d3/lib/science/science.lin.js
@@ -0,0 +1,27 @@
+(function(){science.lin = {};
+/**
+ * Solves tridiagonal systems of linear equations.
+ *
+ * Source: http://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm
+ *
+ * @param {number[]} a
+ * @param {number[]} b
+ * @param {number[]} c
+ * @param {number[]} d
+ * @param {number[]} x
+ * @param {number} n
+ */
+science.lin.tridag = function(a, b, c, d, x, n) {
+  var i,
+      m;
+  for (i = 1; i < n; i++) {
+    m = a[i] / b[i - 1];
+    b[i] -= m * c[i - 1];
+    d[i] -= m * d[i - 1];
+  }
+  x[n - 1] = d[n - 1] / b[n - 1];
+  for (i = n - 2; i >= 0; i--) {
+    x[i] = (d[i] - c[i] * x[i + 1]) / b[i];
+  }
+};
+})()
\ No newline at end of file
diff --git a/static/demo/components/d3/lib/science/science.lin.min.js b/static/demo/components/d3/lib/science/science.lin.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..a470da465fb5c1e4672d51ce2939d366754cd5dd
--- /dev/null
+++ b/static/demo/components/d3/lib/science/science.lin.min.js
@@ -0,0 +1 @@
+(function(){science.lin={},science.lin.tridag=function(a,b,c,d,e,f){var g,h;for(g=1;g<f;g++)h=a[g]/b[g-1],b[g]-=h*c[g-1],d[g]-=h*d[g-1];e[f-1]=d[f-1]/b[f-1];for(g=f-2;g>=0;g--)e[g]=(d[g]-c[g]*e[g+1])/b[g]}})()
\ No newline at end of file
diff --git a/static/demo/components/d3/lib/science/science.min.js b/static/demo/components/d3/lib/science/science.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..41cf0ebbcb4ea75e2e8fd0deec3c3fb983ef646c
--- /dev/null
+++ b/static/demo/components/d3/lib/science/science.min.js
@@ -0,0 +1 @@
+(function(){science={version:"1.7.0"},science.ascending=function(a,b){return a-b},science.EULER=.5772156649015329,science.expm1=function(a){return a<1e-5&&a>-0.00001?a+.5*a*a:Math.exp(a)-1},science.functor=function(a){return typeof a=="function"?a:function(){return a}},science.hypot=function(a,b){a=Math.abs(a),b=Math.abs(b);var c,d;a>b?(c=a,d=b):(c=b,d=a);var e=d/c;return c*Math.sqrt(1+e*e)},science.quadratic=function(){function b(b,c,d){var e=c*c-4*b*d;if(e>0){e=Math.sqrt(e)/(2*b);return a?[{r:-c-e,i:0},{r:-c+e,i:0}]:[-c-e,-c+e]}if(e===0){e=-c/(2*b);return a?[{r:e,i:0}]:[e]}if(a){e=Math.sqrt(-e)/(2*b);return[{r:-c,i:-e},{r:-c,i:e}]}return[]}var a=!1;b.complex=function(c){if(!arguments.length)return a;a=c;return b};return b},science.zeroes=function(a){var b=-1,c=[];if(arguments.length===1)while(++b<a)c[b]=0;else while(++b<a)c[b]=science.zeroes.apply(this,Array.prototype.slice.call(arguments,1));return c},science.vector={},science.vector.cross=function(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]},science.vector.dot=function(a,b){var c=0,d=-1,e=Math.min(a.length,b.length);while(++d<e)c+=a[d]*b[d];return c},science.vector.length=function(a){return Math.sqrt(science.vector.dot(a,a))},science.vector.normalize=function(a){var b=science.vector.length(a);return a.map(function(a){return a/b})},science.vector.determinant=function(a){var b=a[0].concat(a[1]).concat(a[2]).concat(a[3]);return b[12]*b[9]*b[6]*b[3]-b[8]*b[13]*b[6]*b[3]-b[12]*b[5]*b[10]*b[3]+b[4]*b[13]*b[10]*b[3]+b[8]*b[5]*b[14]*b[3]-b[4]*b[9]*b[14]*b[3]-b[12]*b[9]*b[2]*b[7]+b[8]*b[13]*b[2]*b[7]+b[12]*b[1]*b[10]*b[7]-b[0]*b[13]*b[10]*b[7]-b[8]*b[1]*b[14]*b[7]+b[0]*b[9]*b[14]*b[7]+b[12]*b[5]*b[2]*b[11]-b[4]*b[13]*b[2]*b[11]-b[12]*b[1]*b[6]*b[11]+b[0]*b[13]*b[6]*b[11]+b[4]*b[1]*b[14]*b[11]-b[0]*b[5]*b[14]*b[11]-b[8]*b[5]*b[2]*b[15]+b[4]*b[9]*b[2]*b[15]+b[8]*b[1]*b[6]*b[15]-b[0]*b[9]*b[6]*b[15]-b[4]*b[1]*b[10]*b[15]+b[0]*b[5]*b[10]*b[15]},science.vector.gaussjordan=function(a,b){b||(b=1e-10);var c=a.length,d=a[0].length,e=-1,f,g;while(++e<c){var h=e;f=e;while(++f<c)Math.abs(a[f][e])>Math.abs(a[h][e])&&(h=f);var i=a[e];a[e]=a[h],a[h]=i;if(Math.abs(a[e][e])<=b)return!1;f=e;while(++f<c){var j=a[f][e]/a[e][e];g=e-1;while(++g<d)a[f][g]-=a[e][g]*j}}e=c;while(--e>=0){var j=a[e][e];f=-1;while(++f<e){g=d;while(--g>=e)a[f][g]-=a[e][g]*a[f][e]/j}a[e][e]/=j,g=c-1;while(++g<d)a[e][g]/=j}return!0},science.vector.inverse=function(a){var b=a.length;i=-1;if(b===a[0].length){a=a.map(function(a,c){var d=Array(b),e=-1;while(++e<b)d[e]=c===e?1:0;return a.concat(d)}),science.vector.gaussjordan(a);while(++i<b)a[i]=a[i].slice(b);return a}},science.vector.multiply=function(a,b){var c=a.length,d=b[0].length,e=b.length,f=-1,g,h;if(e!==a[0].length)throw{error:"columns(a) != rows(b); "+a[0].length+" != "+e};var i=Array(c);while(++f<c){i[f]=Array(d),g=-1;while(++g<d){var j=0;h=-1;while(++h<e)j+=a[f][h]*b[h][g];i[f][g]=j}}return i},science.vector.transpose=function(a){var b=a.length,c=a[0].length,d=-1,e,f=Array(c);while(++d<c){f[d]=Array(b),e=-1;while(++e<b)f[d][e]=a[e][d]}return f}})()
\ No newline at end of file
diff --git a/static/demo/components/d3/lib/science/science.stats.js b/static/demo/components/d3/lib/science/science.stats.js
new file mode 100644
index 0000000000000000000000000000000000000000..d98df12087413f7ad81c83e3eda56de1d7af6072
--- /dev/null
+++ b/static/demo/components/d3/lib/science/science.stats.js
@@ -0,0 +1,720 @@
+(function(){science.stats = {};
+// Bandwidth selectors for Gaussian kernels.
+// Based on R's implementations in `stats.bw`.
+science.stats.bandwidth = {
+
+  // Silverman, B. W. (1986) Density Estimation. London: Chapman and Hall.
+  nrd0: function(x) {
+    var hi = Math.sqrt(science.stats.variance(x));
+    if (!(lo = Math.min(hi, science.stats.iqr(x) / 1.34)))
+      (lo = hi) || (lo = Math.abs(x[1])) || (lo = 1);
+    return .9 * lo * Math.pow(x.length, -.2);
+  },
+
+  // Scott, D. W. (1992) Multivariate Density Estimation: Theory, Practice, and
+  // Visualization. Wiley.
+  nrd: function(x) {
+    var h = science.stats.iqr(x) / 1.34;
+    return 1.06 * Math.min(Math.sqrt(science.stats.variance(x)), h)
+      * Math.pow(x.length, -1/5);
+  }
+};
+science.stats.distance = {
+  euclidean: function(a, b) {
+    var n = a.length,
+        i = -1,
+        s = 0,
+        x;
+    while (++i < n) {
+      x = a[i] - b[i];
+      s += x * x;
+    }
+    return Math.sqrt(s);
+  },
+  manhattan: function(a, b) {
+    var n = a.length,
+        i = -1,
+        s = 0;
+    while (++i < n) s += Math.abs(a[i] - b[i]);
+    return s;
+  },
+  minkowski: function(p) {
+    return function(a, b) {
+      var n = a.length,
+          i = -1,
+          s = 0;
+      while (++i < n) s += Math.pow(Math.abs(a[i] - b[i]), p);
+      return Math.pow(s, 1 / p);
+    };
+  },
+  chebyshev: function(a, b) {
+    var n = a.length,
+        i = -1,
+        max = 0,
+        x;
+    while (++i < n) {
+      x = Math.abs(a[i] - b[i]);
+      if (x > max) max = x;
+    }
+    return max;
+  },
+  hamming: function(a, b) {
+    var n = a.length,
+        i = -1,
+        d = 0;
+    while (++i < n) if (a[i] !== b[i]) d++;
+    return d;
+  },
+  jaccard: function(a, b) {
+    var n = a.length,
+        i = -1,
+        s = 0;
+    while (++i < n) if (a[i] === b[i]) s++;
+    return s / n;
+  },
+  braycurtis: function(a, b) {
+    var n = a.length,
+        i = -1,
+        s0 = 0,
+        s1 = 0,
+        ai,
+        bi;
+    while (++i < n) {
+      ai = a[i];
+      bi = b[i];
+      s0 += Math.abs(ai - bi);
+      s1 += Math.abs(ai + bi);
+    }
+    return s0 / s1;
+  }
+};
+// Based on implementation in http://picomath.org/.
+science.stats.erf = function(x) {
+  var a1 =  0.254829592,
+      a2 = -0.284496736,
+      a3 =  1.421413741,
+      a4 = -1.453152027,
+      a5 =  1.061405429,
+      p  =  0.3275911;
+
+  // Save the sign of x
+  var sign = x < 0 ? -1 : 1;
+  if (x < 0) {
+    sign = -1;
+    x = -x;
+  }
+
+  // A&S formula 7.1.26
+  var t = 1 / (1 + p * x);
+  return sign * (
+    1 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1)
+    * t * Math.exp(-x * x));
+};
+science.stats.phi = function(x) {
+  return .5 * (1 + science.stats.erf(x / Math.SQRT2));
+};
+// See <http://en.wikipedia.org/wiki/Kernel_(statistics)>.
+science.stats.kernel = {
+  uniform: function(u) {
+    if (u <= 1 && u >= -1) return .5;
+    return 0;
+  },
+  triangular: function(u) {
+    if (u <= 1 && u >= -1) return 1 - Math.abs(u);
+    return 0;
+  },
+  epanechnikov: function(u) {
+    if (u <= 1 && u >= -1) return .75 * (1 - u * u);
+    return 0;
+  },
+  quartic: function(u) {
+    if (u <= 1 && u >= -1) {
+      var tmp = 1 - u * u;
+      return (15 / 16) * tmp * tmp;
+    }
+    return 0;
+  },
+  triweight: function(u) {
+    if (u <= 1 && u >= -1) {
+      var tmp = 1 - u * u;
+      return (35 / 32) * tmp * tmp * tmp;
+    }
+    return 0;
+  },
+  gaussian: function(u) {
+    return 1 / Math.sqrt(2 * Math.PI) * Math.exp(-.5 * u * u);
+  },
+  cosine: function(u) {
+    if (u <= 1 && u >= -1) return Math.PI / 4 * Math.cos(Math.PI / 2 * u);
+    return 0;
+  }
+};
+// http://exploringdata.net/den_trac.htm
+science.stats.kde = function() {
+  var kernel = science.stats.kernel.gaussian,
+      sample = [],
+      bandwidth = science.stats.bandwidth.nrd;
+
+  function kde(points, i) {
+    var bw = bandwidth.call(this, sample);
+    return points.map(function(x) {
+      var i = -1,
+          y = 0,
+          n = sample.length;
+      while (++i < n) {
+        y += kernel((x - sample[i]) / bw);
+      }
+      return [x, y / bw / n];
+    });
+  }
+
+  kde.kernel = function(x) {
+    if (!arguments.length) return kernel;
+    kernel = x;
+    return kde;
+  };
+
+  kde.sample = function(x) {
+    if (!arguments.length) return sample;
+    sample = x;
+    return kde;
+  };
+
+  kde.bandwidth = function(x) {
+    if (!arguments.length) return bandwidth;
+    bandwidth = science.functor(x);
+    return kde;
+  };
+
+  return kde;
+};
+// Based on figue implementation by Jean-Yves Delort.
+// http://code.google.com/p/figue/
+science.stats.kmeans = function() {
+  var distance = science.stats.distance.euclidean,
+      maxIterations = 1000,
+      k = 1;
+
+  function kmeans(vectors) {
+    var n = vectors.length,
+        assignments = [],
+        clusterSizes = [],
+        repeat = 1,
+        iterations = 0,
+        centroids = science_stats_kmeansRandom(k, vectors),
+        newCentroids,
+        i,
+        j,
+        x,
+        d,
+        min,
+        best;
+
+    while (repeat && iterations < maxIterations) {
+      // Assignment step.
+      j = -1; while (++j < k) {
+        clusterSizes[j] = 0;
+      }
+
+      i = -1; while (++i < n) {
+        x = vectors[i];
+        min = Infinity;
+        j = -1; while (++j < k) {
+          d = distance.call(this, centroids[j], x);
+          if (d < min) {
+            min = d;
+            best = j;
+          }
+        }
+        clusterSizes[assignments[i] = best]++;
+      }
+
+      // Update centroids step.
+      newCentroids = [];
+      i = -1; while (++i < n) {
+        x = assignments[i];
+        d = newCentroids[x];
+        if (d == null) newCentroids[x] = vectors[i].slice();
+        else {
+          j = -1; while (++j < d.length) {
+            d[j] += vectors[i][j];
+          }
+        }
+      }
+      j = -1; while (++j < k) {
+        x = newCentroids[j];
+        d = 1 / clusterSizes[j];
+        i = -1; while (++i < x.length) x[i] *= d;
+      }
+
+      // Check convergence.
+      repeat = 0;
+      j = -1; while (++j < k) {
+        if (!science_stats_kmeansCompare(newCentroids[j], centroids[j])) {
+          repeat = 1;
+          break;
+        }
+      }
+      centroids = newCentroids;
+      iterations++;
+    }
+    return {assignments: assignments, centroids: centroids};
+  }
+
+  kmeans.k = function(x) {
+    if (!arguments.length) return k;
+    k = x;
+    return kmeans;
+  };
+
+  kmeans.distance = function(x) {
+    if (!arguments.length) return distance;
+    distance = x;
+    return kmeans;
+  };
+
+  return kmeans;
+};
+
+function science_stats_kmeansCompare(a, b) {
+  if (!a || !b || a.length !== b.length) return false;
+  var n = a.length,
+      i = -1;
+  while (++i < n) if (a[i] !== b[i]) return false;
+  return true;
+}
+
+// Returns an array of k distinct vectors randomly selected from the input
+// array of vectors. Returns null if k > n or if there are less than k distinct
+// objects in vectors.
+function science_stats_kmeansRandom(k, vectors) {
+  var n = vectors.length;
+  if (k > n) return null;
+  
+  var selected_vectors = [];
+  var selected_indices = [];
+  var tested_indices = {};
+  var tested = 0;
+  var selected = 0;
+  var i,
+      vector,
+      select;
+
+  while (selected < k) {
+    if (tested === n) return null;
+    
+    var random_index = Math.floor(Math.random() * n);
+    if (random_index in tested_indices) continue;
+    
+    tested_indices[random_index] = 1;
+    tested++;
+    vector = vectors[random_index];
+    select = true;
+    for (i = 0; i < selected; i++) {
+      if (science_stats_kmeansCompare(vector, selected_vectors[i])) {
+        select = false;
+        break;
+      }
+    }
+    if (select) {
+      selected_vectors[selected] = vector;
+      selected_indices[selected] = random_index;
+      selected++;
+    }
+  }
+  return selected_vectors;
+}
+science.stats.hcluster = function() {
+  var distance = science.stats.distance.euclidean,
+      linkage = "simple"; // simple, complete or average
+
+  function hcluster(vectors) {
+    var n = vectors.length,
+        dMin = [],
+        cSize = [],
+        distMatrix = [],
+        clusters = [],
+        c1,
+        c2,
+        c1Cluster,
+        c2Cluster,
+        p,
+        root,
+        i,
+        j;
+
+    // Initialise distance matrix and vector of closest clusters.
+    i = -1; while (++i < n) {
+      dMin[i] = 0;
+      distMatrix[i] = [];
+      j = -1; while (++j < n) {
+        distMatrix[i][j] = i === j ? Infinity : distance(vectors[i] , vectors[j]);
+        if (distMatrix[i][dMin[i]] > distMatrix[i][j]) dMin[i] = j;
+      }
+    }
+
+    // create leaves of the tree
+    i = -1; while (++i < n) {
+      clusters[i] = [];
+      clusters[i][0] = {
+        left: null,
+        right: null,
+        dist: 0,
+        centroid: vectors[i],
+        size: 1,
+        depth: 0
+      };
+      cSize[i] = 1;
+    }
+
+    // Main loop
+    for (p = 0; p < n-1; p++) {
+      // find the closest pair of clusters
+      c1 = 0;
+      for (i = 0; i < n; i++) {
+        if (distMatrix[i][dMin[i]] < distMatrix[c1][dMin[c1]]) c1 = i;
+      }
+      c2 = dMin[c1];
+
+      // create node to store cluster info 
+      c1Cluster = clusters[c1][0];
+      c2Cluster = clusters[c2][0];
+
+      newCluster = {
+        left: c1Cluster,
+        right: c2Cluster,
+        dist: distMatrix[c1][c2],
+        centroid: calculateCentroid(c1Cluster.size, c1Cluster.centroid,
+          c2Cluster.size, c2Cluster.centroid),
+        size: c1Cluster.size + c2Cluster.size,
+        depth: 1 + Math.max(c1Cluster.depth, c2Cluster.depth)
+      };
+      clusters[c1].splice(0, 0, newCluster);
+      cSize[c1] += cSize[c2];
+
+      // overwrite row c1 with respect to the linkage type
+      for (j = 0; j < n; j++) {
+        switch (linkage) {
+          case "single":
+            if (distMatrix[c1][j] > distMatrix[c2][j])
+              distMatrix[j][c1] = distMatrix[c1][j] = distMatrix[c2][j];
+            break;
+          case "complete":
+            if (distMatrix[c1][j] < distMatrix[c2][j])
+              distMatrix[j][c1] = distMatrix[c1][j] = distMatrix[c2][j];
+            break;
+          case "average":
+            distMatrix[j][c1] = distMatrix[c1][j] = (cSize[c1] * distMatrix[c1][j] + cSize[c2] * distMatrix[c2][j]) / (cSize[c1] + cSize[j]);
+            break;
+        }
+      }
+      distMatrix[c1][c1] = Infinity;
+
+      // infinity ­out old row c2 and column c2
+      for (i = 0; i < n; i++)
+        distMatrix[i][c2] = distMatrix[c2][i] = Infinity;
+
+      // update dmin and replace ones that previous pointed to c2 to point to c1
+      for (j = 0; j < n; j++) {
+        if (dMin[j] == c2) dMin[j] = c1;
+        if (distMatrix[c1][j] < distMatrix[c1][dMin[c1]]) dMin[c1] = j;
+      }
+
+      // keep track of the last added cluster
+      root = newCluster;
+    }
+
+    return root;
+  }
+
+  hcluster.distance = function(x) {
+    if (!arguments.length) return distance;
+    distance = x;
+    return hcluster;
+  };
+
+  return hcluster;
+};
+
+function calculateCentroid(c1Size, c1Centroid, c2Size, c2Centroid) {
+  var newCentroid = [],
+      newSize = c1Size + c2Size,
+      n = c1Centroid.length,
+      i = -1;
+  while (++i < n) {
+    newCentroid[i] = (c1Size * c1Centroid[i] + c2Size * c2Centroid[i]) / newSize;
+  }
+  return newCentroid;
+}
+science.stats.iqr = function(x) {
+  var quartiles = science.stats.quantiles(x, [.25, .75]);
+  return quartiles[1] - quartiles[0];
+};
+// Based on org.apache.commons.math.analysis.interpolation.LoessInterpolator
+// from http://commons.apache.org/math/
+science.stats.loess = function() {    
+  var bandwidth = .3,
+      robustnessIters = 2,
+      accuracy = 1e-12;
+
+  function smooth(xval, yval, weights) {
+    var n = xval.length,
+        i;
+
+    if (n !== yval.length) throw {error: "Mismatched array lengths"};
+    if (n == 0) throw {error: "At least one point required."};
+
+    if (arguments.length < 3) {
+      weights = [];
+      i = -1; while (++i < n) weights[i] = 1;
+    }
+
+    science_stats_loessFiniteReal(xval);
+    science_stats_loessFiniteReal(yval);
+    science_stats_loessFiniteReal(weights);
+    science_stats_loessStrictlyIncreasing(xval);
+
+    if (n == 1) return [yval[0]];
+    if (n == 2) return [yval[0], yval[1]];
+
+    var bandwidthInPoints = Math.floor(bandwidth * n);
+
+    if (bandwidthInPoints < 2) throw {error: "Bandwidth too small."};
+
+    var res = [],
+        residuals = [],
+        robustnessWeights = [];
+
+    // Do an initial fit and 'robustnessIters' robustness iterations.
+    // This is equivalent to doing 'robustnessIters+1' robustness iterations
+    // starting with all robustness weights set to 1.
+    i = -1; while (++i < n) {
+      res[i] = 0;
+      residuals[i] = 0;
+      robustnessWeights[i] = 1;
+    }
+
+    var iter = -1;
+    while (++iter <= robustnessIters) {
+      var bandwidthInterval = [0, bandwidthInPoints - 1];
+      // At each x, compute a local weighted linear regression
+      var x;
+      i = -1; while (++i < n) {
+        x = xval[i];
+
+        // Find out the interval of source points on which
+        // a regression is to be made.
+        if (i > 0) {
+          science_stats_loessUpdateBandwidthInterval(xval, weights, i, bandwidthInterval);
+        }
+
+        var ileft = bandwidthInterval[0],
+            iright = bandwidthInterval[1];
+
+        // Compute the point of the bandwidth interval that is
+        // farthest from x
+        var edge = (xval[i] - xval[ileft]) > (xval[iright] - xval[i]) ? ileft : iright;
+
+        // Compute a least-squares linear fit weighted by
+        // the product of robustness weights and the tricube
+        // weight function.
+        // See http://en.wikipedia.org/wiki/Linear_regression
+        // (section "Univariate linear case")
+        // and http://en.wikipedia.org/wiki/Weighted_least_squares
+        // (section "Weighted least squares")
+        var sumWeights = 0,
+            sumX = 0,
+            sumXSquared = 0,
+            sumY = 0,
+            sumXY = 0,
+            denom = Math.abs(1 / (xval[edge] - x));
+
+        for (var k = ileft; k <= iright; ++k) {
+          var xk   = xval[k],
+              yk   = yval[k],
+              dist = k < i ? x - xk : xk - x,
+              w    = science_stats_loessTricube(dist * denom) * robustnessWeights[k] * weights[k],
+              xkw  = xk * w;
+          sumWeights += w;
+          sumX += xkw;
+          sumXSquared += xk * xkw;
+          sumY += yk * w;
+          sumXY += yk * xkw;
+        }
+
+        var meanX = sumX / sumWeights,
+            meanY = sumY / sumWeights,
+            meanXY = sumXY / sumWeights,
+            meanXSquared = sumXSquared / sumWeights;
+
+        var beta = (Math.sqrt(Math.abs(meanXSquared - meanX * meanX)) < accuracy)
+            ? 0 : ((meanXY - meanX * meanY) / (meanXSquared - meanX * meanX));
+
+        var alpha = meanY - beta * meanX;
+
+        res[i] = beta * x + alpha;
+        residuals[i] = Math.abs(yval[i] - res[i]);
+      }
+
+      // No need to recompute the robustness weights at the last
+      // iteration, they won't be needed anymore
+      if (iter === robustnessIters) {
+        break;
+      }
+
+      // Recompute the robustness weights.
+
+      // Find the median residual.
+      var sortedResiduals = residuals.slice();
+      sortedResiduals.sort();
+      var medianResidual = sortedResiduals[Math.floor(n / 2)];
+
+      if (Math.abs(medianResidual) < accuracy)
+        break;
+
+      var arg,
+          w;
+      i = -1; while (++i < n) {
+        arg = residuals[i] / (6 * medianResidual);
+        robustnessWeights[i] = (arg >= 1) ? 0 : ((w = 1 - arg * arg) * w);
+      }
+    }
+
+    return res;
+  }
+
+  smooth.bandwidth = function(x) {
+    if (!arguments.length) return x;
+    bandwidth = x;
+    return smooth;
+  };
+
+  smooth.robustnessIterations = function(x) {
+    if (!arguments.length) return x;
+    robustnessIters = x;
+    return smooth;
+  };
+
+  smooth.accuracy = function(x) {
+    if (!arguments.length) return x;
+    accuracy = x;
+    return smooth;
+  };
+
+  return smooth;
+};
+
+function science_stats_loessFiniteReal(values) {
+  var n = values.length,
+      i = -1;
+
+  while (++i < n) if (!isFinite(values[i])) return false;
+
+  return true;
+}
+
+function science_stats_loessStrictlyIncreasing(xval) {
+  var n = xval.length,
+      i = 0;
+
+  while (++i < n) if (xval[i - 1] >= xval[i]) return false;
+
+  return true;
+}
+
+// Compute the tricube weight function.
+// http://en.wikipedia.org/wiki/Local_regression#Weight_function
+function science_stats_loessTricube(x) {
+  return (x = 1 - x * x * x) * x * x;
+}
+
+// Given an index interval into xval that embraces a certain number of
+// points closest to xval[i-1], update the interval so that it embraces
+// the same number of points closest to xval[i], ignoring zero weights.
+function science_stats_loessUpdateBandwidthInterval(
+  xval, weights, i, bandwidthInterval) {
+
+  var left = bandwidthInterval[0],
+      right = bandwidthInterval[1];
+
+  // The right edge should be adjusted if the next point to the right
+  // is closer to xval[i] than the leftmost point of the current interval
+  var nextRight = science_stats_loessNextNonzero(weights, right);
+  if ((nextRight < xval.length) && (xval[nextRight] - xval[i]) < (xval[i] - xval[left])) {
+    var nextLeft = science_stats_loessNextNonzero(weights, left);
+    bandwidthInterval[0] = nextLeft;
+    bandwidthInterval[1] = nextRight;
+  }
+}
+
+function science_stats_loessNextNonzero(weights, i) {
+  var j = i + 1;
+  while (j < weights.length && weights[j] === 0) j++;
+  return j;
+}
+// Welford's algorithm.
+science.stats.mean = function(x) {
+  var n = x.length;
+  if (n === 0) return NaN;
+  var m = 0,
+      i = -1;
+  while (++i < n) m += (x[i] - m) / (i + 1);
+  return m;
+};
+science.stats.median = function(x) {
+  return science.stats.quantiles(x, [.5])[0];
+};
+science.stats.mode = function(x) {
+  x = x.slice().sort(science.ascending);
+  var mode,
+      n = x.length,
+      i = -1,
+      l = i,
+      last = null,
+      max = 0,
+      tmp,
+      v;
+  while (++i < n) {
+    if ((v = x[i]) !== last) {
+      if ((tmp = i - l) > max) {
+        max = tmp;
+        mode = last;
+      }
+      last = v;
+      l = i;
+    }
+  }
+  return mode;
+};
+// Uses R's quantile algorithm type=7.
+science.stats.quantiles = function(d, quantiles) {
+  d = d.slice().sort(science.ascending);
+  var n_1 = d.length - 1;
+  return quantiles.map(function(q) {
+    if (q === 0) return d[0];
+    else if (q === 1) return d[n_1];
+
+    var index = 1 + q * n_1,
+        lo = Math.floor(index),
+        h = index - lo,
+        a = d[lo - 1];
+
+    return h === 0 ? a : a + h * (d[lo] - a);
+  });
+};
+// Unbiased estimate of a sample's variance.
+// Also known as the sample variance, where the denominator is n - 1.
+science.stats.variance = function(x) {
+  var n = x.length;
+  if (n < 1) return NaN;
+  if (n === 1) return 0;
+  var mean = science.stats.mean(x),
+      i = -1,
+      s = 0;
+  while (++i < n) {
+    var v = x[i] - mean;
+    s += v * v;
+  }
+  return s / (n - 1);
+};
+})()
\ No newline at end of file
diff --git a/static/demo/components/d3/lib/science/science.stats.min.js b/static/demo/components/d3/lib/science/science.stats.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..fd69f1343cdb97851d67427d73ad370ca154e291
--- /dev/null
+++ b/static/demo/components/d3/lib/science/science.stats.min.js
@@ -0,0 +1 @@
+(function(){function h(a,b){var c=b+1;while(c<a.length&&a[c]===0)c++;return c}function g(a,b,c,d){var e=d[0],f=d[1],g=h(b,f);if(g<a.length&&a[g]-a[c]<a[c]-a[e]){var i=h(b,e);d[0]=i,d[1]=g}}function f(a){return(a=1-a*a*a)*a*a}function e(a){var b=a.length,c=0;while(++c<b)if(a[c-1]>=a[c])return!1;return!0}function d(a){var b=a.length,c=-1;while(++c<b)if(!isFinite(a[c]))return!1;return!0}function c(a,b,c,d){var e=[],f=a+c,g=b.length,h=-1;while(++h<g)e[h]=(a*b[h]+c*d[h])/f;return e}function b(b,c){var d=c.length;if(b>d)return null;var e=[],f=[],g={},h=0,i=0,j,k,l;while(i<b){if(h===d)return null;var m=Math.floor(Math.random()*d);if(m in g)continue;g[m]=1,h++,k=c[m],l=!0;for(j=0;j<i;j++)if(a(k,e[j])){l=!1;break}l&&(e[i]=k,f[i]=m,i++)}return e}function a(a,b){if(!a||!b||a.length!==b.length)return!1;var c=a.length,d=-1;while(++d<c)if(a[d]!==b[d])return!1;return!0}science.stats={},science.stats.bandwidth={nrd0:function(a){var b=Math.sqrt(science.stats.variance(a));(lo=Math.min(b,science.stats.iqr(a)/1.34))||(lo=b)||(lo=Math.abs(a[1]))||(lo=1);return.9*lo*Math.pow(a.length,-0.2)},nrd:function(a){var b=science.stats.iqr(a)/1.34;return 1.06*Math.min(Math.sqrt(science.stats.variance(a)),b)*Math.pow(a.length,-0.2)}},science.stats.distance={euclidean:function(a,b){var c=a.length,d=-1,e=0,f;while(++d<c)f=a[d]-b[d],e+=f*f;return Math.sqrt(e)},manhattan:function(a,b){var c=a.length,d=-1,e=0;while(++d<c)e+=Math.abs(a[d]-b[d]);return e},minkowski:function(a){return function(b,c){var d=b.length,e=-1,f=0;while(++e<d)f+=Math.pow(Math.abs(b[e]-c[e]),a);return Math.pow(f,1/a)}},chebyshev:function(a,b){var c=a.length,d=-1,e=0,f;while(++d<c)f=Math.abs(a[d]-b[d]),f>e&&(e=f);return e},hamming:function(a,b){var c=a.length,d=-1,e=0;while(++d<c)a[d]!==b[d]&&e++;return e},jaccard:function(a,b){var c=a.length,d=-1,e=0;while(++d<c)a[d]===b[d]&&e++;return e/c},braycurtis:function(a,b){var c=a.length,d=-1,e=0,f=0,g,h;while(++d<c)g=a[d],h=b[d],e+=Math.abs(g-h),f+=Math.abs(g+h);return e/f}},science.stats.erf=function(a){var b=.254829592,c=-0.284496736,d=1.421413741,e=-1.453152027,f=1.061405429,g=.3275911,h=a<0?-1:1;a<0&&(h=-1,a=-a);var i=1/(1+g*a);return h*(1-((((f*i+e)*i+d)*i+c)*i+b)*i*Math.exp(-a*a))},science.stats.phi=function(a){return.5*(1+science.stats.erf(a/Math.SQRT2))},science.stats.kernel={uniform:function(a){return a<=1&&a>=-1?.5:0},triangular:function(a){return a<=1&&a>=-1?1-Math.abs(a):0},epanechnikov:function(a){return a<=1&&a>=-1?.75*(1-a*a):0},quartic:function(a){if(a<=1&&a>=-1){var b=1-a*a;return.9375*b*b}return 0},triweight:function(a){if(a<=1&&a>=-1){var b=1-a*a;return 35/32*b*b*b}return 0},gaussian:function(a){return 1/Math.sqrt(2*Math.PI)*Math.exp(-0.5*a*a)},cosine:function(a){return a<=1&&a>=-1?Math.PI/4*Math.cos(Math.PI/2*a):0}},science.stats.kde=function(){function d(d,e){var f=c.call(this,b);return d.map(function(c){var d=-1,e=0,g=b.length;while(++d<g)e+=a((c-b[d])/f);return[c,e/f/g]})}var a=science.stats.kernel.gaussian,b=[],c=science.stats.bandwidth.nrd;d.kernel=function(b){if(!arguments.length)return a;a=b;return d},d.sample=function(a){if(!arguments.length)return b;b=a;return d},d.bandwidth=function(a){if(!arguments.length)return c;c=science.functor(a);return d};return d},science.stats.kmeans=function(){function f(f){var g=f.length,h=[],i=[],j=1,l=0,m=b(e,f),n,o,p,q,r,s,t;while(j&&l<d){p=-1;while(++p<e)i[p]=0;o=-1;while(++o<g){q=f[o],s=Infinity,p=-1;while(++p<e)r=c.call(this,m[p],q),r<s&&(s=r,t=p);i[h[o]=t]++}n=[],o=-1;while(++o<g){q=h[o],r=n[q];if(r==null)n[q]=f[o].slice();else{p=-1;while(++p<r.length)r[p]+=f[o][p]}}p=-1;while(++p<e){q=n[p],r=1/i[p],o=-1;while(++o<q.length)q[o]*=r}j=0,p=-1;while(++p<e)if(!a(n[p],m[p])){j=1;break}m=n,l++}return{assignments:h,centroids:m}}var c=science.stats.distance.euclidean,d=1e3,e=1;f.k=function(a){if(!arguments.length)return e;e=a;return f},f.distance=function(a){if(!arguments.length)return c;c=a;return f};return f},science.stats.hcluster=function(){function d(d){var e=d.length,f=[],g=[],h=[],i=[],j,k,l,m,n,o,p,q;p=-1;while(++p<e){f[p]=0,h[p]=[],q=-1;while(++q<e)h[p][q]=p===q?Infinity:a(d[p],d[q]),h[p][f[p]]>h[p][q]&&(f[p]=q)}p=-1;while(++p<e)i[p]=[],i[p][0]={left:null,right:null,dist:0,centroid:d[p],size:1,depth:0},g[p]=1;for(n=0;n<e-1;n++){j=0;for(p=0;p<e;p++)h[p][f[p]]<h[j][f[j]]&&(j=p);k=f[j],l=i[j][0],m=i[k][0],newCluster={left:l,right:m,dist:h[j][k],centroid:c(l.size,l.centroid,m.size,m.centroid),size:l.size+m.size,depth:1+Math.max(l.depth,m.depth)},i[j].splice(0,0,newCluster),g[j]+=g[k];for(q=0;q<e;q++)switch(b){case"single":h[j][q]>h[k][q]&&(h[q][j]=h[j][q]=h[k][q]);break;case"complete":h[j][q]<h[k][q]&&(h[q][j]=h[j][q]=h[k][q]);break;case"average":h[q][j]=h[j][q]=(g[j]*h[j][q]+g[k]*h[k][q])/(g[j]+g[q])}h[j][j]=Infinity;for(p=0;p<e;p++)h[p][k]=h[k][p]=Infinity;for(q=0;q<e;q++)f[q]==k&&(f[q]=j),h[j][q]<h[j][f[j]]&&(f[j]=q);o=newCluster}return o}var a=science.stats.distance.euclidean,b="simple";d.distance=function(b){if(!arguments.length)return a;a=b;return d};return d},science.stats.iqr=function(a){var b=science.stats.quantiles(a,[.25,.75]);return b[1]-b[0]},science.stats.loess=function(){function h(h,i,j){var k=h.length,l;if(k!==i.length)throw{error:"Mismatched array lengths"};if(k==0)throw{error:"At least one point required."};if(arguments.length<3){j=[],l=-1;while(++l<k)j[l]=1}d(h),d(i),d(j),e(h);if(k==1)return[i[0]];if(k==2)return[i[0],i[1]];var m=Math.floor(a*k);if(m<2)throw{error:"Bandwidth too small."};var n=[],o=[],p=[];l=-1;while(++l<k)n[l]=0,o[l]=0,p[l]=1;var q=-1;while(++q<=b){var r=[0,m-1],s;l=-1;while(++l<k){s=h[l],l>0&&g(h,j,l,r);var t=r[0],u=r[1],v=h[l]-h[t]>h[u]-h[l]?t:u,w=0,x=0,y=0,z=0,A=0,B=Math.abs(1/(h[v]-s));for(var C=t;C<=u;++C){var D=h[C],E=i[C],F=C<l?s-D:D-s,G=f(F*B)*p[C]*j[C],H=D*G;w+=G,x+=H,y+=D*H,z+=E*G,A+=E*H}var I=x/w,J=z/w,K=A/w,L=y/w,M=Math.sqrt(Math.abs(L-I*I))<c?0:(K-I*J)/(L-I*I),N=J-M*I;n[l]=M*s+N,o[l]=Math.abs(i[l]-n[l])}if(q===b)break;var O=o.slice();O.sort();var P=O[Math.floor(k/2)];if(Math.abs(P)<c)break;var Q,G;l=-1;while(++l<k)Q=o[l]/(6*P),p[l]=Q>=1?0:(G=1-Q*Q)*G}return n}var a=.3,b=2,c=1e-12;h.bandwidth=function(b){if(!arguments.length)return b;a=b;return h},h.robustnessIterations=function(a){if(!arguments.length)return a;b=a;return h},h.accuracy=function(a){if(!arguments.length)return a;c=a;return h};return h},science.stats.mean=function(a){var b=a.length;if(b===0)return NaN;var c=0,d=-1;while(++d<b)c+=(a[d]-c)/(d+1);return c},science.stats.median=function(a){return science.stats.quantiles(a,[.5])[0]},science.stats.mode=function(a){a=a.slice().sort(science.ascending);var b,c=a.length,d=-1,e=d,f=null,g=0,h,i;while(++d<c)(i=a[d])!==f&&((h=d-e)>g&&(g=h,b=f),f=i,e=d);return b},science.stats.quantiles=function(a,b){a=a.slice().sort(science.ascending);var c=a.length-1;return b.map(function(b){if(b===0)return a[0];if(b===1)return a[c];var d=1+b*c,e=Math.floor(d),f=d-e,g=a[e-1];return f===0?g:g+f*(a[e]-g)})},science.stats.variance=function(a){var b=a.length;if(b<1)return NaN;if(b===1)return 0;var c=science.stats.mean(a),d=-1,e=0;while(++d<b){var f=a[d]-c;e+=f*f}return e/(b-1)}})()
\ No newline at end of file
diff --git a/static/demo/components/d3/package.json b/static/demo/components/d3/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..58890452b378024987b83605562bc4072cf6d3ed
--- /dev/null
+++ b/static/demo/components/d3/package.json
@@ -0,0 +1,40 @@
+{
+  "name": "d3",
+  "version": "3.0.8",
+  "description": "A small, free JavaScript library for manipulating documents based on data.",
+  "keywords": [
+    "dom",
+    "w3c",
+    "visualization",
+    "svg",
+    "animation",
+    "canvas"
+  ],
+  "homepage": "http://d3js.org",
+  "author": {
+    "name": "Mike Bostock",
+    "url": "http://bost.ocks.org/mike"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/mbostock/d3.git"
+  },
+  "main": "index.js",
+  "browserify": "index-browserify.js",
+  "jam": {
+    "main": "d3.js",
+    "shim": {
+      "exports": "d3"
+    }
+  },
+  "dependencies": {
+    "jsdom": "0.3.x"
+  },
+  "devDependencies": {
+    "uglify-js": "2.2.x",
+    "vows": "0.7.x"
+  },
+  "scripts": {
+    "test": "./node_modules/vows/bin/vows"
+  }
+}
diff --git a/static/demo/components/d3/src/behavior/behavior.js b/static/demo/components/d3/src/behavior/behavior.js
new file mode 100644
index 0000000000000000000000000000000000000000..39633b10599fa4652d68ae2505a68ad01b21c6ed
--- /dev/null
+++ b/static/demo/components/d3/src/behavior/behavior.js
@@ -0,0 +1 @@
+d3.behavior = {};
diff --git a/static/demo/components/d3/src/behavior/drag.js b/static/demo/components/d3/src/behavior/drag.js
new file mode 100644
index 0000000000000000000000000000000000000000..7ec76004027ee2cea14f7043fa82d0f540c3a804
--- /dev/null
+++ b/static/demo/components/d3/src/behavior/drag.js
@@ -0,0 +1,82 @@
+d3.behavior.drag = function() {
+  var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"),
+      origin = null;
+
+  function drag() {
+    this.on("mousedown.drag", mousedown)
+        .on("touchstart.drag", mousedown);
+  }
+
+  function mousedown() {
+    var target = this,
+        event_ = event.of(target, arguments),
+        eventTarget = d3.event.target,
+        touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null,
+        offset,
+        origin_ = point(),
+        moved = 0;
+
+    var w = d3.select(d3_window)
+        .on(touchId != null ? "touchmove.drag-" + touchId : "mousemove.drag", dragmove)
+        .on(touchId != null ? "touchend.drag-" + touchId : "mouseup.drag", dragend, true);
+
+    if (origin) {
+      offset = origin.apply(target, arguments);
+      offset = [offset.x - origin_[0], offset.y - origin_[1]];
+    } else {
+      offset = [0, 0];
+    }
+
+    // Only cancel mousedown; touchstart is needed for draggable links.
+    if (touchId == null) d3_eventCancel();
+    event_({type: "dragstart"});
+
+    function point() {
+      var p = target.parentNode;
+      return touchId != null
+          ? d3.touches(p).filter(function(p) { return p.identifier === touchId; })[0]
+          : d3.mouse(p);
+    }
+
+    function dragmove() {
+      if (!target.parentNode) return dragend(); // target removed from DOM
+
+      var p = point(),
+          dx = p[0] - origin_[0],
+          dy = p[1] - origin_[1];
+
+      moved |= dx | dy;
+      origin_ = p;
+      d3_eventCancel();
+
+      event_({type: "drag", x: p[0] + offset[0], y: p[1] + offset[1], dx: dx, dy: dy});
+    }
+
+    function dragend() {
+      event_({type: "dragend"});
+
+      // if moved, prevent the mouseup (and possibly click) from propagating
+      if (moved) {
+        d3_eventCancel();
+        if (d3.event.target === eventTarget) w.on("click.drag", click, true);
+      }
+
+      w .on(touchId != null ? "touchmove.drag-" + touchId : "mousemove.drag", null)
+        .on(touchId != null ? "touchend.drag-" + touchId : "mouseup.drag", null);
+    }
+
+    // prevent the subsequent click from propagating (e.g., for anchors)
+    function click() {
+      d3_eventCancel();
+      w.on("click.drag", null);
+    }
+  }
+
+  drag.origin = function(x) {
+    if (!arguments.length) return origin;
+    origin = x;
+    return drag;
+  };
+
+  return d3.rebind(drag, event, "on");
+};
diff --git a/static/demo/components/d3/src/behavior/zoom.js b/static/demo/components/d3/src/behavior/zoom.js
new file mode 100644
index 0000000000000000000000000000000000000000..d7014d5d5c4fcb7ab9e443931fc0868939f682c3
--- /dev/null
+++ b/static/demo/components/d3/src/behavior/zoom.js
@@ -0,0 +1,182 @@
+d3.behavior.zoom = function() {
+  var translate = [0, 0],
+      translate0, // translate when we started zooming (to avoid drift)
+      scale = 1,
+      scale0, // scale when we started touching
+      scaleExtent = d3_behavior_zoomInfinity,
+      event = d3_eventDispatch(zoom, "zoom"),
+      x0,
+      x1,
+      y0,
+      y1,
+      touchtime; // time of last touchstart (to detect double-tap)
+
+  function zoom() {
+    this.on("mousedown.zoom", mousedown)
+        .on("mousemove.zoom", mousemove)
+        .on(d3_behavior_zoomWheel + ".zoom", mousewheel)
+        .on("dblclick.zoom", dblclick)
+        .on("touchstart.zoom", touchstart)
+        .on("touchmove.zoom", touchmove)
+        .on("touchend.zoom", touchstart);
+  }
+
+  zoom.translate = function(x) {
+    if (!arguments.length) return translate;
+    translate = x.map(Number);
+    rescale();
+    return zoom;
+  };
+
+  zoom.scale = function(x) {
+    if (!arguments.length) return scale;
+    scale = +x;
+    rescale();
+    return zoom;
+  };
+
+  zoom.scaleExtent = function(x) {
+    if (!arguments.length) return scaleExtent;
+    scaleExtent = x == null ? d3_behavior_zoomInfinity : x.map(Number);
+    return zoom;
+  };
+
+  zoom.x = function(z) {
+    if (!arguments.length) return x1;
+    x1 = z;
+    x0 = z.copy();
+    translate = [0, 0];
+    scale = 1;
+    return zoom;
+  };
+
+  zoom.y = function(z) {
+    if (!arguments.length) return y1;
+    y1 = z;
+    y0 = z.copy();
+    translate = [0, 0];
+    scale = 1;
+    return zoom;
+  };
+
+  function location(p) {
+    return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
+  }
+
+  function point(l) {
+    return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
+  }
+
+  function scaleTo(s) {
+    scale = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));
+  }
+
+  function translateTo(p, l) {
+    l = point(l);
+    translate[0] += p[0] - l[0];
+    translate[1] += p[1] - l[1];
+  }
+
+  function rescale() {
+    if (x1) x1.domain(x0.range().map(function(x) { return (x - translate[0]) / scale; }).map(x0.invert));
+    if (y1) y1.domain(y0.range().map(function(y) { return (y - translate[1]) / scale; }).map(y0.invert));
+  }
+
+  function dispatch(event) {
+    rescale();
+    d3.event.preventDefault();
+    event({type: "zoom", scale: scale, translate: translate});
+  }
+
+  function mousedown() {
+    var target = this,
+        event_ = event.of(target, arguments),
+        eventTarget = d3.event.target,
+        moved = 0,
+        w = d3.select(d3_window).on("mousemove.zoom", mousemove).on("mouseup.zoom", mouseup),
+        l = location(d3.mouse(target));
+
+    d3_window.focus();
+    d3_eventCancel();
+
+    function mousemove() {
+      moved = 1;
+      translateTo(d3.mouse(target), l);
+      dispatch(event_);
+    }
+
+    function mouseup() {
+      if (moved) d3_eventCancel();
+      w.on("mousemove.zoom", null).on("mouseup.zoom", null);
+      if (moved && d3.event.target === eventTarget) w.on("click.zoom", click, true);
+    }
+
+    function click() {
+      d3_eventCancel();
+      w.on("click.zoom", null);
+    }
+  }
+
+  function mousewheel() {
+    if (!translate0) translate0 = location(d3.mouse(this));
+    scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * scale);
+    translateTo(d3.mouse(this), translate0);
+    dispatch(event.of(this, arguments));
+  }
+
+  function mousemove() {
+    translate0 = null;
+  }
+
+  function dblclick() {
+    var p = d3.mouse(this), l = location(p), k = Math.log(scale) / Math.LN2;
+    scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1));
+    translateTo(p, l);
+    dispatch(event.of(this, arguments));
+  }
+
+  function touchstart() {
+    var touches = d3.touches(this),
+        now = Date.now();
+
+    scale0 = scale;
+    translate0 = {};
+    touches.forEach(function(t) { translate0[t.identifier] = location(t); });
+    d3_eventCancel();
+
+    if (touches.length === 1) {
+      if (now - touchtime < 500) { // dbltap
+        var p = touches[0], l = location(touches[0]);
+        scaleTo(scale * 2);
+        translateTo(p, l);
+        dispatch(event.of(this, arguments));
+      }
+      touchtime = now;
+    }
+  }
+
+  function touchmove() {
+    var touches = d3.touches(this),
+        p0 = touches[0],
+        l0 = translate0[p0.identifier];
+    if (p1 = touches[1]) {
+      var p1, l1 = translate0[p1.identifier];
+      p0 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
+      l0 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
+      scaleTo(d3.event.scale * scale0);
+    }
+    translateTo(p0, l0);
+    touchtime = null;
+    dispatch(event.of(this, arguments));
+  }
+
+  return d3.rebind(zoom, event, "on");
+};
+
+var d3_behavior_zoomInfinity = [0, Infinity]; // default scale extent
+
+// https://developer.mozilla.org/en-US/docs/Mozilla_event_reference/wheel
+var d3_behavior_zoomDelta, d3_behavior_zoomWheel
+    = "onwheel" in document ? (d3_behavior_zoomDelta = function() { return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1); }, "wheel")
+    : "onmousewheel" in document ? (d3_behavior_zoomDelta = function() { return d3.event.wheelDelta; }, "mousewheel")
+    : (d3_behavior_zoomDelta = function() { return -d3.event.detail; }, "MozMousePixelScroll");
diff --git a/static/demo/components/d3/src/compat/date.js b/static/demo/components/d3/src/compat/date.js
new file mode 100644
index 0000000000000000000000000000000000000000..e682d4cb8099fa20419ef16e13addeeafc767acc
--- /dev/null
+++ b/static/demo/components/d3/src/compat/date.js
@@ -0,0 +1,3 @@
+if (!Date.now) Date.now = function() {
+  return +new Date;
+};
diff --git a/static/demo/components/d3/src/compat/style.js b/static/demo/components/d3/src/compat/style.js
new file mode 100644
index 0000000000000000000000000000000000000000..8192f6b2696ed59f9c78ced63d2d55f53cb8f923
--- /dev/null
+++ b/static/demo/components/d3/src/compat/style.js
@@ -0,0 +1,9 @@
+try {
+  d3_document.createElement("div").style.setProperty("opacity", 0, "");
+} catch (error) {
+  var d3_style_prototype = d3_window.CSSStyleDeclaration.prototype,
+      d3_style_setProperty = d3_style_prototype.setProperty;
+  d3_style_prototype.setProperty = function(name, value, priority) {
+    d3_style_setProperty.call(this, name, value + "", priority);
+  };
+}
diff --git a/static/demo/components/d3/src/component.js b/static/demo/components/d3/src/component.js
new file mode 100644
index 0000000000000000000000000000000000000000..13dfb1c8ef5c73265f546c948b7c9a22bc7762a2
--- /dev/null
+++ b/static/demo/components/d3/src/component.js
@@ -0,0 +1,7 @@
+var d3 = require("../index");
+
+console.log(JSON.stringify({
+  "name": "d3",
+  "version": d3.version,
+  "main": "./d3.js"
+}, null, 2));
diff --git a/static/demo/components/d3/src/core/array.js b/static/demo/components/d3/src/core/array.js
new file mode 100644
index 0000000000000000000000000000000000000000..21afe02876da5bd2393c3b14d83766506116ff2e
--- /dev/null
+++ b/static/demo/components/d3/src/core/array.js
@@ -0,0 +1,29 @@
+var d3_array = d3_arraySlice; // conversion for NodeLists
+
+function d3_arrayCopy(pseudoarray) {
+  var i = -1, n = pseudoarray.length, array = [];
+  while (++i < n) array.push(pseudoarray[i]);
+  return array;
+}
+
+function d3_arraySlice(pseudoarray) {
+  return Array.prototype.slice.call(pseudoarray);
+}
+
+try {
+  d3_array(d3_document.documentElement.childNodes)[0].nodeType;
+} catch(e) {
+  d3_array = d3_arrayCopy;
+}
+
+var d3_arraySubclass = [].__proto__?
+
+// Until ECMAScript supports array subclassing, prototype injection works well.
+function(array, prototype) {
+  array.__proto__ = prototype;
+}:
+
+// And if your browser doesn't support __proto__, we'll use direct extension.
+function(array, prototype) {
+  for (var property in prototype) array[property] = prototype[property];
+};
diff --git a/static/demo/components/d3/src/core/ascending.js b/static/demo/components/d3/src/core/ascending.js
new file mode 100644
index 0000000000000000000000000000000000000000..87699cc56d079aace33a47abe15d557b61703bad
--- /dev/null
+++ b/static/demo/components/d3/src/core/ascending.js
@@ -0,0 +1,3 @@
+d3.ascending = function(a, b) {
+  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+};
diff --git a/static/demo/components/d3/src/core/bisect.js b/static/demo/components/d3/src/core/bisect.js
new file mode 100644
index 0000000000000000000000000000000000000000..09b87b8afcaf96abe71093727a09cc0dc4065608
--- /dev/null
+++ b/static/demo/components/d3/src/core/bisect.js
@@ -0,0 +1,28 @@
+d3.bisector = function(f) {
+  return {
+    left: function(a, x, lo, hi) {
+      if (arguments.length < 3) lo = 0;
+      if (arguments.length < 4) hi = a.length;
+      while (lo < hi) {
+        var mid = lo + hi >>> 1;
+        if (f.call(a, a[mid], mid) < x) lo = mid + 1;
+        else hi = mid;
+      }
+      return lo;
+    },
+    right: function(a, x, lo, hi) {
+      if (arguments.length < 3) lo = 0;
+      if (arguments.length < 4) hi = a.length;
+      while (lo < hi) {
+        var mid = lo + hi >>> 1;
+        if (x < f.call(a, a[mid], mid)) hi = mid;
+        else lo = mid + 1;
+      }
+      return lo;
+    }
+  };
+};
+
+var d3_bisector = d3.bisector(function(d) { return d; });
+d3.bisectLeft = d3_bisector.left;
+d3.bisect = d3.bisectRight = d3_bisector.right;
diff --git a/static/demo/components/d3/src/core/class.js b/static/demo/components/d3/src/core/class.js
new file mode 100644
index 0000000000000000000000000000000000000000..ca0fab7f30f4a2d5d6090869242af06f830b5647
--- /dev/null
+++ b/static/demo/components/d3/src/core/class.js
@@ -0,0 +1,12 @@
+function d3_class(ctor, properties) {
+  try {
+    for (var key in properties) {
+      Object.defineProperty(ctor.prototype, key, {
+        value: properties[key],
+        enumerable: false
+      });
+    }
+  } catch (e) {
+    ctor.prototype = properties;
+  }
+}
diff --git a/static/demo/components/d3/src/core/collapse.js b/static/demo/components/d3/src/core/collapse.js
new file mode 100644
index 0000000000000000000000000000000000000000..08adc3a69e755beb47b6fd28c53573c8c121763d
--- /dev/null
+++ b/static/demo/components/d3/src/core/collapse.js
@@ -0,0 +1,3 @@
+function d3_collapse(s) {
+  return s.trim().replace(/\s+/g, " ");
+}
diff --git a/static/demo/components/d3/src/core/color.js b/static/demo/components/d3/src/core/color.js
new file mode 100644
index 0000000000000000000000000000000000000000..396d1b1e91725604b318f75164764cb2e097092b
--- /dev/null
+++ b/static/demo/components/d3/src/core/color.js
@@ -0,0 +1,5 @@
+function d3_Color() {}
+
+d3_Color.prototype.toString = function() {
+  return this.rgb() + "";
+};
diff --git a/static/demo/components/d3/src/core/core.js b/static/demo/components/d3/src/core/core.js
new file mode 100644
index 0000000000000000000000000000000000000000..0a678674e874a5131f73f49eca8be82328cabaaa
--- /dev/null
+++ b/static/demo/components/d3/src/core/core.js
@@ -0,0 +1,15 @@
+var π = Math.PI,
+    ε = 1e-6,
+    d3 = {version: "3.0.8"}, // semver
+    d3_radians = π / 180,
+    d3_degrees = 180 / π,
+    d3_document = document,
+    d3_window = window;
+
+function d3_target(d) {
+  return d.target;
+}
+
+function d3_source(d) {
+  return d.source;
+}
diff --git a/static/demo/components/d3/src/core/descending.js b/static/demo/components/d3/src/core/descending.js
new file mode 100644
index 0000000000000000000000000000000000000000..05034586ffe6ffe3516364500d616d13a13c4a27
--- /dev/null
+++ b/static/demo/components/d3/src/core/descending.js
@@ -0,0 +1,3 @@
+d3.descending = function(a, b) {
+  return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+};
diff --git a/static/demo/components/d3/src/core/dispatch.js b/static/demo/components/d3/src/core/dispatch.js
new file mode 100644
index 0000000000000000000000000000000000000000..1bfe857748f7c52a491b766a038c2fd68fab7f91
--- /dev/null
+++ b/static/demo/components/d3/src/core/dispatch.js
@@ -0,0 +1,60 @@
+d3.dispatch = function() {
+  var dispatch = new d3_dispatch,
+      i = -1,
+      n = arguments.length;
+  while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
+  return dispatch;
+};
+
+function d3_dispatch() {}
+
+d3_dispatch.prototype.on = function(type, listener) {
+  var i = type.indexOf("."),
+      name = "";
+
+  // Extract optional namespace, e.g., "click.foo"
+  if (i > 0) {
+    name = type.substring(i + 1);
+    type = type.substring(0, i);
+  }
+
+  return arguments.length < 2
+      ? this[type].on(name)
+      : this[type].on(name, listener);
+};
+
+function d3_dispatch_event(dispatch) {
+  var listeners = [],
+      listenerByName = new d3_Map;
+
+  function event() {
+    var z = listeners, // defensive reference
+        i = -1,
+        n = z.length,
+        l;
+    while (++i < n) if (l = z[i].on) l.apply(this, arguments);
+    return dispatch;
+  }
+
+  event.on = function(name, listener) {
+    var l = listenerByName.get(name),
+        i;
+
+    // return the current listener, if any
+    if (arguments.length < 2) return l && l.on;
+
+    // remove the old listener, if any (with copy-on-write)
+    if (l) {
+      l.on = null;
+      listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
+      listenerByName.remove(name);
+    }
+
+    // add the new listener, if any
+    if (listener) listeners.push(listenerByName.set(name, {on: listener}));
+
+    return dispatch;
+  };
+
+  return event;
+}
diff --git a/static/demo/components/d3/src/core/ease.js b/static/demo/components/d3/src/core/ease.js
new file mode 100644
index 0000000000000000000000000000000000000000..8a726e7e8335d76ff0cf9624999207c023aea5f9
--- /dev/null
+++ b/static/demo/components/d3/src/core/ease.js
@@ -0,0 +1,106 @@
+var d3_ease_default = function() { return d3_identity; };
+
+var d3_ease = d3.map({
+  linear: d3_ease_default,
+  poly: d3_ease_poly,
+  quad: function() { return d3_ease_quad; },
+  cubic: function() { return d3_ease_cubic; },
+  sin: function() { return d3_ease_sin; },
+  exp: function() { return d3_ease_exp; },
+  circle: function() { return d3_ease_circle; },
+  elastic: d3_ease_elastic,
+  back: d3_ease_back,
+  bounce: function() { return d3_ease_bounce; }
+});
+
+var d3_ease_mode = d3.map({
+  "in": d3_identity,
+  "out": d3_ease_reverse,
+  "in-out": d3_ease_reflect,
+  "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); }
+});
+
+d3.ease = function(name) {
+  var i = name.indexOf("-"),
+      t = i >= 0 ? name.substring(0, i) : name,
+      m = i >= 0 ? name.substring(i + 1) : "in";
+  t = d3_ease.get(t) || d3_ease_default;
+  m = d3_ease_mode.get(m) || d3_identity;
+  return d3_ease_clamp(m(t.apply(null, Array.prototype.slice.call(arguments, 1))));
+};
+
+function d3_ease_clamp(f) {
+  return function(t) {
+    return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
+  };
+}
+
+function d3_ease_reverse(f) {
+  return function(t) {
+    return 1 - f(1 - t);
+  };
+}
+
+function d3_ease_reflect(f) {
+  return function(t) {
+    return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t)));
+  };
+}
+
+function d3_ease_quad(t) {
+  return t * t;
+}
+
+function d3_ease_cubic(t) {
+  return t * t * t;
+}
+
+// Optimized clamp(reflect(poly(3))).
+function d3_ease_cubicInOut(t) {
+  if (t <= 0) return 0;
+  if (t >= 1) return 1;
+  var t2 = t * t, t3 = t2 * t;
+  return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);
+}
+
+function d3_ease_poly(e) {
+  return function(t) {
+    return Math.pow(t, e);
+  };
+}
+
+function d3_ease_sin(t) {
+  return 1 - Math.cos(t * π / 2);
+}
+
+function d3_ease_exp(t) {
+  return Math.pow(2, 10 * (t - 1));
+}
+
+function d3_ease_circle(t) {
+  return 1 - Math.sqrt(1 - t * t);
+}
+
+function d3_ease_elastic(a, p) {
+  var s;
+  if (arguments.length < 2) p = 0.45;
+  if (arguments.length) s = p / (2 * π) * Math.asin(1 / a);
+  else a = 1, s = p / 4;
+  return function(t) {
+    return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * π / p);
+  };
+}
+
+function d3_ease_back(s) {
+  if (!s) s = 1.70158;
+  return function(t) {
+    return t * t * ((s + 1) * t - s);
+  };
+}
+
+function d3_ease_bounce(t) {
+  return t < 1 / 2.75 ? 7.5625 * t * t
+      : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75
+      : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375
+      : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
+}
diff --git a/static/demo/components/d3/src/core/entries.js b/static/demo/components/d3/src/core/entries.js
new file mode 100644
index 0000000000000000000000000000000000000000..4ce014b82bae228e0b27562f93ecc328bd0d10c7
--- /dev/null
+++ b/static/demo/components/d3/src/core/entries.js
@@ -0,0 +1,5 @@
+d3.entries = function(map) {
+  var entries = [];
+  for (var key in map) entries.push({key: key, value: map[key]});
+  return entries;
+};
diff --git a/static/demo/components/d3/src/core/event.js b/static/demo/components/d3/src/core/event.js
new file mode 100644
index 0000000000000000000000000000000000000000..f58c024f3bab0ca169cedee5132677e54758dccb
--- /dev/null
+++ b/static/demo/components/d3/src/core/event.js
@@ -0,0 +1,49 @@
+d3.event = null;
+
+function d3_eventCancel() {
+  d3.event.stopPropagation();
+  d3.event.preventDefault();
+}
+
+function d3_eventSource() {
+  var e = d3.event, s;
+  while (s = e.sourceEvent) e = s;
+  return e;
+}
+
+// Like d3.dispatch, but for custom events abstracting native UI events. These
+// events have a target component (such as a brush), a target element (such as
+// the svg:g element containing the brush) and the standard arguments `d` (the
+// target element's data) and `i` (the selection index of the target element).
+function d3_eventDispatch(target) {
+  var dispatch = new d3_dispatch,
+      i = 0,
+      n = arguments.length;
+
+  while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
+
+  // Creates a dispatch context for the specified `thiz` (typically, the target
+  // DOM element that received the source event) and `argumentz` (typically, the
+  // data `d` and index `i` of the target element). The returned function can be
+  // used to dispatch an event to any registered listeners; the function takes a
+  // single argument as input, being the event to dispatch. The event must have
+  // a "type" attribute which corresponds to a type registered in the
+  // constructor. This context will automatically populate the "sourceEvent" and
+  // "target" attributes of the event, as well as setting the `d3.event` global
+  // for the duration of the notification.
+  dispatch.of = function(thiz, argumentz) {
+    return function(e1) {
+      try {
+        var e0 =
+        e1.sourceEvent = d3.event;
+        e1.target = target;
+        d3.event = e1;
+        dispatch[e1.type].apply(thiz, argumentz);
+      } finally {
+        d3.event = e0;
+      }
+    };
+  };
+
+  return dispatch;
+}
diff --git a/static/demo/components/d3/src/core/extent.js b/static/demo/components/d3/src/core/extent.js
new file mode 100644
index 0000000000000000000000000000000000000000..05584a95c1e5133f256c964c55d52ebf604c7c0b
--- /dev/null
+++ b/static/demo/components/d3/src/core/extent.js
@@ -0,0 +1,21 @@
+d3.extent = function(array, f) {
+  var i = -1,
+      n = array.length,
+      a,
+      b,
+      c;
+  if (arguments.length === 1) {
+    while (++i < n && ((a = c = array[i]) == null || a != a)) a = c = undefined;
+    while (++i < n) if ((b = array[i]) != null) {
+      if (a > b) a = b;
+      if (c < b) c = b;
+    }
+  } else {
+    while (++i < n && ((a = c = f.call(array, array[i], i)) == null || a != a)) a = undefined;
+    while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
+      if (a > b) a = b;
+      if (c < b) c = b;
+    }
+  }
+  return [a, c];
+};
diff --git a/static/demo/components/d3/src/core/format-locale.js b/static/demo/components/d3/src/core/format-locale.js
new file mode 100644
index 0000000000000000000000000000000000000000..95e0a3eef6258d8c4959cc7cc42b58ea876379ef
--- /dev/null
+++ b/static/demo/components/d3/src/core/format-locale.js
@@ -0,0 +1,3 @@
+var d3_format_decimalPoint = {decimal_point},
+    d3_format_thousandsSeparator = {thousands_sep},
+    d3_format_grouping = {grouping};
diff --git a/static/demo/components/d3/src/core/format.js b/static/demo/components/d3/src/core/format.js
new file mode 100644
index 0000000000000000000000000000000000000000..d04c1bd16291a367ed865a50bdbfaf0a96867c4f
--- /dev/null
+++ b/static/demo/components/d3/src/core/format.js
@@ -0,0 +1,125 @@
+d3.format = function(specifier) {
+  var match = d3_format_re.exec(specifier),
+      fill = match[1] || " ",
+      align = match[2] || ">",
+      sign = match[3] || "",
+      basePrefix = match[4] || "",
+      zfill = match[5],
+      width = +match[6],
+      comma = match[7],
+      precision = match[8],
+      type = match[9],
+      scale = 1,
+      suffix = "",
+      integer = false;
+
+  if (precision) precision = +precision.substring(1);
+
+  if (zfill || fill === "0" && align === "=") {
+    zfill = fill = "0";
+    align = "=";
+    if (comma) width -= Math.floor((width - 1) / 4);
+  }
+
+  switch (type) {
+    case "n": comma = true; type = "g"; break;
+    case "%": scale = 100; suffix = "%"; type = "f"; break;
+    case "p": scale = 100; suffix = "%"; type = "r"; break;
+    case "b":
+    case "o":
+    case "x":
+    case "X": if (basePrefix) basePrefix = "0" + type.toLowerCase();
+    case "c":
+    case "d": integer = true; precision = 0; break;
+    case "s": scale = -1; type = "r"; break;
+  }
+
+  if (basePrefix === "#") basePrefix = "";
+
+  // If no precision is specified for r, fallback to general notation.
+  if (type == "r" && !precision) type = "g";
+
+  type = d3_format_types.get(type) || d3_format_typeDefault;
+
+  var zcomma = zfill && comma;
+
+  return function(value) {
+
+    // Return the empty string for floats formatted as ints.
+    if (integer && (value % 1)) return "";
+
+    // Convert negative to positive, and record the sign prefix.
+    var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign;
+
+    // Apply the scale, computing it from the value's exponent for si format.
+    if (scale < 0) {
+      var prefix = d3.formatPrefix(value, precision);
+      value = prefix.scale(value);
+      suffix = prefix.symbol;
+    } else {
+      value *= scale;
+    }
+
+    // Convert to the desired precision.
+    value = type(value, precision);
+
+     // If the fill character is not "0", grouping is applied before padding.
+    if (!zfill && comma) value = d3_format_group(value);
+
+    var length = basePrefix.length + value.length + (zcomma ? 0 : negative.length),
+        padding = length < width ? new Array(length = width - length + 1).join(fill) : "";
+
+    // If the fill character is "0", grouping is applied after padding.
+    if (zcomma) value = d3_format_group(padding + value);
+
+    if (d3_format_decimalPoint) value.replace(".", d3_format_decimalPoint);
+
+    negative += basePrefix;
+
+    return (align === "<" ? negative + value + padding
+          : align === ">" ? padding + negative + value
+          : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length)
+          : negative + (zcomma ? value : padding + value)) + suffix;
+  };
+};
+
+// [[fill]align][sign][#][0][width][,][.precision][type]
+var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/;
+
+var d3_format_types = d3.map({
+  b: function(x) { return x.toString(2); },
+  c: function(x) { return String.fromCharCode(x); },
+  o: function(x) { return x.toString(8); },
+  x: function(x) { return x.toString(16); },
+  X: function(x) { return x.toString(16).toUpperCase(); },
+  g: function(x, p) { return x.toPrecision(p); },
+  e: function(x, p) { return x.toExponential(p); },
+  f: function(x, p) { return x.toFixed(p); },
+  r: function(x, p) { return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p)))); }
+});
+
+function d3_format_precision(x, p) {
+  return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);
+}
+
+function d3_format_typeDefault(x) {
+  return x + "";
+}
+
+// Apply comma grouping for thousands.
+var d3_format_group = d3_identity;
+if (d3_format_grouping) {
+  var d3_format_groupingLength = d3_format_grouping.length;
+  d3_format_group = function(value) {
+    var i = value.lastIndexOf("."),
+        f = i >= 0 ? "." + value.substring(i + 1) : (i = value.length, ""),
+        t = [],
+        j = 0,
+        g = d3_format_grouping[0];
+    while (i > 0 && g > 0) {
+      t.push(value.substring(i -= g, i + g));
+      g = d3_format_grouping[j = (j + 1) % d3_format_groupingLength];
+    }
+    return t.reverse().join(d3_format_thousandsSeparator || "") + f;
+  };
+}
diff --git a/static/demo/components/d3/src/core/formatPrefix.js b/static/demo/components/d3/src/core/formatPrefix.js
new file mode 100644
index 0000000000000000000000000000000000000000..0d9d4fcea3115f3114e3355f39977e2f052f9710
--- /dev/null
+++ b/static/demo/components/d3/src/core/formatPrefix.js
@@ -0,0 +1,20 @@
+var d3_formatPrefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"].map(d3_formatPrefix);
+
+d3.formatPrefix = function(value, precision) {
+  var i = 0;
+  if (value) {
+    if (value < 0) value *= -1;
+    if (precision) value = d3.round(value, d3_format_precision(value, precision));
+    i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);
+    i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3));
+  }
+  return d3_formatPrefixes[8 + i / 3];
+};
+
+function d3_formatPrefix(d, i) {
+  var k = Math.pow(10, Math.abs(8 - i) * 3);
+  return {
+    scale: i > 8 ? function(d) { return d / k; } : function(d) { return d * k; },
+    symbol: d
+  };
+}
diff --git a/static/demo/components/d3/src/core/functor.js b/static/demo/components/d3/src/core/functor.js
new file mode 100644
index 0000000000000000000000000000000000000000..f8b1bf7cbbd525e3983c582b71f5da7ae2ee4589
--- /dev/null
+++ b/static/demo/components/d3/src/core/functor.js
@@ -0,0 +1,5 @@
+function d3_functor(v) {
+  return typeof v === "function" ? v : function() { return v; };
+}
+
+d3.functor = d3_functor;
diff --git a/static/demo/components/d3/src/core/hcl.js b/static/demo/components/d3/src/core/hcl.js
new file mode 100644
index 0000000000000000000000000000000000000000..f873e3ce7e71ae7376a8d7acb77c4179e862cc1a
--- /dev/null
+++ b/static/demo/components/d3/src/core/hcl.js
@@ -0,0 +1,35 @@
+d3.hcl = function(h, c, l) {
+  return arguments.length === 1
+      ? (h instanceof d3_Hcl ? d3_hcl(h.h, h.c, h.l)
+      : (h instanceof d3_Lab ? d3_lab_hcl(h.l, h.a, h.b)
+      : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b)))
+      : d3_hcl(+h, +c, +l);
+};
+
+function d3_hcl(h, c, l) {
+  return new d3_Hcl(h, c, l);
+}
+
+function d3_Hcl(h, c, l) {
+  this.h = h;
+  this.c = c;
+  this.l = l;
+}
+
+var d3_hclPrototype = d3_Hcl.prototype = new d3_Color;
+
+d3_hclPrototype.brighter = function(k) {
+  return d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));
+};
+
+d3_hclPrototype.darker = function(k) {
+  return d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));
+};
+
+d3_hclPrototype.rgb = function() {
+  return d3_hcl_lab(this.h, this.c, this.l).rgb();
+};
+
+function d3_hcl_lab(h, c, l) {
+  return d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);
+}
diff --git a/static/demo/components/d3/src/core/hsl.js b/static/demo/components/d3/src/core/hsl.js
new file mode 100644
index 0000000000000000000000000000000000000000..8397abada05c3c6d59053e44b4161f86fa51d679
--- /dev/null
+++ b/static/demo/components/d3/src/core/hsl.js
@@ -0,0 +1,61 @@
+d3.hsl = function(h, s, l) {
+  return arguments.length === 1
+      ? (h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l)
+      : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl))
+      : d3_hsl(+h, +s, +l);
+};
+
+function d3_hsl(h, s, l) {
+  return new d3_Hsl(h, s, l);
+}
+
+function d3_Hsl(h, s, l) {
+  this.h = h;
+  this.s = s;
+  this.l = l;
+}
+
+var d3_hslPrototype = d3_Hsl.prototype = new d3_Color;
+
+d3_hslPrototype.brighter = function(k) {
+  k = Math.pow(0.7, arguments.length ? k : 1);
+  return d3_hsl(this.h, this.s, this.l / k);
+};
+
+d3_hslPrototype.darker = function(k) {
+  k = Math.pow(0.7, arguments.length ? k : 1);
+  return d3_hsl(this.h, this.s, k * this.l);
+};
+
+d3_hslPrototype.rgb = function() {
+  return d3_hsl_rgb(this.h, this.s, this.l);
+};
+
+function d3_hsl_rgb(h, s, l) {
+  var m1,
+      m2;
+
+  /* Some simple corrections for h, s and l. */
+  h = h % 360; if (h < 0) h += 360;
+  s = s < 0 ? 0 : s > 1 ? 1 : s;
+  l = l < 0 ? 0 : l > 1 ? 1 : l;
+
+  /* From FvD 13.37, CSS Color Module Level 3 */
+  m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
+  m1 = 2 * l - m2;
+
+  function v(h) {
+    if (h > 360) h -= 360;
+    else if (h < 0) h += 360;
+    if (h < 60) return m1 + (m2 - m1) * h / 60;
+    if (h < 180) return m2;
+    if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
+    return m1;
+  }
+
+  function vv(h) {
+    return Math.round(v(h) * 255);
+  }
+
+  return d3_rgb(vv(h + 120), vv(h), vv(h - 120));
+}
diff --git a/static/demo/components/d3/src/core/html.js b/static/demo/components/d3/src/core/html.js
new file mode 100644
index 0000000000000000000000000000000000000000..fe201fd2211a47e34e43ba5986bb9300641d64bf
--- /dev/null
+++ b/static/demo/components/d3/src/core/html.js
@@ -0,0 +1,9 @@
+d3.html = function(url, callback) {
+  return d3.xhr(url, "text/html", callback).response(d3_html);
+};
+
+function d3_html(request) {
+  var range = d3_document.createRange();
+  range.selectNode(d3_document.body);
+  return range.createContextualFragment(request.responseText);
+}
diff --git a/static/demo/components/d3/src/core/identity.js b/static/demo/components/d3/src/core/identity.js
new file mode 100644
index 0000000000000000000000000000000000000000..73893f86231a56439789740ec93d51d5957f1b40
--- /dev/null
+++ b/static/demo/components/d3/src/core/identity.js
@@ -0,0 +1,3 @@
+function d3_identity(d) {
+  return d;
+}
diff --git a/static/demo/components/d3/src/core/interpolate.js b/static/demo/components/d3/src/core/interpolate.js
new file mode 100644
index 0000000000000000000000000000000000000000..c08e845d70e038aa6aef1e3fb36c0d959351179f
--- /dev/null
+++ b/static/demo/components/d3/src/core/interpolate.js
@@ -0,0 +1,261 @@
+d3.interpolate = function(a, b) {
+  var i = d3.interpolators.length, f;
+  while (--i >= 0 && !(f = d3.interpolators[i](a, b)));
+  return f;
+};
+
+d3.interpolateNumber = function(a, b) {
+  b -= a;
+  return function(t) { return a + b * t; };
+};
+
+d3.interpolateRound = function(a, b) {
+  b -= a;
+  return function(t) { return Math.round(a + b * t); };
+};
+
+d3.interpolateString = function(a, b) {
+  var m, // current match
+      i, // current index
+      j, // current index (for coalescing)
+      s0 = 0, // start index of current string prefix
+      s1 = 0, // end index of current string prefix
+      s = [], // string constants and placeholders
+      q = [], // number interpolators
+      n, // q.length
+      o;
+
+  // Reset our regular expression!
+  d3_interpolate_number.lastIndex = 0;
+
+  // Find all numbers in b.
+  for (i = 0; m = d3_interpolate_number.exec(b); ++i) {
+    if (m.index) s.push(b.substring(s0, s1 = m.index));
+    q.push({i: s.length, x: m[0]});
+    s.push(null);
+    s0 = d3_interpolate_number.lastIndex;
+  }
+  if (s0 < b.length) s.push(b.substring(s0));
+
+  // Find all numbers in a.
+  for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) {
+    o = q[i];
+    if (o.x == m[0]) { // The numbers match, so coalesce.
+      if (o.i) {
+        if (s[o.i + 1] == null) { // This match is followed by another number.
+          s[o.i - 1] += o.x;
+          s.splice(o.i, 1);
+          for (j = i + 1; j < n; ++j) q[j].i--;
+        } else { // This match is followed by a string, so coalesce twice.
+          s[o.i - 1] += o.x + s[o.i + 1];
+          s.splice(o.i, 2);
+          for (j = i + 1; j < n; ++j) q[j].i -= 2;
+        }
+      } else {
+          if (s[o.i + 1] == null) { // This match is followed by another number.
+          s[o.i] = o.x;
+        } else { // This match is followed by a string, so coalesce twice.
+          s[o.i] = o.x + s[o.i + 1];
+          s.splice(o.i + 1, 1);
+          for (j = i + 1; j < n; ++j) q[j].i--;
+        }
+      }
+      q.splice(i, 1);
+      n--;
+      i--;
+    } else {
+      o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x));
+    }
+  }
+
+  // Remove any numbers in b not found in a.
+  while (i < n) {
+    o = q.pop();
+    if (s[o.i + 1] == null) { // This match is followed by another number.
+      s[o.i] = o.x;
+    } else { // This match is followed by a string, so coalesce twice.
+      s[o.i] = o.x + s[o.i + 1];
+      s.splice(o.i + 1, 1);
+    }
+    n--;
+  }
+
+  // Special optimization for only a single match.
+  if (s.length === 1) {
+    return s[0] == null ? q[0].x : function() { return b; };
+  }
+
+  // Otherwise, interpolate each of the numbers and rejoin the string.
+  return function(t) {
+    for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t);
+    return s.join("");
+  };
+};
+
+d3.interpolateTransform = function(a, b) {
+  var s = [], // string constants and placeholders
+      q = [], // number interpolators
+      n,
+      A = d3.transform(a),
+      B = d3.transform(b),
+      ta = A.translate,
+      tb = B.translate,
+      ra = A.rotate,
+      rb = B.rotate,
+      wa = A.skew,
+      wb = B.skew,
+      ka = A.scale,
+      kb = B.scale;
+
+  if (ta[0] != tb[0] || ta[1] != tb[1]) {
+    s.push("translate(", null, ",", null, ")");
+    q.push({i: 1, x: d3.interpolateNumber(ta[0], tb[0])}, {i: 3, x: d3.interpolateNumber(ta[1], tb[1])});
+  } else if (tb[0] || tb[1]) {
+    s.push("translate(" + tb + ")");
+  } else {
+    s.push("");
+  }
+
+  if (ra != rb) {
+    if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; // shortest path
+    q.push({i: s.push(s.pop() + "rotate(", null, ")") - 2, x: d3.interpolateNumber(ra, rb)});
+  } else if (rb) {
+    s.push(s.pop() + "rotate(" + rb + ")");
+  }
+
+  if (wa != wb) {
+    q.push({i: s.push(s.pop() + "skewX(", null, ")") - 2, x: d3.interpolateNumber(wa, wb)});
+  } else if (wb) {
+    s.push(s.pop() + "skewX(" + wb + ")");
+  }
+
+  if (ka[0] != kb[0] || ka[1] != kb[1]) {
+    n = s.push(s.pop() + "scale(", null, ",", null, ")");
+    q.push({i: n - 4, x: d3.interpolateNumber(ka[0], kb[0])}, {i: n - 2, x: d3.interpolateNumber(ka[1], kb[1])});
+  } else if (kb[0] != 1 || kb[1] != 1) {
+    s.push(s.pop() + "scale(" + kb + ")");
+  }
+
+  n = q.length;
+  return function(t) {
+    var i = -1, o;
+    while (++i < n) s[(o = q[i]).i] = o.x(t);
+    return s.join("");
+  };
+};
+
+d3.interpolateRgb = function(a, b) {
+  a = d3.rgb(a);
+  b = d3.rgb(b);
+  var ar = a.r,
+      ag = a.g,
+      ab = a.b,
+      br = b.r - ar,
+      bg = b.g - ag,
+      bb = b.b - ab;
+  return function(t) {
+    return "#"
+        + d3_rgb_hex(Math.round(ar + br * t))
+        + d3_rgb_hex(Math.round(ag + bg * t))
+        + d3_rgb_hex(Math.round(ab + bb * t));
+  };
+};
+
+// interpolates HSL space, but outputs RGB string (for compatibility)
+d3.interpolateHsl = function(a, b) {
+  a = d3.hsl(a);
+  b = d3.hsl(b);
+  var h0 = a.h,
+      s0 = a.s,
+      l0 = a.l,
+      h1 = b.h - h0,
+      s1 = b.s - s0,
+      l1 = b.l - l0;
+  if (h1 > 180) h1 -= 360; else if (h1 < -180) h1 += 360; // shortest path
+  return function(t) {
+    return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t) + "";
+  };
+};
+
+d3.interpolateLab = function(a, b) {
+  a = d3.lab(a);
+  b = d3.lab(b);
+  var al = a.l,
+      aa = a.a,
+      ab = a.b,
+      bl = b.l - al,
+      ba = b.a - aa,
+      bb = b.b - ab;
+  return function(t) {
+    return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + "";
+  };
+};
+
+d3.interpolateHcl = function(a, b) {
+  a = d3.hcl(a);
+  b = d3.hcl(b);
+  var ah = a.h,
+      ac = a.c,
+      al = a.l,
+      bh = b.h - ah,
+      bc = b.c - ac,
+      bl = b.l - al;
+  if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; // shortest path
+  return function(t) {
+    return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + "";
+  };
+};
+
+d3.interpolateArray = function(a, b) {
+  var x = [],
+      c = [],
+      na = a.length,
+      nb = b.length,
+      n0 = Math.min(a.length, b.length),
+      i;
+  for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i]));
+  for (; i < na; ++i) c[i] = a[i];
+  for (; i < nb; ++i) c[i] = b[i];
+  return function(t) {
+    for (i = 0; i < n0; ++i) c[i] = x[i](t);
+    return c;
+  };
+};
+
+d3.interpolateObject = function(a, b) {
+  var i = {},
+      c = {},
+      k;
+  for (k in a) {
+    if (k in b) {
+      i[k] = d3_interpolateByName(k)(a[k], b[k]);
+    } else {
+      c[k] = a[k];
+    }
+  }
+  for (k in b) {
+    if (!(k in a)) {
+      c[k] = b[k];
+    }
+  }
+  return function(t) {
+    for (k in i) c[k] = i[k](t);
+    return c;
+  };
+};
+
+var d3_interpolate_number = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;
+
+function d3_interpolateByName(name) {
+  return name == "transform"
+      ? d3.interpolateTransform
+      : d3.interpolate;
+}
+
+d3.interpolators = [
+  d3.interpolateObject,
+  function(a, b) { return b instanceof Array && d3.interpolateArray(a, b); },
+  function(a, b) { return (typeof a === "string" || typeof b === "string") && d3.interpolateString(a + "", b + ""); },
+  function(a, b) { return (typeof b === "string" ? d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Color) && d3.interpolateRgb(a, b); },
+  function(a, b) { return !isNaN(a = +a) && !isNaN(b = +b) && d3.interpolateNumber(a, b); }
+];
diff --git a/static/demo/components/d3/src/core/json.js b/static/demo/components/d3/src/core/json.js
new file mode 100644
index 0000000000000000000000000000000000000000..509640cef25177e458fc1e0db0cabcfeaac3dbb5
--- /dev/null
+++ b/static/demo/components/d3/src/core/json.js
@@ -0,0 +1,7 @@
+d3.json = function(url, callback) {
+  return d3.xhr(url, "application/json", callback).response(d3_json);
+};
+
+function d3_json(request) {
+  return JSON.parse(request.responseText);
+}
diff --git a/static/demo/components/d3/src/core/keys.js b/static/demo/components/d3/src/core/keys.js
new file mode 100644
index 0000000000000000000000000000000000000000..c83ec8e15688b090ec03ae70545e32226c31997c
--- /dev/null
+++ b/static/demo/components/d3/src/core/keys.js
@@ -0,0 +1,5 @@
+d3.keys = function(map) {
+  var keys = [];
+  for (var key in map) keys.push(key);
+  return keys;
+};
diff --git a/static/demo/components/d3/src/core/lab.js b/static/demo/components/d3/src/core/lab.js
new file mode 100644
index 0000000000000000000000000000000000000000..e3ff74f1277a4400ccb8d04a30e415c38ace8f29
--- /dev/null
+++ b/static/demo/components/d3/src/core/lab.js
@@ -0,0 +1,61 @@
+d3.lab = function(l, a, b) {
+  return arguments.length === 1
+      ? (l instanceof d3_Lab ? d3_lab(l.l, l.a, l.b)
+      : (l instanceof d3_Hcl ? d3_hcl_lab(l.l, l.c, l.h)
+      : d3_rgb_lab((l = d3.rgb(l)).r, l.g, l.b)))
+      : d3_lab(+l, +a, +b);
+};
+
+function d3_lab(l, a, b) {
+  return new d3_Lab(l, a, b);
+}
+
+function d3_Lab(l, a, b) {
+  this.l = l;
+  this.a = a;
+  this.b = b;
+}
+
+// Corresponds roughly to RGB brighter/darker
+var d3_lab_K = 18;
+
+// D65 standard referent
+var d3_lab_X = 0.950470,
+    d3_lab_Y = 1,
+    d3_lab_Z = 1.088830;
+
+var d3_labPrototype = d3_Lab.prototype = new d3_Color;
+
+d3_labPrototype.brighter = function(k) {
+  return d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
+};
+
+d3_labPrototype.darker = function(k) {
+  return d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
+};
+
+d3_labPrototype.rgb = function() {
+  return d3_lab_rgb(this.l, this.a, this.b);
+};
+
+function d3_lab_rgb(l, a, b) {
+  var y = (l + 16) / 116,
+      x = y + a / 500,
+      z = y - b / 200;
+  x = d3_lab_xyz(x) * d3_lab_X;
+  y = d3_lab_xyz(y) * d3_lab_Y;
+  z = d3_lab_xyz(z) * d3_lab_Z;
+  return d3_rgb(
+    d3_xyz_rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z),
+    d3_xyz_rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
+    d3_xyz_rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z)
+  );
+}
+
+function d3_lab_hcl(l, a, b) {
+  return d3_hcl(Math.atan2(b, a) / π * 180, Math.sqrt(a * a + b * b), l);
+}
+
+function d3_lab_xyz(x) {
+  return x > 0.206893034 ? x * x * x : (x - 4 / 29) / 7.787037;
+}
diff --git a/static/demo/components/d3/src/core/map.js b/static/demo/components/d3/src/core/map.js
new file mode 100644
index 0000000000000000000000000000000000000000..b30ebe2a83b850dda526201cd54e086f6a9ef65c
--- /dev/null
+++ b/static/demo/components/d3/src/core/map.js
@@ -0,0 +1,48 @@
+d3.map = function(object) {
+  var map = new d3_Map;
+  for (var key in object) map.set(key, object[key]);
+  return map;
+};
+
+function d3_Map() {}
+
+d3_class(d3_Map, {
+  has: function(key) {
+    return d3_map_prefix + key in this;
+  },
+  get: function(key) {
+    return this[d3_map_prefix + key];
+  },
+  set: function(key, value) {
+    return this[d3_map_prefix + key] = value;
+  },
+  remove: function(key) {
+    key = d3_map_prefix + key;
+    return key in this && delete this[key];
+  },
+  keys: function() {
+    var keys = [];
+    this.forEach(function(key) { keys.push(key); });
+    return keys;
+  },
+  values: function() {
+    var values = [];
+    this.forEach(function(key, value) { values.push(value); });
+    return values;
+  },
+  entries: function() {
+    var entries = [];
+    this.forEach(function(key, value) { entries.push({key: key, value: value}); });
+    return entries;
+  },
+  forEach: function(f) {
+    for (var key in this) {
+      if (key.charCodeAt(0) === d3_map_prefixCode) {
+        f.call(this, key.substring(1), this[key]);
+      }
+    }
+  }
+});
+
+var d3_map_prefix = "\0", // prevent collision with built-ins
+    d3_map_prefixCode = d3_map_prefix.charCodeAt(0);
diff --git a/static/demo/components/d3/src/core/max.js b/static/demo/components/d3/src/core/max.js
new file mode 100644
index 0000000000000000000000000000000000000000..d52bda31a3271099515dcb8b4cce8e8a2dd2682e
--- /dev/null
+++ b/static/demo/components/d3/src/core/max.js
@@ -0,0 +1,14 @@
+d3.max = function(array, f) {
+  var i = -1,
+      n = array.length,
+      a,
+      b;
+  if (arguments.length === 1) {
+    while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
+    while (++i < n) if ((b = array[i]) != null && b > a) a = b;
+  } else {
+    while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
+    while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
+  }
+  return a;
+};
diff --git a/static/demo/components/d3/src/core/mean.js b/static/demo/components/d3/src/core/mean.js
new file mode 100644
index 0000000000000000000000000000000000000000..24a286adcdfe00c6b1c2c14d6e2c4e7f2c70ecce
--- /dev/null
+++ b/static/demo/components/d3/src/core/mean.js
@@ -0,0 +1,13 @@
+d3.mean = function(array, f) {
+  var n = array.length,
+      a,
+      m = 0,
+      i = -1,
+      j = 0;
+  if (arguments.length === 1) {
+    while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j;
+  } else {
+    while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j;
+  }
+  return j ? m : undefined;
+};
diff --git a/static/demo/components/d3/src/core/median.js b/static/demo/components/d3/src/core/median.js
new file mode 100644
index 0000000000000000000000000000000000000000..37bb0e2a737ed716a0592db87c0b2335fdbd136f
--- /dev/null
+++ b/static/demo/components/d3/src/core/median.js
@@ -0,0 +1,5 @@
+d3.median = function(array, f) {
+  if (arguments.length > 1) array = array.map(f);
+  array = array.filter(d3_number);
+  return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined;
+};
diff --git a/static/demo/components/d3/src/core/merge.js b/static/demo/components/d3/src/core/merge.js
new file mode 100644
index 0000000000000000000000000000000000000000..d7307181107d2d50352c0228f3c70645513071f2
--- /dev/null
+++ b/static/demo/components/d3/src/core/merge.js
@@ -0,0 +1,3 @@
+d3.merge = function(arrays) {
+  return Array.prototype.concat.apply([], arrays);
+};
diff --git a/static/demo/components/d3/src/core/min.js b/static/demo/components/d3/src/core/min.js
new file mode 100644
index 0000000000000000000000000000000000000000..705a8f8cf2409be6862dd99200b74a72a9d212af
--- /dev/null
+++ b/static/demo/components/d3/src/core/min.js
@@ -0,0 +1,14 @@
+d3.min = function(array, f) {
+  var i = -1,
+      n = array.length,
+      a,
+      b;
+  if (arguments.length === 1) {
+    while (++i < n && ((a = array[i]) == null || a != a)) a = undefined;
+    while (++i < n) if ((b = array[i]) != null && a > b) a = b;
+  } else {
+    while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined;
+    while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
+  }
+  return a;
+};
diff --git a/static/demo/components/d3/src/core/mouse.js b/static/demo/components/d3/src/core/mouse.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8fcb1ac3f2382316117f535938555c608cd4f98
--- /dev/null
+++ b/static/demo/components/d3/src/core/mouse.js
@@ -0,0 +1,33 @@
+d3.mouse = function(container) {
+  return d3_mousePoint(container, d3_eventSource());
+};
+
+// https://bugs.webkit.org/show_bug.cgi?id=44083
+var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;
+
+function d3_mousePoint(container, e) {
+  var svg = container.ownerSVGElement || container;
+  if (svg.createSVGPoint) {
+    var point = svg.createSVGPoint();
+    if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {
+      svg = d3.select(d3_document.body).append("svg")
+          .style("position", "absolute")
+          .style("top", 0)
+          .style("left", 0);
+      var ctm = svg[0][0].getScreenCTM();
+      d3_mouse_bug44083 = !(ctm.f || ctm.e);
+      svg.remove();
+    }
+    if (d3_mouse_bug44083) {
+      point.x = e.pageX;
+      point.y = e.pageY;
+    } else {
+      point.x = e.clientX;
+      point.y = e.clientY;
+    }
+    point = point.matrixTransform(container.getScreenCTM().inverse());
+    return [point.x, point.y];
+  }
+  var rect = container.getBoundingClientRect();
+  return [e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop];
+};
diff --git a/static/demo/components/d3/src/core/nest.js b/static/demo/components/d3/src/core/nest.js
new file mode 100644
index 0000000000000000000000000000000000000000..b3af5f781cb9c8ac19e7095244f483684d3f4918
--- /dev/null
+++ b/static/demo/components/d3/src/core/nest.js
@@ -0,0 +1,89 @@
+d3.nest = function() {
+  var nest = {},
+      keys = [],
+      sortKeys = [],
+      sortValues,
+      rollup;
+
+  function map(array, depth) {
+    if (depth >= keys.length) return rollup
+        ? rollup.call(nest, array) : (sortValues
+        ? array.sort(sortValues)
+        : array);
+
+    var i = -1,
+        n = array.length,
+        key = keys[depth++],
+        keyValue,
+        object,
+        valuesByKey = new d3_Map,
+        values,
+        o = {};
+
+    while (++i < n) {
+      if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
+        values.push(object);
+      } else {
+        valuesByKey.set(keyValue, [object]);
+      }
+    }
+
+    valuesByKey.forEach(function(keyValue, values) {
+      o[keyValue] = map(values, depth);
+    });
+
+    return o;
+  }
+
+  function entries(map, depth) {
+    if (depth >= keys.length) return map;
+
+    var a = [],
+        sortKey = sortKeys[depth++],
+        key;
+
+    for (key in map) {
+      a.push({key: key, values: entries(map[key], depth)});
+    }
+
+    if (sortKey) a.sort(function(a, b) {
+      return sortKey(a.key, b.key);
+    });
+
+    return a;
+  }
+
+  nest.map = function(array) {
+    return map(array, 0);
+  };
+
+  nest.entries = function(array) {
+    return entries(map(array, 0), 0);
+  };
+
+  nest.key = function(d) {
+    keys.push(d);
+    return nest;
+  };
+
+  // Specifies the order for the most-recently specified key.
+  // Note: only applies to entries. Map keys are unordered!
+  nest.sortKeys = function(order) {
+    sortKeys[keys.length - 1] = order;
+    return nest;
+  };
+
+  // Specifies the order for leaf values.
+  // Applies to both maps and entries array.
+  nest.sortValues = function(order) {
+    sortValues = order;
+    return nest;
+  };
+
+  nest.rollup = function(f) {
+    rollup = f;
+    return nest;
+  };
+
+  return nest;
+};
diff --git a/static/demo/components/d3/src/core/noop.js b/static/demo/components/d3/src/core/noop.js
new file mode 100644
index 0000000000000000000000000000000000000000..35f91d114d1b3ee28ff72423a87a398adf110d55
--- /dev/null
+++ b/static/demo/components/d3/src/core/noop.js
@@ -0,0 +1 @@
+function d3_noop() {}
diff --git a/static/demo/components/d3/src/core/ns.js b/static/demo/components/d3/src/core/ns.js
new file mode 100644
index 0000000000000000000000000000000000000000..e23a653ba4918b91d66c3fdb7227a7b39efbcfad
--- /dev/null
+++ b/static/demo/components/d3/src/core/ns.js
@@ -0,0 +1,22 @@
+var d3_nsPrefix = {
+  svg: "http://www.w3.org/2000/svg",
+  xhtml: "http://www.w3.org/1999/xhtml",
+  xlink: "http://www.w3.org/1999/xlink",
+  xml: "http://www.w3.org/XML/1998/namespace",
+  xmlns: "http://www.w3.org/2000/xmlns/"
+};
+
+d3.ns = {
+  prefix: d3_nsPrefix,
+  qualify: function(name) {
+    var i = name.indexOf(":"),
+        prefix = name;
+    if (i >= 0) {
+      prefix = name.substring(0, i);
+      name = name.substring(i + 1);
+    }
+    return d3_nsPrefix.hasOwnProperty(prefix)
+        ? {space: d3_nsPrefix[prefix], local: name}
+        : name;
+  }
+};
diff --git a/static/demo/components/d3/src/core/number.js b/static/demo/components/d3/src/core/number.js
new file mode 100644
index 0000000000000000000000000000000000000000..ed03c6ff586002d1d2665ed3e97ff0eb9d7ae24a
--- /dev/null
+++ b/static/demo/components/d3/src/core/number.js
@@ -0,0 +1,3 @@
+function d3_number(x) {
+  return x != null && !isNaN(x);
+}
diff --git a/static/demo/components/d3/src/core/permute.js b/static/demo/components/d3/src/core/permute.js
new file mode 100644
index 0000000000000000000000000000000000000000..08d0ebea6aa68b23390eae1aa70c3ef619703f83
--- /dev/null
+++ b/static/demo/components/d3/src/core/permute.js
@@ -0,0 +1,7 @@
+d3.permute = function(array, indexes) {
+  var permutes = [],
+      i = -1,
+      n = indexes.length;
+  while (++i < n) permutes[i] = array[indexes[i]];
+  return permutes;
+};
diff --git a/static/demo/components/d3/src/core/quantile.js b/static/demo/components/d3/src/core/quantile.js
new file mode 100644
index 0000000000000000000000000000000000000000..67fe9fd71cd314ee64a28eb1e4fbb2c7a9bd59ec
--- /dev/null
+++ b/static/demo/components/d3/src/core/quantile.js
@@ -0,0 +1,8 @@
+// R-7 per <http://en.wikipedia.org/wiki/Quantile>
+d3.quantile = function(values, p) {
+  var H = (values.length - 1) * p + 1,
+      h = Math.floor(H),
+      v = +values[h - 1],
+      e = H - h;
+  return e ? v + e * (values[h] - v) : v;
+};
diff --git a/static/demo/components/d3/src/core/random.js b/static/demo/components/d3/src/core/random.js
new file mode 100644
index 0000000000000000000000000000000000000000..151f7b1cb5adfedcad467950086ba1fc073dcbab
--- /dev/null
+++ b/static/demo/components/d3/src/core/random.js
@@ -0,0 +1,28 @@
+d3.random = {
+  normal: function(µ, σ) {
+    var n = arguments.length;
+    if (n < 2) σ = 1;
+    if (n < 1) µ = 0;
+    return function() {
+      var x, y, r;
+      do {
+        x = Math.random() * 2 - 1;
+        y = Math.random() * 2 - 1;
+        r = x * x + y * y;
+      } while (!r || r > 1);
+      return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);
+    };
+  },
+  logNormal: function() {
+    var random = d3.random.normal.apply(d3, arguments);
+    return function() {
+      return Math.exp(random());
+    };
+  },
+  irwinHall: function(m) {
+    return function() {
+      for (var s = 0, j = 0; j < m; j++) s += Math.random();
+      return s / m;
+    };
+  }
+};
diff --git a/static/demo/components/d3/src/core/range.js b/static/demo/components/d3/src/core/range.js
new file mode 100644
index 0000000000000000000000000000000000000000..38fbc05f5e1f17fc4395c82eeaa7a6157ab6198f
--- /dev/null
+++ b/static/demo/components/d3/src/core/range.js
@@ -0,0 +1,24 @@
+d3.range = function(start, stop, step) {
+  if (arguments.length < 3) {
+    step = 1;
+    if (arguments.length < 2) {
+      stop = start;
+      start = 0;
+    }
+  }
+  if ((stop - start) / step === Infinity) throw new Error("infinite range");
+  var range = [],
+       k = d3_range_integerScale(Math.abs(step)),
+       i = -1,
+       j;
+  start *= k, stop *= k, step *= k;
+  if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k);
+  else while ((j = start + step * ++i) < stop) range.push(j / k);
+  return range;
+};
+
+function d3_range_integerScale(x) {
+  var k = 1;
+  while (x * k % 1) k *= 10;
+  return k;
+}
diff --git a/static/demo/components/d3/src/core/rebind.js b/static/demo/components/d3/src/core/rebind.js
new file mode 100644
index 0000000000000000000000000000000000000000..d61184646eee4d52f67989d84d8f4fb5af237c06
--- /dev/null
+++ b/static/demo/components/d3/src/core/rebind.js
@@ -0,0 +1,16 @@
+// Copies a variable number of methods from source to target.
+d3.rebind = function(target, source) {
+  var i = 1, n = arguments.length, method;
+  while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
+  return target;
+};
+
+// Method is assumed to be a standard D3 getter-setter:
+// If passed with no arguments, gets the value.
+// If passed with arguments, sets the value and returns the target.
+function d3_rebind(target, source, method) {
+  return function() {
+    var value = method.apply(source, arguments);
+    return value === source ? target : value;
+  };
+}
diff --git a/static/demo/components/d3/src/core/requote.js b/static/demo/components/d3/src/core/requote.js
new file mode 100644
index 0000000000000000000000000000000000000000..99dbf15a7df497450f79cf36b4c3f18f144c5a97
--- /dev/null
+++ b/static/demo/components/d3/src/core/requote.js
@@ -0,0 +1,5 @@
+d3.requote = function(s) {
+  return s.replace(d3_requote_re, "\\$&");
+};
+
+var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
diff --git a/static/demo/components/d3/src/core/rgb.js b/static/demo/components/d3/src/core/rgb.js
new file mode 100644
index 0000000000000000000000000000000000000000..9d953cedfa8ae15add86ccade873a1f60bede763
--- /dev/null
+++ b/static/demo/components/d3/src/core/rgb.js
@@ -0,0 +1,300 @@
+d3.rgb = function(r, g, b) {
+  return arguments.length === 1
+      ? (r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b)
+      : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb))
+      : d3_rgb(~~r, ~~g, ~~b);
+};
+
+function d3_rgb(r, g, b) {
+  return new d3_Rgb(r, g, b);
+}
+
+function d3_Rgb(r, g, b) {
+  this.r = r;
+  this.g = g;
+  this.b = b;
+}
+
+var d3_rgbPrototype = d3_Rgb.prototype = new d3_Color;
+
+d3_rgbPrototype.brighter = function(k) {
+  k = Math.pow(0.7, arguments.length ? k : 1);
+  var r = this.r,
+      g = this.g,
+      b = this.b,
+      i = 30;
+  if (!r && !g && !b) return d3_rgb(i, i, i);
+  if (r && r < i) r = i;
+  if (g && g < i) g = i;
+  if (b && b < i) b = i;
+  return d3_rgb(
+      Math.min(255, Math.floor(r / k)),
+      Math.min(255, Math.floor(g / k)),
+      Math.min(255, Math.floor(b / k)));
+};
+
+d3_rgbPrototype.darker = function(k) {
+  k = Math.pow(0.7, arguments.length ? k : 1);
+  return d3_rgb(
+      Math.floor(k * this.r),
+      Math.floor(k * this.g),
+      Math.floor(k * this.b));
+};
+
+d3_rgbPrototype.hsl = function() {
+  return d3_rgb_hsl(this.r, this.g, this.b);
+};
+
+d3_rgbPrototype.toString = function() {
+  return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
+};
+
+function d3_rgb_hex(v) {
+  return v < 0x10
+      ? "0" + Math.max(0, v).toString(16)
+      : Math.min(255, v).toString(16);
+}
+
+function d3_rgb_parse(format, rgb, hsl) {
+  var r = 0, // red channel; int in [0, 255]
+      g = 0, // green channel; int in [0, 255]
+      b = 0, // blue channel; int in [0, 255]
+      m1, // CSS color specification match
+      m2, // CSS color specification type (e.g., rgb)
+      name;
+
+  /* Handle hsl, rgb. */
+  m1 = /([a-z]+)\((.*)\)/i.exec(format);
+  if (m1) {
+    m2 = m1[2].split(",");
+    switch (m1[1]) {
+      case "hsl": {
+        return hsl(
+          parseFloat(m2[0]), // degrees
+          parseFloat(m2[1]) / 100, // percentage
+          parseFloat(m2[2]) / 100 // percentage
+        );
+      }
+      case "rgb": {
+        return rgb(
+          d3_rgb_parseNumber(m2[0]),
+          d3_rgb_parseNumber(m2[1]),
+          d3_rgb_parseNumber(m2[2])
+        );
+      }
+    }
+  }
+
+  /* Named colors. */
+  if (name = d3_rgb_names.get(format)) return rgb(name.r, name.g, name.b);
+
+  /* Hexadecimal colors: #rgb and #rrggbb. */
+  if (format != null && format.charAt(0) === "#") {
+    if (format.length === 4) {
+      r = format.charAt(1); r += r;
+      g = format.charAt(2); g += g;
+      b = format.charAt(3); b += b;
+    } else if (format.length === 7) {
+      r = format.substring(1, 3);
+      g = format.substring(3, 5);
+      b = format.substring(5, 7);
+    }
+    r = parseInt(r, 16);
+    g = parseInt(g, 16);
+    b = parseInt(b, 16);
+  }
+
+  return rgb(r, g, b);
+}
+
+function d3_rgb_hsl(r, g, b) {
+  var min = Math.min(r /= 255, g /= 255, b /= 255),
+      max = Math.max(r, g, b),
+      d = max - min,
+      h,
+      s,
+      l = (max + min) / 2;
+  if (d) {
+    s = l < .5 ? d / (max + min) : d / (2 - max - min);
+    if (r == max) h = (g - b) / d + (g < b ? 6 : 0);
+    else if (g == max) h = (b - r) / d + 2;
+    else h = (r - g) / d + 4;
+    h *= 60;
+  } else {
+    s = h = 0;
+  }
+  return d3_hsl(h, s, l);
+}
+
+function d3_rgb_lab(r, g, b) {
+  r = d3_rgb_xyz(r);
+  g = d3_rgb_xyz(g);
+  b = d3_rgb_xyz(b);
+  var x = d3_xyz_lab((0.4124564 * r + 0.3575761 * g + 0.1804375 * b) / d3_lab_X),
+      y = d3_xyz_lab((0.2126729 * r + 0.7151522 * g + 0.0721750 * b) / d3_lab_Y),
+      z = d3_xyz_lab((0.0193339 * r + 0.1191920 * g + 0.9503041 * b) / d3_lab_Z);
+  return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));
+}
+
+function d3_rgb_xyz(r) {
+  return (r /= 255) <= 0.04045 ? r / 12.92 : Math.pow((r + 0.055) / 1.055, 2.4);
+}
+
+function d3_rgb_parseNumber(c) { // either integer or percentage
+  var f = parseFloat(c);
+  return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
+}
+
+var d3_rgb_names = d3.map({
+  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",
+  darkgrey: "#a9a9a9",
+  darkkhaki: "#bdb76b",
+  darkmagenta: "#8b008b",
+  darkolivegreen: "#556b2f",
+  darkorange: "#ff8c00",
+  darkorchid: "#9932cc",
+  darkred: "#8b0000",
+  darksalmon: "#e9967a",
+  darkseagreen: "#8fbc8f",
+  darkslateblue: "#483d8b",
+  darkslategray: "#2f4f4f",
+  darkslategrey: "#2f4f4f",
+  darkturquoise: "#00ced1",
+  darkviolet: "#9400d3",
+  deeppink: "#ff1493",
+  deepskyblue: "#00bfff",
+  dimgray: "#696969",
+  dimgrey: "#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",
+  grey: "#808080",
+  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",
+  lightgray: "#d3d3d3",
+  lightgreen: "#90ee90",
+  lightgrey: "#d3d3d3",
+  lightpink: "#ffb6c1",
+  lightsalmon: "#ffa07a",
+  lightseagreen: "#20b2aa",
+  lightskyblue: "#87cefa",
+  lightslategray: "#778899",
+  lightslategrey: "#778899",
+  lightsteelblue: "#b0c4de",
+  lightyellow: "#ffffe0",
+  lime: "#00ff00",
+  limegreen: "#32cd32",
+  linen: "#faf0e6",
+  magenta: "#ff00ff",
+  maroon: "#800000",
+  mediumaquamarine: "#66cdaa",
+  mediumblue: "#0000cd",
+  mediumorchid: "#ba55d3",
+  mediumpurple: "#9370db",
+  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: "#db7093",
+  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",
+  slategrey: "#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"
+});
+
+d3_rgb_names.forEach(function(key, value) {
+  d3_rgb_names.set(key, d3_rgb_parse(value, d3_rgb, d3_hsl_rgb));
+});
diff --git a/static/demo/components/d3/src/core/round.js b/static/demo/components/d3/src/core/round.js
new file mode 100644
index 0000000000000000000000000000000000000000..44e9574295a465695e4559b724afd7eb410b9737
--- /dev/null
+++ b/static/demo/components/d3/src/core/round.js
@@ -0,0 +1,5 @@
+d3.round = function(x, n) {
+  return n
+      ? Math.round(x * (n = Math.pow(10, n))) / n
+      : Math.round(x);
+};
diff --git a/static/demo/components/d3/src/core/selection-append.js b/static/demo/components/d3/src/core/selection-append.js
new file mode 100644
index 0000000000000000000000000000000000000000..42d892a922749b8c92edc87eb546a1220e990183
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-append.js
@@ -0,0 +1,15 @@
+// TODO append(node)?
+// TODO append(function)?
+d3_selectionPrototype.append = function(name) {
+  name = d3.ns.qualify(name);
+
+  function append() {
+    return this.appendChild(d3_document.createElementNS(this.namespaceURI, name));
+  }
+
+  function appendNS() {
+    return this.appendChild(d3_document.createElementNS(name.space, name.local));
+  }
+
+  return this.select(name.local ? appendNS : append);
+};
diff --git a/static/demo/components/d3/src/core/selection-attr.js b/static/demo/components/d3/src/core/selection-attr.js
new file mode 100644
index 0000000000000000000000000000000000000000..616c3429173594476ae2c6ee8b7bdb4a07b0e7e4
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-attr.js
@@ -0,0 +1,59 @@
+d3_selectionPrototype.attr = function(name, value) {
+  if (arguments.length < 2) {
+
+    // For attr(string), return the attribute value for the first node.
+    if (typeof name === "string") {
+      var node = this.node();
+      name = d3.ns.qualify(name);
+      return name.local
+          ? node.getAttributeNS(name.space, name.local)
+          : node.getAttribute(name);
+    }
+
+    // For attr(object), the object specifies the names and values of the
+    // attributes to set or remove. The values may be functions that are
+    // evaluated for each element.
+    for (value in name) this.each(d3_selection_attr(value, name[value]));
+    return this;
+  }
+
+  return this.each(d3_selection_attr(name, value));
+};
+
+function d3_selection_attr(name, value) {
+  name = d3.ns.qualify(name);
+
+  // For attr(string, null), remove the attribute with the specified name.
+  function attrNull() {
+    this.removeAttribute(name);
+  }
+  function attrNullNS() {
+    this.removeAttributeNS(name.space, name.local);
+  }
+
+  // For attr(string, string), set the attribute with the specified name.
+  function attrConstant() {
+    this.setAttribute(name, value);
+  }
+  function attrConstantNS() {
+    this.setAttributeNS(name.space, name.local, value);
+  }
+
+  // For attr(string, function), evaluate the function for each element, and set
+  // or remove the attribute as appropriate.
+  function attrFunction() {
+    var x = value.apply(this, arguments);
+    if (x == null) this.removeAttribute(name);
+    else this.setAttribute(name, x);
+  }
+  function attrFunctionNS() {
+    var x = value.apply(this, arguments);
+    if (x == null) this.removeAttributeNS(name.space, name.local);
+    else this.setAttributeNS(name.space, name.local, x);
+  }
+
+  return value == null
+      ? (name.local ? attrNullNS : attrNull) : (typeof value === "function"
+      ? (name.local ? attrFunctionNS : attrFunction)
+      : (name.local ? attrConstantNS : attrConstant));
+}
diff --git a/static/demo/components/d3/src/core/selection-call.js b/static/demo/components/d3/src/core/selection-call.js
new file mode 100644
index 0000000000000000000000000000000000000000..e117fce64b0a35d79960989a77c677194f954843
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-call.js
@@ -0,0 +1,5 @@
+d3_selectionPrototype.call = function(callback) {
+  var args = d3_array(arguments);
+  callback.apply(args[0] = this, args);
+  return this;
+};
diff --git a/static/demo/components/d3/src/core/selection-classed.js b/static/demo/components/d3/src/core/selection-classed.js
new file mode 100644
index 0000000000000000000000000000000000000000..3c00aa691deb7935a78cd399fd0218ff34b40da8
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-classed.js
@@ -0,0 +1,77 @@
+d3_selectionPrototype.classed = function(name, value) {
+  if (arguments.length < 2) {
+
+    // For classed(string), return true only if the first node has the specified
+    // class or classes. Note that even if the browser supports DOMTokenList, it
+    // probably doesn't support it on SVG elements (which can be animated).
+    if (typeof name === "string") {
+      var node = this.node(),
+          n = (name = name.trim().split(/^|\s+/g)).length,
+          i = -1;
+      if (value = node.classList) {
+        while (++i < n) if (!value.contains(name[i])) return false;
+      } else {
+        value = node.className;
+        if (value.baseVal != null) value = value.baseVal;
+        while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;
+      }
+      return true;
+    }
+
+    // For classed(object), the object specifies the names of classes to add or
+    // remove. The values may be functions that are evaluated for each element.
+    for (value in name) this.each(d3_selection_classed(value, name[value]));
+    return this;
+  }
+
+  // Otherwise, both a name and a value are specified, and are handled as below.
+  return this.each(d3_selection_classed(name, value));
+};
+
+function d3_selection_classedRe(name) {
+  return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g");
+}
+
+// Multiple class names are allowed (e.g., "foo bar").
+function d3_selection_classed(name, value) {
+  name = name.trim().split(/\s+/).map(d3_selection_classedName);
+  var n = name.length;
+
+  function classedConstant() {
+    var i = -1;
+    while (++i < n) name[i](this, value);
+  }
+
+  // When the value is a function, the function is still evaluated only once per
+  // element even if there are multiple class names.
+  function classedFunction() {
+    var i = -1, x = value.apply(this, arguments);
+    while (++i < n) name[i](this, x);
+  }
+
+  return typeof value === "function"
+      ? classedFunction
+      : classedConstant;
+}
+
+function d3_selection_classedName(name) {
+  var re = d3_selection_classedRe(name);
+  return function(node, value) {
+    if (c = node.classList) return value ? c.add(name) : c.remove(name);
+    var c = node.className,
+        cb = c.baseVal != null,
+        cv = cb ? c.baseVal : c;
+    if (value) {
+      re.lastIndex = 0;
+      if (!re.test(cv)) {
+        cv = d3_collapse(cv + " " + name);
+        if (cb) c.baseVal = cv;
+        else node.className = cv;
+      }
+    } else if (cv) {
+      cv = d3_collapse(cv.replace(re, " "));
+      if (cb) c.baseVal = cv;
+      else node.className = cv;
+    }
+  };
+}
diff --git a/static/demo/components/d3/src/core/selection-data.js b/static/demo/components/d3/src/core/selection-data.js
new file mode 100644
index 0000000000000000000000000000000000000000..82d21aec4b163f8349a33197c67807bed6366f33
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-data.js
@@ -0,0 +1,115 @@
+d3_selectionPrototype.data = function(value, key) {
+  var i = -1,
+      n = this.length,
+      group,
+      node;
+
+  // If no value is specified, return the first value.
+  if (!arguments.length) {
+    value = new Array(n = (group = this[0]).length);
+    while (++i < n) {
+      if (node = group[i]) {
+        value[i] = node.__data__;
+      }
+    }
+    return value;
+  }
+
+  function bind(group, groupData) {
+    var i,
+        n = group.length,
+        m = groupData.length,
+        n0 = Math.min(n, m),
+        updateNodes = new Array(m),
+        enterNodes = new Array(m),
+        exitNodes = new Array(n),
+        node,
+        nodeData;
+
+    if (key) {
+      var nodeByKeyValue = new d3_Map,
+          dataByKeyValue = new d3_Map,
+          keyValues = [],
+          keyValue;
+
+      for (i = -1; ++i < n;) {
+        keyValue = key.call(node = group[i], node.__data__, i);
+        if (nodeByKeyValue.has(keyValue)) {
+          exitNodes[i] = node; // duplicate selection key
+        } else {
+          nodeByKeyValue.set(keyValue, node);
+        }
+        keyValues.push(keyValue);
+      }
+
+      for (i = -1; ++i < m;) {
+        keyValue = key.call(groupData, nodeData = groupData[i], i);
+        if (node = nodeByKeyValue.get(keyValue)) {
+          updateNodes[i] = node;
+          node.__data__ = nodeData;
+        } else if (!dataByKeyValue.has(keyValue)) { // no duplicate data key
+          enterNodes[i] = d3_selection_dataNode(nodeData);
+        }
+        dataByKeyValue.set(keyValue, nodeData);
+        nodeByKeyValue.remove(keyValue);
+      }
+
+      for (i = -1; ++i < n;) {
+        if (nodeByKeyValue.has(keyValues[i])) {
+          exitNodes[i] = group[i];
+        }
+      }
+    } else {
+      for (i = -1; ++i < n0;) {
+        node = group[i];
+        nodeData = groupData[i];
+        if (node) {
+          node.__data__ = nodeData;
+          updateNodes[i] = node;
+        } else {
+          enterNodes[i] = d3_selection_dataNode(nodeData);
+        }
+      }
+      for (; i < m; ++i) {
+        enterNodes[i] = d3_selection_dataNode(groupData[i]);
+      }
+      for (; i < n; ++i) {
+        exitNodes[i] = group[i];
+      }
+    }
+
+    enterNodes.update
+        = updateNodes;
+
+    enterNodes.parentNode
+        = updateNodes.parentNode
+        = exitNodes.parentNode
+        = group.parentNode;
+
+    enter.push(enterNodes);
+    update.push(updateNodes);
+    exit.push(exitNodes);
+  }
+
+  var enter = d3_selection_enter([]),
+      update = d3_selection([]),
+      exit = d3_selection([]);
+
+  if (typeof value === "function") {
+    while (++i < n) {
+      bind(group = this[i], value.call(group, group.parentNode.__data__, i));
+    }
+  } else {
+    while (++i < n) {
+      bind(group = this[i], value);
+    }
+  }
+
+  update.enter = function() { return enter; };
+  update.exit = function() { return exit; };
+  return update;
+};
+
+function d3_selection_dataNode(data) {
+  return {__data__: data};
+}
diff --git a/static/demo/components/d3/src/core/selection-datum.js b/static/demo/components/d3/src/core/selection-datum.js
new file mode 100644
index 0000000000000000000000000000000000000000..c392e2c42f023fcf3c6e758f35251c3414d822c5
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-datum.js
@@ -0,0 +1,5 @@
+d3_selectionPrototype.datum = function(value) {
+  return arguments.length
+      ? this.property("__data__", value)
+      : this.property("__data__");
+};
diff --git a/static/demo/components/d3/src/core/selection-each.js b/static/demo/components/d3/src/core/selection-each.js
new file mode 100644
index 0000000000000000000000000000000000000000..1102a0dac058a5c1b16f763f3dd181e368290406
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-each.js
@@ -0,0 +1,14 @@
+d3_selectionPrototype.each = function(callback) {
+  return d3_selection_each(this, function(node, i, j) {
+    callback.call(node, node.__data__, i, j);
+  });
+};
+
+function d3_selection_each(groups, callback) {
+  for (var j = 0, m = groups.length; j < m; j++) {
+    for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {
+      if (node = group[i]) callback(node, i, j);
+    }
+  }
+  return groups;
+}
diff --git a/static/demo/components/d3/src/core/selection-empty.js b/static/demo/components/d3/src/core/selection-empty.js
new file mode 100644
index 0000000000000000000000000000000000000000..91eaca90158430036b3f9f5bc6e7525be71723aa
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-empty.js
@@ -0,0 +1,3 @@
+d3_selectionPrototype.empty = function() {
+  return !this.node();
+};
diff --git a/static/demo/components/d3/src/core/selection-enter-select.js b/static/demo/components/d3/src/core/selection-enter-select.js
new file mode 100644
index 0000000000000000000000000000000000000000..7b442ddd06f86887f8667cb4a46ef7bb9430e891
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-enter-select.js
@@ -0,0 +1,24 @@
+d3_selection_enterPrototype.select = function(selector) {
+  var subgroups = [],
+      subgroup,
+      subnode,
+      upgroup,
+      group,
+      node;
+
+  for (var j = -1, m = this.length; ++j < m;) {
+    upgroup = (group = this[j]).update;
+    subgroups.push(subgroup = []);
+    subgroup.parentNode = group.parentNode;
+    for (var i = -1, n = group.length; ++i < n;) {
+      if (node = group[i]) {
+        subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i));
+        subnode.__data__ = node.__data__;
+      } else {
+        subgroup.push(null);
+      }
+    }
+  }
+
+  return d3_selection(subgroups);
+};
diff --git a/static/demo/components/d3/src/core/selection-enter.js b/static/demo/components/d3/src/core/selection-enter.js
new file mode 100644
index 0000000000000000000000000000000000000000..bc9071b177e2d602adc8257354b801fc17a692ad
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-enter.js
@@ -0,0 +1,14 @@
+function d3_selection_enter(selection) {
+  d3_arraySubclass(selection, d3_selection_enterPrototype);
+  return selection;
+}
+
+var d3_selection_enterPrototype = [];
+
+d3.selection.enter = d3_selection_enter;
+d3.selection.enter.prototype = d3_selection_enterPrototype;
+
+d3_selection_enterPrototype.append = d3_selectionPrototype.append;
+d3_selection_enterPrototype.insert = d3_selectionPrototype.insert;
+d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
+d3_selection_enterPrototype.node = d3_selectionPrototype.node;
diff --git a/static/demo/components/d3/src/core/selection-filter.js b/static/demo/components/d3/src/core/selection-filter.js
new file mode 100644
index 0000000000000000000000000000000000000000..238578477f4bb4253d28c440b6e94e0dc7bc78a8
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-filter.js
@@ -0,0 +1,26 @@
+d3_selectionPrototype.filter = function(filter) {
+  var subgroups = [],
+      subgroup,
+      group,
+      node;
+
+  if (typeof filter !== "function") filter = d3_selection_filter(filter);
+
+  for (var j = 0, m = this.length; j < m; j++) {
+    subgroups.push(subgroup = []);
+    subgroup.parentNode = (group = this[j]).parentNode;
+    for (var i = 0, n = group.length; i < n; i++) {
+      if ((node = group[i]) && filter.call(node, node.__data__, i)) {
+        subgroup.push(node);
+      }
+    }
+  }
+
+  return d3_selection(subgroups);
+};
+
+function d3_selection_filter(selector) {
+  return function() {
+    return d3_selectMatches(this, selector);
+  };
+}
diff --git a/static/demo/components/d3/src/core/selection-html.js b/static/demo/components/d3/src/core/selection-html.js
new file mode 100644
index 0000000000000000000000000000000000000000..1f7fa74a3a0c6a541849d10fd1acbdf51dbc5d3d
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-html.js
@@ -0,0 +1,8 @@
+d3_selectionPrototype.html = function(value) {
+  return arguments.length
+      ? this.each(typeof value === "function"
+      ? function() { var v = value.apply(this, arguments); this.innerHTML = v == null ? "" : v; } : value == null
+      ? function() { this.innerHTML = ""; }
+      : function() { this.innerHTML = value; })
+      : this.node().innerHTML;
+};
diff --git a/static/demo/components/d3/src/core/selection-insert.js b/static/demo/components/d3/src/core/selection-insert.js
new file mode 100644
index 0000000000000000000000000000000000000000..c1732d1664f291a600b76b5b8b6662922158ab5b
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-insert.js
@@ -0,0 +1,20 @@
+// TODO insert(node, function)?
+// TODO insert(function, string)?
+// TODO insert(function, function)?
+d3_selectionPrototype.insert = function(name, before) {
+  name = d3.ns.qualify(name);
+
+  function insert() {
+    return this.insertBefore(
+        d3_document.createElementNS(this.namespaceURI, name),
+        d3_select(before, this));
+  }
+
+  function insertNS() {
+    return this.insertBefore(
+        d3_document.createElementNS(name.space, name.local),
+        d3_select(before, this));
+  }
+
+  return this.select(name.local ? insertNS : insert);
+};
diff --git a/static/demo/components/d3/src/core/selection-node.js b/static/demo/components/d3/src/core/selection-node.js
new file mode 100644
index 0000000000000000000000000000000000000000..1b9158f7807a5b7449b4f15e76b70588d0d4afba
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-node.js
@@ -0,0 +1,9 @@
+d3_selectionPrototype.node = function() {
+  for (var j = 0, m = this.length; j < m; j++) {
+    for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+      var node = group[i];
+      if (node) return node;
+    }
+  }
+  return null;
+};
diff --git a/static/demo/components/d3/src/core/selection-on.js b/static/demo/components/d3/src/core/selection-on.js
new file mode 100644
index 0000000000000000000000000000000000000000..8511dc44ff50255e5498b0e0e77597dacea644a3
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-on.js
@@ -0,0 +1,58 @@
+d3_selectionPrototype.on = function(type, listener, capture) {
+  var n = arguments.length;
+  if (n < 3) {
+
+    // For on(object) or on(object, boolean), the object specifies the event
+    // types and listeners to add or remove. The optional boolean specifies
+    // whether the listener captures events.
+    if (typeof type !== "string") {
+      if (n < 2) listener = false;
+      for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));
+      return this;
+    }
+
+    // For on(string), return the listener for the first node.
+    if (n < 2) return (n = this.node()["__on" + type]) && n._;
+
+    // For on(string, function), use the default capture.
+    capture = false;
+  }
+
+  // Otherwise, a type, listener and capture are specified, and handled as below.
+  return this.each(d3_selection_on(type, listener, capture));
+};
+
+function d3_selection_on(type, listener, capture) {
+  var name = "__on" + type, i = type.indexOf(".");
+  if (i > 0) type = type.substring(0, i);
+
+  function onRemove() {
+    var wrapper = this[name];
+    if (wrapper) {
+      this.removeEventListener(type, wrapper, wrapper.$);
+      delete this[name];
+    }
+  }
+
+  function onAdd() {
+    var node = this,
+        args = d3_array(arguments);
+
+    onRemove.call(this);
+    this.addEventListener(type, this[name] = wrapper, wrapper.$ = capture);
+    wrapper._ = listener;
+
+    function wrapper(e) {
+      var o = d3.event; // Events can be reentrant (e.g., focus).
+      d3.event = e;
+      args[0] = node.__data__;
+      try {
+        listener.apply(node, args);
+      } finally {
+        d3.event = o;
+      }
+    }
+  }
+
+  return listener ? onAdd : onRemove;
+}
diff --git a/static/demo/components/d3/src/core/selection-order.js b/static/demo/components/d3/src/core/selection-order.js
new file mode 100644
index 0000000000000000000000000000000000000000..9812dcd8342c25f2eff1989cdcddc2d81c82d79c
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-order.js
@@ -0,0 +1,11 @@
+d3_selectionPrototype.order = function() {
+  for (var j = -1, m = this.length; ++j < m;) {
+    for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
+      if (node = group[i]) {
+        if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
+        next = node;
+      }
+    }
+  }
+  return this;
+};
diff --git a/static/demo/components/d3/src/core/selection-property.js b/static/demo/components/d3/src/core/selection-property.js
new file mode 100644
index 0000000000000000000000000000000000000000..9f72f320a944df8cabf7d046391955ddf5ac2087
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-property.js
@@ -0,0 +1,41 @@
+d3_selectionPrototype.property = function(name, value) {
+  if (arguments.length < 2) {
+
+    // For property(string), return the property value for the first node.
+    if (typeof name === "string") return this.node()[name];
+
+    // For property(object), the object specifies the names and values of the
+    // properties to set or remove. The values may be functions that are
+    // evaluated for each element.
+    for (value in name) this.each(d3_selection_property(value, name[value]));
+    return this;
+  }
+
+  // Otherwise, both a name and a value are specified, and are handled as below.
+  return this.each(d3_selection_property(name, value));
+};
+
+function d3_selection_property(name, value) {
+
+  // For property(name, null), remove the property with the specified name.
+  function propertyNull() {
+    delete this[name];
+  }
+
+  // For property(name, string), set the property with the specified name.
+  function propertyConstant() {
+    this[name] = value;
+  }
+
+  // For property(name, function), evaluate the function for each element, and
+  // set or remove the property as appropriate.
+  function propertyFunction() {
+    var x = value.apply(this, arguments);
+    if (x == null) delete this[name];
+    else this[name] = x;
+  }
+
+  return value == null
+      ? propertyNull : (typeof value === "function"
+      ? propertyFunction : propertyConstant);
+}
diff --git a/static/demo/components/d3/src/core/selection-remove.js b/static/demo/components/d3/src/core/selection-remove.js
new file mode 100644
index 0000000000000000000000000000000000000000..ec07cec004cf82249a7930c19a8cf7f117b986b0
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-remove.js
@@ -0,0 +1,9 @@
+// TODO remove(selector)?
+// TODO remove(node)?
+// TODO remove(function)?
+d3_selectionPrototype.remove = function() {
+  return this.each(function() {
+    var parent = this.parentNode;
+    if (parent) parent.removeChild(this);
+  });
+};
diff --git a/static/demo/components/d3/src/core/selection-root.js b/static/demo/components/d3/src/core/selection-root.js
new file mode 100644
index 0000000000000000000000000000000000000000..80d2c080698da661d4b1a59dff872c3a1ee027c4
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-root.js
@@ -0,0 +1,18 @@
+var d3_selectionRoot = d3_selection([[d3_document]]);
+
+d3_selectionRoot[0].parentNode = d3_selectRoot;
+
+// TODO fast singleton implementation!
+// TODO select(function)
+d3.select = function(selector) {
+  return typeof selector === "string"
+      ? d3_selectionRoot.select(selector)
+      : d3_selection([[selector]]); // assume node
+};
+
+// TODO selectAll(function)
+d3.selectAll = function(selector) {
+  return typeof selector === "string"
+      ? d3_selectionRoot.selectAll(selector)
+      : d3_selection([d3_array(selector)]); // assume node[]
+};
diff --git a/static/demo/components/d3/src/core/selection-select.js b/static/demo/components/d3/src/core/selection-select.js
new file mode 100644
index 0000000000000000000000000000000000000000..fea22b5ddc9d08ea503e0d70fa4cdec2b6f7aac6
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-select.js
@@ -0,0 +1,30 @@
+d3_selectionPrototype.select = function(selector) {
+  var subgroups = [],
+      subgroup,
+      subnode,
+      group,
+      node;
+
+  if (typeof selector !== "function") selector = d3_selection_selector(selector);
+
+  for (var j = -1, m = this.length; ++j < m;) {
+    subgroups.push(subgroup = []);
+    subgroup.parentNode = (group = this[j]).parentNode;
+    for (var i = -1, n = group.length; ++i < n;) {
+      if (node = group[i]) {
+        subgroup.push(subnode = selector.call(node, node.__data__, i));
+        if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
+      } else {
+        subgroup.push(null);
+      }
+    }
+  }
+
+  return d3_selection(subgroups);
+};
+
+function d3_selection_selector(selector) {
+  return function() {
+    return d3_select(selector, this);
+  };
+}
diff --git a/static/demo/components/d3/src/core/selection-selectAll.js b/static/demo/components/d3/src/core/selection-selectAll.js
new file mode 100644
index 0000000000000000000000000000000000000000..c133c6352d55d0bf73e3f6b7d3f4cd6403369e4a
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-selectAll.js
@@ -0,0 +1,24 @@
+d3_selectionPrototype.selectAll = function(selector) {
+  var subgroups = [],
+      subgroup,
+      node;
+
+  if (typeof selector !== "function") selector = d3_selection_selectorAll(selector);
+
+  for (var j = -1, m = this.length; ++j < m;) {
+    for (var group = this[j], i = -1, n = group.length; ++i < n;) {
+      if (node = group[i]) {
+        subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i)));
+        subgroup.parentNode = node;
+      }
+    }
+  }
+
+  return d3_selection(subgroups);
+};
+
+function d3_selection_selectorAll(selector) {
+  return function() {
+    return d3_selectAll(selector, this);
+  };
+}
diff --git a/static/demo/components/d3/src/core/selection-sort.js b/static/demo/components/d3/src/core/selection-sort.js
new file mode 100644
index 0000000000000000000000000000000000000000..ffa3a18353544460ba8865afca8948c9eb81c08a
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-sort.js
@@ -0,0 +1,12 @@
+d3_selectionPrototype.sort = function(comparator) {
+  comparator = d3_selection_sortComparator.apply(this, arguments);
+  for (var j = -1, m = this.length; ++j < m;) this[j].sort(comparator);
+  return this.order();
+};
+
+function d3_selection_sortComparator(comparator) {
+  if (!arguments.length) comparator = d3.ascending;
+  return function(a, b) {
+    return (!a - !b) || comparator(a.__data__, b.__data__);
+  };
+}
diff --git a/static/demo/components/d3/src/core/selection-style.js b/static/demo/components/d3/src/core/selection-style.js
new file mode 100644
index 0000000000000000000000000000000000000000..f7eabd1c75a5bc601d633b51a2e84eee10b912d2
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-style.js
@@ -0,0 +1,53 @@
+d3_selectionPrototype.style = function(name, value, priority) {
+  var n = arguments.length;
+  if (n < 3) {
+
+    // For style(object) or style(object, string), the object specifies the
+    // names and values of the attributes to set or remove. The values may be
+    // functions that are evaluated for each element. The optional string
+    // specifies the priority.
+    if (typeof name !== "string") {
+      if (n < 2) value = "";
+      for (priority in name) this.each(d3_selection_style(priority, name[priority], value));
+      return this;
+    }
+
+    // For style(string), return the computed style value for the first node.
+    if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);
+
+    // For style(string, string) or style(string, function), use the default
+    // priority. The priority is ignored for style(string, null).
+    priority = "";
+  }
+
+  // Otherwise, a name, value and priority are specified, and handled as below.
+  return this.each(d3_selection_style(name, value, priority));
+};
+
+function d3_selection_style(name, value, priority) {
+
+  // For style(name, null) or style(name, null, priority), remove the style
+  // property with the specified name. The priority is ignored.
+  function styleNull() {
+    this.style.removeProperty(name);
+  }
+
+  // For style(name, string) or style(name, string, priority), set the style
+  // property with the specified name, using the specified priority.
+  function styleConstant() {
+    this.style.setProperty(name, value, priority);
+  }
+
+  // For style(name, function) or style(name, function, priority), evaluate the
+  // function for each element, and set or remove the style property as
+  // appropriate. When setting, use the specified priority.
+  function styleFunction() {
+    var x = value.apply(this, arguments);
+    if (x == null) this.style.removeProperty(name);
+    else this.style.setProperty(name, x, priority);
+  }
+
+  return value == null
+      ? styleNull : (typeof value === "function"
+      ? styleFunction : styleConstant);
+}
diff --git a/static/demo/components/d3/src/core/selection-text.js b/static/demo/components/d3/src/core/selection-text.js
new file mode 100644
index 0000000000000000000000000000000000000000..8371dcd0c8baddd19314ccdc994981be82b5107d
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-text.js
@@ -0,0 +1,8 @@
+d3_selectionPrototype.text = function(value) {
+  return arguments.length
+      ? this.each(typeof value === "function"
+      ? function() { var v = value.apply(this, arguments); this.textContent = v == null ? "" : v; } : value == null
+      ? function() { this.textContent = ""; }
+      : function() { this.textContent = value; })
+      : this.node().textContent;
+};
diff --git a/static/demo/components/d3/src/core/selection-transition.js b/static/demo/components/d3/src/core/selection-transition.js
new file mode 100644
index 0000000000000000000000000000000000000000..43bdbc8edc0682a81cba2b09b428339c4f18c997
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection-transition.js
@@ -0,0 +1,19 @@
+d3_selectionPrototype.transition = function() {
+  var id = d3_transitionInheritId || ++d3_transitionId,
+      subgroups = [],
+      subgroup,
+      node,
+      transition = Object.create(d3_transitionInherit);
+
+  transition.time = Date.now();
+
+  for (var j = -1, m = this.length; ++j < m;) {
+    subgroups.push(subgroup = []);
+    for (var group = this[j], i = -1, n = group.length; ++i < n;) {
+      if (node = group[i]) d3_transitionNode(node, i, id, transition);
+      subgroup.push(node);
+    }
+  }
+
+  return d3_transition(subgroups, id);
+};
diff --git a/static/demo/components/d3/src/core/selection.js b/static/demo/components/d3/src/core/selection.js
new file mode 100644
index 0000000000000000000000000000000000000000..fd5a066fa1ed14c1c508357fef9ab50d10feb89d
--- /dev/null
+++ b/static/demo/components/d3/src/core/selection.js
@@ -0,0 +1,25 @@
+function d3_selection(groups) {
+  d3_arraySubclass(groups, d3_selectionPrototype);
+  return groups;
+}
+
+var d3_select = function(s, n) { return n.querySelector(s); },
+    d3_selectAll = function(s, n) { return n.querySelectorAll(s); },
+    d3_selectRoot = d3_document.documentElement,
+    d3_selectMatcher = d3_selectRoot.matchesSelector || d3_selectRoot.webkitMatchesSelector || d3_selectRoot.mozMatchesSelector || d3_selectRoot.msMatchesSelector || d3_selectRoot.oMatchesSelector,
+    d3_selectMatches = function(n, s) { return d3_selectMatcher.call(n, s); };
+
+// Prefer Sizzle, if available.
+if (typeof Sizzle === "function") {
+  d3_select = function(s, n) { return Sizzle(s, n)[0] || null; };
+  d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); };
+  d3_selectMatches = Sizzle.matchesSelector;
+}
+
+var d3_selectionPrototype = [];
+
+d3.selection = function() {
+  return d3_selectionRoot;
+};
+
+d3.selection.prototype = d3_selectionPrototype;
diff --git a/static/demo/components/d3/src/core/shuffle.js b/static/demo/components/d3/src/core/shuffle.js
new file mode 100644
index 0000000000000000000000000000000000000000..3369f76bc338f94d939eb510668f8677f4ed14ff
--- /dev/null
+++ b/static/demo/components/d3/src/core/shuffle.js
@@ -0,0 +1,8 @@
+d3.shuffle = function(array) {
+  var m = array.length, t, i;
+  while (m) {
+    i = Math.random() * m-- | 0;
+    t = array[m], array[m] = array[i], array[i] = t;
+  }
+  return array;
+};
diff --git a/static/demo/components/d3/src/core/sum.js b/static/demo/components/d3/src/core/sum.js
new file mode 100644
index 0000000000000000000000000000000000000000..b9af6e8a78328833c907add5e05fe896209f2a7f
--- /dev/null
+++ b/static/demo/components/d3/src/core/sum.js
@@ -0,0 +1,14 @@
+d3.sum = function(array, f) {
+  var s = 0,
+      n = array.length,
+      a,
+      i = -1;
+
+  if (arguments.length === 1) {
+    while (++i < n) if (!isNaN(a = +array[i])) s += a;
+  } else {
+    while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a;
+  }
+
+  return s;
+};
diff --git a/static/demo/components/d3/src/core/text.js b/static/demo/components/d3/src/core/text.js
new file mode 100644
index 0000000000000000000000000000000000000000..55fe08ca2f8399c1063d326789f825da561ee2cf
--- /dev/null
+++ b/static/demo/components/d3/src/core/text.js
@@ -0,0 +1,7 @@
+d3.text = function() {
+  return d3.xhr.apply(d3, arguments).response(d3_text);
+};
+
+function d3_text(request) {
+  return request.responseText;
+}
diff --git a/static/demo/components/d3/src/core/timer.js b/static/demo/components/d3/src/core/timer.js
new file mode 100644
index 0000000000000000000000000000000000000000..a91fcc473d801c11bf1a8b3a5933f75f1addcfeb
--- /dev/null
+++ b/static/demo/components/d3/src/core/timer.js
@@ -0,0 +1,98 @@
+var d3_timer_id = 0,
+    d3_timer_byId = {},
+    d3_timer_queue = null,
+    d3_timer_interval, // is an interval (or frame) active?
+    d3_timer_timeout; // is a timeout active?
+
+// The timer will continue to fire until callback returns true.
+d3.timer = function(callback, delay, then) {
+  if (arguments.length < 3) {
+    if (arguments.length < 2) delay = 0;
+    else if (!isFinite(delay)) return;
+    then = Date.now();
+  }
+
+  // If the callback's already in the queue, update it.
+  var timer = d3_timer_byId[callback.id];
+  if (timer && timer.callback === callback) {
+    timer.then = then;
+    timer.delay = delay;
+  }
+
+  // Otherwise, add the callback to the queue.
+  else d3_timer_byId[callback.id = ++d3_timer_id] = d3_timer_queue = {
+    callback: callback,
+    then: then,
+    delay: delay,
+    next: d3_timer_queue
+  };
+
+  // Start animatin'!
+  if (!d3_timer_interval) {
+    d3_timer_timeout = clearTimeout(d3_timer_timeout);
+    d3_timer_interval = 1;
+    d3_timer_frame(d3_timer_step);
+  }
+};
+
+function d3_timer_step() {
+  var elapsed,
+      now = Date.now(),
+      t1 = d3_timer_queue;
+
+  while (t1) {
+    elapsed = now - t1.then;
+    if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed);
+    t1 = t1.next;
+  }
+
+  var delay = d3_timer_flush() - now;
+  if (delay > 24) {
+    if (isFinite(delay)) {
+      clearTimeout(d3_timer_timeout);
+      d3_timer_timeout = setTimeout(d3_timer_step, delay);
+    }
+    d3_timer_interval = 0;
+  } else {
+    d3_timer_interval = 1;
+    d3_timer_frame(d3_timer_step);
+  }
+}
+
+d3.timer.flush = function() {
+  var elapsed,
+      now = Date.now(),
+      t1 = d3_timer_queue;
+
+  while (t1) {
+    elapsed = now - t1.then;
+    if (!t1.delay) t1.flush = t1.callback(elapsed);
+    t1 = t1.next;
+  }
+
+  d3_timer_flush();
+};
+
+// Flush after callbacks to avoid concurrent queue modification.
+function d3_timer_flush() {
+  var t0 = null,
+      t1 = d3_timer_queue,
+      then = Infinity;
+  while (t1) {
+    if (t1.flush) {
+      delete d3_timer_byId[t1.callback.id];
+      t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next;
+    } else {
+      then = Math.min(then, t1.then + t1.delay);
+      t1 = (t0 = t1).next;
+    }
+  }
+  return then;
+}
+
+var d3_timer_frame = d3_window.requestAnimationFrame
+    || d3_window.webkitRequestAnimationFrame
+    || d3_window.mozRequestAnimationFrame
+    || d3_window.oRequestAnimationFrame
+    || d3_window.msRequestAnimationFrame
+    || function(callback) { setTimeout(callback, 17); };
diff --git a/static/demo/components/d3/src/core/touches.js b/static/demo/components/d3/src/core/touches.js
new file mode 100644
index 0000000000000000000000000000000000000000..2323754214ffb2ae2dc82d5f0781b647e1ba461d
--- /dev/null
+++ b/static/demo/components/d3/src/core/touches.js
@@ -0,0 +1,8 @@
+d3.touches = function(container, touches) {
+  if (arguments.length < 2) touches = d3_eventSource().touches;
+  return touches ? d3_array(touches).map(function(touch) {
+    var point = d3_mousePoint(container, touch);
+    point.identifier = touch.identifier;
+    return point;
+  }) : [];
+};
diff --git a/static/demo/components/d3/src/core/transform.js b/static/demo/components/d3/src/core/transform.js
new file mode 100644
index 0000000000000000000000000000000000000000..8ab347d70dbd0bf74d73d02ccfe5d79d4a97f6bc
--- /dev/null
+++ b/static/demo/components/d3/src/core/transform.js
@@ -0,0 +1,59 @@
+d3.transform = function(string) {
+  var g = d3_document.createElementNS(d3.ns.prefix.svg, "g");
+  return (d3.transform = function(string) {
+    g.setAttribute("transform", string);
+    var t = g.transform.baseVal.consolidate();
+    return new d3_transform(t ? t.matrix : d3_transformIdentity);
+  })(string);
+};
+
+// Compute x-scale and normalize the first row.
+// Compute shear and make second row orthogonal to first.
+// Compute y-scale and normalize the second row.
+// Finally, compute the rotation.
+function d3_transform(m) {
+  var r0 = [m.a, m.b],
+      r1 = [m.c, m.d],
+      kx = d3_transformNormalize(r0),
+      kz = d3_transformDot(r0, r1),
+      ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
+  if (r0[0] * r1[1] < r1[0] * r0[1]) {
+    r0[0] *= -1;
+    r0[1] *= -1;
+    kx *= -1;
+    kz *= -1;
+  }
+  this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;
+  this.translate = [m.e, m.f];
+  this.scale = [kx, ky];
+  this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;
+};
+
+d3_transform.prototype.toString = function() {
+  return "translate(" + this.translate
+      + ")rotate(" + this.rotate
+      + ")skewX(" + this.skew
+      + ")scale(" + this.scale
+      + ")";
+};
+
+function d3_transformDot(a, b) {
+  return a[0] * b[0] + a[1] * b[1];
+}
+
+function d3_transformNormalize(a) {
+  var k = Math.sqrt(d3_transformDot(a, a));
+  if (k) {
+    a[0] /= k;
+    a[1] /= k;
+  }
+  return k;
+}
+
+function d3_transformCombine(a, b, k) {
+  a[0] += k * b[0];
+  a[1] += k * b[1];
+  return a;
+}
+
+var d3_transformIdentity = {a: 1, b: 0, c: 0, d: 1, e: 0, f: 0};
diff --git a/static/demo/components/d3/src/core/transition-attr.js b/static/demo/components/d3/src/core/transition-attr.js
new file mode 100644
index 0000000000000000000000000000000000000000..e0cfd66f6b471b7a9746487703030619865342c6
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-attr.js
@@ -0,0 +1,53 @@
+d3_transitionPrototype.attr = function(nameNS, value) {
+  if (arguments.length < 2) {
+
+    // For attr(object), the object specifies the names and values of the
+    // attributes to transition. The values may be functions that are
+    // evaluated for each element.
+    for (value in nameNS) this.attr(value, nameNS[value]);
+    return this;
+  }
+
+  var interpolate = d3_interpolateByName(nameNS),
+      name = d3.ns.qualify(nameNS);
+
+  // For attr(string, null), remove the attribute with the specified name.
+  function attrNull() {
+    this.removeAttribute(name);
+  }
+  function attrNullNS() {
+    this.removeAttributeNS(name.space, name.local);
+  }
+
+  return d3_transition_tween(this, "attr." + nameNS, value, function(b) {
+
+    // For attr(string, string), set the attribute with the specified name.
+    function attrString() {
+      var a = this.getAttribute(name), i;
+      return a !== b && (i = interpolate(a, b), function(t) { this.setAttribute(name, i(t)); });
+    }
+    function attrStringNS() {
+      var a = this.getAttributeNS(name.space, name.local), i;
+      return a !== b && (i = interpolate(a, b), function(t) { this.setAttributeNS(name.space, name.local, i(t)); });
+    }
+
+    return b == null ? (name.local ? attrNullNS : attrNull)
+        : (b += "", name.local ? attrStringNS : attrString);
+  });
+};
+
+d3_transitionPrototype.attrTween = function(nameNS, tween) {
+  var name = d3.ns.qualify(nameNS);
+
+  function attrTween(d, i) {
+    var f = tween.call(this, d, i, this.getAttribute(name));
+    return f && function(t) { this.setAttribute(name, f(t)); };
+  }
+
+  function attrTweenNS(d, i) {
+    var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
+    return f && function(t) { this.setAttributeNS(name.space, name.local, f(t)); };
+  }
+
+  return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
+};
diff --git a/static/demo/components/d3/src/core/transition-delay.js b/static/demo/components/d3/src/core/transition-delay.js
new file mode 100644
index 0000000000000000000000000000000000000000..2fd2e17606b32895e1e682d5b1e62b95872aada0
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-delay.js
@@ -0,0 +1,6 @@
+d3_transitionPrototype.delay = function(value) {
+  var id = this.id;
+  return d3_selection_each(this, typeof value === "function"
+      ? function(node, i, j) { node.__transition__[id].delay = value.call(node, node.__data__, i, j) | 0; }
+      : (value |= 0, function(node) { node.__transition__[id].delay = value; }));
+};
diff --git a/static/demo/components/d3/src/core/transition-duration.js b/static/demo/components/d3/src/core/transition-duration.js
new file mode 100644
index 0000000000000000000000000000000000000000..a1681e9547590bfdb4dcb9975cc9dfd2e702b1a5
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-duration.js
@@ -0,0 +1,6 @@
+d3_transitionPrototype.duration = function(value) {
+  var id = this.id;
+  return d3_selection_each(this, typeof value === "function"
+      ? function(node, i, j) { node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j) | 0); }
+      : (value = Math.max(1, value | 0), function(node) { node.__transition__[id].duration = value; }));
+};
diff --git a/static/demo/components/d3/src/core/transition-each.js b/static/demo/components/d3/src/core/transition-each.js
new file mode 100644
index 0000000000000000000000000000000000000000..8119b9dcffef38c872b3a13987adc7e892893604
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-each.js
@@ -0,0 +1,19 @@
+d3_transitionPrototype.each = function(type, listener) {
+  var id = this.id;
+  if (arguments.length < 2) {
+    var inherit = d3_transitionInherit,
+        inheritId = d3_transitionInheritId;
+    d3_transitionInheritId = id;
+    d3_selection_each(this, function(node, i, j) {
+      d3_transitionInherit = node.__transition__[id];
+      type.call(node, node.__data__, i, j);
+    });
+    d3_transitionInherit = inherit;
+    d3_transitionInheritId = inheritId;
+  } else {
+    d3_selection_each(this, function(node) {
+      node.__transition__[id].event.on(type, listener);
+    });
+  }
+  return this;
+};
diff --git a/static/demo/components/d3/src/core/transition-ease.js b/static/demo/components/d3/src/core/transition-ease.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a8dec6395af649eecc4aee695ec666b4d57a616
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-ease.js
@@ -0,0 +1,6 @@
+d3_transitionPrototype.ease = function(value) {
+  var id = this.id;
+  if (arguments.length < 1) return this.node().__transition__[id].ease;
+  if (typeof value !== "function") value = d3.ease.apply(d3, arguments);
+  return d3_selection_each(this, function(node) { node.__transition__[id].ease = value; });
+};
diff --git a/static/demo/components/d3/src/core/transition-filter.js b/static/demo/components/d3/src/core/transition-filter.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8d0b16a6136aed6621b9ee98e7a19d035df8b16
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-filter.js
@@ -0,0 +1,19 @@
+d3_transitionPrototype.filter = function(filter) {
+  var subgroups = [],
+      subgroup,
+      group,
+      node;
+
+  if (typeof filter !== "function") filter = d3_selection_filter(filter);
+
+  for (var j = 0, m = this.length; j < m; j++) {
+    subgroups.push(subgroup = []);
+    for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+      if ((node = group[i]) && filter.call(node, node.__data__, i)) {
+        subgroup.push(node);
+      }
+    }
+  }
+
+  return d3_transition(subgroups, this.id, this.time).ease(this.ease());
+};
diff --git a/static/demo/components/d3/src/core/transition-remove.js b/static/demo/components/d3/src/core/transition-remove.js
new file mode 100644
index 0000000000000000000000000000000000000000..35a87e8ef9a0fb58bd993cf6c94c2f5a0edd49b3
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-remove.js
@@ -0,0 +1,6 @@
+d3_transitionPrototype.remove = function() {
+  return this.each("end.transition", function() {
+    var p;
+    if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this);
+  });
+};
diff --git a/static/demo/components/d3/src/core/transition-select.js b/static/demo/components/d3/src/core/transition-select.js
new file mode 100644
index 0000000000000000000000000000000000000000..b43e19131dfbe97d5f58d1e9c3b007a055577aac
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-select.js
@@ -0,0 +1,24 @@
+d3_transitionPrototype.select = function(selector) {
+  var id = this.id,
+      subgroups = [],
+      subgroup,
+      subnode,
+      node;
+
+  if (typeof selector !== "function") selector = d3_selection_selector(selector);
+
+  for (var j = -1, m = this.length; ++j < m;) {
+    subgroups.push(subgroup = []);
+    for (var group = this[j], i = -1, n = group.length; ++i < n;) {
+      if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i))) {
+        if ("__data__" in node) subnode.__data__ = node.__data__;
+        d3_transitionNode(subnode, i, id, node.__transition__[id]);
+        subgroup.push(subnode);
+      } else {
+        subgroup.push(null);
+      }
+    }
+  }
+
+  return d3_transition(subgroups, id);
+};
diff --git a/static/demo/components/d3/src/core/transition-selectAll.js b/static/demo/components/d3/src/core/transition-selectAll.js
new file mode 100644
index 0000000000000000000000000000000000000000..cfb7f84733698bd51d3ca7f7f20cd57a6adc9290
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-selectAll.js
@@ -0,0 +1,27 @@
+d3_transitionPrototype.selectAll = function(selector) {
+  var id = this.id,
+      subgroups = [],
+      subgroup,
+      subnodes,
+      node,
+      subnode,
+      transition;
+
+  if (typeof selector !== "function") selector = d3_selection_selectorAll(selector);
+
+  for (var j = -1, m = this.length; ++j < m;) {
+    for (var group = this[j], i = -1, n = group.length; ++i < n;) {
+      if (node = group[i]) {
+        transition = node.__transition__[id];
+        subnodes = selector.call(node, node.__data__, i);
+        subgroups.push(subgroup = []);
+        for (var k = -1, o = subnodes.length; ++k < o;) {
+          d3_transitionNode(subnode = subnodes[k], k, id, transition);
+          subgroup.push(subnode);
+        }
+      }
+    }
+  }
+
+  return d3_transition(subgroups, id);
+};
diff --git a/static/demo/components/d3/src/core/transition-style.js b/static/demo/components/d3/src/core/transition-style.js
new file mode 100644
index 0000000000000000000000000000000000000000..34b60cac0b4e714c0508cf429c69309a3e2138d3
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-style.js
@@ -0,0 +1,49 @@
+d3_transitionPrototype.style = function(name, value, priority) {
+  var n = arguments.length;
+  if (n < 3) {
+
+    // For style(object) or style(object, string), the object specifies the
+    // names and values of the attributes to set or remove. The values may be
+    // functions that are evaluated for each element. The optional string
+    // specifies the priority.
+    if (typeof name !== "string") {
+      if (n < 2) value = "";
+      for (priority in name) this.style(priority, name[priority], value);
+      return this;
+    }
+
+    // For style(string, string) or style(string, function), use the default
+    // priority. The priority is ignored for style(string, null).
+    priority = "";
+  }
+
+  var interpolate = d3_interpolateByName(name);
+
+  // For style(name, null) or style(name, null, priority), remove the style
+  // property with the specified name. The priority is ignored.
+  function styleNull() {
+    this.style.removeProperty(name);
+  }
+
+  // Otherwise, a name, value and priority are specified, and handled as below.
+  return d3_transition_tween(this, "style." + name, value, function(b) {
+
+    // For style(name, string) or style(name, string, priority), set the style
+    // property with the specified name, using the specified priority.
+    function styleString() {
+      var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;
+      return a !== b && (i = interpolate(a, b), function(t) { this.style.setProperty(name, i(t), priority); });
+    }
+
+    return b == null ? styleNull
+        : (b += "", styleString);
+  });
+};
+
+d3_transitionPrototype.styleTween = function(name, tween, priority) {
+  if (arguments.length < 3) priority = "";
+  return this.tween("style." + name, function(d, i) {
+    var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));
+    return f && function(t) { this.style.setProperty(name, f(t), priority); };
+  });
+};
diff --git a/static/demo/components/d3/src/core/transition-text.js b/static/demo/components/d3/src/core/transition-text.js
new file mode 100644
index 0000000000000000000000000000000000000000..62235a1e2a90f57fd1ead8e992ecad6518d1b8f8
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-text.js
@@ -0,0 +1,8 @@
+d3_transitionPrototype.text = function(value) {
+  return d3_transition_tween(this, "text", value, d3_transition_text);
+};
+
+function d3_transition_text(b) {
+  if (b == null) b = "";
+  return function() { this.textContent = b; };
+}
diff --git a/static/demo/components/d3/src/core/transition-transition.js b/static/demo/components/d3/src/core/transition-transition.js
new file mode 100644
index 0000000000000000000000000000000000000000..72168bce6006c85cb981e1c264f3a9e559d42fd7
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-transition.js
@@ -0,0 +1,23 @@
+d3_transitionPrototype.transition = function() {
+  var id0 = this.id,
+      id1 = ++d3_transitionId,
+      subgroups = [],
+      subgroup,
+      group,
+      node,
+      transition;
+
+  for (var j = 0, m = this.length; j < m; j++) {
+    subgroups.push(subgroup = []);
+    for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+      if (node = group[i]) {
+        transition = Object.create(node.__transition__[id0]);
+        transition.delay += transition.duration;
+        d3_transitionNode(node, i, id1, transition);
+      }
+      subgroup.push(node);
+    }
+  }
+
+  return d3_transition(subgroups, id1);
+};
diff --git a/static/demo/components/d3/src/core/transition-tween.js b/static/demo/components/d3/src/core/transition-tween.js
new file mode 100644
index 0000000000000000000000000000000000000000..0e599b2f413e1871de83fb9eec81da97fdf88fc8
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition-tween.js
@@ -0,0 +1,14 @@
+d3_transitionPrototype.tween = function(name, tween) {
+  var id = this.id;
+  if (arguments.length < 2) return this.node().__transition__[id].tween.get(name);
+  return d3_selection_each(this, tween == null
+        ? function(node) { node.__transition__[id].tween.remove(name); }
+        : function(node) { node.__transition__[id].tween.set(name, tween); });
+};
+
+function d3_transition_tween(groups, name, value, tween) {
+  var id = groups.id;
+  return d3_selection_each(groups, typeof value === "function"
+      ? function(node, i, j) { node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j))); }
+      : (value = tween(value), function(node) { node.__transition__[id].tween.set(name, value); }));
+}
diff --git a/static/demo/components/d3/src/core/transition.js b/static/demo/components/d3/src/core/transition.js
new file mode 100644
index 0000000000000000000000000000000000000000..14ef50fcc39e2a59606479268a62694a82da64b6
--- /dev/null
+++ b/static/demo/components/d3/src/core/transition.js
@@ -0,0 +1,98 @@
+function d3_transition(groups, id) {
+  d3_arraySubclass(groups, d3_transitionPrototype);
+
+  groups.id = id; // Note: read-only!
+
+  return groups;
+}
+
+var d3_transitionPrototype = [],
+    d3_transitionId = 0,
+    d3_transitionInheritId,
+    d3_transitionInherit = {ease: d3_ease_cubicInOut, delay: 0, duration: 250};
+
+d3_transitionPrototype.call = d3_selectionPrototype.call;
+d3_transitionPrototype.empty = d3_selectionPrototype.empty;
+d3_transitionPrototype.node = d3_selectionPrototype.node;
+
+d3.transition = function(selection) {
+  return arguments.length
+      ? (d3_transitionInheritId ? selection.transition() : selection)
+      : d3_selectionRoot.transition();
+};
+
+d3.transition.prototype = d3_transitionPrototype;
+
+function d3_transitionNode(node, i, id, inherit) {
+  var lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}),
+      transition = lock[id];
+
+  if (!transition) {
+    var time = inherit.time;
+
+    transition = lock[id] = {
+      tween: new d3_Map,
+      event: d3.dispatch("start", "end"), // TODO construct lazily?
+      time: time,
+      ease: inherit.ease,
+      delay: inherit.delay,
+      duration: inherit.duration
+    };
+
+    ++lock.count;
+
+    d3.timer(function(elapsed) {
+      var d = node.__data__,
+          ease = transition.ease,
+          event = transition.event,
+          delay = transition.delay,
+          duration = transition.duration,
+          tweened = [];
+
+      return delay <= elapsed
+          ? start(elapsed)
+          : d3.timer(start, delay, time), 1;
+
+      function start(elapsed) {
+        if (lock.active > id) return stop();
+        lock.active = id;
+        event.start.call(node, d, i);
+
+        transition.tween.forEach(function(key, value) {
+          if (value = value.call(node, d, i)) {
+            tweened.push(value);
+          }
+        });
+
+        if (!tick(elapsed)) d3.timer(tick, 0, time);
+        return 1;
+      }
+
+      function tick(elapsed) {
+        if (lock.active !== id) return stop();
+
+        var t = (elapsed - delay) / duration,
+            e = ease(t),
+            n = tweened.length;
+
+        while (n > 0) {
+          tweened[--n].call(node, e);
+        }
+
+        if (t >= 1) {
+          stop();
+          event.end.call(node, d, i);
+          return 1;
+        }
+      }
+
+      function stop() {
+        if (--lock.count) delete lock[id];
+        else delete node.__transition__;
+        return 1;
+      }
+    }, 0, time);
+
+    return transition;
+  }
+}
diff --git a/static/demo/components/d3/src/core/transpose.js b/static/demo/components/d3/src/core/transpose.js
new file mode 100644
index 0000000000000000000000000000000000000000..8e3a645a8e040621d9c16e982b800ab9265c4970
--- /dev/null
+++ b/static/demo/components/d3/src/core/transpose.js
@@ -0,0 +1,3 @@
+d3.transpose = function(matrix) {
+  return d3.zip.apply(d3, matrix);
+};
diff --git a/static/demo/components/d3/src/core/true.js b/static/demo/components/d3/src/core/true.js
new file mode 100644
index 0000000000000000000000000000000000000000..0900faf20833cec1cb2aae6b17596a0743ead520
--- /dev/null
+++ b/static/demo/components/d3/src/core/true.js
@@ -0,0 +1,3 @@
+function d3_true() {
+  return true;
+}
diff --git a/static/demo/components/d3/src/core/uninterpolate.js b/static/demo/components/d3/src/core/uninterpolate.js
new file mode 100644
index 0000000000000000000000000000000000000000..4337381f8403a625bc86473a2c3f55dc1318a178
--- /dev/null
+++ b/static/demo/components/d3/src/core/uninterpolate.js
@@ -0,0 +1,9 @@
+function d3_uninterpolateNumber(a, b) {
+  b = b - (a = +a) ? 1 / (b - a) : 0;
+  return function(x) { return (x - a) * b; };
+}
+
+function d3_uninterpolateClamp(a, b) {
+  b = b - (a = +a) ? 1 / (b - a) : 0;
+  return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); };
+}
diff --git a/static/demo/components/d3/src/core/values.js b/static/demo/components/d3/src/core/values.js
new file mode 100644
index 0000000000000000000000000000000000000000..299d30433caa314f96d5ff835973fc751d5b4af6
--- /dev/null
+++ b/static/demo/components/d3/src/core/values.js
@@ -0,0 +1,5 @@
+d3.values = function(map) {
+  var values = [];
+  for (var key in map) values.push(map[key]);
+  return values;
+};
diff --git a/static/demo/components/d3/src/core/xhr.js b/static/demo/components/d3/src/core/xhr.js
new file mode 100644
index 0000000000000000000000000000000000000000..b23ea0cca48a73187cfb51fe3719bf31bf646c24
--- /dev/null
+++ b/static/demo/components/d3/src/core/xhr.js
@@ -0,0 +1,82 @@
+d3.xhr = function(url, mimeType, callback) {
+  var xhr = {},
+      dispatch = d3.dispatch("progress", "load", "error"),
+      headers = {},
+      response = d3_identity,
+      request = new (d3_window.XDomainRequest && /^(http(s)?:)?\/\//.test(url) ? XDomainRequest : XMLHttpRequest);
+
+  "onload" in request
+      ? request.onload = request.onerror = respond
+      : request.onreadystatechange = function() { request.readyState > 3 && respond(); };
+
+  function respond() {
+    var s = request.status;
+    !s && request.responseText || s >= 200 && s < 300 || s === 304
+        ? dispatch.load.call(xhr, response.call(xhr, request))
+        : dispatch.error.call(xhr, request);
+  }
+
+  request.onprogress = function(event) {
+    var o = d3.event;
+    d3.event = event;
+    try { dispatch.progress.call(xhr, request); }
+    finally { d3.event = o; }
+  };
+
+  xhr.header = function(name, value) {
+    name = (name + "").toLowerCase();
+    if (arguments.length < 2) return headers[name];
+    if (value == null) delete headers[name];
+    else headers[name] = value + "";
+    return xhr;
+  };
+
+  // If mimeType is non-null and no Accept header is set, a default is used.
+  xhr.mimeType = function(value) {
+    if (!arguments.length) return mimeType;
+    mimeType = value == null ? null : value + "";
+    return xhr;
+  };
+
+  // Specify how to convert the response content to a specific type;
+  // changes the callback value on "load" events.
+  xhr.response = function(value) {
+    response = value;
+    return xhr;
+  };
+
+  // Convenience methods.
+  ["get", "post"].forEach(function(method) {
+    xhr[method] = function() {
+      return xhr.send.apply(xhr, [method].concat(d3_array(arguments)));
+    };
+  });
+
+  // If callback is non-null, it will be used for error and load events.
+  xhr.send = function(method, data, callback) {
+    if (arguments.length === 2 && typeof data === "function") callback = data, data = null;
+    request.open(method, url, true);
+    if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*";
+    if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);
+    if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);
+    if (callback != null) xhr.on("error", callback).on("load", function(request) { callback(null, request); });
+    request.send(data == null ? null : data);
+    return xhr;
+  };
+
+  xhr.abort = function() {
+    request.abort();
+    return xhr;
+  };
+
+  d3.rebind(xhr, dispatch, "on");
+
+  if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, mimeType = null;
+  return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));
+};
+
+function d3_xhr_fixCallback(callback) {
+  return callback.length === 1
+      ? function(error, request) { callback(error == null ? request : null); }
+      : callback;
+}
diff --git a/static/demo/components/d3/src/core/xml.js b/static/demo/components/d3/src/core/xml.js
new file mode 100644
index 0000000000000000000000000000000000000000..ecc2aab33f43bae2e1de6074f1f261aaef4432ba
--- /dev/null
+++ b/static/demo/components/d3/src/core/xml.js
@@ -0,0 +1,7 @@
+d3.xml = function() {
+  return d3.xhr.apply(d3, arguments).response(d3_xml);
+};
+
+function d3_xml(request) {
+  return request.responseXML;
+}
diff --git a/static/demo/components/d3/src/core/xyz.js b/static/demo/components/d3/src/core/xyz.js
new file mode 100644
index 0000000000000000000000000000000000000000..30e79ab412bf0557483eeb8ffe632036f22ab6f7
--- /dev/null
+++ b/static/demo/components/d3/src/core/xyz.js
@@ -0,0 +1,7 @@
+function d3_xyz_lab(x) {
+  return x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;
+}
+
+function d3_xyz_rgb(r) {
+  return Math.round(255 * (r <= 0.00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - 0.055));
+}
diff --git a/static/demo/components/d3/src/core/zip.js b/static/demo/components/d3/src/core/zip.js
new file mode 100644
index 0000000000000000000000000000000000000000..edd65dd9504af1ff93ce27556bf5cf8daf5b8267
--- /dev/null
+++ b/static/demo/components/d3/src/core/zip.js
@@ -0,0 +1,13 @@
+d3.zip = function() {
+  if (!(n = arguments.length)) return [];
+  for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) {
+    for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) {
+      zip[j] = arguments[j][i];
+    }
+  }
+  return zips;
+};
+
+function d3_zipLength(d) {
+  return d.length;
+}
diff --git a/static/demo/components/d3/src/dsv/csv.js b/static/demo/components/d3/src/dsv/csv.js
new file mode 100644
index 0000000000000000000000000000000000000000..f9a99d4778bc479957e4e01d7b5662f53a005983
--- /dev/null
+++ b/static/demo/components/d3/src/dsv/csv.js
@@ -0,0 +1 @@
+d3.csv = d3_dsv(",", "text/csv");
diff --git a/static/demo/components/d3/src/dsv/dsv.js b/static/demo/components/d3/src/dsv/dsv.js
new file mode 100644
index 0000000000000000000000000000000000000000..2df3cc2671c4349dd5a566e72d5527d54d445c92
--- /dev/null
+++ b/static/demo/components/d3/src/dsv/dsv.js
@@ -0,0 +1,97 @@
+function d3_dsv(delimiter, mimeType) {
+  var reFormat = new RegExp("[\"" + delimiter + "\n]"),
+      delimiterCode = delimiter.charCodeAt(0);
+
+  function dsv(url, callback) {
+    return d3.xhr(url, mimeType, callback).response(response);
+  }
+
+  function response(request) {
+    return dsv.parse(request.responseText);
+  }
+
+  dsv.parse = function(text) {
+    var o;
+    return dsv.parseRows(text, function(row) {
+      if (o) return o(row);
+      o = new Function("d", "return {" + row.map(function(name, i) {
+        return JSON.stringify(name) + ": d[" + i + "]";
+      }).join(",") + "}");
+    });
+  };
+
+  dsv.parseRows = function(text, f) {
+    var EOL = {}, // sentinel value for end-of-line
+        EOF = {}, // sentinel value for end-of-file
+        rows = [], // output rows
+        N = text.length,
+        I = 0, // current character index
+        n = 0, // the current line number
+        t, // the current token
+        eol; // is the current token followed by EOL?
+
+    function token() {
+      if (I >= N) return EOF; // special case: end of file
+      if (eol) return eol = false, EOL; // special case: end of line
+
+      // special case: quotes
+      var j = I;
+      if (text.charCodeAt(j) === 34) {
+        var i = j;
+        while (i++ < N) {
+          if (text.charCodeAt(i) === 34) {
+            if (text.charCodeAt(i + 1) !== 34) break;
+            ++i;
+          }
+        }
+        I = i + 2;
+        var c = text.charCodeAt(i + 1);
+        if (c === 13) {
+          eol = true;
+          if (text.charCodeAt(i + 2) === 10) ++I;
+        } else if (c === 10) {
+          eol = true;
+        }
+        return text.substring(j + 1, i).replace(/""/g, "\"");
+      }
+
+      // common case: find next delimiter or newline
+      while (I < N) {
+        var c = text.charCodeAt(I++), k = 1;
+        if (c === 10) eol = true; // \n
+        else if (c === 13) { eol = true; if (text.charCodeAt(I) === 10) ++I, ++k; } // \r|\r\n
+        else if (c !== delimiterCode) continue;
+        return text.substring(j, I - k);
+      }
+
+      // special case: last token before EOF
+      return text.substring(j);
+    }
+
+    while ((t = token()) !== EOF) {
+      var a = [];
+      while (t !== EOL && t !== EOF) {
+        a.push(t);
+        t = token();
+      }
+      if (f && !(a = f(a, n++))) continue;
+      rows.push(a);
+    }
+
+    return rows;
+  };
+
+  dsv.format = function(rows) {
+    return rows.map(formatRow).join("\n");
+  };
+
+  function formatRow(row) {
+    return row.map(formatValue).join(delimiter);
+  }
+
+  function formatValue(text) {
+    return reFormat.test(text) ? "\"" + text.replace(/\"/g, "\"\"") + "\"" : text;
+  }
+
+  return dsv;
+}
diff --git a/static/demo/components/d3/src/dsv/tsv.js b/static/demo/components/d3/src/dsv/tsv.js
new file mode 100644
index 0000000000000000000000000000000000000000..4ad1cf31b35a6b1d7b2a3c37e5904e91aa206437
--- /dev/null
+++ b/static/demo/components/d3/src/dsv/tsv.js
@@ -0,0 +1 @@
+d3.tsv = d3_dsv("\t", "text/tab-separated-values");
diff --git a/static/demo/components/d3/src/end.js b/static/demo/components/d3/src/end.js
new file mode 100644
index 0000000000000000000000000000000000000000..f79afbeabc316228048cda74aa3a018fcd4b7502
--- /dev/null
+++ b/static/demo/components/d3/src/end.js
@@ -0,0 +1 @@
+return d3;})();
diff --git a/static/demo/components/d3/src/geo/albers-usa.js b/static/demo/components/d3/src/geo/albers-usa.js
new file mode 100644
index 0000000000000000000000000000000000000000..a4c14f340b43a5ac93807dda58e29cb0d8fa8405
--- /dev/null
+++ b/static/demo/components/d3/src/geo/albers-usa.js
@@ -0,0 +1,59 @@
+// TODO composite invert
+
+// A composite projection for the United States, 960x500. The set of standard
+// parallels for each region comes from USGS, which is published here:
+// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
+d3.geo.albersUsa = function() {
+  var lower48 = d3.geo.albers();
+
+  var alaska = d3.geo.albers()
+      .rotate([160, 0])
+      .center([0, 60])
+      .parallels([55, 65]);
+
+  var hawaii = d3.geo.albers()
+      .rotate([160, 0])
+      .center([0, 20])
+      .parallels([8, 18]);
+
+  var puertoRico = d3.geo.albers()
+      .rotate([60, 0])
+      .center([0, 10])
+      .parallels([8, 18]);
+
+  function albersUsa(coordinates) {
+    return projection(coordinates)(coordinates);
+  }
+
+  function projection(point) {
+    var lon = point[0],
+        lat = point[1];
+    return lat > 50 ? alaska
+        : lon < -140 ? hawaii
+        : lat < 21 ? puertoRico
+        : lower48;
+  }
+
+  albersUsa.scale = function(x) {
+    if (!arguments.length) return lower48.scale();
+    lower48.scale(x);
+    alaska.scale(x * .6);
+    hawaii.scale(x);
+    puertoRico.scale(x * 1.5);
+    return albersUsa.translate(lower48.translate());
+  };
+
+  albersUsa.translate = function(x) {
+    if (!arguments.length) return lower48.translate();
+    var dz = lower48.scale(),
+        dx = x[0],
+        dy = x[1];
+    lower48.translate(x);
+    alaska.translate([dx - .40 * dz, dy + .17 * dz]);
+    hawaii.translate([dx - .19 * dz, dy + .20 * dz]);
+    puertoRico.translate([dx + .58 * dz, dy + .43 * dz]);
+    return albersUsa;
+  };
+
+  return albersUsa.scale(lower48.scale());
+};
diff --git a/static/demo/components/d3/src/geo/albers.js b/static/demo/components/d3/src/geo/albers.js
new file mode 100644
index 0000000000000000000000000000000000000000..37d305aa31758ab00978b878a5ef6c10668fc8b3
--- /dev/null
+++ b/static/demo/components/d3/src/geo/albers.js
@@ -0,0 +1,38 @@
+function d3_geo_albers(φ0, φ1) {
+  var sinφ0 = Math.sin(φ0),
+      n = (sinφ0 + Math.sin(φ1)) / 2,
+      C = 1 + sinφ0 * (2 * n - sinφ0),
+      ρ0 = Math.sqrt(C) / n;
+
+  function albers(λ, φ) {
+    var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;
+    return [
+      ρ * Math.sin(λ *= n),
+      ρ0 - ρ * Math.cos(λ)
+    ];
+  }
+
+  albers.invert = function(x, y) {
+    var ρ0_y = ρ0 - y;
+    return [
+      Math.atan2(x, ρ0_y) / n,
+      Math.asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n))
+    ];
+  };
+
+  return albers;
+}
+
+(d3.geo.albers = function() {
+  var φ0 = 29.5 * d3_radians,
+      φ1 = 45.5 * d3_radians,
+      m = d3_geo_projectionMutator(d3_geo_albers),
+      p = m(φ0, φ1);
+
+  p.parallels = function(_) {
+    if (!arguments.length) return [φ0 * d3_degrees, φ1 * d3_degrees];
+    return m(φ0 = _[0] * d3_radians, φ1 = _[1] * d3_radians);
+  };
+
+  return p.rotate([98, 0]).center([0, 38]).scale(1000);
+}).raw = d3_geo_albers;
diff --git a/static/demo/components/d3/src/geo/area.js b/static/demo/components/d3/src/geo/area.js
new file mode 100644
index 0000000000000000000000000000000000000000..3cb1ae26499c0a9690232299ea20e7d1bdd51cb1
--- /dev/null
+++ b/static/demo/components/d3/src/geo/area.js
@@ -0,0 +1,66 @@
+d3.geo.area = function(object) {
+  d3_geo_areaSum = 0;
+  d3.geo.stream(object, d3_geo_area);
+  return d3_geo_areaSum;
+};
+
+var d3_geo_areaSum,
+    d3_geo_areaRingU,
+    d3_geo_areaRingV;
+
+var d3_geo_area = {
+  sphere: function() { d3_geo_areaSum += 4 * π; },
+  point: d3_noop,
+  lineStart: d3_noop,
+  lineEnd: d3_noop,
+
+  // Only count area for polygon rings.
+  polygonStart: function() {
+    d3_geo_areaRingU = 1, d3_geo_areaRingV = 0;
+    d3_geo_area.lineStart = d3_geo_areaRingStart;
+  },
+  polygonEnd: function() {
+    var area = 2 * Math.atan2(d3_geo_areaRingV, d3_geo_areaRingU);
+    d3_geo_areaSum += area < 0 ? 4 * π + area : area;
+    d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;
+  }
+};
+
+function d3_geo_areaRingStart() {
+  var λ00, φ00, λ0, cosφ0, sinφ0; // start point and two previous points
+
+  // For the first point, …
+  d3_geo_area.point = function(λ, φ) {
+    d3_geo_area.point = nextPoint;
+    λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), sinφ0 = Math.sin(φ);
+  };
+
+  // For subsequent points, …
+  function nextPoint(λ, φ) {
+    λ *= d3_radians;
+    φ = φ * d3_radians / 2 + π / 4; // half the angular distance from south pole
+
+    // Spherical excess E for a spherical triangle with vertices: south pole,
+    // previous point, current point.  Uses a formula derived from Cagnoli’s
+    // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
+    var dλ = λ - λ0,
+        cosφ = Math.cos(φ),
+        sinφ = Math.sin(φ),
+        k = sinφ0 * sinφ,
+        u0 = d3_geo_areaRingU,
+        v0 = d3_geo_areaRingV,
+        u = cosφ0 * cosφ + k * Math.cos(dλ),
+        v = k * Math.sin(dλ);
+    // ∑ arg(z) = arg(∏ z), where z = u + iv.
+    d3_geo_areaRingU = u0 * u - v0 * v;
+    d3_geo_areaRingV = v0 * u + u0 * v;
+
+    // Advance the previous points.
+    λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;
+  }
+
+  // For the last point, return to the start.
+  d3_geo_area.lineEnd = function() {
+    nextPoint(λ00, φ00);
+  };
+}
diff --git a/static/demo/components/d3/src/geo/azimuthal-equal-area.js b/static/demo/components/d3/src/geo/azimuthal-equal-area.js
new file mode 100644
index 0000000000000000000000000000000000000000..2cda3bb69cbfb441dce71adb44b978b203b8736f
--- /dev/null
+++ b/static/demo/components/d3/src/geo/azimuthal-equal-area.js
@@ -0,0 +1,8 @@
+var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(
+  function(cosλcosφ) { return Math.sqrt(2 / (1 + cosλcosφ)); },
+  function(ρ) { return 2 * Math.asin(ρ / 2); }
+);
+
+(d3.geo.azimuthalEqualArea = function() {
+  return d3_geo_projection(d3_geo_azimuthalEqualArea);
+}).raw = d3_geo_azimuthalEqualArea;
diff --git a/static/demo/components/d3/src/geo/azimuthal-equidistant.js b/static/demo/components/d3/src/geo/azimuthal-equidistant.js
new file mode 100644
index 0000000000000000000000000000000000000000..37eaf2fbda125906d418a5b5ae12fe24bbe941c8
--- /dev/null
+++ b/static/demo/components/d3/src/geo/azimuthal-equidistant.js
@@ -0,0 +1,8 @@
+var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(
+  function(cosλcosφ) { var c = Math.acos(cosλcosφ); return c && c / Math.sin(c); },
+  d3_identity
+);
+
+(d3.geo.azimuthalEquidistant = function() {
+  return d3_geo_projection(d3_geo_azimuthalEquidistant);
+}).raw = d3_geo_azimuthalEquidistant;
diff --git a/static/demo/components/d3/src/geo/azimuthal.js b/static/demo/components/d3/src/geo/azimuthal.js
new file mode 100644
index 0000000000000000000000000000000000000000..5c0d9f5a9d0f81d8bffbcc5da061bbfe4d917c4c
--- /dev/null
+++ b/static/demo/components/d3/src/geo/azimuthal.js
@@ -0,0 +1,25 @@
+// Abstract azimuthal projection.
+function d3_geo_azimuthal(scale, angle) {
+  function azimuthal(λ, φ) {
+    var cosλ = Math.cos(λ),
+        cosφ = Math.cos(φ),
+        k = scale(cosλ * cosφ);
+    return [
+      k * cosφ * Math.sin(λ),
+      k * Math.sin(φ)
+    ];
+  }
+
+  azimuthal.invert = function(x, y) {
+    var ρ = Math.sqrt(x * x + y * y),
+        c = angle(ρ),
+        sinc = Math.sin(c),
+        cosc = Math.cos(c);
+    return [
+      Math.atan2(x * sinc, ρ * cosc),
+      Math.asin(ρ && y * sinc / ρ)
+    ];
+  };
+
+  return azimuthal;
+}
diff --git a/static/demo/components/d3/src/geo/bounds.js b/static/demo/components/d3/src/geo/bounds.js
new file mode 100644
index 0000000000000000000000000000000000000000..fc0c43c1c4f00b0803d859c85dac895bc84bfcbc
--- /dev/null
+++ b/static/demo/components/d3/src/geo/bounds.js
@@ -0,0 +1,32 @@
+d3.geo.bounds = d3_geo_bounds(d3_identity);
+
+function d3_geo_bounds(projectStream) {
+  var x0, y0, x1, y1;
+
+  var bound = {
+    point: boundPoint,
+    lineStart: d3_noop,
+    lineEnd: d3_noop,
+
+    // While inside a polygon, ignore points in holes.
+    polygonStart: function() { bound.lineEnd = boundPolygonLineEnd; },
+    polygonEnd: function() { bound.point = boundPoint; }
+  };
+
+  function boundPoint(x, y) {
+    if (x < x0) x0 = x;
+    if (x > x1) x1 = x;
+    if (y < y0) y0 = y;
+    if (y > y1) y1 = y;
+  }
+
+  function boundPolygonLineEnd() {
+    bound.point = bound.lineEnd = d3_noop;
+  }
+
+  return function(feature) {
+    y1 = x1 = -(x0 = y0 = Infinity);
+    d3.geo.stream(feature, projectStream(bound));
+    return [[x0, y0], [x1, y1]];
+  };
+}
diff --git a/static/demo/components/d3/src/geo/cartesian.js b/static/demo/components/d3/src/geo/cartesian.js
new file mode 100644
index 0000000000000000000000000000000000000000..f365a3dd0814e28500852e23f4649d995bc13445
--- /dev/null
+++ b/static/demo/components/d3/src/geo/cartesian.js
@@ -0,0 +1,47 @@
+// TODO
+// cross and scale return new vectors,
+// whereas add and normalize operate in-place
+
+function d3_geo_cartesian(spherical) {
+  var λ = spherical[0],
+      φ = spherical[1],
+      cosφ = Math.cos(φ);
+  return [
+    cosφ * Math.cos(λ),
+    cosφ * Math.sin(λ),
+    Math.sin(φ)
+  ];
+}
+
+function d3_geo_cartesianDot(a, b) {
+  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+}
+
+function d3_geo_cartesianCross(a, b) {
+  return [
+    a[1] * b[2] - a[2] * b[1],
+    a[2] * b[0] - a[0] * b[2],
+    a[0] * b[1] - a[1] * b[0]
+  ];
+}
+
+function d3_geo_cartesianAdd(a, b) {
+  a[0] += b[0];
+  a[1] += b[1];
+  a[2] += b[2];
+}
+
+function d3_geo_cartesianScale(vector, k) {
+  return [
+    vector[0] * k,
+    vector[1] * k,
+    vector[2] * k
+  ];
+}
+
+function d3_geo_cartesianNormalize(d) {
+  var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
+  d[0] /= l;
+  d[1] /= l;
+  d[2] /= l;
+}
diff --git a/static/demo/components/d3/src/geo/centroid.js b/static/demo/components/d3/src/geo/centroid.js
new file mode 100644
index 0000000000000000000000000000000000000000..a8e4e6c514fd21d839a37314561c79ed85a914e4
--- /dev/null
+++ b/static/demo/components/d3/src/geo/centroid.js
@@ -0,0 +1,107 @@
+d3.geo.centroid = function(object) {
+  d3_geo_centroidDimension = d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+  d3.geo.stream(object, d3_geo_centroid);
+  var m;
+  if (d3_geo_centroidW &&
+      Math.abs(m = Math.sqrt(d3_geo_centroidX * d3_geo_centroidX + d3_geo_centroidY * d3_geo_centroidY + d3_geo_centroidZ * d3_geo_centroidZ)) > ε) {
+    return [
+      Math.atan2(d3_geo_centroidY, d3_geo_centroidX) * d3_degrees,
+      Math.asin(Math.max(-1, Math.min(1, d3_geo_centroidZ / m))) * d3_degrees
+    ];
+  }
+};
+
+var d3_geo_centroidDimension,
+    d3_geo_centroidW,
+    d3_geo_centroidX,
+    d3_geo_centroidY,
+    d3_geo_centroidZ;
+
+var d3_geo_centroid = {
+  sphere: function() {
+    if (d3_geo_centroidDimension < 2) {
+      d3_geo_centroidDimension = 2;
+      d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+    }
+  },
+  point: d3_geo_centroidPoint,
+  lineStart: d3_geo_centroidLineStart,
+  lineEnd: d3_geo_centroidLineEnd,
+  polygonStart: function() {
+    if (d3_geo_centroidDimension < 2) {
+      d3_geo_centroidDimension = 2;
+      d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+    }
+    d3_geo_centroid.lineStart = d3_geo_centroidRingStart;
+  },
+  polygonEnd: function() {
+    d3_geo_centroid.lineStart = d3_geo_centroidLineStart;
+  }
+};
+
+// Arithmetic mean of Cartesian vectors.
+function d3_geo_centroidPoint(λ, φ) {
+  if (d3_geo_centroidDimension) return;
+  ++d3_geo_centroidW;
+  λ *= d3_radians;
+  var cosφ = Math.cos(φ *= d3_radians);
+  d3_geo_centroidX += (cosφ * Math.cos(λ) - d3_geo_centroidX) / d3_geo_centroidW;
+  d3_geo_centroidY += (cosφ * Math.sin(λ) - d3_geo_centroidY) / d3_geo_centroidW;
+  d3_geo_centroidZ += (Math.sin(φ) - d3_geo_centroidZ) / d3_geo_centroidW;
+}
+
+function d3_geo_centroidRingStart() {
+  var λ00, φ00; // first point
+
+  d3_geo_centroidDimension = 1;
+  d3_geo_centroidLineStart();
+  d3_geo_centroidDimension = 2;
+
+  var linePoint = d3_geo_centroid.point;
+  d3_geo_centroid.point = function(λ, φ) {
+    linePoint(λ00 = λ, φ00 = φ);
+  };
+  d3_geo_centroid.lineEnd = function() {
+    d3_geo_centroid.point(λ00, φ00);
+    d3_geo_centroidLineEnd();
+    d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;
+  };
+}
+
+function d3_geo_centroidLineStart() {
+  var x0, y0, z0; // previous point
+
+  if (d3_geo_centroidDimension > 1) return;
+  if (d3_geo_centroidDimension < 1) {
+    d3_geo_centroidDimension = 1;
+    d3_geo_centroidW = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+  }
+
+  d3_geo_centroid.point = function(λ, φ) {
+    λ *= d3_radians;
+    var cosφ = Math.cos(φ *= d3_radians);
+    x0 = cosφ * Math.cos(λ);
+    y0 = cosφ * Math.sin(λ);
+    z0 = Math.sin(φ);
+    d3_geo_centroid.point = nextPoint;
+  };
+
+  function nextPoint(λ, φ) {
+    λ *= d3_radians;
+    var cosφ = Math.cos(φ *= d3_radians),
+        x = cosφ * Math.cos(λ),
+        y = cosφ * Math.sin(λ),
+        z = Math.sin(φ),
+        w = Math.atan2(
+          Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w),
+          x0 * x + y0 * y + z0 * z);
+    d3_geo_centroidW += w;
+    d3_geo_centroidX += w * (x0 + (x0 = x));
+    d3_geo_centroidY += w * (y0 + (y0 = y));
+    d3_geo_centroidZ += w * (z0 + (z0 = z));
+  }
+}
+
+function d3_geo_centroidLineEnd() {
+  d3_geo_centroid.point = d3_geo_centroidPoint;
+}
diff --git a/static/demo/components/d3/src/geo/circle.js b/static/demo/components/d3/src/geo/circle.js
new file mode 100644
index 0000000000000000000000000000000000000000..e136846e16bdc2e865cb6cfe5640a5eae80dc09d
--- /dev/null
+++ b/static/demo/components/d3/src/geo/circle.js
@@ -0,0 +1,75 @@
+d3.geo.circle = function() {
+  var origin = [0, 0],
+      angle,
+      precision = 6,
+      interpolate;
+
+  function circle() {
+    var center = typeof origin === "function" ? origin.apply(this, arguments) : origin,
+        rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert,
+        ring = [];
+
+    interpolate(null, null, 1, {
+      point: function(x, y) {
+        ring.push(x = rotate(x, y));
+        x[0] *= d3_degrees, x[1] *= d3_degrees;
+      }
+    });
+
+    return {type: "Polygon", coordinates: [ring]};
+  }
+
+  circle.origin = function(x) {
+    if (!arguments.length) return origin;
+    origin = x;
+    return circle;
+  };
+
+  circle.angle = function(x) {
+    if (!arguments.length) return angle;
+    interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);
+    return circle;
+  };
+
+  circle.precision = function(_) {
+    if (!arguments.length) return precision;
+    interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);
+    return circle;
+  };
+
+  return circle.angle(90);
+};
+
+// Interpolates along a circle centered at [0°, 0°], with a given radius and
+// precision.
+function d3_geo_circleInterpolate(radians, precision) {
+  var cr = Math.cos(radians),
+      sr = Math.sin(radians);
+  return function(from, to, direction, listener) {
+    if (from != null) {
+      from = d3_geo_circleAngle(cr, from);
+      to = d3_geo_circleAngle(cr, to);
+      if (direction > 0 ? from < to: from > to) from += direction * 2 * π;
+    } else {
+      from = radians + direction * 2 * π;
+      to = radians;
+    }
+    var point;
+    for (var step = direction * precision, t = from; direction > 0 ? t > to : t < to; t -= step) {
+      listener.point((point = d3_geo_spherical([
+        cr,
+        -sr * Math.cos(t),
+        -sr * Math.sin(t)
+      ]))[0], point[1]);
+    }
+  };
+}
+
+// Signed angle of a cartesian point relative to [cr, 0, 0].
+function d3_geo_circleAngle(cr, point) {
+  var a = d3_geo_cartesian(point);
+  a[0] -= cr;
+  d3_geo_cartesianNormalize(a);
+  var angle = Math.acos(Math.max(-1, Math.min(1, -a[1])));
+  return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);
+}
diff --git a/static/demo/components/d3/src/geo/clip-antimeridian.js b/static/demo/components/d3/src/geo/clip-antimeridian.js
new file mode 100644
index 0000000000000000000000000000000000000000..1f8db4bbdfe854650b5c7b928e6d40fd858d7b8a
--- /dev/null
+++ b/static/demo/components/d3/src/geo/clip-antimeridian.js
@@ -0,0 +1,86 @@
+var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate);
+
+// Takes a line and cuts into visible segments. Return values:
+//   0: there were intersections or the line was empty.
+//   1: no intersections.
+//   2: there were intersections, and the first and last segments should be
+//      rejoined.
+function d3_geo_clipAntimeridianLine(listener) {
+  var λ0 = NaN,
+      φ0 = NaN,
+      sλ0 = NaN,
+      clean; // no intersections
+
+  return {
+    lineStart: function() {
+      listener.lineStart();
+      clean = 1;
+    },
+    point: function(λ1, φ1) {
+      var sλ1 = λ1 > 0 ? π : -π,
+          dλ = Math.abs(λ1 - λ0);
+      if (Math.abs(dλ - π) < ε) { // line crosses a pole
+        listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? π / 2 : -π / 2);
+        listener.point(sλ0, φ0);
+        listener.lineEnd();
+        listener.lineStart();
+        listener.point(sλ1, φ0);
+        listener.point( λ1, φ0);
+        clean = 0;
+      } else if (sλ0 !== sλ1 && dλ >= π) { // line crosses antimeridian
+        // handle degeneracies
+        if (Math.abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;
+        if (Math.abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;
+        φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);
+        listener.point(sλ0, φ0);
+        listener.lineEnd();
+        listener.lineStart();
+        listener.point(sλ1, φ0);
+        clean = 0;
+      }
+      listener.point(λ0 = λ1, φ0 = φ1);
+      sλ0 = sλ1;
+    },
+    lineEnd: function() {
+      listener.lineEnd();
+      λ0 = φ0 = NaN;
+    },
+    // if there are intersections, we always rejoin the first and last segments.
+    clean: function() { return 2 - clean; }
+  };
+}
+
+function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
+  var cosφ0,
+      cosφ1,
+      sinλ0_λ1 = Math.sin(λ0 - λ1);
+  return Math.abs(sinλ0_λ1) > ε
+      ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1)
+                 - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0))
+                 / (cosφ0 * cosφ1 * sinλ0_λ1))
+      : (φ0 + φ1) / 2;
+}
+
+function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {
+  var φ;
+  if (from == null) {
+    φ = direction * π / 2;
+    listener.point(-π,  φ);
+    listener.point( 0,  φ);
+    listener.point( π,  φ);
+    listener.point( π,  0);
+    listener.point( π, -φ);
+    listener.point( 0, -φ);
+    listener.point(-π, -φ);
+    listener.point(-Ï€,  0);
+    listener.point(-π,  φ);
+  } else if (Math.abs(from[0] - to[0]) > ε) {
+    var s = (from[0] < to[0] ? 1 : -1) * π;
+    φ = direction * s / 2;
+    listener.point(-s, φ);
+    listener.point( 0, φ);
+    listener.point( s, φ);
+  } else {
+    listener.point(to[0], to[1]);
+  }
+}
diff --git a/static/demo/components/d3/src/geo/clip-circle.js b/static/demo/components/d3/src/geo/clip-circle.js
new file mode 100644
index 0000000000000000000000000000000000000000..bf70af336671f3cbfbadbe625ec2a641cdf420ce
--- /dev/null
+++ b/static/demo/components/d3/src/geo/clip-circle.js
@@ -0,0 +1,101 @@
+// Clip features against a circle centered at [0°, 0°], with a given radius.
+function d3_geo_clipCircle(degrees) {
+  var radians = degrees * d3_radians,
+      cr = Math.cos(radians),
+      interpolate = d3_geo_circleInterpolate(radians, 6 * d3_radians);
+
+  return d3_geo_clip(visible, clipLine, interpolate);
+
+  function visible(λ, φ) {
+    return Math.cos(λ) * Math.cos(φ) > cr;
+  }
+
+  // TODO handle two invisible endpoints with visible intermediate segment.
+  // Takes a line and cuts into visible segments. Return values used for
+  // polygon clipping:
+  //   0: there were intersections or the line was empty.
+  //   1: no intersections.
+  //   2: there were intersections, and the first and last segments should be
+  //      rejoined.
+  function clipLine(listener) {
+    var point0,
+        v0,
+        v00,
+        clean; // no intersections
+    return {
+      lineStart: function() {
+        v00 = v0 = false;
+        clean = 1;
+      },
+      point: function(λ, φ) {
+        var point1 = [λ, φ],
+            point2,
+            v = visible(λ, φ);
+        if (!point0 && (v00 = v0 = v)) listener.lineStart();
+        // handle degeneracies
+        if (v !== v0) {
+          point2 = intersect(point0, point1);
+          if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {
+            point1[0] += ε;
+            point1[1] += ε;
+            v = visible(point1[0], point1[1]);
+          }
+        }
+        if (v !== v0) {
+          clean = 0;
+          if (v0 = v) {
+            // outside going in
+            listener.lineStart();
+            point2 = intersect(point1, point0);
+            listener.point(point2[0], point2[1]);
+          } else {
+            // inside going out
+            point2 = intersect(point0, point1);
+            listener.point(point2[0], point2[1]);
+            listener.lineEnd();
+          }
+          point0 = point2;
+        }
+        if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) listener.point(point1[0], point1[1]);
+        point0 = point1;
+      },
+      lineEnd: function() {
+        if (v0) listener.lineEnd();
+        point0 = null;
+      },
+      // Rejoin first and last segments if there were intersections and the first
+      // and last points were visible.
+      clean: function() { return clean | ((v00 && v0) << 1); }
+    };
+  }
+
+  // Intersects the great circle between a and b with the clip circle.
+  function intersect(a, b) {
+    var pa = d3_geo_cartesian(a, 0),
+        pb = d3_geo_cartesian(b, 0);
+    // We have two planes, n1.p = d1 and n2.p = d2.
+    // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 x n2).
+    var n1 = [1, 0, 0], // normal
+        n2 = d3_geo_cartesianCross(pa, pb),
+        n2n2 = d3_geo_cartesianDot(n2, n2),
+        n1n2 = n2[0], // d3_geo_cartesianDot(n1, n2),
+        determinant = n2n2 - n1n2 * n1n2;
+    // Two polar points.
+    if (!determinant) return a;
+
+    var c1 =  cr * n2n2 / determinant,
+        c2 = -cr * n1n2 / determinant,
+        n1xn2 = d3_geo_cartesianCross(n1, n2),
+        A = d3_geo_cartesianScale(n1, c1),
+        B = d3_geo_cartesianScale(n2, c2);
+    d3_geo_cartesianAdd(A, B);
+    // Now solve |p(t)|^2 = 1.
+    var u = n1xn2,
+        w = d3_geo_cartesianDot(A, u),
+        uu = d3_geo_cartesianDot(u, u),
+        t = Math.sqrt(w * w - uu * (d3_geo_cartesianDot(A, A) - 1)),
+        q = d3_geo_cartesianScale(u, (-w - t) / uu);
+    d3_geo_cartesianAdd(q, A);
+    return d3_geo_spherical(q);
+  }
+}
diff --git a/static/demo/components/d3/src/geo/clip.js b/static/demo/components/d3/src/geo/clip.js
new file mode 100644
index 0000000000000000000000000000000000000000..d120b1c4f74f64d7250ebcdffd4340a1bb5e6048
--- /dev/null
+++ b/static/demo/components/d3/src/geo/clip.js
@@ -0,0 +1,275 @@
+function d3_geo_clip(pointVisible, clipLine, interpolate) {
+  return function(listener) {
+    var line = clipLine(listener);
+
+    var clip = {
+      point: point,
+      lineStart: lineStart,
+      lineEnd: lineEnd,
+      polygonStart: function() {
+        clip.point = pointRing;
+        clip.lineStart = ringStart;
+        clip.lineEnd = ringEnd;
+        invisible = false;
+        invisibleArea = visibleArea = 0;
+        segments = [];
+        listener.polygonStart();
+      },
+      polygonEnd: function() {
+        clip.point = point;
+        clip.lineStart = lineStart;
+        clip.lineEnd = lineEnd;
+
+        segments = d3.merge(segments);
+        if (segments.length) {
+          d3_geo_clipPolygon(segments, interpolate, listener);
+        } else if (visibleArea < -ε || invisible && invisibleArea < -ε) {
+          listener.lineStart();
+          interpolate(null, null, 1, listener);
+          listener.lineEnd();
+        }
+        listener.polygonEnd();
+        segments = null;
+      },
+      sphere: function() {
+        listener.polygonStart();
+        listener.lineStart();
+        interpolate(null, null, 1, listener);
+        listener.lineEnd();
+        listener.polygonEnd();
+      }
+    };
+
+    function point(λ, φ) { if (pointVisible(λ, φ)) listener.point(λ, φ); }
+    function pointLine(λ, φ) { line.point(λ, φ); }
+    function lineStart() { clip.point = pointLine; line.lineStart(); }
+    function lineEnd() { clip.point = point; line.lineEnd(); }
+
+    var segments,
+        visibleArea,
+        invisibleArea,
+        invisible;
+
+    var buffer = d3_geo_clipBufferListener(),
+        ringListener = clipLine(buffer),
+        ring;
+
+    function pointRing(λ, φ) {
+      ringListener.point(λ, φ);
+      ring.push([λ, φ]);
+    }
+
+    function ringStart() {
+      ringListener.lineStart();
+      ring = [];
+    }
+
+    function ringEnd() {
+      pointRing(ring[0][0], ring[0][1]);
+      ringListener.lineEnd();
+
+      var clean = ringListener.clean(),
+          ringSegments = buffer.buffer(),
+          segment,
+          n = ringSegments.length;
+
+      // TODO compute on-the-fly?
+      if (!n) {
+        invisible = true;
+        invisibleArea += d3_geo_clipAreaRing(ring, -1);
+        ring = null;
+        return;
+      }
+      ring = null;
+
+      // No intersections.
+      // TODO compute on-the-fly?
+      if (clean & 1) {
+        segment = ringSegments[0];
+        visibleArea += d3_geo_clipAreaRing(segment, 1);
+        var n = segment.length - 1,
+            i = -1,
+            point;
+        listener.lineStart();
+        while (++i < n) listener.point((point = segment[i])[0], point[1]);
+        listener.lineEnd();
+        return;
+      }
+
+      // Rejoin connected segments.
+      if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
+
+      segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));
+    }
+
+    return clip;
+  };
+}
+
+// General spherical polygon clipping algorithm: takes a polygon, cuts it into
+// visible line segments and rejoins the segments by interpolating along the
+// clip edge.  If there are no intersections with the clip edge, the whole clip
+// edge is inserted if appropriate.
+function d3_geo_clipPolygon(segments, interpolate, listener) {
+  var subject = [],
+      clip = [];
+
+  segments.forEach(function(segment) {
+    if ((n = segment.length) <= 1) return;
+    var n, p0 = segment[0], p1 = segment[n - 1];
+
+    // If the first and last points of a segment are coincident, then treat as
+    // a closed ring.
+    // TODO if all rings are closed, then the winding order of the exterior
+    // ring should be checked.
+    if (d3_geo_sphericalEqual(p0, p1)) {
+      listener.lineStart();
+      for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);
+      listener.lineEnd();
+      return;
+    }
+
+    var a = {point: p0, points: segment, other: null, visited: false, entry: true, subject: true},
+        b = {point: p0, points: [p0], other: a, visited: false, entry: false, subject: false};
+    a.other = b;
+    subject.push(a);
+    clip.push(b);
+    a = {point: p1, points: [p1], other: null, visited: false, entry: false, subject: true};
+    b = {point: p1, points: [p1], other: a, visited: false, entry: true, subject: false};
+    a.other = b;
+    subject.push(a);
+    clip.push(b);
+  });
+  clip.sort(d3_geo_clipSort);
+  d3_geo_clipLinkCircular(subject);
+  d3_geo_clipLinkCircular(clip);
+  if (!subject.length) return;
+  var start = subject[0],
+      current,
+      points,
+      point;
+  while (1) {
+    // Find first unvisited intersection.
+    current = start;
+    while (current.visited) if ((current = current.next) === start) return;
+    points = current.points;
+    listener.lineStart();
+    do {
+      current.visited = current.other.visited = true;
+      if (current.entry) {
+        if (current.subject) {
+          for (var i = 0; i < points.length; i++) listener.point((point = points[i])[0], point[1]);
+        } else {
+          interpolate(current.point, current.next.point, 1, listener);
+        }
+        current = current.next;
+      } else {
+        if (current.subject) {
+          points = current.prev.points;
+          for (var i = points.length; --i >= 0;) listener.point((point = points[i])[0], point[1]);
+        } else {
+          interpolate(current.point, current.prev.point, -1, listener);
+        }
+        current = current.prev;
+      }
+      current = current.other;
+      points = current.points;
+    } while (!current.visited);
+    listener.lineEnd();
+  }
+}
+
+function d3_geo_clipLinkCircular(array) {
+  if (!(n = array.length)) return;
+  var n,
+      i = 0,
+      a = array[0],
+      b;
+  while (++i < n) {
+    a.next = b = array[i];
+    b.prev = a;
+    a = b;
+  }
+  a.next = b = array[0];
+  b.prev = a;
+}
+
+// Intersection points are sorted along the clip edge. For both antimeridian
+// cutting and circle clipping, the same comparison is used.
+function d3_geo_clipSort(a, b) {
+  return ((a = a.point)[0] < 0 ? a[1] - π / 2 - ε : π / 2 - a[1])
+       - ((b = b.point)[0] < 0 ? b[1] - π / 2 - ε : π / 2 - b[1]);
+}
+
+function d3_geo_clipSegmentLength1(segment) {
+  return segment.length > 1;
+}
+
+function d3_geo_clipBufferListener() {
+  var lines = [],
+      line;
+  return {
+    lineStart: function() { lines.push(line = []); },
+    point: function(λ, φ) { line.push([λ, φ]); },
+    lineEnd: d3_noop,
+    buffer: function() {
+      var buffer = lines;
+      lines = [];
+      line = null;
+      return buffer;
+    }
+  };
+}
+
+// Approximate polygon ring area (×2, since we only need the sign).
+// For an invisible polygon ring, we rotate longitudinally by 180°.
+// The invisible parameter should be 1, or -1 to rotate longitudinally.
+// Based on Robert. G. Chamberlain and William H. Duquette,
+// “Some Algorithms for Polygons on a Sphere”,
+// http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409
+function d3_geo_clipAreaRing(ring, invisible) {
+  if (!(n = ring.length)) return 0;
+  var n,
+      i = 0,
+      area = 0,
+      p = ring[0],
+      λ = p[0],
+      φ = p[1],
+      cosφ = Math.cos(φ),
+      x0 = Math.atan2(invisible * Math.sin(λ) * cosφ, Math.sin(φ)),
+      y0 = 1 - invisible * Math.cos(λ) * cosφ,
+      x1 = x0,
+      x, // λ'; λ rotated to south pole.
+      y; // φ' = 1 + sin(φ); φ rotated to south pole.
+  while (++i < n) {
+    p = ring[i];
+    cosφ = Math.cos(φ = p[1]);
+    x = Math.atan2(invisible * Math.sin(λ = p[0]) * cosφ, Math.sin(φ));
+    y = 1 - invisible * Math.cos(λ) * cosφ;
+
+    // If both the current point and the previous point are at the north pole,
+    // skip this point.
+    if (Math.abs(y0 - 2) < ε && Math.abs(y - 2) < ε) continue;
+
+    // If this or the previous point is at the south pole, or if this segment
+    // goes through the south pole, the area is 0.
+    if (Math.abs(y) < ε || Math.abs(y0) < ε) {}
+
+    // If this segment goes through either pole…
+    else if (Math.abs(Math.abs(x - x0) - π) < ε) {
+      // For the north pole, compute lune area.
+      if (y + y0 > 2) area += 4 * (x - x0);
+      // For the south pole, the area is zero.
+    }
+
+    // If the previous point is at the north pole, then compute lune area.
+    else if (Math.abs(y0 - 2) < ε) area += 4 * (x - x1);
+
+    // Otherwise, the spherical triangle area is approximately
+    // δλ * (1 + sinφ0 + 1 + sinφ) / 2.
+    else area += ((3 * π + x - x0) % (2 * π) - π) * (y0 + y);
+
+    x1 = x0, x0 = x, y0 = y;
+  }
+  return area;
+}
diff --git a/static/demo/components/d3/src/geo/compose.js b/static/demo/components/d3/src/geo/compose.js
new file mode 100644
index 0000000000000000000000000000000000000000..fe374ef820eeeb77c89b04424ac5af454268d2c6
--- /dev/null
+++ b/static/demo/components/d3/src/geo/compose.js
@@ -0,0 +1,12 @@
+function d3_geo_compose(a, b) {
+
+  function compose(x, y) {
+    return x = a(x, y), b(x[0], x[1]);
+  }
+
+  if (a.invert && b.invert) compose.invert = function(x, y) {
+    return x = b.invert(x, y), x && a.invert(x[0], x[1]);
+  };
+
+  return compose;
+}
diff --git a/static/demo/components/d3/src/geo/equirectangular.js b/static/demo/components/d3/src/geo/equirectangular.js
new file mode 100644
index 0000000000000000000000000000000000000000..dd872417cd05bcbab285e12c049da3b65ba7c388
--- /dev/null
+++ b/static/demo/components/d3/src/geo/equirectangular.js
@@ -0,0 +1,7 @@
+function d3_geo_equirectangular(λ, φ) {
+  return [λ, φ];
+}
+
+(d3.geo.equirectangular = function() {
+  return d3_geo_projection(d3_geo_equirectangular).scale(250 / π);
+}).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;
diff --git a/static/demo/components/d3/src/geo/geo.js b/static/demo/components/d3/src/geo/geo.js
new file mode 100644
index 0000000000000000000000000000000000000000..cf220ceb04e6a73022b51d61ee20df959526aa79
--- /dev/null
+++ b/static/demo/components/d3/src/geo/geo.js
@@ -0,0 +1 @@
+d3.geo = {};
diff --git a/static/demo/components/d3/src/geo/gnomonic.js b/static/demo/components/d3/src/geo/gnomonic.js
new file mode 100644
index 0000000000000000000000000000000000000000..87c1941a366111df972d4059495f59453d75a51e
--- /dev/null
+++ b/static/demo/components/d3/src/geo/gnomonic.js
@@ -0,0 +1,8 @@
+var d3_geo_gnomonic = d3_geo_azimuthal(
+  function(cosλcosφ) { return 1 / cosλcosφ; },
+  Math.atan
+);
+
+(d3.geo.gnomonic = function() {
+  return d3_geo_projection(d3_geo_gnomonic);
+}).raw = d3_geo_gnomonic;
diff --git a/static/demo/components/d3/src/geo/graticule.js b/static/demo/components/d3/src/geo/graticule.js
new file mode 100644
index 0000000000000000000000000000000000000000..fde372f498b54c48a42ac5823b2f3857c9ef9583
--- /dev/null
+++ b/static/demo/components/d3/src/geo/graticule.js
@@ -0,0 +1,67 @@
+d3.geo.graticule = function() {
+  var x1, x0,
+      y1, y0,
+      dx = 22.5, dy = dx,
+      x, y,
+      precision = 2.5;
+
+  function graticule() {
+    return {type: "MultiLineString", coordinates: lines()};
+  }
+
+  function lines() {
+    return d3.range(Math.ceil(x0 / dx) * dx, x1, dx).map(x)
+        .concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).map(y));
+  }
+
+  graticule.lines = function() {
+    return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
+  }
+
+  graticule.outline = function() {
+    return {
+      type: "Polygon",
+      coordinates: [
+        x(x0).concat(
+        y(y1).slice(1),
+        x(x1).reverse().slice(1),
+        y(y0).reverse().slice(1))
+      ]
+    };
+  };
+
+  graticule.extent = function(_) {
+    if (!arguments.length) return [[x0, y0], [x1, y1]];
+    x0 = +_[0][0], x1 = +_[1][0];
+    y0 = +_[0][1], y1 = +_[1][1];
+    if (x0 > x1) _ = x0, x0 = x1, x1 = _;
+    if (y0 > y1) _ = y0, y0 = y1, y1 = _;
+    return graticule.precision(precision);
+  };
+
+  graticule.step = function(_) {
+    if (!arguments.length) return [dx, dy];
+    dx = +_[0], dy = +_[1];
+    return graticule;
+  };
+
+  graticule.precision = function(_) {
+    if (!arguments.length) return precision;
+    precision = +_;
+    x = d3_geo_graticuleX(y0, y1, precision);
+    y = d3_geo_graticuleY(x0, x1, precision);
+    return graticule;
+  };
+
+  return graticule.extent([[-180 + ε, -90 + ε], [180 - ε, 90 - ε]]);
+};
+
+function d3_geo_graticuleX(y0, y1, dy) {
+  var y = d3.range(y0, y1 - ε, dy).concat(y1);
+  return function(x) { return y.map(function(y) { return [x, y]; }); };
+}
+
+function d3_geo_graticuleY(x0, x1, dx) {
+  var x = d3.range(x0, x1 - ε, dx).concat(x1);
+  return function(y) { return x.map(function(x) { return [x, y]; }); };
+}
diff --git a/static/demo/components/d3/src/geo/greatArc.js b/static/demo/components/d3/src/geo/greatArc.js
new file mode 100644
index 0000000000000000000000000000000000000000..e4546c5fe5ef12a230b70b99647078abfafc66e7
--- /dev/null
+++ b/static/demo/components/d3/src/geo/greatArc.js
@@ -0,0 +1,46 @@
+d3.geo.greatArc = function() {
+  var source = d3_source, source_,
+      target = d3_target, target_,
+      precision = 6 * d3_radians,
+      interpolate;
+
+  function greatArc() {
+    var p0 = source_ || source.apply(this, arguments),
+        p1 = target_ || target.apply(this, arguments),
+        i = interpolate || d3.geo.interpolate(p0, p1),
+        t = 0,
+        dt = precision / i.distance,
+        coordinates = [p0];
+    while ((t += dt) < 1) coordinates.push(i(t));
+    coordinates.push(p1);
+    return {type: "LineString", coordinates: coordinates};
+  }
+
+  // Length returned in radians; multiply by radius for distance.
+  greatArc.distance = function() {
+    return (interpolate || d3.geo.interpolate(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments))).distance;
+  };
+
+  greatArc.source = function(_) {
+    if (!arguments.length) return source;
+    source = _, source_ = typeof _ === "function" ? null : _;
+    interpolate = source_ && target_ ? d3.geo.interpolate(source_, target_) : null;
+    return greatArc;
+  };
+
+  greatArc.target = function(_) {
+    if (!arguments.length) return target;
+    target = _, target_ = typeof _ === "function" ? null : _;
+    interpolate = source_ && target_ ? d3.geo.interpolate(source_, target_) : null;
+    return greatArc;
+  };
+
+  // Precision is specified in degrees.
+  greatArc.precision = function(_) {
+    if (!arguments.length) return precision / d3_radians;
+    precision = _ * d3_radians;
+    return greatArc;
+  };
+
+  return greatArc;
+};
diff --git a/static/demo/components/d3/src/geo/haversin.js b/static/demo/components/d3/src/geo/haversin.js
new file mode 100644
index 0000000000000000000000000000000000000000..bc03ba08560ff14c7915bfeea2e86fdf7ff87ec3
--- /dev/null
+++ b/static/demo/components/d3/src/geo/haversin.js
@@ -0,0 +1,3 @@
+function d3_geo_haversin(x) {
+  return (x = Math.sin(x / 2)) * x;
+}
diff --git a/static/demo/components/d3/src/geo/interpolate.js b/static/demo/components/d3/src/geo/interpolate.js
new file mode 100644
index 0000000000000000000000000000000000000000..2af084f756cd7d56f7b3a1f9010eded3746976be
--- /dev/null
+++ b/static/demo/components/d3/src/geo/interpolate.js
@@ -0,0 +1,35 @@
+d3.geo.interpolate = function(source, target) {
+  return d3_geo_interpolate(
+    source[0] * d3_radians, source[1] * d3_radians,
+    target[0] * d3_radians, target[1] * d3_radians
+  );
+}
+
+function d3_geo_interpolate(x0, y0, x1, y1) {
+  var cy0 = Math.cos(y0),
+      sy0 = Math.sin(y0),
+      cy1 = Math.cos(y1),
+      sy1 = Math.sin(y1),
+      kx0 = cy0 * Math.cos(x0),
+      ky0 = cy0 * Math.sin(x0),
+      kx1 = cy1 * Math.cos(x1),
+      ky1 = cy1 * Math.sin(x1),
+      d = 2 * Math.asin(Math.sqrt(d3_geo_haversin(y1 - y0) + cy0 * cy1 * d3_geo_haversin(x1 - x0))),
+      k = 1 / Math.sin(d);
+
+  var interpolate = d ? function(t) {
+    var B = Math.sin(t *= d) * k,
+        A = Math.sin(d - t) * k,
+        x = A * kx0 + B * kx1,
+        y = A * ky0 + B * ky1,
+        z = A * sy0 + B * sy1;
+    return [
+      Math.atan2(y, x) * d3_degrees,
+      Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees
+    ];
+  } : function() { return [x0 * d3_degrees, y0 * d3_degrees]; };
+
+  interpolate.distance = d;
+
+  return interpolate;
+};
diff --git a/static/demo/components/d3/src/geo/mercator.js b/static/demo/components/d3/src/geo/mercator.js
new file mode 100644
index 0000000000000000000000000000000000000000..09cad155acb89d0b79fed1c3ae2b578cef7d5ce4
--- /dev/null
+++ b/static/demo/components/d3/src/geo/mercator.js
@@ -0,0 +1,17 @@
+function d3_geo_mercator(λ, φ) {
+  return [
+    λ / (2 * π),
+    Math.max(-.5, Math.min(+.5, Math.log(Math.tan(π / 4 + φ / 2)) / (2 * π)))
+  ];
+}
+
+d3_geo_mercator.invert = function(x, y) {
+  return [
+    2 * π * x,
+    2 * Math.atan(Math.exp(2 * π * y)) - π / 2
+  ];
+};
+
+(d3.geo.mercator = function() {
+  return d3_geo_projection(d3_geo_mercator).scale(500);
+}).raw = d3_geo_mercator;
diff --git a/static/demo/components/d3/src/geo/orthographic.js b/static/demo/components/d3/src/geo/orthographic.js
new file mode 100644
index 0000000000000000000000000000000000000000..e6ef7c3ce24b6fe0ab38ece71fc664392771554b
--- /dev/null
+++ b/static/demo/components/d3/src/geo/orthographic.js
@@ -0,0 +1,8 @@
+var d3_geo_orthographic = d3_geo_azimuthal(
+  function() { return 1; },
+  Math.asin
+);
+
+(d3.geo.orthographic = function() {
+  return d3_geo_projection(d3_geo_orthographic);
+}).raw = d3_geo_orthographic;
diff --git a/static/demo/components/d3/src/geo/path-area.js b/static/demo/components/d3/src/geo/path-area.js
new file mode 100644
index 0000000000000000000000000000000000000000..a8e996fa8539397d47f93dd71fe95e9cd1091a79
--- /dev/null
+++ b/static/demo/components/d3/src/geo/path-area.js
@@ -0,0 +1,38 @@
+// TODO Unify this code with d3.geom.polygon area?
+
+var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {
+  point: d3_noop,
+  lineStart: d3_noop,
+  lineEnd: d3_noop,
+
+  // Only count area for polygon rings.
+  polygonStart: function() {
+    d3_geo_pathAreaPolygon = 0;
+    d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;
+  },
+  polygonEnd: function() {
+    d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
+    d3_geo_pathAreaSum += Math.abs(d3_geo_pathAreaPolygon / 2);
+  }
+};
+
+function d3_geo_pathAreaRingStart() {
+  var x00, y00, x0, y0;
+
+  // For the first point, …
+  d3_geo_pathArea.point = function(x, y) {
+    d3_geo_pathArea.point = nextPoint;
+    x00 = x0 = x, y00 = y0 = y;
+  };
+
+  // For subsequent points, …
+  function nextPoint(x, y) {
+    d3_geo_pathAreaPolygon += y0 * x - x0 * y;
+    x0 = x, y0 = y;
+  }
+
+  // For the last point, return to the start.
+  d3_geo_pathArea.lineEnd = function() {
+    nextPoint(x00, y00);
+  };
+}
diff --git a/static/demo/components/d3/src/geo/path-buffer.js b/static/demo/components/d3/src/geo/path-buffer.js
new file mode 100644
index 0000000000000000000000000000000000000000..dbfcb58a6f7802712b3747a627aa91581c6257bd
--- /dev/null
+++ b/static/demo/components/d3/src/geo/path-buffer.js
@@ -0,0 +1,52 @@
+function d3_geo_pathBuffer() {
+  var pointCircle = d3_geo_pathCircle(4.5),
+      buffer = [];
+
+  var stream = {
+    point: point,
+
+    // While inside a line, override point to moveTo then lineTo.
+    lineStart: function() { stream.point = pointLineStart; },
+    lineEnd: lineEnd,
+
+    // While inside a polygon, override lineEnd to closePath.
+    polygonStart: function() { stream.lineEnd = lineEndPolygon; },
+    polygonEnd: function() { stream.lineEnd = lineEnd; stream.point = point; },
+
+    pointRadius: function(_) {
+      pointCircle = d3_geo_pathCircle(_);
+      return stream;
+    },
+
+    result: function() {
+      if (buffer.length) {
+        var result = buffer.join("");
+        buffer = [];
+        return result;
+      }
+    }
+  };
+
+  function point(x, y) {
+    buffer.push("M", x, ",", y, pointCircle);
+  }
+
+  function pointLineStart(x, y) {
+    buffer.push("M", x, ",", y);
+    stream.point = pointLine;
+  }
+
+  function pointLine(x, y) {
+    buffer.push("L", x, ",", y);
+  }
+
+  function lineEnd() {
+    stream.point = point;
+  }
+
+  function lineEndPolygon() {
+    buffer.push("Z");
+  }
+
+  return stream;
+}
diff --git a/static/demo/components/d3/src/geo/path-centroid.js b/static/demo/components/d3/src/geo/path-centroid.js
new file mode 100644
index 0000000000000000000000000000000000000000..81e2de637c89f09a7a72c2c5c01d576ab3e4f44e
--- /dev/null
+++ b/static/demo/components/d3/src/geo/path-centroid.js
@@ -0,0 +1,84 @@
+// TODO Unify this code with d3.geom.polygon centroid?
+// TODO Enforce positive area for exterior, negative area for interior?
+
+var d3_geo_pathCentroid = {
+  point: d3_geo_pathCentroidPoint,
+
+  // For lines, weight by length.
+  lineStart: d3_geo_pathCentroidLineStart,
+  lineEnd: d3_geo_pathCentroidLineEnd,
+
+  // For polygons, weight by area.
+  polygonStart: function() {
+    d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;
+  },
+  polygonEnd: function() {
+    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
+    d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;
+    d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;
+  }
+};
+
+function d3_geo_pathCentroidPoint(x, y) {
+  if (d3_geo_centroidDimension) return;
+  d3_geo_centroidX += x;
+  d3_geo_centroidY += y;
+  ++d3_geo_centroidZ;
+}
+
+function d3_geo_pathCentroidLineStart() {
+  var x0, y0;
+
+  if (d3_geo_centroidDimension !== 1) {
+    if (d3_geo_centroidDimension < 1) {
+      d3_geo_centroidDimension = 1;
+      d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+    } else return;
+  }
+
+  d3_geo_pathCentroid.point = function(x, y) {
+    d3_geo_pathCentroid.point = nextPoint;
+    x0 = x, y0 = y;
+  };
+
+  function nextPoint(x, y) {
+    var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
+    d3_geo_centroidX += z * (x0 + x) / 2;
+    d3_geo_centroidY += z * (y0 + y) / 2;
+    d3_geo_centroidZ += z;
+    x0 = x, y0 = y;
+  }
+}
+
+function d3_geo_pathCentroidLineEnd() {
+  d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
+}
+
+function d3_geo_pathCentroidRingStart() {
+  var x00, y00, x0, y0;
+
+  if (d3_geo_centroidDimension < 2) {
+    d3_geo_centroidDimension = 2;
+    d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+  }
+
+  // For the first point, …
+  d3_geo_pathCentroid.point = function(x, y) {
+    d3_geo_pathCentroid.point = nextPoint;
+    x00 = x0 = x, y00 = y0 = y;
+  };
+
+  // For subsequent points, …
+  function nextPoint(x, y) {
+    var z = y0 * x - x0 * y;
+    d3_geo_centroidX += z * (x0 + x);
+    d3_geo_centroidY += z * (y0 + y);
+    d3_geo_centroidZ += z * 3;
+    x0 = x, y0 = y;
+  }
+
+  // For the last point, return to the start.
+  d3_geo_pathCentroid.lineEnd = function() {
+    nextPoint(x00, y00);
+  };
+}
diff --git a/static/demo/components/d3/src/geo/path-context.js b/static/demo/components/d3/src/geo/path-context.js
new file mode 100644
index 0000000000000000000000000000000000000000..f0c2546ea7aac816fb4cbeeac4fc92d7998b1d51
--- /dev/null
+++ b/static/demo/components/d3/src/geo/path-context.js
@@ -0,0 +1,46 @@
+function d3_geo_pathContext(context) {
+  var pointRadius = 4.5;
+
+  var stream = {
+    point: point,
+
+    // While inside a line, override point to moveTo then lineTo.
+    lineStart: function() { stream.point = pointLineStart; },
+    lineEnd: lineEnd,
+
+    // While inside a polygon, override lineEnd to closePath.
+    polygonStart: function() { stream.lineEnd = lineEndPolygon; },
+    polygonEnd: function() { stream.lineEnd = lineEnd; stream.point = point; },
+
+    pointRadius: function(_) {
+      pointRadius = _;
+      return stream;
+    },
+
+    result: d3_noop
+  };
+
+  function point(x, y) {
+    context.moveTo(x, y);
+    context.arc(x, y, pointRadius, 0, 2 * π);
+  }
+
+  function pointLineStart(x, y) {
+    context.moveTo(x, y);
+    stream.point = pointLine;
+  }
+
+  function pointLine(x, y) {
+    context.lineTo(x, y);
+  }
+
+  function lineEnd() {
+    stream.point = point;
+  }
+
+  function lineEndPolygon() {
+    context.closePath();
+  }
+
+  return stream;
+}
diff --git a/static/demo/components/d3/src/geo/path.js b/static/demo/components/d3/src/geo/path.js
new file mode 100644
index 0000000000000000000000000000000000000000..c18079a8fcb3b57b816fab91c119ea0fc65f453e
--- /dev/null
+++ b/static/demo/components/d3/src/geo/path.js
@@ -0,0 +1,76 @@
+// TODO better encapsulation for d3_geo_pathArea; move to area.js
+// TODO better encapsulation for d3_geo_pathCentroid; move to centroid.js
+
+d3.geo.path = function() {
+  var pointRadius = 4.5,
+      projection,
+      context,
+      projectStream,
+      contextStream;
+
+  function path(object) {
+    if (object) d3.geo.stream(object, projectStream(
+        contextStream.pointRadius(typeof pointRadius === "function"
+            ? +pointRadius.apply(this, arguments)
+            : pointRadius)));
+    return contextStream.result();
+  }
+
+  path.area = function(object) {
+    d3_geo_pathAreaSum = 0;
+    d3.geo.stream(object, projectStream(d3_geo_pathArea));
+    return d3_geo_pathAreaSum;
+  };
+
+  path.centroid = function(object) {
+    d3_geo_centroidDimension = d3_geo_centroidX = d3_geo_centroidY = d3_geo_centroidZ = 0;
+    d3.geo.stream(object, projectStream(d3_geo_pathCentroid));
+    return d3_geo_centroidZ ? [d3_geo_centroidX / d3_geo_centroidZ, d3_geo_centroidY / d3_geo_centroidZ] : undefined;
+  };
+
+  path.bounds = function(object) {
+    return d3_geo_bounds(projectStream)(object);
+  };
+
+  path.projection = function(_) {
+    if (!arguments.length) return projection;
+    projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;
+    return path;
+  };
+
+  path.context = function(_) {
+    if (!arguments.length) return context;
+    contextStream = (context = _) == null ? new d3_geo_pathBuffer : new d3_geo_pathContext(_);
+    return path;
+  };
+
+  path.pointRadius = function(_) {
+    if (!arguments.length) return pointRadius;
+    pointRadius = typeof _ === "function" ? _ : +_;
+    return path;
+  };
+
+  return path.projection(d3.geo.albersUsa()).context(null);
+};
+
+function d3_geo_pathCircle(radius) {
+  return "m0," + radius
+      + "a" + radius + "," + radius + " 0 1,1 0," + (-2 * radius)
+      + "a" + radius + "," + radius + " 0 1,1 0," + (+2 * radius)
+      + "z";
+}
+
+function d3_geo_pathProjectStream(project) {
+  var resample = d3_geo_resample(function(λ, φ) { return project([λ * d3_degrees, φ * d3_degrees]); });
+  return function(stream) {
+    stream = resample(stream);
+    return {
+      point: function(λ, φ) { stream.point(λ * d3_radians, φ * d3_radians); },
+      sphere: function() { stream.sphere(); },
+      lineStart: function() { stream.lineStart(); },
+      lineEnd: function() { stream.lineEnd(); },
+      polygonStart: function() { stream.polygonStart(); },
+      polygonEnd: function() { stream.polygonEnd(); }
+    };
+  };
+}
diff --git a/static/demo/components/d3/src/geo/projection.js b/static/demo/components/d3/src/geo/projection.js
new file mode 100644
index 0000000000000000000000000000000000000000..66d86e1ba2403eff6512bf82e8217e5a9b3b3a75
--- /dev/null
+++ b/static/demo/components/d3/src/geo/projection.js
@@ -0,0 +1,98 @@
+d3.geo.projection = d3_geo_projection;
+d3.geo.projectionMutator = d3_geo_projectionMutator;
+
+function d3_geo_projection(project) {
+  return d3_geo_projectionMutator(function() { return project; })();
+}
+
+function d3_geo_projectionMutator(projectAt) {
+  var project,
+      rotate,
+      projectRotate,
+      projectResample = d3_geo_resample(function(x, y) { x = project(x, y); return [x[0] * k + δx, δy - x[1] * k]; }),
+      k = 150, // scale
+      x = 480, y = 250, // translate
+      λ = 0, φ = 0, // center
+      δλ = 0, δφ = 0, δγ = 0, // rotate
+      δx, δy, // center
+      clip = d3_geo_clipAntimeridian,
+      clipAngle = null;
+
+  function projection(point) {
+    point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);
+    return [point[0] * k + δx, δy - point[1] * k];
+  }
+
+  function invert(point) {
+    point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);
+    return point && [point[0] * d3_degrees, point[1] * d3_degrees];
+  }
+
+  projection.stream = function(stream) {
+    return d3_geo_projectionRadiansRotate(rotate, clip(projectResample(stream)));
+  };
+
+  projection.clipAngle = function(_) {
+    if (!arguments.length) return clipAngle;
+    clip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle(clipAngle = +_);
+    return projection;
+  };
+
+  projection.scale = function(_) {
+    if (!arguments.length) return k;
+    k = +_;
+    return reset();
+  };
+
+  projection.translate = function(_) {
+    if (!arguments.length) return [x, y];
+    x = +_[0];
+    y = +_[1];
+    return reset();
+  };
+
+  projection.center = function(_) {
+    if (!arguments.length) return [λ * d3_degrees, φ * d3_degrees];
+    λ = _[0] % 360 * d3_radians;
+    φ = _[1] % 360 * d3_radians;
+    return reset();
+  };
+
+  projection.rotate = function(_) {
+    if (!arguments.length) return [δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees];
+    δλ = _[0] % 360 * d3_radians;
+    δφ = _[1] % 360 * d3_radians;
+    δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;
+    return reset();
+  };
+
+  d3.rebind(projection, projectResample, "precision");
+
+  function reset() {
+    projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);
+    var center = project(λ, φ);
+    δx = x - center[0] * k;
+    δy = y + center[1] * k;
+    return projection;
+  }
+
+  return function() {
+    project = projectAt.apply(this, arguments);
+    projection.invert = project.invert && invert;
+    return reset();
+  };
+}
+
+function d3_geo_projectionRadiansRotate(rotate, stream) {
+  return {
+    point: function(x, y) {
+      y = rotate(x * d3_radians, y * d3_radians), x = y[0];
+      stream.point(x > π ? x - 2 * π : x < -π ? x + 2 * π : x, y[1]);
+    },
+    sphere: function() { stream.sphere(); },
+    lineStart: function() { stream.lineStart(); },
+    lineEnd: function() { stream.lineEnd(); },
+    polygonStart: function() { stream.polygonStart(); },
+    polygonEnd: function() { stream.polygonEnd(); }
+  };
+}
diff --git a/static/demo/components/d3/src/geo/resample.js b/static/demo/components/d3/src/geo/resample.js
new file mode 100644
index 0000000000000000000000000000000000000000..af92bcaefd32673c7966bfd53e680bc7de8fe30e
--- /dev/null
+++ b/static/demo/components/d3/src/geo/resample.js
@@ -0,0 +1,90 @@
+function d3_geo_resample(project) {
+  var δ2 = .5, // precision, px²
+      maxDepth = 16;
+
+  function resample(stream) {
+    var λ0, x0, y0, a0, b0, c0; // previous point
+
+    var resample = {
+      point: point,
+      lineStart: lineStart,
+      lineEnd: lineEnd,
+      polygonStart: function() { stream.polygonStart(); resample.lineStart = polygonLineStart; },
+      polygonEnd: function() { stream.polygonEnd(); resample.lineStart = lineStart; }
+    };
+
+    function point(x, y) {
+      x = project(x, y);
+      stream.point(x[0], x[1]);
+    }
+
+    function lineStart() {
+      x0 = NaN;
+      resample.point = linePoint;
+      stream.lineStart();
+    }
+
+    function linePoint(λ, φ) {
+      var c = d3_geo_cartesian([λ, φ]), p = project(λ, φ);
+      resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
+      stream.point(x0, y0);
+    }
+
+    function lineEnd() {
+      resample.point = point;
+      stream.lineEnd();
+    }
+
+    function polygonLineStart() {
+      var λ00, φ00, x00, y00, a00, b00, c00; // first point
+
+      lineStart();
+
+      resample.point = function(λ, φ) {
+        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
+        resample.point = linePoint;
+      };
+
+      resample.lineEnd = function() {
+        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);
+        resample.lineEnd = lineEnd;
+        lineEnd();
+      };
+    }
+
+    return resample;
+  }
+
+  function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {
+    var dx = x1 - x0,
+        dy = y1 - y0,
+        d2 = dx * dx + dy * dy;
+    if (d2 > 4 * δ2 && depth--) {
+      var a = a0 + a1,
+          b = b0 + b1,
+          c = c0 + c1,
+          m = Math.sqrt(a * a + b * b + c * c),
+          φ2 = Math.asin(c /= m),
+          λ2 = Math.abs(Math.abs(c) - 1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a),
+          p = project(λ2, φ2),
+          x2 = p[0],
+          y2 = p[1],
+          dx2 = x2 - x0,
+          dy2 = y2 - y0,
+          dz = dy * dx2 - dx * dy2;
+      if (dz * dz / d2 > δ2 || Math.abs((dx * dx2 + dy * dy2) / d2 - .5) > .3) {
+        resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);
+        stream.point(x2, y2);
+        resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);
+      }
+    }
+  }
+
+  resample.precision = function(_) {
+    if (!arguments.length) return Math.sqrt(δ2);
+    maxDepth = (δ2 = _ * _) > 0 && 16;
+    return resample;
+  };
+
+  return resample;
+}
diff --git a/static/demo/components/d3/src/geo/rotation.js b/static/demo/components/d3/src/geo/rotation.js
new file mode 100644
index 0000000000000000000000000000000000000000..596ed7f21c976ebc3d3ba3c6512d6bddc319f5ca
--- /dev/null
+++ b/static/demo/components/d3/src/geo/rotation.js
@@ -0,0 +1,52 @@
+// Note: |δλ| and |δφ| must be < 2π
+function d3_geo_rotation(δλ, δφ, δγ) {
+  return δλ ? (δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ))
+    : d3_geo_rotationλ(δλ))
+    : (δφ || δγ ? d3_geo_rotationφγ(δφ, δγ)
+    : d3_geo_equirectangular);
+}
+
+function d3_geo_forwardRotationλ(δλ) {
+  return function(λ, φ) {
+    return λ += δλ, [λ > π ? λ - 2 * π : λ < -π ? λ + 2 * π : λ, φ];
+  };
+}
+
+function d3_geo_rotationλ(δλ) {
+  var rotation = d3_geo_forwardRotationλ(δλ);
+  rotation.invert = d3_geo_forwardRotationλ(-δλ);
+  return rotation;
+}
+
+function d3_geo_rotationφγ(δφ, δγ) {
+  var cosδφ = Math.cos(δφ),
+      sinδφ = Math.sin(δφ),
+      cosδγ = Math.cos(δγ),
+      sinδγ = Math.sin(δγ);
+
+  function rotation(λ, φ) {
+    var cosφ = Math.cos(φ),
+        x = Math.cos(λ) * cosφ,
+        y = Math.sin(λ) * cosφ,
+        z = Math.sin(φ),
+        k = z * cosδφ + x * sinδφ;
+    return [
+      Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ),
+      Math.asin(Math.max(-1, Math.min(1, k * cosδγ + y * sinδγ)))
+    ];
+  }
+
+  rotation.invert = function(λ, φ) {
+    var cosφ = Math.cos(φ),
+        x = Math.cos(λ) * cosφ,
+        y = Math.sin(λ) * cosφ,
+        z = Math.sin(φ),
+        k = z * cosδγ - y * sinδγ;
+    return [
+      Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ),
+      Math.asin(Math.max(-1, Math.min(1, k * cosδφ - x * sinδφ)))
+    ];
+  };
+
+  return rotation;
+}
diff --git a/static/demo/components/d3/src/geo/spherical.js b/static/demo/components/d3/src/geo/spherical.js
new file mode 100644
index 0000000000000000000000000000000000000000..6e4f639a26896bf6991e14c8f4ef8538e8933085
--- /dev/null
+++ b/static/demo/components/d3/src/geo/spherical.js
@@ -0,0 +1,10 @@
+function d3_geo_spherical(cartesian) {
+  return [
+    Math.atan2(cartesian[1], cartesian[0]),
+    Math.asin(Math.max(-1, Math.min(1, cartesian[2])))
+  ];
+}
+
+function d3_geo_sphericalEqual(a, b) {
+  return Math.abs(a[0] - b[0]) < ε && Math.abs(a[1] - b[1]) < ε;
+}
diff --git a/static/demo/components/d3/src/geo/stereographic.js b/static/demo/components/d3/src/geo/stereographic.js
new file mode 100644
index 0000000000000000000000000000000000000000..811afacc0b0b4f7015981f30a847ab3cd7a7209b
--- /dev/null
+++ b/static/demo/components/d3/src/geo/stereographic.js
@@ -0,0 +1,8 @@
+var d3_geo_stereographic = d3_geo_azimuthal(
+  function(cosλcosφ) { return 1 / (1 + cosλcosφ); },
+  function(ρ) { return 2 * Math.atan(ρ); }
+);
+
+(d3.geo.stereographic = function() {
+  return d3_geo_projection(d3_geo_stereographic);
+}).raw = d3_geo_stereographic;
diff --git a/static/demo/components/d3/src/geo/stream.js b/static/demo/components/d3/src/geo/stream.js
new file mode 100644
index 0000000000000000000000000000000000000000..9c1081e30e6083e36b59e41b278caa37cfd3e339
--- /dev/null
+++ b/static/demo/components/d3/src/geo/stream.js
@@ -0,0 +1,69 @@
+d3.geo.stream = function(object, listener) {
+  if (d3_geo_streamObjectType.hasOwnProperty(object.type)) {
+    d3_geo_streamObjectType[object.type](object, listener);
+  } else {
+    d3_geo_streamGeometry(object, listener);
+  }
+};
+
+function d3_geo_streamGeometry(geometry, listener) {
+  if (d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {
+    d3_geo_streamGeometryType[geometry.type](geometry, listener);
+  }
+}
+
+var d3_geo_streamObjectType = {
+  Feature: function(feature, listener) {
+    d3_geo_streamGeometry(feature.geometry, listener);
+  },
+  FeatureCollection: function(object, listener) {
+    var features = object.features, i = -1, n = features.length;
+    while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);
+  }
+};
+
+var d3_geo_streamGeometryType = {
+  Sphere: function(object, listener) {
+    listener.sphere();
+  },
+  Point: function(object, listener) {
+    var coordinate = object.coordinates;
+    listener.point(coordinate[0], coordinate[1]);
+  },
+  MultiPoint: function(object, listener) {
+    var coordinates = object.coordinates, i = -1, n = coordinates.length, coordinate;
+    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1]);
+  },
+  LineString: function(object, listener) {
+    d3_geo_streamLine(object.coordinates, listener, 0);
+  },
+  MultiLineString: function(object, listener) {
+    var coordinates = object.coordinates, i = -1, n = coordinates.length;
+    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);
+  },
+  Polygon: function(object, listener) {
+    d3_geo_streamPolygon(object.coordinates, listener);
+  },
+  MultiPolygon: function(object, listener) {
+    var coordinates = object.coordinates, i = -1, n = coordinates.length;
+    while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);
+  },
+  GeometryCollection: function(object, listener) {
+    var geometries = object.geometries, i = -1, n = geometries.length;
+    while (++i < n) d3_geo_streamGeometry(geometries[i], listener);
+  }
+};
+
+function d3_geo_streamLine(coordinates, listener, closed) {
+  var i = -1, n = coordinates.length - closed, coordinate;
+  listener.lineStart();
+  while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1]);
+  listener.lineEnd();
+}
+
+function d3_geo_streamPolygon(coordinates, listener) {
+  var i = -1, n = coordinates.length;
+  listener.polygonStart();
+  while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);
+  listener.polygonEnd();
+}
diff --git a/static/demo/components/d3/src/geom/delaunay.js b/static/demo/components/d3/src/geom/delaunay.js
new file mode 100644
index 0000000000000000000000000000000000000000..4088ce430809806175d62d2b7ae4e010de410876
--- /dev/null
+++ b/static/demo/components/d3/src/geom/delaunay.js
@@ -0,0 +1,31 @@
+/**
+* @param vertices [[x1, y1], [x2, y2], …]
+* @returns triangles [[[x1, y1], [x2, y2], [x3, y3]], …]
+ */
+d3.geom.delaunay = function(vertices) {
+  var edges = vertices.map(function() { return []; }),
+      triangles = [];
+
+  // Use the Voronoi tessellation to determine Delaunay edges.
+  d3_voronoi_tessellate(vertices, function(e) {
+    edges[e.region.l.index].push(vertices[e.region.r.index]);
+  });
+
+  // Reconnect the edges into counterclockwise triangles.
+  edges.forEach(function(edge, i) {
+    var v = vertices[i],
+        cx = v[0],
+        cy = v[1];
+    edge.forEach(function(v) {
+      v.angle = Math.atan2(v[0] - cx, v[1] - cy);
+    });
+    edge.sort(function(a, b) {
+      return a.angle - b.angle;
+    });
+    for (var j = 0, m = edge.length - 1; j < m; j++) {
+      triangles.push([v, edge[j], edge[j + 1]]);
+    }
+  });
+
+  return triangles;
+};
diff --git a/static/demo/components/d3/src/geom/geom.js b/static/demo/components/d3/src/geom/geom.js
new file mode 100644
index 0000000000000000000000000000000000000000..b17c4fc30609d35d1ba69e2b64379efdff03fc66
--- /dev/null
+++ b/static/demo/components/d3/src/geom/geom.js
@@ -0,0 +1 @@
+d3.geom = {};
diff --git a/static/demo/components/d3/src/geom/hull.js b/static/demo/components/d3/src/geom/hull.js
new file mode 100644
index 0000000000000000000000000000000000000000..b6a5be056c93a738dd4093ab7692868c2edd2fdd
--- /dev/null
+++ b/static/demo/components/d3/src/geom/hull.js
@@ -0,0 +1,98 @@
+/**
+ * Computes the 2D convex hull of a set of points using Graham's scanning
+ * algorithm. The algorithm has been implemented as described in Cormen,
+ * Leiserson, and Rivest's Introduction to Algorithms. The running time of
+ * this algorithm is O(n log n), where n is the number of input points.
+ *
+ * @param vertices [[x1, y1], [x2, y2], …]
+ * @returns polygon [[x1, y1], [x2, y2], …]
+ */
+d3.geom.hull = function(vertices) {
+  if (vertices.length < 3) return [];
+
+  var len = vertices.length,
+      plen = len - 1,
+      points = [],
+      stack = [],
+      i, j, h = 0, x1, y1, x2, y2, u, v, a, sp;
+
+  // find the starting ref point: leftmost point with the minimum y coord
+  for (i=1; i<len; ++i) {
+    if (vertices[i][1] < vertices[h][1]) {
+      h = i;
+    } else if (vertices[i][1] == vertices[h][1]) {
+      h = (vertices[i][0] < vertices[h][0] ? i : h);
+    }
+  }
+
+  // calculate polar angles from ref point and sort
+  for (i=0; i<len; ++i) {
+    if (i === h) continue;
+    y1 = vertices[i][1] - vertices[h][1];
+    x1 = vertices[i][0] - vertices[h][0];
+    points.push({angle: Math.atan2(y1, x1), index: i});
+  }
+  points.sort(function(a, b) { return a.angle - b.angle; });
+
+  // toss out duplicate angles
+  a = points[0].angle;
+  v = points[0].index;
+  u = 0;
+  for (i=1; i<plen; ++i) {
+    j = points[i].index;
+    if (a == points[i].angle) {
+      // keep angle for point most distant from the reference
+      x1 = vertices[v][0] - vertices[h][0];
+      y1 = vertices[v][1] - vertices[h][1];
+      x2 = vertices[j][0] - vertices[h][0];
+      y2 = vertices[j][1] - vertices[h][1];
+      if ((x1*x1 + y1*y1) >= (x2*x2 + y2*y2)) {
+        points[i].index = -1;
+      } else {
+        points[u].index = -1;
+        a = points[i].angle;
+        u = i;
+        v = j;
+      }
+    } else {
+      a = points[i].angle;
+      u = i;
+      v = j;
+    }
+  }
+
+  // initialize the stack
+  stack.push(h);
+  for (i=0, j=0; i<2; ++j) {
+    if (points[j].index !== -1) {
+      stack.push(points[j].index);
+      i++;
+    }
+  }
+  sp = stack.length;
+
+  // do graham's scan
+  for (; j<plen; ++j) {
+    if (points[j].index === -1) continue; // skip tossed out points
+    while (!d3_geom_hullCCW(stack[sp-2], stack[sp-1], points[j].index, vertices)) {
+      --sp;
+    }
+    stack[sp++] = points[j].index;
+  }
+
+  // construct the hull
+  var poly = [];
+  for (i=0; i<sp; ++i) {
+    poly.push(vertices[stack[i]]);
+  }
+  return poly;
+}
+
+// are three points in counter-clockwise order?
+function d3_geom_hullCCW(i1, i2, i3, v) {
+  var t, a, b, c, d, e, f;
+  t = v[i1]; a = t[0]; b = t[1];
+  t = v[i2]; c = t[0]; d = t[1];
+  t = v[i3]; e = t[0]; f = t[1];
+  return ((f-b)*(c-a) - (d-b)*(e-a)) > 0;
+}
diff --git a/static/demo/components/d3/src/geom/polygon.js b/static/demo/components/d3/src/geom/polygon.js
new file mode 100644
index 0000000000000000000000000000000000000000..6996e7a822536f82f40cbf61d41e521ff7f4a218
--- /dev/null
+++ b/static/demo/components/d3/src/geom/polygon.js
@@ -0,0 +1,80 @@
+d3.geom.polygon = function(coordinates) {
+
+  coordinates.area = function() {
+    var i = 0,
+        n = coordinates.length,
+        area = coordinates[n - 1][1] * coordinates[0][0] - coordinates[n - 1][0] * coordinates[0][1];
+    while (++i < n) {
+      area += coordinates[i - 1][1] * coordinates[i][0] - coordinates[i - 1][0] * coordinates[i][1];
+    }
+    return area * .5;
+  };
+
+  coordinates.centroid = function(k) {
+    var i = -1,
+        n = coordinates.length,
+        x = 0,
+        y = 0,
+        a,
+        b = coordinates[n - 1],
+        c;
+    if (!arguments.length) k = -1 / (6 * coordinates.area());
+    while (++i < n) {
+      a = b;
+      b = coordinates[i];
+      c = a[0] * b[1] - b[0] * a[1];
+      x += (a[0] + b[0]) * c;
+      y += (a[1] + b[1]) * c;
+    }
+    return [x * k, y * k];
+  };
+
+  // The Sutherland-Hodgman clipping algorithm.
+  // Note: requires the clip polygon to be counterclockwise and convex.
+  coordinates.clip = function(subject) {
+    var input,
+        i = -1,
+        n = coordinates.length,
+        j,
+        m,
+        a = coordinates[n - 1],
+        b,
+        c,
+        d;
+    while (++i < n) {
+      input = subject.slice();
+      subject.length = 0;
+      b = coordinates[i];
+      c = input[(m = input.length) - 1];
+      j = -1;
+      while (++j < m) {
+        d = input[j];
+        if (d3_geom_polygonInside(d, a, b)) {
+          if (!d3_geom_polygonInside(c, a, b)) {
+            subject.push(d3_geom_polygonIntersect(c, d, a, b));
+          }
+          subject.push(d);
+        } else if (d3_geom_polygonInside(c, a, b)) {
+          subject.push(d3_geom_polygonIntersect(c, d, a, b));
+        }
+        c = d;
+      }
+      a = b;
+    }
+    return subject;
+  };
+
+  return coordinates;
+};
+
+function d3_geom_polygonInside(p, a, b) {
+  return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
+}
+
+// Intersect two infinite lines cd and ab.
+function d3_geom_polygonIntersect(c, d, a, b) {
+  var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3,
+      y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3,
+      ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);
+  return [x1 + ua * x21, y1 + ua * y21];
+}
diff --git a/static/demo/components/d3/src/geom/quadtree.js b/static/demo/components/d3/src/geom/quadtree.js
new file mode 100644
index 0000000000000000000000000000000000000000..f4a1e4296d7c70592e59db0d845abcfaf64e4b10
--- /dev/null
+++ b/static/demo/components/d3/src/geom/quadtree.js
@@ -0,0 +1,113 @@
+d3.geom.quadtree = function(points, x1, y1, x2, y2) {
+  var p,
+      i = -1,
+      n = points.length;
+
+  // Allow bounds to be specified explicitly.
+  if (arguments.length < 5) {
+    if (arguments.length === 3) {
+      y2 = y1;
+      x2 = x1;
+      y1 = x1 = 0;
+    } else {
+      x1 = y1 = Infinity;
+      x2 = y2 = -Infinity;
+
+      // Compute bounds.
+      while (++i < n) {
+        p = points[i];
+        if (p.x < x1) x1 = p.x;
+        if (p.y < y1) y1 = p.y;
+        if (p.x > x2) x2 = p.x;
+        if (p.y > y2) y2 = p.y;
+      }
+    }
+  }
+
+  // Squarify the bounds.
+  var dx = x2 - x1,
+      dy = y2 - y1;
+  if (dx > dy) y2 = y1 + dx;
+  else x2 = x1 + dy;
+
+  // Recursively inserts the specified point p at the node n or one of its
+  // descendants. The bounds are defined by [x1, x2] and [y1, y2].
+  function insert(n, p, x1, y1, x2, y2) {
+    if (isNaN(p.x) || isNaN(p.y)) return; // ignore invalid points
+    if (n.leaf) {
+      var v = n.point;
+      if (v) {
+        // If the point at this leaf node is at the same position as the new
+        // point we are adding, we leave the point associated with the
+        // internal node while adding the new point to a child node. This
+        // avoids infinite recursion.
+        if ((Math.abs(v.x - p.x) + Math.abs(v.y - p.y)) < .01) {
+          insertChild(n, p, x1, y1, x2, y2);
+        } else {
+          n.point = null;
+          insertChild(n, v, x1, y1, x2, y2);
+          insertChild(n, p, x1, y1, x2, y2);
+        }
+      } else {
+        n.point = p;
+      }
+    } else {
+      insertChild(n, p, x1, y1, x2, y2);
+    }
+  }
+
+  // Recursively inserts the specified point p into a descendant of node n. The
+  // bounds are defined by [x1, x2] and [y1, y2].
+  function insertChild(n, p, x1, y1, x2, y2) {
+    // Compute the split point, and the quadrant in which to insert p.
+    var sx = (x1 + x2) * .5,
+        sy = (y1 + y2) * .5,
+        right = p.x >= sx,
+        bottom = p.y >= sy,
+        i = (bottom << 1) + right;
+
+    // Recursively insert into the child node.
+    n.leaf = false;
+    n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());
+
+    // Update the bounds as we recurse.
+    if (right) x1 = sx; else x2 = sx;
+    if (bottom) y1 = sy; else y2 = sy;
+    insert(n, p, x1, y1, x2, y2);
+  }
+
+  // Create the root node.
+  var root = d3_geom_quadtreeNode();
+
+  root.add = function(p) {
+    insert(root, p, x1, y1, x2, y2);
+  };
+
+  root.visit = function(f) {
+    d3_geom_quadtreeVisit(f, root, x1, y1, x2, y2);
+  };
+
+  // Insert all points.
+  points.forEach(root.add);
+  return root;
+};
+
+function d3_geom_quadtreeNode() {
+  return {
+    leaf: true,
+    nodes: [],
+    point: null
+  };
+}
+
+function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {
+  if (!f(node, x1, y1, x2, y2)) {
+    var sx = (x1 + x2) * .5,
+        sy = (y1 + y2) * .5,
+        children = node.nodes;
+    if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);
+    if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);
+    if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);
+    if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);
+  }
+}
diff --git a/static/demo/components/d3/src/geom/voronoi.js b/static/demo/components/d3/src/geom/voronoi.js
new file mode 100644
index 0000000000000000000000000000000000000000..9544b22eae730cd6daeedefc39f19be942ad49f3
--- /dev/null
+++ b/static/demo/components/d3/src/geom/voronoi.js
@@ -0,0 +1,441 @@
+// Adapted from Nicolas Garcia Belmonte's JIT implementation:
+// http://blog.thejit.org/2010/02/12/voronoi-tessellation/
+// http://blog.thejit.org/assets/voronoijs/voronoi.js
+// See lib/jit/LICENSE for details.
+
+// Notes:
+//
+// This implementation does not clip the returned polygons, so if you want to
+// clip them to a particular shape you will need to do that either in SVG or by
+// post-processing with d3.geom.polygon's clip method.
+//
+// If any vertices are coincident or have NaN positions, the behavior of this
+// method is undefined. Most likely invalid polygons will be returned. You
+// should filter invalid points, and consolidate coincident points, before
+// computing the tessellation.
+
+/**
+ * @param vertices [[x1, y1], [x2, y2], …]
+ * @returns polygons [[[x1, y1], [x2, y2], …], …]
+ */
+d3.geom.voronoi = function(vertices) {
+  var polygons = vertices.map(function() { return []; }),
+      Z = 1e6;
+
+  d3_voronoi_tessellate(vertices, function(e) {
+    var s1,
+        s2,
+        x1,
+        x2,
+        y1,
+        y2;
+    if (e.a === 1 && e.b >= 0) {
+      s1 = e.ep.r;
+      s2 = e.ep.l;
+    } else {
+      s1 = e.ep.l;
+      s2 = e.ep.r;
+    }
+    if (e.a === 1) {
+      y1 = s1 ? s1.y : -Z;
+      x1 = e.c - e.b * y1;
+      y2 = s2 ? s2.y : Z;
+      x2 = e.c - e.b * y2;
+    } else {
+      x1 = s1 ? s1.x : -Z;
+      y1 = e.c - e.a * x1;
+      x2 = s2 ? s2.x : Z;
+      y2 = e.c - e.a * x2;
+    }
+    var v1 = [x1, y1],
+        v2 = [x2, y2];
+    polygons[e.region.l.index].push(v1, v2);
+    polygons[e.region.r.index].push(v1, v2);
+  });
+
+  // Connect edges into counterclockwise polygons without coincident points.
+  polygons = polygons.map(function(polygon, i) {
+    var cx = vertices[i][0],
+        cy = vertices[i][1],
+        angle = polygon.map(function(v) { return Math.atan2(v[0] - cx, v[1] - cy); }),
+        order = d3.range(polygon.length).sort(function(a, b) { return angle[a] - angle[b]; });
+    return order
+        .filter(function(d, i) { return !i || (angle[d] - angle[order[i - 1]] > ε); })
+        .map(function(d) { return polygon[d]; });
+  });
+
+  // Fix degenerate polygons.
+  polygons.forEach(function(polygon, i) {
+    var n = polygon.length;
+    if (!n) return polygon.push([-Z, -Z], [-Z, Z], [Z, Z], [Z, -Z]);
+    if (n > 2) return;
+
+    var p0 = vertices[i],
+        p1 = polygon[0],
+        p2 = polygon[1],
+        x0 = p0[0], y0 = p0[1],
+        x1 = p1[0], y1 = p1[1],
+        x2 = p2[0], y2 = p2[1],
+        dx = Math.abs(x2 - x1), dy = y2 - y1;
+
+    if (Math.abs(dy) < ε) { // 0°
+      var y = y0 < y1 ? -Z : Z;
+      polygon.push([-Z, y], [Z, y]);
+    } else if (dx < ε) { // ±90°
+      var x = x0 < x1 ? -Z : Z;
+      polygon.push([x, -Z], [x, Z]);
+    } else {
+      var y = (x2 - x1) * (y1 - y0) < (x1 - x0) * (y2 - y1) ? Z : -Z,
+          z = Math.abs(dy) - dx;
+      if (Math.abs(z) < ε) { // ±45°
+        polygon.push([dy < 0 ? y : -y, y]);
+      } else {
+        if (z > 0) y *= -1;
+        polygon.push([-Z, y], [Z, y]);
+      }
+    }
+  });
+
+  return polygons;
+};
+
+var d3_voronoi_opposite = {l: "r", r: "l"};
+
+function d3_voronoi_tessellate(vertices, callback) {
+
+  var Sites = {
+    list: vertices
+      .map(function(v, i) {
+        return {
+          index: i,
+          x: v[0],
+          y: v[1]
+        };
+      })
+      .sort(function(a, b) {
+        return a.y < b.y ? -1
+          : a.y > b.y ? 1
+          : a.x < b.x ? -1
+          : a.x > b.x ? 1
+          : 0;
+      }),
+    bottomSite: null
+  };
+
+  var EdgeList = {
+    list: [],
+    leftEnd: null,
+    rightEnd: null,
+
+    init: function() {
+      EdgeList.leftEnd = EdgeList.createHalfEdge(null, "l");
+      EdgeList.rightEnd = EdgeList.createHalfEdge(null, "l");
+      EdgeList.leftEnd.r = EdgeList.rightEnd;
+      EdgeList.rightEnd.l = EdgeList.leftEnd;
+      EdgeList.list.unshift(EdgeList.leftEnd, EdgeList.rightEnd);
+    },
+
+    createHalfEdge: function(edge, side) {
+      return {
+        edge: edge,
+        side: side,
+        vertex: null,
+        "l": null,
+        "r": null
+      };
+    },
+
+    insert: function(lb, he) {
+      he.l = lb;
+      he.r = lb.r;
+      lb.r.l = he;
+      lb.r = he;
+    },
+
+    leftBound: function(p) {
+      var he = EdgeList.leftEnd;
+      do {
+        he = he.r;
+      } while (he != EdgeList.rightEnd && Geom.rightOf(he, p));
+      he = he.l;
+      return he;
+    },
+
+    del: function(he) {
+      he.l.r = he.r;
+      he.r.l = he.l;
+      he.edge = null;
+    },
+
+    right: function(he) {
+      return he.r;
+    },
+
+    left: function(he) {
+      return he.l;
+    },
+
+    leftRegion: function(he) {
+      return he.edge == null
+          ? Sites.bottomSite
+          : he.edge.region[he.side];
+    },
+
+    rightRegion: function(he) {
+      return he.edge == null
+          ? Sites.bottomSite
+          : he.edge.region[d3_voronoi_opposite[he.side]];
+    }
+  };
+
+  var Geom = {
+
+    bisect: function(s1, s2) {
+      var newEdge = {
+        region: {"l": s1, "r": s2},
+        ep: {"l": null, "r": null}
+      };
+
+      var dx = s2.x - s1.x,
+          dy = s2.y - s1.y,
+          adx = dx > 0 ? dx : -dx,
+          ady = dy > 0 ? dy : -dy;
+
+      newEdge.c = s1.x * dx + s1.y * dy
+          + (dx * dx + dy * dy) * .5;
+
+      if (adx > ady) {
+        newEdge.a = 1;
+        newEdge.b = dy / dx;
+        newEdge.c /= dx;
+      } else {
+        newEdge.b = 1;
+        newEdge.a = dx / dy;
+        newEdge.c /= dy;
+      }
+
+      return newEdge;
+    },
+
+    intersect: function(el1, el2) {
+      var e1 = el1.edge,
+          e2 = el2.edge;
+      if (!e1 || !e2 || (e1.region.r == e2.region.r)) {
+        return null;
+      }
+      var d = (e1.a * e2.b) - (e1.b * e2.a);
+      if (Math.abs(d) < 1e-10) {
+        return null;
+      }
+      var xint = (e1.c * e2.b - e2.c * e1.b) / d,
+          yint = (e2.c * e1.a - e1.c * e2.a) / d,
+          e1r = e1.region.r,
+          e2r = e2.region.r,
+          el,
+          e;
+      if ((e1r.y < e2r.y) ||
+         (e1r.y == e2r.y && e1r.x < e2r.x)) {
+        el = el1;
+        e = e1;
+      } else {
+        el = el2;
+        e = e2;
+      }
+      var rightOfSite = (xint >= e.region.r.x);
+      if ((rightOfSite && (el.side === "l")) ||
+        (!rightOfSite && (el.side === "r"))) {
+        return null;
+      }
+      return {
+        x: xint,
+        y: yint
+      };
+    },
+
+    rightOf: function(he, p) {
+      var e = he.edge,
+          topsite = e.region.r,
+          rightOfSite = (p.x > topsite.x);
+
+      if (rightOfSite && (he.side === "l")) {
+        return 1;
+      }
+      if (!rightOfSite && (he.side === "r")) {
+        return 0;
+      }
+      if (e.a === 1) {
+        var dyp = p.y - topsite.y,
+            dxp = p.x - topsite.x,
+            fast = 0,
+            above = 0;
+
+        if ((!rightOfSite && (e.b < 0)) ||
+          (rightOfSite && (e.b >= 0))) {
+          above = fast = (dyp >= e.b * dxp);
+        } else {
+          above = ((p.x + p.y * e.b) > e.c);
+          if (e.b < 0) {
+            above = !above;
+          }
+          if (!above) {
+            fast = 1;
+          }
+        }
+        if (!fast) {
+          var dxs = topsite.x - e.region.l.x;
+          above = (e.b * (dxp * dxp - dyp * dyp)) <
+            (dxs * dyp * (1 + 2 * dxp / dxs + e.b * e.b));
+
+          if (e.b < 0) {
+            above = !above;
+          }
+        }
+      } else /* e.b == 1 */ {
+        var yl = e.c - e.a * p.x,
+            t1 = p.y - yl,
+            t2 = p.x - topsite.x,
+            t3 = yl - topsite.y;
+
+        above = (t1 * t1) > (t2 * t2 + t3 * t3);
+      }
+      return he.side === "l" ? above : !above;
+    },
+
+    endPoint: function(edge, side, site) {
+      edge.ep[side] = site;
+      if (!edge.ep[d3_voronoi_opposite[side]]) return;
+      callback(edge);
+    },
+
+    distance: function(s, t) {
+      var dx = s.x - t.x,
+          dy = s.y - t.y;
+      return Math.sqrt(dx * dx + dy * dy);
+    }
+  };
+
+  var EventQueue = {
+    list: [],
+
+    insert: function(he, site, offset) {
+      he.vertex = site;
+      he.ystar = site.y + offset;
+      for (var i=0, list=EventQueue.list, l=list.length; i<l; i++) {
+        var next = list[i];
+        if (he.ystar > next.ystar ||
+          (he.ystar == next.ystar &&
+          site.x > next.vertex.x)) {
+          continue;
+        } else {
+          break;
+        }
+      }
+      list.splice(i, 0, he);
+    },
+
+    del: function(he) {
+      for (var i=0, ls=EventQueue.list, l=ls.length; i<l && (ls[i] != he); ++i) {}
+      ls.splice(i, 1);
+    },
+
+    empty: function() { return EventQueue.list.length === 0; },
+
+    nextEvent: function(he) {
+      for (var i=0, ls=EventQueue.list, l=ls.length; i<l; ++i) {
+        if (ls[i] == he) return ls[i+1];
+      }
+      return null;
+    },
+
+    min: function() {
+      var elem = EventQueue.list[0];
+      return {
+        x: elem.vertex.x,
+        y: elem.ystar
+      };
+    },
+
+    extractMin: function() {
+      return EventQueue.list.shift();
+    }
+  };
+
+  EdgeList.init();
+  Sites.bottomSite = Sites.list.shift();
+
+  var newSite = Sites.list.shift(), newIntStar;
+  var lbnd, rbnd, llbnd, rrbnd, bisector;
+  var bot, top, temp, p, v;
+  var e, pm;
+
+  while (true) {
+    if (!EventQueue.empty()) {
+      newIntStar = EventQueue.min();
+    }
+    if (newSite && (EventQueue.empty()
+      || newSite.y < newIntStar.y
+      || (newSite.y == newIntStar.y
+      && newSite.x < newIntStar.x))) { //new site is smallest
+      lbnd = EdgeList.leftBound(newSite);
+      rbnd = EdgeList.right(lbnd);
+      bot = EdgeList.rightRegion(lbnd);
+      e = Geom.bisect(bot, newSite);
+      bisector = EdgeList.createHalfEdge(e, "l");
+      EdgeList.insert(lbnd, bisector);
+      p = Geom.intersect(lbnd, bisector);
+      if (p) {
+        EventQueue.del(lbnd);
+        EventQueue.insert(lbnd, p, Geom.distance(p, newSite));
+      }
+      lbnd = bisector;
+      bisector = EdgeList.createHalfEdge(e, "r");
+      EdgeList.insert(lbnd, bisector);
+      p = Geom.intersect(bisector, rbnd);
+      if (p) {
+        EventQueue.insert(bisector, p, Geom.distance(p, newSite));
+      }
+      newSite = Sites.list.shift();
+    } else if (!EventQueue.empty()) { //intersection is smallest
+      lbnd = EventQueue.extractMin();
+      llbnd = EdgeList.left(lbnd);
+      rbnd = EdgeList.right(lbnd);
+      rrbnd = EdgeList.right(rbnd);
+      bot = EdgeList.leftRegion(lbnd);
+      top = EdgeList.rightRegion(rbnd);
+      v = lbnd.vertex;
+      Geom.endPoint(lbnd.edge, lbnd.side, v);
+      Geom.endPoint(rbnd.edge, rbnd.side, v);
+      EdgeList.del(lbnd);
+      EventQueue.del(rbnd);
+      EdgeList.del(rbnd);
+      pm = "l";
+      if (bot.y > top.y) {
+        temp = bot;
+        bot = top;
+        top = temp;
+        pm = "r";
+      }
+      e = Geom.bisect(bot, top);
+      bisector = EdgeList.createHalfEdge(e, pm);
+      EdgeList.insert(llbnd, bisector);
+      Geom.endPoint(e, d3_voronoi_opposite[pm], v);
+      p = Geom.intersect(llbnd, bisector);
+      if (p) {
+        EventQueue.del(llbnd);
+        EventQueue.insert(llbnd, p, Geom.distance(p, bot));
+      }
+      p = Geom.intersect(bisector, rrbnd);
+      if (p) {
+        EventQueue.insert(bisector, p, Geom.distance(p, bot));
+      }
+    } else {
+      break;
+    }
+  }//end while
+
+  for (lbnd = EdgeList.right(EdgeList.leftEnd);
+      lbnd != EdgeList.rightEnd;
+      lbnd = EdgeList.right(lbnd)) {
+    callback(lbnd.edge);
+  }
+}
diff --git a/static/demo/components/d3/src/layout/bundle.js b/static/demo/components/d3/src/layout/bundle.js
new file mode 100644
index 0000000000000000000000000000000000000000..947d67a66081d9cda46372a86e790d04b8e0c2ef
--- /dev/null
+++ b/static/demo/components/d3/src/layout/bundle.js
@@ -0,0 +1,57 @@
+// Implements hierarchical edge bundling using Holten's algorithm. For each
+// input link, a path is computed that travels through the tree, up the parent
+// hierarchy to the least common ancestor, and then back down to the destination
+// node. Each path is simply an array of nodes.
+d3.layout.bundle = function() {
+  return function(links) {
+    var paths = [],
+        i = -1,
+        n = links.length;
+    while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
+    return paths;
+  };
+};
+
+function d3_layout_bundlePath(link) {
+  var start = link.source,
+      end = link.target,
+      lca = d3_layout_bundleLeastCommonAncestor(start, end),
+      points = [start];
+  while (start !== lca) {
+    start = start.parent;
+    points.push(start);
+  }
+  var k = points.length;
+  while (end !== lca) {
+    points.splice(k, 0, end);
+    end = end.parent;
+  }
+  return points;
+}
+
+function d3_layout_bundleAncestors(node) {
+  var ancestors = [],
+      parent = node.parent;
+  while (parent != null) {
+    ancestors.push(node);
+    node = parent;
+    parent = parent.parent;
+  }
+  ancestors.push(node);
+  return ancestors;
+}
+
+function d3_layout_bundleLeastCommonAncestor(a, b) {
+  if (a === b) return a;
+  var aNodes = d3_layout_bundleAncestors(a),
+      bNodes = d3_layout_bundleAncestors(b),
+      aNode = aNodes.pop(),
+      bNode = bNodes.pop(),
+      sharedNode = null;
+  while (aNode === bNode) {
+    sharedNode = aNode;
+    aNode = aNodes.pop();
+    bNode = bNodes.pop();
+  }
+  return sharedNode;
+}
diff --git a/static/demo/components/d3/src/layout/chord.js b/static/demo/components/d3/src/layout/chord.js
new file mode 100644
index 0000000000000000000000000000000000000000..561d6a04b83472f2bea0ec56c8af9a4aadc61dab
--- /dev/null
+++ b/static/demo/components/d3/src/layout/chord.js
@@ -0,0 +1,153 @@
+d3.layout.chord = function() {
+  var chord = {},
+      chords,
+      groups,
+      matrix,
+      n,
+      padding = 0,
+      sortGroups,
+      sortSubgroups,
+      sortChords;
+
+  function relayout() {
+    var subgroups = {},
+        groupSums = [],
+        groupIndex = d3.range(n),
+        subgroupIndex = [],
+        k,
+        x,
+        x0,
+        i,
+        j;
+
+    chords = [];
+    groups = [];
+
+    // Compute the sum.
+    k = 0, i = -1; while (++i < n) {
+      x = 0, j = -1; while (++j < n) {
+        x += matrix[i][j];
+      }
+      groupSums.push(x);
+      subgroupIndex.push(d3.range(n));
+      k += x;
+    }
+
+    // Sort groups…
+    if (sortGroups) {
+      groupIndex.sort(function(a, b) {
+        return sortGroups(groupSums[a], groupSums[b]);
+      });
+    }
+
+    // Sort subgroups…
+    if (sortSubgroups) {
+      subgroupIndex.forEach(function(d, i) {
+        d.sort(function(a, b) {
+          return sortSubgroups(matrix[i][a], matrix[i][b]);
+        });
+      });
+    }
+
+    // Convert the sum to scaling factor for [0, 2pi].
+    // TODO Allow start and end angle to be specified.
+    // TODO Allow padding to be specified as percentage?
+    k = (2 * π - padding * n) / k;
+
+    // Compute the start and end angle for each group and subgroup.
+    // Note: Opera has a bug reordering object literal properties!
+    x = 0, i = -1; while (++i < n) {
+      x0 = x, j = -1; while (++j < n) {
+        var di = groupIndex[i],
+            dj = subgroupIndex[di][j],
+            v = matrix[di][dj],
+            a0 = x,
+            a1 = x += v * k;
+        subgroups[di + "-" + dj] = {
+          index: di,
+          subindex: dj,
+          startAngle: a0,
+          endAngle: a1,
+          value: v
+        };
+      }
+      groups[di] = {
+        index: di,
+        startAngle: x0,
+        endAngle: x,
+        value: (x - x0) / k
+      };
+      x += padding;
+    }
+
+    // Generate chords for each (non-empty) subgroup-subgroup link.
+    i = -1; while (++i < n) {
+      j = i - 1; while (++j < n) {
+        var source = subgroups[i + "-" + j],
+            target = subgroups[j + "-" + i];
+        if (source.value || target.value) {
+          chords.push(source.value < target.value
+              ? {source: target, target: source}
+              : {source: source, target: target});
+        }
+      }
+    }
+
+    if (sortChords) resort();
+  }
+
+  function resort() {
+    chords.sort(function(a, b) {
+      return sortChords(
+          (a.source.value + a.target.value) / 2,
+          (b.source.value + b.target.value) / 2);
+    });
+  }
+
+  chord.matrix = function(x) {
+    if (!arguments.length) return matrix;
+    n = (matrix = x) && matrix.length;
+    chords = groups = null;
+    return chord;
+  };
+
+  chord.padding = function(x) {
+    if (!arguments.length) return padding;
+    padding = x;
+    chords = groups = null;
+    return chord;
+  };
+
+  chord.sortGroups = function(x) {
+    if (!arguments.length) return sortGroups;
+    sortGroups = x;
+    chords = groups = null;
+    return chord;
+  };
+
+  chord.sortSubgroups = function(x) {
+    if (!arguments.length) return sortSubgroups;
+    sortSubgroups = x;
+    chords = null;
+    return chord;
+  };
+
+  chord.sortChords = function(x) {
+    if (!arguments.length) return sortChords;
+    sortChords = x;
+    if (chords) resort();
+    return chord;
+  };
+
+  chord.chords = function() {
+    if (!chords) relayout();
+    return chords;
+  };
+
+  chord.groups = function() {
+    if (!groups) relayout();
+    return groups;
+  };
+
+  return chord;
+};
diff --git a/static/demo/components/d3/src/layout/cluster.js b/static/demo/components/d3/src/layout/cluster.js
new file mode 100644
index 0000000000000000000000000000000000000000..dfacc60764957dde1eecc0547a150795fad4341b
--- /dev/null
+++ b/static/demo/components/d3/src/layout/cluster.js
@@ -0,0 +1,77 @@
+// Implements a hierarchical layout using the cluster (or dendrogram)
+// algorithm.
+d3.layout.cluster = function() {
+  var hierarchy = d3.layout.hierarchy().sort(null).value(null),
+      separation = d3_layout_treeSeparation,
+      size = [1, 1]; // width, height
+
+  function cluster(d, i) {
+    var nodes = hierarchy.call(this, d, i),
+        root = nodes[0],
+        previousNode,
+        x = 0;
+
+    // First walk, computing the initial x & y values.
+    d3_layout_treeVisitAfter(root, function(node) {
+      var children = node.children;
+      if (children && children.length) {
+        node.x = d3_layout_clusterX(children);
+        node.y = d3_layout_clusterY(children);
+      } else {
+        node.x = previousNode ? x += separation(node, previousNode) : 0;
+        node.y = 0;
+        previousNode = node;
+      }
+    });
+
+    // Compute the left-most, right-most, and depth-most nodes for extents.
+    var left = d3_layout_clusterLeft(root),
+        right = d3_layout_clusterRight(root),
+        x0 = left.x - separation(left, right) / 2,
+        x1 = right.x + separation(right, left) / 2;
+
+    // Second walk, normalizing x & y to the desired size.
+    d3_layout_treeVisitAfter(root, function(node) {
+      node.x = (node.x - x0) / (x1 - x0) * size[0];
+      node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];
+    });
+
+    return nodes;
+  }
+
+  cluster.separation = function(x) {
+    if (!arguments.length) return separation;
+    separation = x;
+    return cluster;
+  };
+
+  cluster.size = function(x) {
+    if (!arguments.length) return size;
+    size = x;
+    return cluster;
+  };
+
+  return d3_layout_hierarchyRebind(cluster, hierarchy);
+};
+
+function d3_layout_clusterY(children) {
+  return 1 + d3.max(children, function(child) {
+    return child.y;
+  });
+}
+
+function d3_layout_clusterX(children) {
+  return children.reduce(function(x, child) {
+    return x + child.x;
+  }, 0) / children.length;
+}
+
+function d3_layout_clusterLeft(node) {
+  var children = node.children;
+  return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
+}
+
+function d3_layout_clusterRight(node) {
+  var children = node.children, n;
+  return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
+}
diff --git a/static/demo/components/d3/src/layout/force.js b/static/demo/components/d3/src/layout/force.js
new file mode 100644
index 0000000000000000000000000000000000000000..441f6a448cfff6043a918b74b07127296307b133
--- /dev/null
+++ b/static/demo/components/d3/src/layout/force.js
@@ -0,0 +1,350 @@
+// A rudimentary force layout using Gauss-Seidel.
+d3.layout.force = function() {
+  var force = {},
+      event = d3.dispatch("start", "tick", "end"),
+      size = [1, 1],
+      drag,
+      alpha,
+      friction = .9,
+      linkDistance = d3_layout_forceLinkDistance,
+      linkStrength = d3_layout_forceLinkStrength,
+      charge = -30,
+      gravity = .1,
+      theta = .8,
+      nodes = [],
+      links = [],
+      distances,
+      strengths,
+      charges;
+
+  function repulse(node) {
+    return function(quad, x1, _, x2) {
+      if (quad.point !== node) {
+        var dx = quad.cx - node.x,
+            dy = quad.cy - node.y,
+            dn = 1 / Math.sqrt(dx * dx + dy * dy);
+
+        /* Barnes-Hut criterion. */
+        if ((x2 - x1) * dn < theta) {
+          var k = quad.charge * dn * dn;
+          node.px -= dx * k;
+          node.py -= dy * k;
+          return true;
+        }
+
+        if (quad.point && isFinite(dn)) {
+          var k = quad.pointCharge * dn * dn;
+          node.px -= dx * k;
+          node.py -= dy * k;
+        }
+      }
+      return !quad.charge;
+    };
+  }
+
+  force.tick = function() {
+    // simulated annealing, basically
+    if ((alpha *= .99) < .005) {
+      event.end({type: "end", alpha: alpha = 0});
+      return true;
+    }
+
+    var n = nodes.length,
+        m = links.length,
+        q,
+        i, // current index
+        o, // current object
+        s, // current source
+        t, // current target
+        l, // current distance
+        k, // current force
+        x, // x-distance
+        y; // y-distance
+
+    // gauss-seidel relaxation for links
+    for (i = 0; i < m; ++i) {
+      o = links[i];
+      s = o.source;
+      t = o.target;
+      x = t.x - s.x;
+      y = t.y - s.y;
+      if (l = (x * x + y * y)) {
+        l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
+        x *= l;
+        y *= l;
+        t.x -= x * (k = s.weight / (t.weight + s.weight));
+        t.y -= y * k;
+        s.x += x * (k = 1 - k);
+        s.y += y * k;
+      }
+    }
+
+    // apply gravity forces
+    if (k = alpha * gravity) {
+      x = size[0] / 2;
+      y = size[1] / 2;
+      i = -1; if (k) while (++i < n) {
+        o = nodes[i];
+        o.x += (x - o.x) * k;
+        o.y += (y - o.y) * k;
+      }
+    }
+
+    // compute quadtree center of mass and apply charge forces
+    if (charge) {
+      d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
+      i = -1; while (++i < n) {
+        if (!(o = nodes[i]).fixed) {
+          q.visit(repulse(o));
+        }
+      }
+    }
+
+    // position verlet integration
+    i = -1; while (++i < n) {
+      o = nodes[i];
+      if (o.fixed) {
+        o.x = o.px;
+        o.y = o.py;
+      } else {
+        o.x -= (o.px - (o.px = o.x)) * friction;
+        o.y -= (o.py - (o.py = o.y)) * friction;
+      }
+    }
+
+    event.tick({type: "tick", alpha: alpha});
+  };
+
+  force.nodes = function(x) {
+    if (!arguments.length) return nodes;
+    nodes = x;
+    return force;
+  };
+
+  force.links = function(x) {
+    if (!arguments.length) return links;
+    links = x;
+    return force;
+  };
+
+  force.size = function(x) {
+    if (!arguments.length) return size;
+    size = x;
+    return force;
+  };
+
+  force.linkDistance = function(x) {
+    if (!arguments.length) return linkDistance;
+    linkDistance = typeof x === "function" ? x : +x;
+    return force;
+  };
+
+  // For backwards-compatibility.
+  force.distance = force.linkDistance;
+
+  force.linkStrength = function(x) {
+    if (!arguments.length) return linkStrength;
+    linkStrength = typeof x === "function" ? x : +x;
+    return force;
+  };
+
+  force.friction = function(x) {
+    if (!arguments.length) return friction;
+    friction = +x;
+    return force;
+  };
+
+  force.charge = function(x) {
+    if (!arguments.length) return charge;
+    charge = typeof x === "function" ? x : +x;
+    return force;
+  };
+
+  force.gravity = function(x) {
+    if (!arguments.length) return gravity;
+    gravity = +x;
+    return force;
+  };
+
+  force.theta = function(x) {
+    if (!arguments.length) return theta;
+    theta = +x;
+    return force;
+  };
+
+  force.alpha = function(x) {
+    if (!arguments.length) return alpha;
+
+    x = +x;
+    if (alpha) { // if we're already running
+      if (x > 0) alpha = x; // we might keep it hot
+      else alpha = 0; // or, next tick will dispatch "end"
+    } else if (x > 0) { // otherwise, fire it up!
+      event.start({type: "start", alpha: alpha = x});
+      d3.timer(force.tick);
+    }
+
+    return force;
+  };
+
+  force.start = function() {
+    var i,
+        j,
+        n = nodes.length,
+        m = links.length,
+        w = size[0],
+        h = size[1],
+        neighbors,
+        o;
+
+    for (i = 0; i < n; ++i) {
+      (o = nodes[i]).index = i;
+      o.weight = 0;
+    }
+
+    for (i = 0; i < m; ++i) {
+      o = links[i];
+      if (typeof o.source == "number") o.source = nodes[o.source];
+      if (typeof o.target == "number") o.target = nodes[o.target];
+      ++o.source.weight;
+      ++o.target.weight;
+    }
+
+    for (i = 0; i < n; ++i) {
+      o = nodes[i];
+      if (isNaN(o.x)) o.x = position("x", w);
+      if (isNaN(o.y)) o.y = position("y", h);
+      if (isNaN(o.px)) o.px = o.x;
+      if (isNaN(o.py)) o.py = o.y;
+    }
+
+    distances = [];
+    if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i);
+    else for (i = 0; i < m; ++i) distances[i] = linkDistance;
+
+    strengths = [];
+    if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i);
+    else for (i = 0; i < m; ++i) strengths[i] = linkStrength;
+
+    charges = [];
+    if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i);
+    else for (i = 0; i < n; ++i) charges[i] = charge;
+
+    // initialize node position based on first neighbor
+    function position(dimension, size) {
+      var neighbors = neighbor(i),
+          j = -1,
+          m = neighbors.length,
+          x;
+      while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x;
+      return Math.random() * size;
+    }
+
+    // initialize neighbors lazily
+    function neighbor() {
+      if (!neighbors) {
+        neighbors = [];
+        for (j = 0; j < n; ++j) {
+          neighbors[j] = [];
+        }
+        for (j = 0; j < m; ++j) {
+          var o = links[j];
+          neighbors[o.source.index].push(o.target);
+          neighbors[o.target.index].push(o.source);
+        }
+      }
+      return neighbors[i];
+    }
+
+    return force.resume();
+  };
+
+  force.resume = function() {
+    return force.alpha(.1);
+  };
+
+  force.stop = function() {
+    return force.alpha(0);
+  };
+
+  // use `node.call(force.drag)` to make nodes draggable
+  force.drag = function() {
+    if (!drag) drag = d3.behavior.drag()
+        .origin(d3_identity)
+        .on("dragstart.force", d3_layout_forceDragstart)
+        .on("drag.force", dragmove)
+        .on("dragend.force", d3_layout_forceDragend);
+
+    if (!arguments.length) return drag;
+
+    this.on("mouseover.force", d3_layout_forceMouseover)
+        .on("mouseout.force", d3_layout_forceMouseout)
+        .call(drag);
+  };
+
+  function dragmove(d) {
+    d.px = d3.event.x, d.py = d3.event.y;
+    force.resume(); // restart annealing
+  }
+
+  return d3.rebind(force, event, "on");
+};
+
+// The fixed property has three bits:
+// Bit 1 can be set externally (e.g., d.fixed = true) and show persist.
+// Bit 2 stores the dragging state, from mousedown to mouseup.
+// Bit 3 stores the hover state, from mouseover to mouseout.
+// Dragend is a special case: it also clears the hover state.
+
+function d3_layout_forceDragstart(d) {
+  d.fixed |= 2; // set bit 2
+}
+
+function d3_layout_forceDragend(d) {
+  d.fixed &= ~6; // unset bits 2 and 3
+}
+
+function d3_layout_forceMouseover(d) {
+  d.fixed |= 4; // set bit 3
+  d.px = d.x, d.py = d.y; // set velocity to zero
+}
+
+function d3_layout_forceMouseout(d) {
+  d.fixed &= ~4; // unset bit 3
+}
+
+function d3_layout_forceAccumulate(quad, alpha, charges) {
+  var cx = 0,
+      cy = 0;
+  quad.charge = 0;
+  if (!quad.leaf) {
+    var nodes = quad.nodes,
+        n = nodes.length,
+        i = -1,
+        c;
+    while (++i < n) {
+      c = nodes[i];
+      if (c == null) continue;
+      d3_layout_forceAccumulate(c, alpha, charges);
+      quad.charge += c.charge;
+      cx += c.charge * c.cx;
+      cy += c.charge * c.cy;
+    }
+  }
+  if (quad.point) {
+    // jitter internal nodes that are coincident
+    if (!quad.leaf) {
+      quad.point.x += Math.random() - .5;
+      quad.point.y += Math.random() - .5;
+    }
+    var k = alpha * charges[quad.point.index];
+    quad.charge += quad.pointCharge = k;
+    cx += k * quad.point.x;
+    cy += k * quad.point.y;
+  }
+  quad.cx = cx / quad.charge;
+  quad.cy = cy / quad.charge;
+}
+
+var d3_layout_forceLinkDistance = 20,
+    d3_layout_forceLinkStrength = 1;
diff --git a/static/demo/components/d3/src/layout/hierarchy.js b/static/demo/components/d3/src/layout/hierarchy.js
new file mode 100644
index 0000000000000000000000000000000000000000..847487cf2f803b90065d70984f28dfd09a996604
--- /dev/null
+++ b/static/demo/components/d3/src/layout/hierarchy.js
@@ -0,0 +1,112 @@
+d3.layout.hierarchy = function() {
+  var sort = d3_layout_hierarchySort,
+      children = d3_layout_hierarchyChildren,
+      value = d3_layout_hierarchyValue;
+
+  // Recursively compute the node depth and value.
+  // Also converts to a standard hierarchy structure.
+  function recurse(node, depth, nodes) {
+    var childs = children.call(hierarchy, node, depth);
+    node.depth = depth;
+    nodes.push(node);
+    if (childs && (n = childs.length)) {
+      var i = -1,
+          n,
+          c = node.children = [],
+          v = 0,
+          j = depth + 1,
+          d;
+      while (++i < n) {
+        d = recurse(childs[i], j, nodes);
+        d.parent = node;
+        c.push(d);
+        v += d.value;
+      }
+      if (sort) c.sort(sort);
+      if (value) node.value = v;
+    } else if (value) {
+      node.value = +value.call(hierarchy, node, depth) || 0;
+    }
+    return node;
+  }
+
+  // Recursively re-evaluates the node value.
+  function revalue(node, depth) {
+    var children = node.children,
+        v = 0;
+    if (children && (n = children.length)) {
+      var i = -1,
+          n,
+          j = depth + 1;
+      while (++i < n) v += revalue(children[i], j);
+    } else if (value) {
+      v = +value.call(hierarchy, node, depth) || 0;
+    }
+    if (value) node.value = v;
+    return v;
+  }
+
+  function hierarchy(d) {
+    var nodes = [];
+    recurse(d, 0, nodes);
+    return nodes;
+  }
+
+  hierarchy.sort = function(x) {
+    if (!arguments.length) return sort;
+    sort = x;
+    return hierarchy;
+  };
+
+  hierarchy.children = function(x) {
+    if (!arguments.length) return children;
+    children = x;
+    return hierarchy;
+  };
+
+  hierarchy.value = function(x) {
+    if (!arguments.length) return value;
+    value = x;
+    return hierarchy;
+  };
+
+  // Re-evaluates the `value` property for the specified hierarchy.
+  hierarchy.revalue = function(root) {
+    revalue(root, 0);
+    return root;
+  };
+
+  return hierarchy;
+};
+
+// A method assignment helper for hierarchy subclasses.
+function d3_layout_hierarchyRebind(object, hierarchy) {
+  d3.rebind(object, hierarchy, "sort", "children", "value");
+
+  // Add an alias for nodes and links, for convenience.
+  object.nodes = object;
+  object.links = d3_layout_hierarchyLinks;
+
+  return object;
+}
+
+function d3_layout_hierarchyChildren(d) {
+  return d.children;
+}
+
+function d3_layout_hierarchyValue(d) {
+  return d.value;
+}
+
+function d3_layout_hierarchySort(a, b) {
+  return b.value - a.value;
+}
+
+// Returns an array source+target objects for the specified nodes.
+function d3_layout_hierarchyLinks(nodes) {
+  return d3.merge(nodes.map(function(parent) {
+    return (parent.children || []).map(function(child) {
+      return {source: parent, target: child};
+    });
+  }));
+}
diff --git a/static/demo/components/d3/src/layout/histogram.js b/static/demo/components/d3/src/layout/histogram.js
new file mode 100644
index 0000000000000000000000000000000000000000..27d4d86dbc144ed547430c2ad19abd89ddf2aa1b
--- /dev/null
+++ b/static/demo/components/d3/src/layout/histogram.js
@@ -0,0 +1,104 @@
+d3.layout.histogram = function() {
+  var frequency = true,
+      valuer = Number,
+      ranger = d3_layout_histogramRange,
+      binner = d3_layout_histogramBinSturges;
+
+  function histogram(data, i) {
+    var bins = [],
+        values = data.map(valuer, this),
+        range = ranger.call(this, values, i),
+        thresholds = binner.call(this, range, values, i),
+        bin,
+        i = -1,
+        n = values.length,
+        m = thresholds.length - 1,
+        k = frequency ? 1 : 1 / n,
+        x;
+
+    // Initialize the bins.
+    while (++i < m) {
+      bin = bins[i] = [];
+      bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
+      bin.y = 0;
+    }
+
+    // Fill the bins, ignoring values outside the range.
+    if (m > 0) {
+      i = -1; while(++i < n) {
+        x = values[i];
+        if (x >= range[0] && x <= range[1]) {
+          bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
+          bin.y += k;
+          bin.push(data[i]);
+        }
+      }
+    }
+
+    return bins;
+  }
+
+  // Specifies how to extract a value from the associated data. The default
+  // value function is `Number`, which is equivalent to the identity function.
+  histogram.value = function(x) {
+    if (!arguments.length) return valuer;
+    valuer = x;
+    return histogram;
+  };
+
+  // Specifies the range of the histogram. Values outside the specified range
+  // will be ignored. The argument `x` may be specified either as a two-element
+  // array representing the minimum and maximum value of the range, or as a
+  // function that returns the range given the array of values and the current
+  // index `i`. The default range is the extent (minimum and maximum) of the
+  // values.
+  histogram.range = function(x) {
+    if (!arguments.length) return ranger;
+    ranger = d3_functor(x);
+    return histogram;
+  };
+
+  // Specifies how to bin values in the histogram. The argument `x` may be
+  // specified as a number, in which case the range of values will be split
+  // uniformly into the given number of bins. Or, `x` may be an array of
+  // threshold values, defining the bins; the specified array must contain the
+  // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x`
+  // may be a function which is evaluated, being passed the range, the array of
+  // values, and the current index `i`, returning an array of thresholds. The
+  // default bin function will divide the values into uniform bins using
+  // Sturges' formula.
+  histogram.bins = function(x) {
+    if (!arguments.length) return binner;
+    binner = typeof x === "number"
+        ? function(range) { return d3_layout_histogramBinFixed(range, x); }
+        : d3_functor(x);
+    return histogram;
+  };
+
+  // Specifies whether the histogram's `y` value is a count (frequency) or a
+  // probability (density). The default value is true.
+  histogram.frequency = function(x) {
+    if (!arguments.length) return frequency;
+    frequency = !!x;
+    return histogram;
+  };
+
+  return histogram;
+};
+
+function d3_layout_histogramBinSturges(range, values) {
+  return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
+}
+
+function d3_layout_histogramBinFixed(range, n) {
+  var x = -1,
+      b = +range[0],
+      m = (range[1] - b) / n,
+      f = [];
+  while (++x <= n) f[x] = m * x + b;
+  return f;
+}
+
+function d3_layout_histogramRange(values) {
+  return [d3.min(values), d3.max(values)];
+}
diff --git a/static/demo/components/d3/src/layout/layout.js b/static/demo/components/d3/src/layout/layout.js
new file mode 100644
index 0000000000000000000000000000000000000000..3bcbccefe6c45794b8d495bbb0c7ab66e74ffe61
--- /dev/null
+++ b/static/demo/components/d3/src/layout/layout.js
@@ -0,0 +1 @@
+d3.layout = {};
diff --git a/static/demo/components/d3/src/layout/pack.js b/static/demo/components/d3/src/layout/pack.js
new file mode 100644
index 0000000000000000000000000000000000000000..67fd21fa07bd72e01c7d9c86ddc3939672d62960
--- /dev/null
+++ b/static/demo/components/d3/src/layout/pack.js
@@ -0,0 +1,205 @@
+d3.layout.pack = function() {
+  var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort),
+      padding = 0,
+      size = [1, 1];
+
+  function pack(d, i) {
+    var nodes = hierarchy.call(this, d, i),
+        root = nodes[0];
+
+    // Recursively compute the layout.
+    root.x = 0;
+    root.y = 0;
+    d3_layout_treeVisitAfter(root, function(d) { d.r = Math.sqrt(d.value); });
+    d3_layout_treeVisitAfter(root, d3_layout_packSiblings);
+
+    // Compute the scale factor the initial layout.
+    var w = size[0],
+        h = size[1],
+        k = Math.max(2 * root.r / w, 2 * root.r / h);
+
+    // When padding, recompute the layout using scaled padding.
+    if (padding > 0) {
+      var dr = padding * k / 2;
+      d3_layout_treeVisitAfter(root, function(d) { d.r += dr; });
+      d3_layout_treeVisitAfter(root, d3_layout_packSiblings);
+      d3_layout_treeVisitAfter(root, function(d) { d.r -= dr; });
+      k = Math.max(2 * root.r / w, 2 * root.r / h);
+    }
+
+    // Scale the layout to fit the requested size.
+    d3_layout_packTransform(root, w / 2, h / 2, 1 / k);
+
+    return nodes;
+  }
+
+  pack.size = function(x) {
+    if (!arguments.length) return size;
+    size = x;
+    return pack;
+  };
+
+  pack.padding = function(_) {
+    if (!arguments.length) return padding;
+    padding = +_;
+    return pack;
+  };
+
+  return d3_layout_hierarchyRebind(pack, hierarchy);
+};
+
+function d3_layout_packSort(a, b) {
+  return a.value - b.value;
+}
+
+function d3_layout_packInsert(a, b) {
+  var c = a._pack_next;
+  a._pack_next = b;
+  b._pack_prev = a;
+  b._pack_next = c;
+  c._pack_prev = b;
+}
+
+function d3_layout_packSplice(a, b) {
+  a._pack_next = b;
+  b._pack_prev = a;
+}
+
+function d3_layout_packIntersects(a, b) {
+  var dx = b.x - a.x,
+      dy = b.y - a.y,
+      dr = a.r + b.r;
+  return dr * dr - dx * dx - dy * dy > .001; // within epsilon
+}
+
+function d3_layout_packSiblings(node) {
+  if (!(nodes = node.children) || !(n = nodes.length)) return;
+
+  var nodes,
+      xMin = Infinity,
+      xMax = -Infinity,
+      yMin = Infinity,
+      yMax = -Infinity,
+      a, b, c, i, j, k, n;
+
+  function bound(node) {
+    xMin = Math.min(node.x - node.r, xMin);
+    xMax = Math.max(node.x + node.r, xMax);
+    yMin = Math.min(node.y - node.r, yMin);
+    yMax = Math.max(node.y + node.r, yMax);
+  }
+
+  // Create node links.
+  nodes.forEach(d3_layout_packLink);
+
+  // Create first node.
+  a = nodes[0];
+  a.x = -a.r;
+  a.y = 0;
+  bound(a);
+
+  // Create second node.
+  if (n > 1) {
+    b = nodes[1];
+    b.x = b.r;
+    b.y = 0;
+    bound(b);
+
+    // Create third node and build chain.
+    if (n > 2) {
+      c = nodes[2];
+      d3_layout_packPlace(a, b, c);
+      bound(c);
+      d3_layout_packInsert(a, c);
+      a._pack_prev = c;
+      d3_layout_packInsert(c, b);
+      b = a._pack_next;
+
+      // Now iterate through the rest.
+      for (i = 3; i < n; i++) {
+        d3_layout_packPlace(a, b, c = nodes[i]);
+
+        // Search for the closest intersection.
+        var isect = 0, s1 = 1, s2 = 1;
+        for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
+          if (d3_layout_packIntersects(j, c)) {
+            isect = 1;
+            break;
+          }
+        }
+        if (isect == 1) {
+          for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
+            if (d3_layout_packIntersects(k, c)) {
+              break;
+            }
+          }
+        }
+
+        // Update node chain.
+        if (isect) {
+          if (s1 < s2 || (s1 == s2 && b.r < a.r)) d3_layout_packSplice(a, b = j);
+          else d3_layout_packSplice(a = k, b);
+          i--;
+        } else {
+          d3_layout_packInsert(a, c);
+          b = c;
+          bound(c);
+        }
+      }
+    }
+  }
+
+  // Re-center the circles and compute the encompassing radius.
+  var cx = (xMin + xMax) / 2,
+      cy = (yMin + yMax) / 2,
+      cr = 0;
+  for (i = 0; i < n; i++) {
+    c = nodes[i];
+    c.x -= cx;
+    c.y -= cy;
+    cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));
+  }
+  node.r = cr;
+
+  // Remove node links.
+  nodes.forEach(d3_layout_packUnlink);
+}
+
+function d3_layout_packLink(node) {
+  node._pack_next = node._pack_prev = node;
+}
+
+function d3_layout_packUnlink(node) {
+  delete node._pack_next;
+  delete node._pack_prev;
+}
+
+function d3_layout_packTransform(node, x, y, k) {
+  var children = node.children;
+  node.x = (x += k * node.x);
+  node.y = (y += k * node.y);
+  node.r *= k;
+  if (children) {
+    var i = -1, n = children.length;
+    while (++i < n) d3_layout_packTransform(children[i], x, y, k);
+  }
+}
+
+function d3_layout_packPlace(a, b, c) {
+  var db = a.r + c.r,
+      dx = b.x - a.x,
+      dy = b.y - a.y;
+  if (db && (dx || dy)) {
+    var da = b.r + c.r,
+        dc = dx * dx + dy * dy;
+    da *= da;
+    db *= db;
+    var x = .5 + (db - da) / (2 * dc),
+        y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
+    c.x = a.x + x * dx + y * dy;
+    c.y = a.y + x * dy - y * dx;
+  } else {
+    c.x = a.x + db;
+    c.y = a.y;
+  }
+}
diff --git a/static/demo/components/d3/src/layout/partition.js b/static/demo/components/d3/src/layout/partition.js
new file mode 100644
index 0000000000000000000000000000000000000000..49257a94bbde285c2d078988cd1f181a30b54634
--- /dev/null
+++ b/static/demo/components/d3/src/layout/partition.js
@@ -0,0 +1,48 @@
+d3.layout.partition = function() {
+  var hierarchy = d3.layout.hierarchy(),
+      size = [1, 1]; // width, height
+
+  function position(node, x, dx, dy) {
+    var children = node.children;
+    node.x = x;
+    node.y = node.depth * dy;
+    node.dx = dx;
+    node.dy = dy;
+    if (children && (n = children.length)) {
+      var i = -1,
+          n,
+          c,
+          d;
+      dx = node.value ? dx / node.value : 0;
+      while (++i < n) {
+        position(c = children[i], x, d = c.value * dx, dy);
+        x += d;
+      }
+    }
+  }
+
+  function depth(node) {
+    var children = node.children,
+        d = 0;
+    if (children && (n = children.length)) {
+      var i = -1,
+          n;
+      while (++i < n) d = Math.max(d, depth(children[i]));
+    }
+    return 1 + d;
+  }
+
+  function partition(d, i) {
+    var nodes = hierarchy.call(this, d, i);
+    position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
+    return nodes;
+  }
+
+  partition.size = function(x) {
+    if (!arguments.length) return size;
+    size = x;
+    return partition;
+  };
+
+  return d3_layout_hierarchyRebind(partition, hierarchy);
+};
diff --git a/static/demo/components/d3/src/layout/pie.js b/static/demo/components/d3/src/layout/pie.js
new file mode 100644
index 0000000000000000000000000000000000000000..dc045f1ab03e4a5268c171b20a2861f627449f21
--- /dev/null
+++ b/static/demo/components/d3/src/layout/pie.js
@@ -0,0 +1,94 @@
+d3.layout.pie = function() {
+  var value = Number,
+      sort = d3_layout_pieSortByValue,
+      startAngle = 0,
+      endAngle = 2 * π;
+
+  function pie(data) {
+
+    // Compute the numeric values for each data element.
+    var values = data.map(function(d, i) { return +value.call(pie, d, i); });
+
+    // Compute the start angle.
+    var a = +(typeof startAngle === "function"
+        ? startAngle.apply(this, arguments)
+        : startAngle);
+
+    // Compute the angular scale factor: from value to radians.
+    var k = ((typeof endAngle === "function"
+        ? endAngle.apply(this, arguments)
+        : endAngle) - startAngle)
+        / d3.sum(values);
+
+    // Optionally sort the data.
+    var index = d3.range(data.length);
+    if (sort != null) index.sort(sort === d3_layout_pieSortByValue
+        ? function(i, j) { return values[j] - values[i]; }
+        : function(i, j) { return sort(data[i], data[j]); });
+
+    // Compute the arcs!
+    // They are stored in the original data's order.
+    var arcs = [];
+    index.forEach(function(i) {
+      var d;
+      arcs[i] = {
+        data: data[i],
+        value: d = values[i],
+        startAngle: a,
+        endAngle: a += d * k
+      };
+    });
+    return arcs;
+  }
+
+  /**
+   * Specifies the value function *x*, which returns a nonnegative numeric value
+   * for each datum. The default value function is `Number`. The value function
+   * is passed two arguments: the current datum and the current index.
+   */
+  pie.value = function(x) {
+    if (!arguments.length) return value;
+    value = x;
+    return pie;
+  };
+
+  /**
+   * Specifies a sort comparison operator *x*. The comparator is passed two data
+   * elements from the data array, a and b; it returns a negative value if a is
+   * less than b, a positive value if a is greater than b, and zero if a equals
+   * b.
+   */
+  pie.sort = function(x) {
+    if (!arguments.length) return sort;
+    sort = x;
+    return pie;
+  };
+
+  /**
+   * Specifies the overall start angle of the pie chart. Defaults to 0. The
+   * start angle can be specified either as a constant or as a function; in the
+   * case of a function, it is evaluated once per array (as opposed to per
+   * element).
+   */
+  pie.startAngle = function(x) {
+    if (!arguments.length) return startAngle;
+    startAngle = x;
+    return pie;
+  };
+
+  /**
+   * Specifies the overall end angle of the pie chart. Defaults to 2Ï€. The
+   * end angle can be specified either as a constant or as a function; in the
+   * case of a function, it is evaluated once per array (as opposed to per
+   * element).
+   */
+  pie.endAngle = function(x) {
+    if (!arguments.length) return endAngle;
+    endAngle = x;
+    return pie;
+  };
+
+  return pie;
+};
+
+var d3_layout_pieSortByValue = {};
diff --git a/static/demo/components/d3/src/layout/stack.js b/static/demo/components/d3/src/layout/stack.js
new file mode 100644
index 0000000000000000000000000000000000000000..ef62298756ec454d7ac57f024e2a562535a02fcc
--- /dev/null
+++ b/static/demo/components/d3/src/layout/stack.js
@@ -0,0 +1,240 @@
+// data is two-dimensional array of x,y; we populate y0
+d3.layout.stack = function() {
+  var values = d3_identity,
+      order = d3_layout_stackOrderDefault,
+      offset = d3_layout_stackOffsetZero,
+      out = d3_layout_stackOut,
+      x = d3_layout_stackX,
+      y = d3_layout_stackY;
+
+  function stack(data, index) {
+
+    // Convert series to canonical two-dimensional representation.
+    var series = data.map(function(d, i) {
+      return values.call(stack, d, i);
+    });
+
+    // Convert each series to canonical [[x,y]] representation.
+    var points = series.map(function(d) {
+      return d.map(function(v, i) {
+        return [x.call(stack, v, i), y.call(stack, v, i)];
+      });
+    });
+
+    // Compute the order of series, and permute them.
+    var orders = order.call(stack, points, index);
+    series = d3.permute(series, orders);
+    points = d3.permute(points, orders);
+
+    // Compute the baseline…
+    var offsets = offset.call(stack, points, index);
+
+    // And propagate it to other series.
+    var n = series.length,
+        m = series[0].length,
+        i,
+        j,
+        o;
+    for (j = 0; j < m; ++j) {
+      out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
+      for (i = 1; i < n; ++i) {
+        out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
+      }
+    }
+
+    return data;
+  }
+
+  stack.values = function(x) {
+    if (!arguments.length) return values;
+    values = x;
+    return stack;
+  };
+
+  stack.order = function(x) {
+    if (!arguments.length) return order;
+    order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;
+    return stack;
+  };
+
+  stack.offset = function(x) {
+    if (!arguments.length) return offset;
+    offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;
+    return stack;
+  };
+
+  stack.x = function(z) {
+    if (!arguments.length) return x;
+    x = z;
+    return stack;
+  };
+
+  stack.y = function(z) {
+    if (!arguments.length) return y;
+    y = z;
+    return stack;
+  };
+
+  stack.out = function(z) {
+    if (!arguments.length) return out;
+    out = z;
+    return stack;
+  };
+
+  return stack;
+}
+
+function d3_layout_stackX(d) {
+  return d.x;
+}
+
+function d3_layout_stackY(d) {
+  return d.y;
+}
+
+function d3_layout_stackOut(d, y0, y) {
+  d.y0 = y0;
+  d.y = y;
+}
+
+var d3_layout_stackOrders = d3.map({
+
+  "inside-out": function(data) {
+    var n = data.length,
+        i,
+        j,
+        max = data.map(d3_layout_stackMaxIndex),
+        sums = data.map(d3_layout_stackReduceSum),
+        index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }),
+        top = 0,
+        bottom = 0,
+        tops = [],
+        bottoms = [];
+    for (i = 0; i < n; ++i) {
+      j = index[i];
+      if (top < bottom) {
+        top += sums[j];
+        tops.push(j);
+      } else {
+        bottom += sums[j];
+        bottoms.push(j);
+      }
+    }
+    return bottoms.reverse().concat(tops);
+  },
+
+  "reverse": function(data) {
+    return d3.range(data.length).reverse();
+  },
+
+  "default": d3_layout_stackOrderDefault
+
+});
+
+var d3_layout_stackOffsets = d3.map({
+
+  "silhouette": function(data) {
+    var n = data.length,
+        m = data[0].length,
+        sums = [],
+        max = 0,
+        i,
+        j,
+        o,
+        y0 = [];
+    for (j = 0; j < m; ++j) {
+      for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+      if (o > max) max = o;
+      sums.push(o);
+    }
+    for (j = 0; j < m; ++j) {
+      y0[j] = (max - sums[j]) / 2;
+    }
+    return y0;
+  },
+
+  "wiggle": function(data) {
+    var n = data.length,
+        x = data[0],
+        m = x.length,
+        i,
+        j,
+        k,
+        s1,
+        s2,
+        s3,
+        dx,
+        o,
+        o0,
+        y0 = [];
+    y0[0] = o = o0 = 0;
+    for (j = 1; j < m; ++j) {
+      for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
+      for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
+        for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
+          s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
+        }
+        s2 += s3 * data[i][j][1];
+      }
+      y0[j] = o -= s1 ? s2 / s1 * dx : 0;
+      if (o < o0) o0 = o;
+    }
+    for (j = 0; j < m; ++j) y0[j] -= o0;
+    return y0;
+  },
+
+  "expand": function(data) {
+    var n = data.length,
+        m = data[0].length,
+        k = 1 / n,
+        i,
+        j,
+        o,
+        y0 = [];
+    for (j = 0; j < m; ++j) {
+      for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+      if (o) for (i = 0; i < n; i++) data[i][j][1] /= o;
+      else for (i = 0; i < n; i++) data[i][j][1] = k;
+    }
+    for (j = 0; j < m; ++j) y0[j] = 0;
+    return y0;
+  },
+
+  "zero": d3_layout_stackOffsetZero
+
+});
+
+function d3_layout_stackOrderDefault(data) {
+  return d3.range(data.length);
+}
+
+function d3_layout_stackOffsetZero(data) {
+  var j = -1,
+      m = data[0].length,
+      y0 = [];
+  while (++j < m) y0[j] = 0;
+  return y0;
+}
+
+function d3_layout_stackMaxIndex(array) {
+  var i = 1,
+      j = 0,
+      v = array[0][1],
+      k,
+      n = array.length;
+  for (; i < n; ++i) {
+    if ((k = array[i][1]) > v) {
+      j = i;
+      v = k;
+    }
+  }
+  return j;
+}
+
+function d3_layout_stackReduceSum(d) {
+  return d.reduce(d3_layout_stackSum, 0);
+}
+
+function d3_layout_stackSum(p, d) {
+  return p + d[1];
+}
diff --git a/static/demo/components/d3/src/layout/tree.js b/static/demo/components/d3/src/layout/tree.js
new file mode 100644
index 0000000000000000000000000000000000000000..5b112b66152260e7763cdb073284418683035144
--- /dev/null
+++ b/static/demo/components/d3/src/layout/tree.js
@@ -0,0 +1,237 @@
+// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
+d3.layout.tree = function() {
+  var hierarchy = d3.layout.hierarchy().sort(null).value(null),
+      separation = d3_layout_treeSeparation,
+      size = [1, 1]; // width, height
+
+  function tree(d, i) {
+    var nodes = hierarchy.call(this, d, i),
+        root = nodes[0];
+
+    function firstWalk(node, previousSibling) {
+      var children = node.children,
+          layout = node._tree;
+      if (children && (n = children.length)) {
+        var n,
+            firstChild = children[0],
+            previousChild,
+            ancestor = firstChild,
+            child,
+            i = -1;
+        while (++i < n) {
+          child = children[i];
+          firstWalk(child, previousChild);
+          ancestor = apportion(child, previousChild, ancestor);
+          previousChild = child;
+        }
+        d3_layout_treeShift(node);
+        var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim);
+        if (previousSibling) {
+          layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
+          layout.mod = layout.prelim - midpoint;
+        } else {
+          layout.prelim = midpoint;
+        }
+      } else {
+        if (previousSibling) {
+          layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);
+        }
+      }
+    }
+
+    function secondWalk(node, x) {
+      node.x = node._tree.prelim + x;
+      var children = node.children;
+      if (children && (n = children.length)) {
+        var i = -1,
+            n;
+        x += node._tree.mod;
+        while (++i < n) {
+          secondWalk(children[i], x);
+        }
+      }
+    }
+
+    function apportion(node, previousSibling, ancestor) {
+      if (previousSibling) {
+        var vip = node,
+            vop = node,
+            vim = previousSibling,
+            vom = node.parent.children[0],
+            sip = vip._tree.mod,
+            sop = vop._tree.mod,
+            sim = vim._tree.mod,
+            som = vom._tree.mod,
+            shift;
+        while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
+          vom = d3_layout_treeLeft(vom);
+          vop = d3_layout_treeRight(vop);
+          vop._tree.ancestor = node;
+          shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip);
+          if (shift > 0) {
+            d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift);
+            sip += shift;
+            sop += shift;
+          }
+          sim += vim._tree.mod;
+          sip += vip._tree.mod;
+          som += vom._tree.mod;
+          sop += vop._tree.mod;
+        }
+        if (vim && !d3_layout_treeRight(vop)) {
+          vop._tree.thread = vim;
+          vop._tree.mod += sim - sop;
+        }
+        if (vip && !d3_layout_treeLeft(vom)) {
+          vom._tree.thread = vip;
+          vom._tree.mod += sip - som;
+          ancestor = node;
+        }
+      }
+      return ancestor;
+    }
+
+    // Initialize temporary layout variables.
+    d3_layout_treeVisitAfter(root, function(node, previousSibling) {
+      node._tree = {
+        ancestor: node,
+        prelim: 0,
+        mod: 0,
+        change: 0,
+        shift: 0,
+        number: previousSibling ? previousSibling._tree.number + 1 : 0
+      };
+    });
+
+    // Compute the layout using Buchheim et al.'s algorithm.
+    firstWalk(root);
+    secondWalk(root, -root._tree.prelim);
+
+    // Compute the left-most, right-most, and depth-most nodes for extents.
+    var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost),
+        right = d3_layout_treeSearch(root, d3_layout_treeRightmost),
+        deep = d3_layout_treeSearch(root, d3_layout_treeDeepest),
+        x0 = left.x - separation(left, right) / 2,
+        x1 = right.x + separation(right, left) / 2,
+        y1 = deep.depth || 1;
+
+    // Clear temporary layout variables; transform x and y.
+    d3_layout_treeVisitAfter(root, function(node) {
+      node.x = (node.x - x0) / (x1 - x0) * size[0];
+      node.y = node.depth / y1 * size[1];
+      delete node._tree;
+    });
+
+    return nodes;
+  }
+
+  tree.separation = function(x) {
+    if (!arguments.length) return separation;
+    separation = x;
+    return tree;
+  };
+
+  tree.size = function(x) {
+    if (!arguments.length) return size;
+    size = x;
+    return tree;
+  };
+
+  return d3_layout_hierarchyRebind(tree, hierarchy);
+};
+
+function d3_layout_treeSeparation(a, b) {
+  return a.parent == b.parent ? 1 : 2;
+}
+
+// function d3_layout_treeSeparationRadial(a, b) {
+//   return (a.parent == b.parent ? 1 : 2) / a.depth;
+// }
+
+function d3_layout_treeLeft(node) {
+  var children = node.children;
+  return children && children.length ? children[0] : node._tree.thread;
+}
+
+function d3_layout_treeRight(node) {
+  var children = node.children,
+      n;
+  return children && (n = children.length) ? children[n - 1] : node._tree.thread;
+}
+
+function d3_layout_treeSearch(node, compare) {
+  var children = node.children;
+  if (children && (n = children.length)) {
+    var child,
+        n,
+        i = -1;
+    while (++i < n) {
+      if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) {
+        node = child;
+      }
+    }
+  }
+  return node;
+}
+
+function d3_layout_treeRightmost(a, b) {
+  return a.x - b.x;
+}
+
+function d3_layout_treeLeftmost(a, b) {
+  return b.x - a.x;
+}
+
+function d3_layout_treeDeepest(a, b) {
+  return a.depth - b.depth;
+}
+
+function d3_layout_treeVisitAfter(node, callback) {
+  function visit(node, previousSibling) {
+    var children = node.children;
+    if (children && (n = children.length)) {
+      var child,
+          previousChild = null,
+          i = -1,
+          n;
+      while (++i < n) {
+        child = children[i];
+        visit(child, previousChild);
+        previousChild = child;
+      }
+    }
+    callback(node, previousSibling);
+  }
+  visit(node, null);
+}
+
+function d3_layout_treeShift(node) {
+  var shift = 0,
+      change = 0,
+      children = node.children,
+      i = children.length,
+      child;
+  while (--i >= 0) {
+    child = children[i]._tree;
+    child.prelim += shift;
+    child.mod += shift;
+    shift += child.shift + (change += child.change);
+  }
+}
+
+function d3_layout_treeMove(ancestor, node, shift) {
+  ancestor = ancestor._tree;
+  node = node._tree;
+  var change = shift / (node.number - ancestor.number);
+  ancestor.change += change;
+  node.change -= change;
+  node.shift += shift;
+  node.prelim += shift;
+  node.mod += shift;
+}
+
+function d3_layout_treeAncestor(vim, node, ancestor) {
+  return vim._tree.ancestor.parent == node.parent
+      ? vim._tree.ancestor
+      : ancestor;
+}
diff --git a/static/demo/components/d3/src/layout/treemap.js b/static/demo/components/d3/src/layout/treemap.js
new file mode 100644
index 0000000000000000000000000000000000000000..c1e50a998889053460eb354f0c12f8d039a5fdbe
--- /dev/null
+++ b/static/demo/components/d3/src/layout/treemap.js
@@ -0,0 +1,227 @@
+// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk
+// Modified to support a target aspect ratio by Jeff Heer
+d3.layout.treemap = function() {
+  var hierarchy = d3.layout.hierarchy(),
+      round = Math.round,
+      size = [1, 1], // width, height
+      padding = null,
+      pad = d3_layout_treemapPadNull,
+      sticky = false,
+      stickies,
+      mode = "squarify",
+      ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio
+
+  // Compute the area for each child based on value & scale.
+  function scale(children, k) {
+    var i = -1,
+        n = children.length,
+        child,
+        area;
+    while (++i < n) {
+      area = (child = children[i]).value * (k < 0 ? 0 : k);
+      child.area = isNaN(area) || area <= 0 ? 0 : area;
+    }
+  }
+
+  // Recursively arranges the specified node's children into squarified rows.
+  function squarify(node) {
+    var children = node.children;
+    if (children && children.length) {
+      var rect = pad(node),
+          row = [],
+          remaining = children.slice(), // copy-on-write
+          child,
+          best = Infinity, // the best row score so far
+          score, // the current row score
+          u = mode === "slice" ? rect.dx
+            : mode === "dice" ? rect.dy
+            : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx
+            : Math.min(rect.dx, rect.dy), // initial orientation
+          n;
+      scale(remaining, rect.dx * rect.dy / node.value);
+      row.area = 0;
+      while ((n = remaining.length) > 0) {
+        row.push(child = remaining[n - 1]);
+        row.area += child.area;
+        if (mode !== "squarify" || (score = worst(row, u)) <= best) { // continue with this orientation
+          remaining.pop();
+          best = score;
+        } else { // abort, and try a different orientation
+          row.area -= row.pop().area;
+          position(row, u, rect, false);
+          u = Math.min(rect.dx, rect.dy);
+          row.length = row.area = 0;
+          best = Infinity;
+        }
+      }
+      if (row.length) {
+        position(row, u, rect, true);
+        row.length = row.area = 0;
+      }
+      children.forEach(squarify);
+    }
+  }
+
+  // Recursively resizes the specified node's children into existing rows.
+  // Preserves the existing layout!
+  function stickify(node) {
+    var children = node.children;
+    if (children && children.length) {
+      var rect = pad(node),
+          remaining = children.slice(), // copy-on-write
+          child,
+          row = [];
+      scale(remaining, rect.dx * rect.dy / node.value);
+      row.area = 0;
+      while (child = remaining.pop()) {
+        row.push(child);
+        row.area += child.area;
+        if (child.z != null) {
+          position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);
+          row.length = row.area = 0;
+        }
+      }
+      children.forEach(stickify);
+    }
+  }
+
+  // Computes the score for the specified row, as the worst aspect ratio.
+  function worst(row, u) {
+    var s = row.area,
+        r,
+        rmax = 0,
+        rmin = Infinity,
+        i = -1,
+        n = row.length;
+    while (++i < n) {
+      if (!(r = row[i].area)) continue;
+      if (r < rmin) rmin = r;
+      if (r > rmax) rmax = r;
+    }
+    s *= s;
+    u *= u;
+    return s
+        ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio))
+        : Infinity;
+  }
+
+  // Positions the specified row of nodes. Modifies `rect`.
+  function position(row, u, rect, flush) {
+    var i = -1,
+        n = row.length,
+        x = rect.x,
+        y = rect.y,
+        v = u ? round(row.area / u) : 0,
+        o;
+    if (u == rect.dx) { // horizontal subdivision
+      if (flush || v > rect.dy) v = rect.dy; // over+underflow
+      while (++i < n) {
+        o = row[i];
+        o.x = x;
+        o.y = y;
+        o.dy = v;
+        x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);
+      }
+      o.z = true;
+      o.dx += rect.x + rect.dx - x; // rounding error
+      rect.y += v;
+      rect.dy -= v;
+    } else { // vertical subdivision
+      if (flush || v > rect.dx) v = rect.dx; // over+underflow
+      while (++i < n) {
+        o = row[i];
+        o.x = x;
+        o.y = y;
+        o.dx = v;
+        y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);
+      }
+      o.z = false;
+      o.dy += rect.y + rect.dy - y; // rounding error
+      rect.x += v;
+      rect.dx -= v;
+    }
+  }
+
+  function treemap(d) {
+    var nodes = stickies || hierarchy(d),
+        root = nodes[0];
+    root.x = 0;
+    root.y = 0;
+    root.dx = size[0];
+    root.dy = size[1];
+    if (stickies) hierarchy.revalue(root);
+    scale([root], root.dx * root.dy / root.value);
+    (stickies ? stickify : squarify)(root);
+    if (sticky) stickies = nodes;
+    return nodes;
+  }
+
+  treemap.size = function(x) {
+    if (!arguments.length) return size;
+    size = x;
+    return treemap;
+  };
+
+  treemap.padding = function(x) {
+    if (!arguments.length) return padding;
+
+    function padFunction(node) {
+      var p = x.call(treemap, node, node.depth);
+      return p == null
+          ? d3_layout_treemapPadNull(node)
+          : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p);
+    }
+
+    function padConstant(node) {
+      return d3_layout_treemapPad(node, x);
+    }
+
+    var type;
+    pad = (padding = x) == null ? d3_layout_treemapPadNull
+        : (type = typeof x) === "function" ? padFunction
+        : type === "number" ? (x = [x, x, x, x], padConstant)
+        : padConstant;
+    return treemap;
+  };
+
+  treemap.round = function(x) {
+    if (!arguments.length) return round != Number;
+    round = x ? Math.round : Number;
+    return treemap;
+  };
+
+  treemap.sticky = function(x) {
+    if (!arguments.length) return sticky;
+    sticky = x;
+    stickies = null;
+    return treemap;
+  };
+
+  treemap.ratio = function(x) {
+    if (!arguments.length) return ratio;
+    ratio = x;
+    return treemap;
+  };
+
+  treemap.mode = function(x) {
+    if (!arguments.length) return mode;
+    mode = x + "";
+    return treemap;
+  };
+
+  return d3_layout_hierarchyRebind(treemap, hierarchy);
+};
+
+function d3_layout_treemapPadNull(node) {
+  return {x: node.x, y: node.y, dx: node.dx, dy: node.dy};
+}
+
+function d3_layout_treemapPad(node, padding) {
+  var x = node.x + padding[3],
+      y = node.y + padding[0],
+      dx = node.dx - padding[1] - padding[3],
+      dy = node.dy - padding[0] - padding[2];
+  if (dx < 0) { x += dx / 2; dx = 0; }
+  if (dy < 0) { y += dy / 2; dy = 0; }
+  return {x: x, y: y, dx: dx, dy: dy};
+}
diff --git a/static/demo/components/d3/src/locale.js b/static/demo/components/d3/src/locale.js
new file mode 100644
index 0000000000000000000000000000000000000000..945751edbfb2885142327c3b10a6223dc37fb6ef
--- /dev/null
+++ b/static/demo/components/d3/src/locale.js
@@ -0,0 +1,31 @@
+var fs = require("fs"),
+    puts = require("util").puts,
+    formats = {},
+    kvRe = /=/,
+    valueRe = /;/g,
+    quotedRe = /"([^"]*?)"/g,
+    data = [];
+
+process.stdin.resume();
+process.stdin.setEncoding("utf8");
+process.stdin.on("data", function(chunk) { data.push(chunk); });
+process.stdin.on("end", write);
+
+function write() {
+  data.join("\n").split(/\n/g).forEach(function(line) {
+    var i = line.match(kvRe);
+    if (i && (i = i.index)) {
+      var value = line.substring(i + 1).replace(quotedRe, "$1").split(valueRe);
+      formats[line.substring(0, i)] = value;
+    }
+  });
+
+  puts(fs.readFileSync(process.argv[2], "utf8").replace(/\{([^\}]+)\}/g, function(d, k) {
+    d = formats[k];
+    return k === "grouping"
+        ? d === "127" || d === "0" ? null : "[" + d.map(Number).join(", ") + "]"
+        : d == null ? null : d.length > 1 ? "[" + d.map(quote).join(", ") + "]" : quote(d[0]);
+  }));
+}
+
+function quote(d) { return '"' + d + '"'; }
diff --git a/static/demo/components/d3/src/package.js b/static/demo/components/d3/src/package.js
new file mode 100644
index 0000000000000000000000000000000000000000..e0f25b4f5a3f2ef548378a513e8a0fdbaf497e90
--- /dev/null
+++ b/static/demo/components/d3/src/package.js
@@ -0,0 +1,27 @@
+var d3 = require("../index");
+
+console.log(JSON.stringify({
+  "name": "d3",
+  "version": d3.version,
+  "description": "A small, free JavaScript library for manipulating documents based on data.",
+  "keywords": ["dom", "w3c", "visualization", "svg", "animation", "canvas"],
+  "homepage": "http://d3js.org",
+  "author": {"name": "Mike Bostock", "url": "http://bost.ocks.org/mike"},
+  "repository": {"type": "git", "url": "https://github.com/mbostock/d3.git"},
+  "main": "index.js",
+  "browserify" : "index-browserify.js",
+  "jam": {
+    "main": "d3.js",
+    "shim": {
+      "exports": "d3"
+    }
+  },
+  "dependencies": {
+    "jsdom": "0.3.x"
+  },
+  "devDependencies": {
+    "uglify-js": "2.2.x",
+    "vows": "0.7.x"
+  },
+  "scripts": {"test": "./node_modules/vows/bin/vows"}
+}, null, 2));
diff --git a/static/demo/components/d3/src/scale/bilinear.js b/static/demo/components/d3/src/scale/bilinear.js
new file mode 100644
index 0000000000000000000000000000000000000000..ff014777c654e5a70a84cf99a02ecd1ee69dbece
--- /dev/null
+++ b/static/demo/components/d3/src/scale/bilinear.js
@@ -0,0 +1,7 @@
+function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
+  var u = uninterpolate(domain[0], domain[1]),
+      i = interpolate(range[0], range[1]);
+  return function(x) {
+    return i(u(x));
+  };
+}
diff --git a/static/demo/components/d3/src/scale/category.js b/static/demo/components/d3/src/scale/category.js
new file mode 100644
index 0000000000000000000000000000000000000000..0c6e57a82b89071489a10c69c90441fd089afe06
--- /dev/null
+++ b/static/demo/components/d3/src/scale/category.js
@@ -0,0 +1,54 @@
+/*
+ * This product includes color specifications and designs developed by Cynthia
+ * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information.
+ */
+
+d3.scale.category10 = function() {
+  return d3.scale.ordinal().range(d3_category10);
+};
+
+d3.scale.category20 = function() {
+  return d3.scale.ordinal().range(d3_category20);
+};
+
+d3.scale.category20b = function() {
+  return d3.scale.ordinal().range(d3_category20b);
+};
+
+d3.scale.category20c = function() {
+  return d3.scale.ordinal().range(d3_category20c);
+};
+
+var d3_category10 = [
+  "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd",
+  "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf"
+];
+
+var d3_category20 = [
+  "#1f77b4", "#aec7e8",
+  "#ff7f0e", "#ffbb78",
+  "#2ca02c", "#98df8a",
+  "#d62728", "#ff9896",
+  "#9467bd", "#c5b0d5",
+  "#8c564b", "#c49c94",
+  "#e377c2", "#f7b6d2",
+  "#7f7f7f", "#c7c7c7",
+  "#bcbd22", "#dbdb8d",
+  "#17becf", "#9edae5"
+];
+
+var d3_category20b = [
+  "#393b79", "#5254a3", "#6b6ecf", "#9c9ede",
+  "#637939", "#8ca252", "#b5cf6b", "#cedb9c",
+  "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94",
+  "#843c39", "#ad494a", "#d6616b", "#e7969c",
+  "#7b4173", "#a55194", "#ce6dbd", "#de9ed6"
+];
+
+var d3_category20c = [
+  "#3182bd", "#6baed6", "#9ecae1", "#c6dbef",
+  "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2",
+  "#31a354", "#74c476", "#a1d99b", "#c7e9c0",
+  "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb",
+  "#636363", "#969696", "#bdbdbd", "#d9d9d9"
+];
diff --git a/static/demo/components/d3/src/scale/identity.js b/static/demo/components/d3/src/scale/identity.js
new file mode 100644
index 0000000000000000000000000000000000000000..759cb6c856b5094a63d612fca34461e86761971b
--- /dev/null
+++ b/static/demo/components/d3/src/scale/identity.js
@@ -0,0 +1,30 @@
+d3.scale.identity = function() {
+  return d3_scale_identity([0, 1]);
+};
+
+function d3_scale_identity(domain) {
+
+  function identity(x) { return +x; }
+
+  identity.invert = identity;
+
+  identity.domain = identity.range = function(x) {
+    if (!arguments.length) return domain;
+    domain = x.map(identity);
+    return identity;
+  };
+
+  identity.ticks = function(m) {
+    return d3_scale_linearTicks(domain, m);
+  };
+
+  identity.tickFormat = function(m) {
+    return d3_scale_linearTickFormat(domain, m);
+  };
+
+  identity.copy = function() {
+    return d3_scale_identity(domain);
+  };
+
+  return identity;
+}
diff --git a/static/demo/components/d3/src/scale/linear.js b/static/demo/components/d3/src/scale/linear.js
new file mode 100644
index 0000000000000000000000000000000000000000..c7f504275caf9534740d748ec2cf4aca7bd89e9f
--- /dev/null
+++ b/static/demo/components/d3/src/scale/linear.js
@@ -0,0 +1,110 @@
+d3.scale.linear = function() {
+  return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false);
+};
+
+function d3_scale_linear(domain, range, interpolate, clamp) {
+  var output,
+      input;
+
+  function rescale() {
+    var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear,
+        uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
+    output = linear(domain, range, uninterpolate, interpolate);
+    input = linear(range, domain, uninterpolate, d3.interpolate);
+    return scale;
+  }
+
+  function scale(x) {
+    return output(x);
+  }
+
+  // Note: requires range is coercible to number!
+  scale.invert = function(y) {
+    return input(y);
+  };
+
+  scale.domain = function(x) {
+    if (!arguments.length) return domain;
+    domain = x.map(Number);
+    return rescale();
+  };
+
+  scale.range = function(x) {
+    if (!arguments.length) return range;
+    range = x;
+    return rescale();
+  };
+
+  scale.rangeRound = function(x) {
+    return scale.range(x).interpolate(d3.interpolateRound);
+  };
+
+  scale.clamp = function(x) {
+    if (!arguments.length) return clamp;
+    clamp = x;
+    return rescale();
+  };
+
+  scale.interpolate = function(x) {
+    if (!arguments.length) return interpolate;
+    interpolate = x;
+    return rescale();
+  };
+
+  scale.ticks = function(m) {
+    return d3_scale_linearTicks(domain, m);
+  };
+
+  scale.tickFormat = function(m) {
+    return d3_scale_linearTickFormat(domain, m);
+  };
+
+  scale.nice = function() {
+    d3_scale_nice(domain, d3_scale_linearNice);
+    return rescale();
+  };
+
+  scale.copy = function() {
+    return d3_scale_linear(domain, range, interpolate, clamp);
+  };
+
+  return rescale();
+}
+
+function d3_scale_linearRebind(scale, linear) {
+  return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
+}
+
+function d3_scale_linearNice(dx) {
+  dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1);
+  return dx && {
+    floor: function(x) { return Math.floor(x / dx) * dx; },
+    ceil: function(x) { return Math.ceil(x / dx) * dx; }
+  };
+}
+
+function d3_scale_linearTickRange(domain, m) {
+  var extent = d3_scaleExtent(domain),
+      span = extent[1] - extent[0],
+      step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)),
+      err = m / span * step;
+
+  // Filter ticks to get closer to the desired count.
+  if (err <= .15) step *= 10;
+  else if (err <= .35) step *= 5;
+  else if (err <= .75) step *= 2;
+
+  // Round start and stop values to step interval.
+  extent[0] = Math.ceil(extent[0] / step) * step;
+  extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive
+  extent[2] = step;
+  return extent;
+}
+
+function d3_scale_linearTicks(domain, m) {
+  return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));
+}
+
+function d3_scale_linearTickFormat(domain, m) {
+  return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f");
+}
diff --git a/static/demo/components/d3/src/scale/log.js b/static/demo/components/d3/src/scale/log.js
new file mode 100644
index 0000000000000000000000000000000000000000..6f762049ea92a0db454b5c4373966237588bd240
--- /dev/null
+++ b/static/demo/components/d3/src/scale/log.js
@@ -0,0 +1,85 @@
+d3.scale.log = function() {
+  return d3_scale_log(d3.scale.linear(), d3_scale_logp);
+};
+
+function d3_scale_log(linear, log) {
+  var pow = log.pow;
+
+  function scale(x) {
+    return linear(log(x));
+  }
+
+  scale.invert = function(x) {
+    return pow(linear.invert(x));
+  };
+
+  scale.domain = function(x) {
+    if (!arguments.length) return linear.domain().map(pow);
+    log = x[0] < 0 ? d3_scale_logn : d3_scale_logp;
+    pow = log.pow;
+    linear.domain(x.map(log));
+    return scale;
+  };
+
+  scale.nice = function() {
+    linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault));
+    return scale;
+  };
+
+  scale.ticks = function() {
+    var extent = d3_scaleExtent(linear.domain()),
+        ticks = [];
+    if (extent.every(isFinite)) {
+      var i = Math.floor(extent[0]),
+          j = Math.ceil(extent[1]),
+          u = pow(extent[0]),
+          v = pow(extent[1]);
+      if (log === d3_scale_logn) {
+        ticks.push(pow(i));
+        for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k);
+      } else {
+        for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k);
+        ticks.push(pow(i));
+      }
+      for (i = 0; ticks[i] < u; i++) {} // strip small values
+      for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values
+      ticks = ticks.slice(i, j);
+    }
+    return ticks;
+  };
+
+  scale.tickFormat = function(n, format) {
+    if (arguments.length < 2) format = d3_scale_logFormat;
+    if (!arguments.length) return format;
+    var k = Math.max(.1, n / scale.ticks().length),
+        f = log === d3_scale_logn ? (e = -1e-12, Math.floor) : (e = 1e-12, Math.ceil),
+        e;
+    return function(d) {
+      return d / pow(f(log(d) + e)) <= k ? format(d) : "";
+    };
+  };
+
+  scale.copy = function() {
+    return d3_scale_log(linear.copy(), log);
+  };
+
+  return d3_scale_linearRebind(scale, linear);
+}
+
+var d3_scale_logFormat = d3.format(".0e");
+
+function d3_scale_logp(x) {
+  return Math.log(x < 0 ? 0 : x) / Math.LN10;
+}
+
+function d3_scale_logn(x) {
+  return -Math.log(x > 0 ? 0 : -x) / Math.LN10;
+}
+
+d3_scale_logp.pow = function(x) {
+  return Math.pow(10, x);
+};
+
+d3_scale_logn.pow = function(x) {
+  return -Math.pow(10, -x);
+};
diff --git a/static/demo/components/d3/src/scale/nice.js b/static/demo/components/d3/src/scale/nice.js
new file mode 100644
index 0000000000000000000000000000000000000000..563a5f3ffdb7cb080fd7ff8b64a5b53b5200a47f
--- /dev/null
+++ b/static/demo/components/d3/src/scale/nice.js
@@ -0,0 +1,23 @@
+function d3_scale_nice(domain, nice) {
+  var i0 = 0,
+      i1 = domain.length - 1,
+      x0 = domain[i0],
+      x1 = domain[i1],
+      dx;
+
+  if (x1 < x0) {
+    dx = i0, i0 = i1, i1 = dx;
+    dx = x0, x0 = x1, x1 = dx;
+  }
+
+  if (nice = nice(x1 - x0)) {
+    domain[i0] = nice.floor(x0);
+    domain[i1] = nice.ceil(x1);
+  }
+
+  return domain;
+}
+
+function d3_scale_niceDefault() {
+  return Math;
+}
diff --git a/static/demo/components/d3/src/scale/ordinal.js b/static/demo/components/d3/src/scale/ordinal.js
new file mode 100644
index 0000000000000000000000000000000000000000..4af72010d80e1a19562f4081b1f4c0e5a6ddde8d
--- /dev/null
+++ b/static/demo/components/d3/src/scale/ordinal.js
@@ -0,0 +1,88 @@
+d3.scale.ordinal = function() {
+  return d3_scale_ordinal([], {t: "range", a: [[]]});
+};
+
+function d3_scale_ordinal(domain, ranger) {
+  var index,
+      range,
+      rangeBand;
+
+  function scale(x) {
+    return range[((index.get(x) || index.set(x, domain.push(x))) - 1) % range.length];
+  }
+
+  function steps(start, step) {
+    return d3.range(domain.length).map(function(i) { return start + step * i; });
+  }
+
+  scale.domain = function(x) {
+    if (!arguments.length) return domain;
+    domain = [];
+    index = new d3_Map;
+    var i = -1, n = x.length, xi;
+    while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));
+    return scale[ranger.t].apply(scale, ranger.a);
+  };
+
+  scale.range = function(x) {
+    if (!arguments.length) return range;
+    range = x;
+    rangeBand = 0;
+    ranger = {t: "range", a: arguments};
+    return scale;
+  };
+
+  scale.rangePoints = function(x, padding) {
+    if (arguments.length < 2) padding = 0;
+    var start = x[0],
+        stop = x[1],
+        step = (stop - start) / (Math.max(1, domain.length - 1) + padding);
+    range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);
+    rangeBand = 0;
+    ranger = {t: "rangePoints", a: arguments};
+    return scale;
+  };
+
+  scale.rangeBands = function(x, padding, outerPadding) {
+    if (arguments.length < 2) padding = 0;
+    if (arguments.length < 3) outerPadding = padding;
+    var reverse = x[1] < x[0],
+        start = x[reverse - 0],
+        stop = x[1 - reverse],
+        step = (stop - start) / (domain.length - padding + 2 * outerPadding);
+    range = steps(start + step * outerPadding, step);
+    if (reverse) range.reverse();
+    rangeBand = step * (1 - padding);
+    ranger = {t: "rangeBands", a: arguments};
+    return scale;
+  };
+
+  scale.rangeRoundBands = function(x, padding, outerPadding) {
+    if (arguments.length < 2) padding = 0;
+    if (arguments.length < 3) outerPadding = padding;
+    var reverse = x[1] < x[0],
+        start = x[reverse - 0],
+        stop = x[1 - reverse],
+        step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)),
+        error = stop - start - (domain.length - padding) * step;
+    range = steps(start + Math.round(error / 2), step);
+    if (reverse) range.reverse();
+    rangeBand = Math.round(step * (1 - padding));
+    ranger = {t: "rangeRoundBands", a: arguments};
+    return scale;
+  };
+
+  scale.rangeBand = function() {
+    return rangeBand;
+  };
+
+  scale.rangeExtent = function() {
+    return d3_scaleExtent(ranger.a[0]);
+  };
+
+  scale.copy = function() {
+    return d3_scale_ordinal(domain, ranger);
+  };
+
+  return scale.domain(domain);
+}
diff --git a/static/demo/components/d3/src/scale/polylinear.js b/static/demo/components/d3/src/scale/polylinear.js
new file mode 100644
index 0000000000000000000000000000000000000000..09a19bb9c45f5804eabaffea31c390ed7c47a760
--- /dev/null
+++ b/static/demo/components/d3/src/scale/polylinear.js
@@ -0,0 +1,22 @@
+function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
+  var u = [],
+      i = [],
+      j = 0,
+      k = Math.min(domain.length, range.length) - 1;
+
+  // Handle descending domains.
+  if (domain[k] < domain[0]) {
+    domain = domain.slice().reverse();
+    range = range.slice().reverse();
+  }
+
+  while (++j <= k) {
+    u.push(uninterpolate(domain[j - 1], domain[j]));
+    i.push(interpolate(range[j - 1], range[j]));
+  }
+
+  return function(x) {
+    var j = d3.bisect(domain, x, 1, k) - 1;
+    return i[j](u[j](x));
+  };
+}
diff --git a/static/demo/components/d3/src/scale/pow.js b/static/demo/components/d3/src/scale/pow.js
new file mode 100644
index 0000000000000000000000000000000000000000..96d52fff37b3bf21ae7755021c430fe038633739
--- /dev/null
+++ b/static/demo/components/d3/src/scale/pow.js
@@ -0,0 +1,54 @@
+d3.scale.pow = function() {
+  return d3_scale_pow(d3.scale.linear(), 1);
+};
+
+function d3_scale_pow(linear, exponent) {
+  var powp = d3_scale_powPow(exponent),
+      powb = d3_scale_powPow(1 / exponent);
+
+  function scale(x) {
+    return linear(powp(x));
+  }
+
+  scale.invert = function(x) {
+    return powb(linear.invert(x));
+  };
+
+  scale.domain = function(x) {
+    if (!arguments.length) return linear.domain().map(powb);
+    linear.domain(x.map(powp));
+    return scale;
+  };
+
+  scale.ticks = function(m) {
+    return d3_scale_linearTicks(scale.domain(), m);
+  };
+
+  scale.tickFormat = function(m) {
+    return d3_scale_linearTickFormat(scale.domain(), m);
+  };
+
+  scale.nice = function() {
+    return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice));
+  };
+
+  scale.exponent = function(x) {
+    if (!arguments.length) return exponent;
+    var domain = scale.domain();
+    powp = d3_scale_powPow(exponent = x);
+    powb = d3_scale_powPow(1 / exponent);
+    return scale.domain(domain);
+  };
+
+  scale.copy = function() {
+    return d3_scale_pow(linear.copy(), exponent);
+  };
+
+  return d3_scale_linearRebind(scale, linear);
+}
+
+function d3_scale_powPow(e) {
+  return function(x) {
+    return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);
+  };
+}
diff --git a/static/demo/components/d3/src/scale/quantile.js b/static/demo/components/d3/src/scale/quantile.js
new file mode 100644
index 0000000000000000000000000000000000000000..85cef58d9780a1f214a7a2c6999ae960b8f4efc6
--- /dev/null
+++ b/static/demo/components/d3/src/scale/quantile.js
@@ -0,0 +1,42 @@
+d3.scale.quantile = function() {
+  return d3_scale_quantile([], []);
+};
+
+function d3_scale_quantile(domain, range) {
+  var thresholds;
+
+  function rescale() {
+    var k = 0,
+        q = range.length;
+    thresholds = [];
+    while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);
+    return scale;
+  }
+
+  function scale(x) {
+    if (isNaN(x = +x)) return NaN;
+    return range[d3.bisect(thresholds, x)];
+  }
+
+  scale.domain = function(x) {
+    if (!arguments.length) return domain;
+    domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending);
+    return rescale();
+  };
+
+  scale.range = function(x) {
+    if (!arguments.length) return range;
+    range = x;
+    return rescale();
+  };
+
+  scale.quantiles = function() {
+    return thresholds;
+  };
+
+  scale.copy = function() {
+    return d3_scale_quantile(domain, range); // copy on write!
+  };
+
+  return rescale();
+}
diff --git a/static/demo/components/d3/src/scale/quantize.js b/static/demo/components/d3/src/scale/quantize.js
new file mode 100644
index 0000000000000000000000000000000000000000..cdb6d2b33a1d07f161fbe85fb129f4a7a6bf42df
--- /dev/null
+++ b/static/demo/components/d3/src/scale/quantize.js
@@ -0,0 +1,36 @@
+d3.scale.quantize = function() {
+  return d3_scale_quantize(0, 1, [0, 1]);
+};
+
+function d3_scale_quantize(x0, x1, range) {
+  var kx, i;
+
+  function scale(x) {
+    return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];
+  }
+
+  function rescale() {
+    kx = range.length / (x1 - x0);
+    i = range.length - 1;
+    return scale;
+  }
+
+  scale.domain = function(x) {
+    if (!arguments.length) return [x0, x1];
+    x0 = +x[0];
+    x1 = +x[x.length - 1];
+    return rescale();
+  };
+
+  scale.range = function(x) {
+    if (!arguments.length) return range;
+    range = x;
+    return rescale();
+  };
+
+  scale.copy = function() {
+    return d3_scale_quantize(x0, x1, range); // copy on write
+  };
+
+  return rescale();
+}
diff --git a/static/demo/components/d3/src/scale/scale.js b/static/demo/components/d3/src/scale/scale.js
new file mode 100644
index 0000000000000000000000000000000000000000..b7952d4402a137dd37bcf9d275056dd495ab3e16
--- /dev/null
+++ b/static/demo/components/d3/src/scale/scale.js
@@ -0,0 +1,10 @@
+d3.scale = {};
+
+function d3_scaleExtent(domain) {
+  var start = domain[0], stop = domain[domain.length - 1];
+  return start < stop ? [start, stop] : [stop, start];
+}
+
+function d3_scaleRange(scale) {
+  return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());
+}
diff --git a/static/demo/components/d3/src/scale/sqrt.js b/static/demo/components/d3/src/scale/sqrt.js
new file mode 100644
index 0000000000000000000000000000000000000000..5e823a561f0710690a32b9687d7d3994f3515fa8
--- /dev/null
+++ b/static/demo/components/d3/src/scale/sqrt.js
@@ -0,0 +1,3 @@
+d3.scale.sqrt = function() {
+  return d3.scale.pow().exponent(.5);
+};
diff --git a/static/demo/components/d3/src/scale/threshold.js b/static/demo/components/d3/src/scale/threshold.js
new file mode 100644
index 0000000000000000000000000000000000000000..3dbd2ad21fea83ff50ec1d56b9019b142411a885
--- /dev/null
+++ b/static/demo/components/d3/src/scale/threshold.js
@@ -0,0 +1,28 @@
+d3.scale.threshold = function() {
+  return d3_scale_threshold([.5], [0, 1]);
+};
+
+function d3_scale_threshold(domain, range) {
+
+  function scale(x) {
+    return range[d3.bisect(domain, x)];
+  }
+
+  scale.domain = function(_) {
+    if (!arguments.length) return domain;
+    domain = _;
+    return scale;
+  };
+
+  scale.range = function(_) {
+    if (!arguments.length) return range;
+    range = _;
+    return scale;
+  };
+
+  scale.copy = function() {
+    return d3_scale_threshold(domain, range);
+  };
+
+  return scale;
+};
diff --git a/static/demo/components/d3/src/start.js b/static/demo/components/d3/src/start.js
new file mode 100644
index 0000000000000000000000000000000000000000..066c2471cb66c2180c51b520d07ba8c3134b8263
--- /dev/null
+++ b/static/demo/components/d3/src/start.js
@@ -0,0 +1 @@
+d3 = (function(){
\ No newline at end of file
diff --git a/static/demo/components/d3/src/svg/arc.js b/static/demo/components/d3/src/svg/arc.js
new file mode 100644
index 0000000000000000000000000000000000000000..b98c533cd0553082dfd3e55e40a8e7550728520e
--- /dev/null
+++ b/static/demo/components/d3/src/svg/arc.js
@@ -0,0 +1,95 @@
+d3.svg.arc = function() {
+  var innerRadius = d3_svg_arcInnerRadius,
+      outerRadius = d3_svg_arcOuterRadius,
+      startAngle = d3_svg_arcStartAngle,
+      endAngle = d3_svg_arcEndAngle;
+
+  function arc() {
+    var r0 = innerRadius.apply(this, arguments),
+        r1 = outerRadius.apply(this, arguments),
+        a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset,
+        a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset,
+        da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0),
+        df = da < π ? "0" : "1",
+        c0 = Math.cos(a0),
+        s0 = Math.sin(a0),
+        c1 = Math.cos(a1),
+        s1 = Math.sin(a1);
+    return da >= d3_svg_arcMax
+      ? (r0
+      ? "M0," + r1
+      + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1)
+      + "A" + r1 + "," + r1 + " 0 1,1 0," + r1
+      + "M0," + r0
+      + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0)
+      + "A" + r0 + "," + r0 + " 0 1,0 0," + r0
+      + "Z"
+      : "M0," + r1
+      + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1)
+      + "A" + r1 + "," + r1 + " 0 1,1 0," + r1
+      + "Z")
+      : (r0
+      ? "M" + r1 * c0 + "," + r1 * s0
+      + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1
+      + "L" + r0 * c1 + "," + r0 * s1
+      + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0
+      + "Z"
+      : "M" + r1 * c0 + "," + r1 * s0
+      + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1
+      + "L0,0"
+      + "Z");
+  }
+
+  arc.innerRadius = function(v) {
+    if (!arguments.length) return innerRadius;
+    innerRadius = d3_functor(v);
+    return arc;
+  };
+
+  arc.outerRadius = function(v) {
+    if (!arguments.length) return outerRadius;
+    outerRadius = d3_functor(v);
+    return arc;
+  };
+
+  arc.startAngle = function(v) {
+    if (!arguments.length) return startAngle;
+    startAngle = d3_functor(v);
+    return arc;
+  };
+
+  arc.endAngle = function(v) {
+    if (!arguments.length) return endAngle;
+    endAngle = d3_functor(v);
+    return arc;
+  };
+
+  arc.centroid = function() {
+    var r = (innerRadius.apply(this, arguments)
+        + outerRadius.apply(this, arguments)) / 2,
+        a = (startAngle.apply(this, arguments)
+        + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;
+    return [Math.cos(a) * r, Math.sin(a) * r];
+  };
+
+  return arc;
+};
+
+var d3_svg_arcOffset = -Ï€ / 2,
+    d3_svg_arcMax = 2 * π - 1e-6;
+
+function d3_svg_arcInnerRadius(d) {
+  return d.innerRadius;
+}
+
+function d3_svg_arcOuterRadius(d) {
+  return d.outerRadius;
+}
+
+function d3_svg_arcStartAngle(d) {
+  return d.startAngle;
+}
+
+function d3_svg_arcEndAngle(d) {
+  return d.endAngle;
+}
diff --git a/static/demo/components/d3/src/svg/area-radial.js b/static/demo/components/d3/src/svg/area-radial.js
new file mode 100644
index 0000000000000000000000000000000000000000..5cfc4bd7e4511b21ff554968ed3dc0e2e9a54c0c
--- /dev/null
+++ b/static/demo/components/d3/src/svg/area-radial.js
@@ -0,0 +1,10 @@
+d3.svg.area.radial = function() {
+  var area = d3_svg_area(d3_svg_lineRadial);
+  area.radius = area.x, delete area.x;
+  area.innerRadius = area.x0, delete area.x0;
+  area.outerRadius = area.x1, delete area.x1;
+  area.angle = area.y, delete area.y;
+  area.startAngle = area.y0, delete area.y0;
+  area.endAngle = area.y1, delete area.y1;
+  return area;
+};
diff --git a/static/demo/components/d3/src/svg/area.js b/static/demo/components/d3/src/svg/area.js
new file mode 100644
index 0000000000000000000000000000000000000000..c1649d2c3a885241fa09c3cdb29283f93cdf6926
--- /dev/null
+++ b/static/demo/components/d3/src/svg/area.js
@@ -0,0 +1,114 @@
+function d3_svg_area(projection) {
+  var x0 = d3_svg_lineX,
+      x1 = d3_svg_lineX,
+      y0 = 0,
+      y1 = d3_svg_lineY,
+      defined = d3_true,
+      interpolate = d3_svg_lineLinear,
+      interpolateKey = interpolate.key,
+      interpolateReverse = interpolate,
+      L = "L",
+      tension = .7;
+
+  function area(data) {
+    var segments = [],
+        points0 = [],
+        points1 = [],
+        i = -1,
+        n = data.length,
+        d,
+        fx0 = d3_functor(x0),
+        fy0 = d3_functor(y0),
+        fx1 = x0 === x1 ? function() { return x; } : d3_functor(x1),
+        fy1 = y0 === y1 ? function() { return y; } : d3_functor(y1),
+        x,
+        y;
+
+    function segment() {
+      segments.push("M", interpolate(projection(points1), tension),
+          L, interpolateReverse(projection(points0.reverse()), tension),
+          "Z");
+    }
+
+    while (++i < n) {
+      if (defined.call(this, d = data[i], i)) {
+        points0.push([x = +fx0.call(this, d, i), y = +fy0.call(this, d, i)]);
+        points1.push([+fx1.call(this, d, i), +fy1.call(this, d, i)]);
+      } else if (points0.length) {
+        segment();
+        points0 = [];
+        points1 = [];
+      }
+    }
+
+    if (points0.length) segment();
+
+    return segments.length ? segments.join("") : null;
+  }
+
+  area.x = function(_) {
+    if (!arguments.length) return x1;
+    x0 = x1 = _;
+    return area;
+  };
+
+  area.x0 = function(_) {
+    if (!arguments.length) return x0;
+    x0 = _;
+    return area;
+  };
+
+  area.x1 = function(_) {
+    if (!arguments.length) return x1;
+    x1 = _;
+    return area;
+  };
+
+  area.y = function(_) {
+    if (!arguments.length) return y1;
+    y0 = y1 = _;
+    return area;
+  };
+
+  area.y0 = function(_) {
+    if (!arguments.length) return y0;
+    y0 = _;
+    return area;
+  };
+
+  area.y1 = function(_) {
+    if (!arguments.length) return y1;
+    y1 = _;
+    return area;
+  };
+
+  area.defined  = function(_) {
+    if (!arguments.length) return defined;
+    defined = _;
+    return area;
+  };
+
+  area.interpolate = function(_) {
+    if (!arguments.length) return interpolateKey;
+    if (typeof _ === "function") interpolateKey = interpolate = _;
+    else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
+    interpolateReverse = interpolate.reverse || interpolate;
+    L = interpolate.closed ? "M" : "L";
+    return area;
+  };
+
+  area.tension = function(_) {
+    if (!arguments.length) return tension;
+    tension = _;
+    return area;
+  };
+
+  return area;
+}
+
+d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;
+d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;
+
+d3.svg.area = function() {
+  return d3_svg_area(d3_identity);
+};
diff --git a/static/demo/components/d3/src/svg/axis.js b/static/demo/components/d3/src/svg/axis.js
new file mode 100644
index 0000000000000000000000000000000000000000..299fe076fca4adb071b4d380a986bb2d30022aa6
--- /dev/null
+++ b/static/demo/components/d3/src/svg/axis.js
@@ -0,0 +1,216 @@
+d3.svg.axis = function() {
+  var scale = d3.scale.linear(),
+      orient = d3_svg_axisDefaultOrient,
+      tickMajorSize = 6,
+      tickMinorSize = 6,
+      tickEndSize = 6,
+      tickPadding = 3,
+      tickArguments_ = [10],
+      tickValues = null,
+      tickFormat_,
+      tickSubdivide = 0;
+
+  function axis(g) {
+    g.each(function() {
+      var g = d3.select(this);
+
+      // Ticks, or domain values for ordinal scales.
+      var ticks = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain()) : tickValues,
+          tickFormat = tickFormat_ == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String) : tickFormat_;
+
+      // Minor ticks.
+      var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide),
+          subtick = g.selectAll(".tick.minor").data(subticks, String),
+          subtickEnter = subtick.enter().insert("line", ".tick").attr("class", "tick minor").style("opacity", 1e-6),
+          subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(),
+          subtickUpdate = d3.transition(subtick).style("opacity", 1);
+
+      // Major ticks.
+      var tick = g.selectAll(".tick.major").data(ticks, String),
+          tickEnter = tick.enter().insert("g", "path").attr("class", "tick major").style("opacity", 1e-6),
+          tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(),
+          tickUpdate = d3.transition(tick).style("opacity", 1),
+          tickTransform;
+
+      // Domain.
+      var range = d3_scaleRange(scale),
+          path = g.selectAll(".domain").data([0]),
+          pathUpdate = (path.enter().append("path").attr("class", "domain"), d3.transition(path));
+
+      // Stash a snapshot of the new scale, and retrieve the old snapshot.
+      var scale1 = scale.copy(),
+          scale0 = this.__chart__ || scale1;
+      this.__chart__ = scale1;
+
+      tickEnter.append("line");
+      tickEnter.append("text");
+
+      var lineEnter = tickEnter.select("line"),
+          lineUpdate = tickUpdate.select("line"),
+          text = tick.select("text").text(tickFormat),
+          textEnter = tickEnter.select("text"),
+          textUpdate = tickUpdate.select("text");
+
+      switch (orient) {
+        case "bottom": {
+          tickTransform = d3_svg_axisX;
+          subtickEnter.attr("y2", tickMinorSize);
+          subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize);
+          lineEnter.attr("y2", tickMajorSize);
+          textEnter.attr("y", Math.max(tickMajorSize, 0) + tickPadding);
+          lineUpdate.attr("x2", 0).attr("y2", tickMajorSize);
+          textUpdate.attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding);
+          text.attr("dy", ".71em").style("text-anchor", "middle");
+          pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize);
+          break;
+        }
+        case "top": {
+          tickTransform = d3_svg_axisX;
+          subtickEnter.attr("y2", -tickMinorSize);
+          subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize);
+          lineEnter.attr("y2", -tickMajorSize);
+          textEnter.attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
+          lineUpdate.attr("x2", 0).attr("y2", -tickMajorSize);
+          textUpdate.attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding));
+          text.attr("dy", "0em").style("text-anchor", "middle");
+          pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize);
+          break;
+        }
+        case "left": {
+          tickTransform = d3_svg_axisY;
+          subtickEnter.attr("x2", -tickMinorSize);
+          subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0);
+          lineEnter.attr("x2", -tickMajorSize);
+          textEnter.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding));
+          lineUpdate.attr("x2", -tickMajorSize).attr("y2", 0);
+          textUpdate.attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0);
+          text.attr("dy", ".32em").style("text-anchor", "end");
+          pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize);
+          break;
+        }
+        case "right": {
+          tickTransform = d3_svg_axisY;
+          subtickEnter.attr("x2", tickMinorSize);
+          subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0);
+          lineEnter.attr("x2", tickMajorSize);
+          textEnter.attr("x", Math.max(tickMajorSize, 0) + tickPadding);
+          lineUpdate.attr("x2", tickMajorSize).attr("y2", 0);
+          textUpdate.attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0);
+          text.attr("dy", ".32em").style("text-anchor", "start");
+          pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize);
+          break;
+        }
+      }
+
+      // For quantitative scales:
+      // - enter new ticks from the old scale
+      // - exit old ticks to the new scale
+      if (scale.ticks) {
+        tickEnter.call(tickTransform, scale0);
+        tickUpdate.call(tickTransform, scale1);
+        tickExit.call(tickTransform, scale1);
+        subtickEnter.call(tickTransform, scale0);
+        subtickUpdate.call(tickTransform, scale1);
+        subtickExit.call(tickTransform, scale1);
+      }
+
+      // For ordinal scales:
+      // - any entering ticks are undefined in the old scale
+      // - any exiting ticks are undefined in the new scale
+      // Therefore, we only need to transition updating ticks.
+      else {
+        var dx = scale1.rangeBand() / 2, x = function(d) { return scale1(d) + dx; };
+        tickEnter.call(tickTransform, x);
+        tickUpdate.call(tickTransform, x);
+      }
+    });
+  }
+
+  axis.scale = function(x) {
+    if (!arguments.length) return scale;
+    scale = x;
+    return axis;
+  };
+
+  axis.orient = function(x) {
+    if (!arguments.length) return orient;
+    orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient;
+    return axis;
+  };
+
+  axis.ticks = function() {
+    if (!arguments.length) return tickArguments_;
+    tickArguments_ = arguments;
+    return axis;
+  };
+
+  axis.tickValues = function(x) {
+    if (!arguments.length) return tickValues;
+    tickValues = x;
+    return axis;
+  };
+
+  axis.tickFormat = function(x) {
+    if (!arguments.length) return tickFormat_;
+    tickFormat_ = x;
+    return axis;
+  };
+
+  axis.tickSize = function(x, y) {
+    if (!arguments.length) return tickMajorSize;
+    var n = arguments.length - 1;
+    tickMajorSize = +x;
+    tickMinorSize = n > 1 ? +y : tickMajorSize;
+    tickEndSize = n > 0 ? +arguments[n] : tickMajorSize;
+    return axis;
+  };
+
+  axis.tickPadding = function(x) {
+    if (!arguments.length) return tickPadding;
+    tickPadding = +x;
+    return axis;
+  };
+
+  axis.tickSubdivide = function(x) {
+    if (!arguments.length) return tickSubdivide;
+    tickSubdivide = +x;
+    return axis;
+  };
+
+  return axis;
+};
+
+var d3_svg_axisDefaultOrient = "bottom",
+    d3_svg_axisOrients = {top: 1, right: 1, bottom: 1, left: 1};
+
+function d3_svg_axisX(selection, x) {
+  selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; });
+}
+
+function d3_svg_axisY(selection, y) {
+  selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; });
+}
+
+function d3_svg_axisSubdivide(scale, ticks, m) {
+  subticks = [];
+  if (m && ticks.length > 1) {
+    var extent = d3_scaleExtent(scale.domain()),
+        subticks,
+        i = -1,
+        n = ticks.length,
+        d = (ticks[1] - ticks[0]) / ++m,
+        j,
+        v;
+    while (++i < n) {
+      for (j = m; --j > 0;) {
+        if ((v = +ticks[i] - j * d) >= extent[0]) {
+          subticks.push(v);
+        }
+      }
+    }
+    for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) {
+      subticks.push(v);
+    }
+  }
+  return subticks;
+}
diff --git a/static/demo/components/d3/src/svg/brush.js b/static/demo/components/d3/src/svg/brush.js
new file mode 100644
index 0000000000000000000000000000000000000000..470cba247f17eef9f9741da86d60ee997b1bf76e
--- /dev/null
+++ b/static/demo/components/d3/src/svg/brush.js
@@ -0,0 +1,358 @@
+d3.svg.brush = function() {
+  var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"),
+      x = null, // x-scale, optional
+      y = null, // y-scale, optional
+      resizes = d3_svg_brushResizes[0],
+      extent = [[0, 0], [0, 0]], // [x0, y0], [x1, y1], in pixels (integers)
+      extentDomain; // the extent in data space, lazily created
+
+  function brush(g) {
+    g.each(function() {
+      var g = d3.select(this),
+          bg = g.selectAll(".background").data([0]),
+          fg = g.selectAll(".extent").data([0]),
+          tz = g.selectAll(".resize").data(resizes, String),
+          e;
+
+      // Prepare the brush container for events.
+      g
+          .style("pointer-events", "all")
+          .on("mousedown.brush", brushstart)
+          .on("touchstart.brush", brushstart);
+
+      // An invisible, mouseable area for starting a new brush.
+      bg.enter().append("rect")
+          .attr("class", "background")
+          .style("visibility", "hidden")
+          .style("cursor", "crosshair");
+
+      // The visible brush extent; style this as you like!
+      fg.enter().append("rect")
+          .attr("class", "extent")
+          .style("cursor", "move");
+
+      // More invisible rects for resizing the extent.
+      tz.enter().append("g")
+          .attr("class", function(d) { return "resize " + d; })
+          .style("cursor", function(d) { return d3_svg_brushCursor[d]; })
+        .append("rect")
+          .attr("x", function(d) { return /[ew]$/.test(d) ? -3 : null; })
+          .attr("y", function(d) { return /^[ns]/.test(d) ? -3 : null; })
+          .attr("width", 6)
+          .attr("height", 6)
+          .style("visibility", "hidden");
+
+      // Show or hide the resizers.
+      tz.style("display", brush.empty() ? "none" : null);
+
+      // Remove any superfluous resizers.
+      tz.exit().remove();
+
+      // Initialize the background to fill the defined range.
+      // If the range isn't defined, you can post-process.
+      if (x) {
+        e = d3_scaleRange(x);
+        bg.attr("x", e[0]).attr("width", e[1] - e[0]);
+        redrawX(g);
+      }
+      if (y) {
+        e = d3_scaleRange(y);
+        bg.attr("y", e[0]).attr("height", e[1] - e[0]);
+        redrawY(g);
+      }
+      redraw(g);
+    });
+  }
+
+  function redraw(g) {
+    g.selectAll(".resize").attr("transform", function(d) {
+      return "translate(" + extent[+/e$/.test(d)][0] + "," + extent[+/^s/.test(d)][1] + ")";
+    });
+  }
+
+  function redrawX(g) {
+    g.select(".extent").attr("x", extent[0][0]);
+    g.selectAll(".extent,.n>rect,.s>rect").attr("width", extent[1][0] - extent[0][0]);
+  }
+
+  function redrawY(g) {
+    g.select(".extent").attr("y", extent[0][1]);
+    g.selectAll(".extent,.e>rect,.w>rect").attr("height", extent[1][1] - extent[0][1]);
+  }
+
+  function brushstart() {
+    var target = this,
+        eventTarget = d3.select(d3.event.target),
+        event_ = event.of(target, arguments),
+        g = d3.select(target),
+        resizing = eventTarget.datum(),
+        resizingX = !/^(n|s)$/.test(resizing) && x,
+        resizingY = !/^(e|w)$/.test(resizing) && y,
+        dragging = eventTarget.classed("extent"),
+        center,
+        origin = mouse(),
+        offset;
+
+    var w = d3.select(d3_window)
+        .on("mousemove.brush", brushmove)
+        .on("mouseup.brush", brushend)
+        .on("touchmove.brush", brushmove)
+        .on("touchend.brush", brushend)
+        .on("keydown.brush", keydown)
+        .on("keyup.brush", keyup);
+
+    // If the extent was clicked on, drag rather than brush;
+    // store the point between the mouse and extent origin instead.
+    if (dragging) {
+      origin[0] = extent[0][0] - origin[0];
+      origin[1] = extent[0][1] - origin[1];
+    }
+
+    // If a resizer was clicked on, record which side is to be resized.
+    // Also, set the origin to the opposite side.
+    else if (resizing) {
+      var ex = +/w$/.test(resizing),
+          ey = +/^n/.test(resizing);
+      offset = [extent[1 - ex][0] - origin[0], extent[1 - ey][1] - origin[1]];
+      origin[0] = extent[ex][0];
+      origin[1] = extent[ey][1];
+    }
+
+    // If the ALT key is down when starting a brush, the center is at the mouse.
+    else if (d3.event.altKey) center = origin.slice();
+
+    // Propagate the active cursor to the body for the drag duration.
+    g.style("pointer-events", "none").selectAll(".resize").style("display", null);
+    d3.select("body").style("cursor", eventTarget.style("cursor"));
+
+    // Notify listeners.
+    event_({type: "brushstart"});
+    brushmove();
+    d3_eventCancel();
+
+    function mouse() {
+      var touches = d3.event.changedTouches;
+      return touches ? d3.touches(target, touches)[0] : d3.mouse(target);
+    }
+
+    function keydown() {
+      if (d3.event.keyCode == 32) {
+        if (!dragging) {
+          center = null;
+          origin[0] -= extent[1][0];
+          origin[1] -= extent[1][1];
+          dragging = 2;
+        }
+        d3_eventCancel();
+      }
+    }
+
+    function keyup() {
+      if (d3.event.keyCode == 32 && dragging == 2) {
+        origin[0] += extent[1][0];
+        origin[1] += extent[1][1];
+        dragging = 0;
+        d3_eventCancel();
+      }
+    }
+
+    function brushmove() {
+      var point = mouse(),
+          moved = false;
+
+      // Preserve the offset for thick resizers.
+      if (offset) {
+        point[0] += offset[0];
+        point[1] += offset[1];
+      }
+
+      if (!dragging) {
+
+        // If needed, determine the center from the current extent.
+        if (d3.event.altKey) {
+          if (!center) center = [(extent[0][0] + extent[1][0]) / 2, (extent[0][1] + extent[1][1]) / 2];
+
+          // Update the origin, for when the ALT key is released.
+          origin[0] = extent[+(point[0] < center[0])][0];
+          origin[1] = extent[+(point[1] < center[1])][1];
+        }
+
+        // When the ALT key is released, we clear the center.
+        else center = null;
+      }
+
+      // Update the brush extent for each dimension.
+      if (resizingX && move1(point, x, 0)) {
+        redrawX(g);
+        moved = true;
+      }
+      if (resizingY && move1(point, y, 1)) {
+        redrawY(g);
+        moved = true;
+      }
+
+      // Final redraw and notify listeners.
+      if (moved) {
+        redraw(g);
+        event_({type: "brush", mode: dragging ? "move" : "resize"});
+      }
+    }
+
+    function move1(point, scale, i) {
+      var range = d3_scaleRange(scale),
+          r0 = range[0],
+          r1 = range[1],
+          position = origin[i],
+          size = extent[1][i] - extent[0][i],
+          min,
+          max;
+
+      // When dragging, reduce the range by the extent size and position.
+      if (dragging) {
+        r0 -= position;
+        r1 -= size + position;
+      }
+
+      // Clamp the point so that the extent fits within the range extent.
+      min = Math.max(r0, Math.min(r1, point[i]));
+
+      // Compute the new extent bounds.
+      if (dragging) {
+        max = (min += position) + size;
+      } else {
+
+        // If the ALT key is pressed, then preserve the center of the extent.
+        if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));
+
+        // Compute the min and max of the position and point.
+        if (position < min) {
+          max = min;
+          min = position;
+        } else {
+          max = position;
+        }
+      }
+
+      // Update the stored bounds.
+      if (extent[0][i] !== min || extent[1][i] !== max) {
+        extentDomain = null;
+        extent[0][i] = min;
+        extent[1][i] = max;
+        return true;
+      }
+    }
+
+    function brushend() {
+      brushmove();
+
+      // reset the cursor styles
+      g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null);
+      d3.select("body").style("cursor", null);
+
+      w .on("mousemove.brush", null)
+        .on("mouseup.brush", null)
+        .on("touchmove.brush", null)
+        .on("touchend.brush", null)
+        .on("keydown.brush", null)
+        .on("keyup.brush", null);
+
+      event_({type: "brushend"});
+      d3_eventCancel();
+    }
+  }
+
+  brush.x = function(z) {
+    if (!arguments.length) return x;
+    x = z;
+    resizes = d3_svg_brushResizes[!x << 1 | !y]; // fore!
+    return brush;
+  };
+
+  brush.y = function(z) {
+    if (!arguments.length) return y;
+    y = z;
+    resizes = d3_svg_brushResizes[!x << 1 | !y]; // fore!
+    return brush;
+  };
+
+  brush.extent = function(z) {
+    var x0, x1, y0, y1, t;
+
+    // Invert the pixel extent to data-space.
+    if (!arguments.length) {
+      z = extentDomain || extent;
+      if (x) {
+        x0 = z[0][0], x1 = z[1][0];
+        if (!extentDomain) {
+          x0 = extent[0][0], x1 = extent[1][0];
+          if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
+          if (x1 < x0) t = x0, x0 = x1, x1 = t;
+        }
+      }
+      if (y) {
+        y0 = z[0][1], y1 = z[1][1];
+        if (!extentDomain) {
+          y0 = extent[0][1], y1 = extent[1][1];
+          if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
+          if (y1 < y0) t = y0, y0 = y1, y1 = t;
+        }
+      }
+      return x && y ? [[x0, y0], [x1, y1]] : x ? [x0, x1] : y && [y0, y1];
+    }
+
+    // Scale the data-space extent to pixels.
+    extentDomain = [[0, 0], [0, 0]];
+    if (x) {
+      x0 = z[0], x1 = z[1];
+      if (y) x0 = x0[0], x1 = x1[0];
+      extentDomain[0][0] = x0, extentDomain[1][0] = x1;
+      if (x.invert) x0 = x(x0), x1 = x(x1);
+      if (x1 < x0) t = x0, x0 = x1, x1 = t;
+      extent[0][0] = x0 | 0, extent[1][0] = x1 | 0;
+    }
+    if (y) {
+      y0 = z[0], y1 = z[1];
+      if (x) y0 = y0[1], y1 = y1[1];
+      extentDomain[0][1] = y0, extentDomain[1][1] = y1;
+      if (y.invert) y0 = y(y0), y1 = y(y1);
+      if (y1 < y0) t = y0, y0 = y1, y1 = t;
+      extent[0][1] = y0 | 0, extent[1][1] = y1 | 0;
+    }
+
+    return brush;
+  };
+
+  brush.clear = function() {
+    extentDomain = null;
+    extent[0][0] =
+    extent[0][1] =
+    extent[1][0] =
+    extent[1][1] = 0;
+    return brush;
+  };
+
+  brush.empty = function() {
+    return (x && extent[0][0] === extent[1][0])
+        || (y && extent[0][1] === extent[1][1]);
+  };
+
+  return d3.rebind(brush, event, "on");
+};
+
+var d3_svg_brushCursor = {
+  n: "ns-resize",
+  e: "ew-resize",
+  s: "ns-resize",
+  w: "ew-resize",
+  nw: "nwse-resize",
+  ne: "nesw-resize",
+  se: "nwse-resize",
+  sw: "nesw-resize"
+};
+
+var d3_svg_brushResizes = [
+  ["n", "e", "s", "w", "nw", "ne", "se", "sw"],
+  ["e", "w"],
+  ["n", "s"],
+  []
+];
diff --git a/static/demo/components/d3/src/svg/chord.js b/static/demo/components/d3/src/svg/chord.js
new file mode 100644
index 0000000000000000000000000000000000000000..0b4d41e452e6b09cb5dd89cef105613f01c1837a
--- /dev/null
+++ b/static/demo/components/d3/src/svg/chord.js
@@ -0,0 +1,83 @@
+d3.svg.chord = function() {
+  var source = d3_source,
+      target = d3_target,
+      radius = d3_svg_chordRadius,
+      startAngle = d3_svg_arcStartAngle,
+      endAngle = d3_svg_arcEndAngle;
+
+  // TODO Allow control point to be customized.
+
+  function chord(d, i) {
+    var s = subgroup(this, source, d, i),
+        t = subgroup(this, target, d, i);
+    return "M" + s.p0
+      + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t)
+      ? curve(s.r, s.p1, s.r, s.p0)
+      : curve(s.r, s.p1, t.r, t.p0)
+      + arc(t.r, t.p1, t.a1 - t.a0)
+      + curve(t.r, t.p1, s.r, s.p0))
+      + "Z";
+  }
+
+  function subgroup(self, f, d, i) {
+    var subgroup = f.call(self, d, i),
+        r = radius.call(self, subgroup, i),
+        a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset,
+        a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset;
+    return {
+      r: r,
+      a0: a0,
+      a1: a1,
+      p0: [r * Math.cos(a0), r * Math.sin(a0)],
+      p1: [r * Math.cos(a1), r * Math.sin(a1)]
+    };
+  }
+
+  function equals(a, b) {
+    return a.a0 == b.a0 && a.a1 == b.a1;
+  }
+
+  function arc(r, p, a) {
+    return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p;
+  }
+
+  function curve(r0, p0, r1, p1) {
+    return "Q 0,0 " + p1;
+  }
+
+  chord.radius = function(v) {
+    if (!arguments.length) return radius;
+    radius = d3_functor(v);
+    return chord;
+  };
+
+  chord.source = function(v) {
+    if (!arguments.length) return source;
+    source = d3_functor(v);
+    return chord;
+  };
+
+  chord.target = function(v) {
+    if (!arguments.length) return target;
+    target = d3_functor(v);
+    return chord;
+  };
+
+  chord.startAngle = function(v) {
+    if (!arguments.length) return startAngle;
+    startAngle = d3_functor(v);
+    return chord;
+  };
+
+  chord.endAngle = function(v) {
+    if (!arguments.length) return endAngle;
+    endAngle = d3_functor(v);
+    return chord;
+  };
+
+  return chord;
+};
+
+function d3_svg_chordRadius(d) {
+  return d.radius;
+}
diff --git a/static/demo/components/d3/src/svg/diagonal-radial.js b/static/demo/components/d3/src/svg/diagonal-radial.js
new file mode 100644
index 0000000000000000000000000000000000000000..3878fb6263d6961813d6bac7e01a9b79bfd1fa1b
--- /dev/null
+++ b/static/demo/components/d3/src/svg/diagonal-radial.js
@@ -0,0 +1,22 @@
+d3.svg.diagonal.radial = function() {
+  var diagonal = d3.svg.diagonal(),
+      projection = d3_svg_diagonalProjection,
+      projection_ = diagonal.projection;
+
+  diagonal.projection = function(x) {
+    return arguments.length
+        ? projection_(d3_svg_diagonalRadialProjection(projection = x))
+        : projection;
+  };
+
+  return diagonal;
+};
+
+function d3_svg_diagonalRadialProjection(projection) {
+  return function() {
+    var d = projection.apply(this, arguments),
+        r = d[0],
+        a = d[1] + d3_svg_arcOffset;
+    return [r * Math.cos(a), r * Math.sin(a)];
+  };
+}
diff --git a/static/demo/components/d3/src/svg/diagonal.js b/static/demo/components/d3/src/svg/diagonal.js
new file mode 100644
index 0000000000000000000000000000000000000000..e4f792120e1f1d544dbab17b92cf192a899d91bd
--- /dev/null
+++ b/static/demo/components/d3/src/svg/diagonal.js
@@ -0,0 +1,38 @@
+d3.svg.diagonal = function() {
+  var source = d3_source,
+      target = d3_target,
+      projection = d3_svg_diagonalProjection;
+
+  function diagonal(d, i) {
+    var p0 = source.call(this, d, i),
+        p3 = target.call(this, d, i),
+        m = (p0.y + p3.y) / 2,
+        p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3];
+    p = p.map(projection);
+    return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3];
+  }
+
+  diagonal.source = function(x) {
+    if (!arguments.length) return source;
+    source = d3_functor(x);
+    return diagonal;
+  };
+
+  diagonal.target = function(x) {
+    if (!arguments.length) return target;
+    target = d3_functor(x);
+    return diagonal;
+  };
+
+  diagonal.projection = function(x) {
+    if (!arguments.length) return projection;
+    projection = x;
+    return diagonal;
+  };
+
+  return diagonal;
+};
+
+function d3_svg_diagonalProjection(d) {
+  return [d.x, d.y];
+}
diff --git a/static/demo/components/d3/src/svg/line-radial.js b/static/demo/components/d3/src/svg/line-radial.js
new file mode 100644
index 0000000000000000000000000000000000000000..d1c2c8cfce746ba5d44dd953ac7ef65f0307e7c4
--- /dev/null
+++ b/static/demo/components/d3/src/svg/line-radial.js
@@ -0,0 +1,22 @@
+d3.svg.line.radial = function() {
+  var line = d3_svg_line(d3_svg_lineRadial);
+  line.radius = line.x, delete line.x;
+  line.angle = line.y, delete line.y;
+  return line;
+};
+
+function d3_svg_lineRadial(points) {
+  var point,
+      i = -1,
+      n = points.length,
+      r,
+      a;
+  while (++i < n) {
+    point = points[i];
+    r = point[0];
+    a = point[1] + d3_svg_arcOffset;
+    point[0] = r * Math.cos(a);
+    point[1] = r * Math.sin(a);
+  }
+  return points;
+}
diff --git a/static/demo/components/d3/src/svg/line.js b/static/demo/components/d3/src/svg/line.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d0636a09c69d9d62aeee9e8fc7ec8c98ea6e2fb
--- /dev/null
+++ b/static/demo/components/d3/src/svg/line.js
@@ -0,0 +1,425 @@
+function d3_svg_line(projection) {
+  var x = d3_svg_lineX,
+      y = d3_svg_lineY,
+      defined = d3_true,
+      interpolate = d3_svg_lineLinear,
+      interpolateKey = interpolate.key,
+      tension = .7;
+
+  function line(data) {
+    var segments = [],
+        points = [],
+        i = -1,
+        n = data.length,
+        d,
+        fx = d3_functor(x),
+        fy = d3_functor(y);
+
+    function segment() {
+      segments.push("M", interpolate(projection(points), tension));
+    }
+
+    while (++i < n) {
+      if (defined.call(this, d = data[i], i)) {
+        points.push([+fx.call(this, d, i), +fy.call(this, d, i)]);
+      } else if (points.length) {
+        segment();
+        points = [];
+      }
+    }
+
+    if (points.length) segment();
+
+    return segments.length ? segments.join("") : null;
+  }
+
+  line.x = function(_) {
+    if (!arguments.length) return x;
+    x = _;
+    return line;
+  };
+
+  line.y = function(_) {
+    if (!arguments.length) return y;
+    y = _;
+    return line;
+  };
+
+  line.defined  = function(_) {
+    if (!arguments.length) return defined;
+    defined = _;
+    return line;
+  };
+
+  line.interpolate = function(_) {
+    if (!arguments.length) return interpolateKey;
+    if (typeof _ === "function") interpolateKey = interpolate = _;
+    else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
+    return line;
+  };
+
+  line.tension = function(_) {
+    if (!arguments.length) return tension;
+    tension = _;
+    return line;
+  };
+
+  return line;
+}
+
+d3.svg.line = function() {
+  return d3_svg_line(d3_identity);
+};
+
+// The default `x` property, which references d[0].
+function d3_svg_lineX(d) {
+  return d[0];
+}
+
+// The default `y` property, which references d[1].
+function d3_svg_lineY(d) {
+  return d[1];
+}
+
+// The various interpolators supported by the `line` class.
+var d3_svg_lineInterpolators = d3.map({
+  "linear": d3_svg_lineLinear,
+  "linear-closed": d3_svg_lineLinearClosed,
+  "step-before": d3_svg_lineStepBefore,
+  "step-after": d3_svg_lineStepAfter,
+  "basis": d3_svg_lineBasis,
+  "basis-open": d3_svg_lineBasisOpen,
+  "basis-closed": d3_svg_lineBasisClosed,
+  "bundle": d3_svg_lineBundle,
+  "cardinal": d3_svg_lineCardinal,
+  "cardinal-open": d3_svg_lineCardinalOpen,
+  "cardinal-closed": d3_svg_lineCardinalClosed,
+  "monotone": d3_svg_lineMonotone
+});
+
+d3_svg_lineInterpolators.forEach(function(key, value) {
+  value.key = key;
+  value.closed = /-closed$/.test(key);
+});
+
+// Linear interpolation; generates "L" commands.
+function d3_svg_lineLinear(points) {
+  return points.join("L");
+}
+
+function d3_svg_lineLinearClosed(points) {
+  return d3_svg_lineLinear(points) + "Z";
+}
+
+// Step interpolation; generates "H" and "V" commands.
+function d3_svg_lineStepBefore(points) {
+  var i = 0,
+      n = points.length,
+      p = points[0],
+      path = [p[0], ",", p[1]];
+  while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]);
+  return path.join("");
+}
+
+// Step interpolation; generates "H" and "V" commands.
+function d3_svg_lineStepAfter(points) {
+  var i = 0,
+      n = points.length,
+      p = points[0],
+      path = [p[0], ",", p[1]];
+  while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]);
+  return path.join("");
+}
+
+// Open cardinal spline interpolation; generates "C" commands.
+function d3_svg_lineCardinalOpen(points, tension) {
+  return points.length < 4
+      ? d3_svg_lineLinear(points)
+      : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1),
+        d3_svg_lineCardinalTangents(points, tension));
+}
+
+// Closed cardinal spline interpolation; generates "C" commands.
+function d3_svg_lineCardinalClosed(points, tension) {
+  return points.length < 3
+      ? d3_svg_lineLinear(points)
+      : points[0] + d3_svg_lineHermite((points.push(points[0]), points),
+        d3_svg_lineCardinalTangents([points[points.length - 2]]
+        .concat(points, [points[1]]), tension));
+}
+
+// Cardinal spline interpolation; generates "C" commands.
+function d3_svg_lineCardinal(points, tension) {
+  return points.length < 3
+      ? d3_svg_lineLinear(points)
+      : points[0] + d3_svg_lineHermite(points,
+        d3_svg_lineCardinalTangents(points, tension));
+}
+
+// Hermite spline construction; generates "C" commands.
+function d3_svg_lineHermite(points, tangents) {
+  if (tangents.length < 1
+      || (points.length != tangents.length
+      && points.length != tangents.length + 2)) {
+    return d3_svg_lineLinear(points);
+  }
+
+  var quad = points.length != tangents.length,
+      path = "",
+      p0 = points[0],
+      p = points[1],
+      t0 = tangents[0],
+      t = t0,
+      pi = 1;
+
+  if (quad) {
+    path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3)
+        + "," + p[0] + "," + p[1];
+    p0 = points[1];
+    pi = 2;
+  }
+
+  if (tangents.length > 1) {
+    t = tangents[1];
+    p = points[pi];
+    pi++;
+    path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1])
+        + "," + (p[0] - t[0]) + "," + (p[1] - t[1])
+        + "," + p[0] + "," + p[1];
+    for (var i = 2; i < tangents.length; i++, pi++) {
+      p = points[pi];
+      t = tangents[i];
+      path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1])
+          + "," + p[0] + "," + p[1];
+    }
+  }
+
+  if (quad) {
+    var lp = points[pi];
+    path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3)
+        + "," + lp[0] + "," + lp[1];
+  }
+
+  return path;
+}
+
+// Generates tangents for a cardinal spline.
+function d3_svg_lineCardinalTangents(points, tension) {
+  var tangents = [],
+      a = (1 - tension) / 2,
+      p0,
+      p1 = points[0],
+      p2 = points[1],
+      i = 1,
+      n = points.length;
+  while (++i < n) {
+    p0 = p1;
+    p1 = p2;
+    p2 = points[i];
+    tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]);
+  }
+  return tangents;
+}
+
+// B-spline interpolation; generates "C" commands.
+function d3_svg_lineBasis(points) {
+  if (points.length < 3) return d3_svg_lineLinear(points);
+  var i = 1,
+      n = points.length,
+      pi = points[0],
+      x0 = pi[0],
+      y0 = pi[1],
+      px = [x0, x0, x0, (pi = points[1])[0]],
+      py = [y0, y0, y0, pi[1]],
+      path = [x0, ",", y0];
+  d3_svg_lineBasisBezier(path, px, py);
+  while (++i < n) {
+    pi = points[i];
+    px.shift(); px.push(pi[0]);
+    py.shift(); py.push(pi[1]);
+    d3_svg_lineBasisBezier(path, px, py);
+  }
+  i = -1;
+  while (++i < 2) {
+    px.shift(); px.push(pi[0]);
+    py.shift(); py.push(pi[1]);
+    d3_svg_lineBasisBezier(path, px, py);
+  }
+  return path.join("");
+}
+
+// Open B-spline interpolation; generates "C" commands.
+function d3_svg_lineBasisOpen(points) {
+  if (points.length < 4) return d3_svg_lineLinear(points);
+  var path = [],
+      i = -1,
+      n = points.length,
+      pi,
+      px = [0],
+      py = [0];
+  while (++i < 3) {
+    pi = points[i];
+    px.push(pi[0]);
+    py.push(pi[1]);
+  }
+  path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px)
+    + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));
+  --i; while (++i < n) {
+    pi = points[i];
+    px.shift(); px.push(pi[0]);
+    py.shift(); py.push(pi[1]);
+    d3_svg_lineBasisBezier(path, px, py);
+  }
+  return path.join("");
+}
+
+// Closed B-spline interpolation; generates "C" commands.
+function d3_svg_lineBasisClosed(points) {
+  var path,
+      i = -1,
+      n = points.length,
+      m = n + 4,
+      pi,
+      px = [],
+      py = [];
+  while (++i < 4) {
+    pi = points[i % n];
+    px.push(pi[0]);
+    py.push(pi[1]);
+  }
+  path = [
+    d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",",
+    d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)
+  ];
+  --i; while (++i < m) {
+    pi = points[i % n];
+    px.shift(); px.push(pi[0]);
+    py.shift(); py.push(pi[1]);
+    d3_svg_lineBasisBezier(path, px, py);
+  }
+  return path.join("");
+}
+
+function d3_svg_lineBundle(points, tension) {
+  var n = points.length - 1;
+  if (n) {
+    var x0 = points[0][0],
+        y0 = points[0][1],
+        dx = points[n][0] - x0,
+        dy = points[n][1] - y0,
+        i = -1,
+        p,
+        t;
+    while (++i <= n) {
+      p = points[i];
+      t = i / n;
+      p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);
+      p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);
+    }
+  }
+  return d3_svg_lineBasis(points);
+}
+
+// Returns the dot product of the given four-element vectors.
+function d3_svg_lineDot4(a, b) {
+  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
+}
+
+// Matrix to transform basis (b-spline) control points to bezier
+// control points. Derived from FvD 11.2.8.
+var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0],
+    d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0],
+    d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6];
+
+// Pushes a "C" Bézier curve onto the specified path array, given the
+// two specified four-element arrays which define the control points.
+function d3_svg_lineBasisBezier(path, x, y) {
+  path.push(
+      "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x),
+      ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y),
+      ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x),
+      ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y),
+      ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x),
+      ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));
+}
+
+// Computes the slope from points p0 to p1.
+function d3_svg_lineSlope(p0, p1) {
+  return (p1[1] - p0[1]) / (p1[0] - p0[0]);
+}
+
+// Compute three-point differences for the given points.
+// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference
+function d3_svg_lineFiniteDifferences(points) {
+  var i = 0,
+      j = points.length - 1,
+      m = [],
+      p0 = points[0],
+      p1 = points[1],
+      d = m[0] = d3_svg_lineSlope(p0, p1);
+  while (++i < j) {
+    m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;
+  }
+  m[i] = d;
+  return m;
+}
+
+// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite
+// interpolation. Returns an array of tangent vectors. For details, see
+// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation
+function d3_svg_lineMonotoneTangents(points) {
+  var tangents = [],
+      d,
+      a,
+      b,
+      s,
+      m = d3_svg_lineFiniteDifferences(points),
+      i = -1,
+      j = points.length - 1;
+
+  // The first two steps are done by computing finite-differences:
+  // 1. Compute the slopes of the secant lines between successive points.
+  // 2. Initialize the tangents at every point as the average of the secants.
+
+  // Then, for each segment…
+  while (++i < j) {
+    d = d3_svg_lineSlope(points[i], points[i + 1]);
+
+    // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set
+    // mk = m{k + 1} = 0 as the spline connecting these points must be flat to
+    // preserve monotonicity. Ignore step 4 and 5 for those k.
+
+    if (Math.abs(d) < 1e-6) {
+      m[i] = m[i + 1] = 0;
+    } else {
+      // 4. Let ak = mk / dk and bk = m{k + 1} / dk.
+      a = m[i] / d;
+      b = m[i + 1] / d;
+
+      // 5. Prevent overshoot and ensure monotonicity by restricting the
+      // magnitude of vector <ak, bk> to a circle of radius 3.
+      s = a * a + b * b;
+      if (s > 9) {
+        s = d * 3 / Math.sqrt(s);
+        m[i] = s * a;
+        m[i + 1] = s * b;
+      }
+    }
+  }
+
+  // Compute the normalized tangent vector from the slopes. Note that if x is
+  // not monotonic, it's possible that the slope will be infinite, so we protect
+  // against NaN by setting the coordinate to zero.
+  i = -1; while (++i <= j) {
+    s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));
+    tangents.push([s || 0, m[i] * s || 0]);
+  }
+
+  return tangents;
+}
+
+function d3_svg_lineMonotone(points) {
+  return points.length < 3
+      ? d3_svg_lineLinear(points)
+      : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));
+}
diff --git a/static/demo/components/d3/src/svg/svg.js b/static/demo/components/d3/src/svg/svg.js
new file mode 100644
index 0000000000000000000000000000000000000000..3749248210fd21490191e13462b5f3373b8c5bc0
--- /dev/null
+++ b/static/demo/components/d3/src/svg/svg.js
@@ -0,0 +1 @@
+d3.svg = {};
diff --git a/static/demo/components/d3/src/svg/symbol.js b/static/demo/components/d3/src/svg/symbol.js
new file mode 100644
index 0000000000000000000000000000000000000000..8e4268f0bee90f1a9b9f79a2e2ea97eab4ca83fb
--- /dev/null
+++ b/static/demo/components/d3/src/svg/symbol.js
@@ -0,0 +1,100 @@
+d3.svg.symbol = function() {
+  var type = d3_svg_symbolType,
+      size = d3_svg_symbolSize;
+
+  function symbol(d, i) {
+    return (d3_svg_symbols.get(type.call(this, d, i))
+        || d3_svg_symbolCircle)
+        (size.call(this, d, i));
+  }
+
+  symbol.type = function(x) {
+    if (!arguments.length) return type;
+    type = d3_functor(x);
+    return symbol;
+  };
+
+  // size of symbol in square pixels
+  symbol.size = function(x) {
+    if (!arguments.length) return size;
+    size = d3_functor(x);
+    return symbol;
+  };
+
+  return symbol;
+};
+
+function d3_svg_symbolSize() {
+  return 64;
+}
+
+function d3_svg_symbolType() {
+  return "circle";
+}
+
+function d3_svg_symbolCircle(size) {
+  var r = Math.sqrt(size / π);
+  return "M0," + r
+      + "A" + r + "," + r + " 0 1,1 0," + (-r)
+      + "A" + r + "," + r + " 0 1,1 0," + r
+      + "Z";
+}
+
+// TODO cross-diagonal?
+var d3_svg_symbols = d3.map({
+  "circle": d3_svg_symbolCircle,
+  "cross": function(size) {
+    var r = Math.sqrt(size / 5) / 2;
+    return "M" + -3 * r + "," + -r
+        + "H" + -r
+        + "V" + -3 * r
+        + "H" + r
+        + "V" + -r
+        + "H" + 3 * r
+        + "V" + r
+        + "H" + r
+        + "V" + 3 * r
+        + "H" + -r
+        + "V" + r
+        + "H" + -3 * r
+        + "Z";
+  },
+  "diamond": function(size) {
+    var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)),
+        rx = ry * d3_svg_symbolTan30;
+    return "M0," + -ry
+        + "L" + rx + ",0"
+        + " 0," + ry
+        + " " + -rx + ",0"
+        + "Z";
+  },
+  "square": function(size) {
+    var r = Math.sqrt(size) / 2;
+    return "M" + -r + "," + -r
+        + "L" + r + "," + -r
+        + " " + r + "," + r
+        + " " + -r + "," + r
+        + "Z";
+  },
+  "triangle-down": function(size) {
+    var rx = Math.sqrt(size / d3_svg_symbolSqrt3),
+        ry = rx * d3_svg_symbolSqrt3 / 2;
+    return "M0," + ry
+        + "L" + rx +"," + -ry
+        + " " + -rx + "," + -ry
+        + "Z";
+  },
+  "triangle-up": function(size) {
+    var rx = Math.sqrt(size / d3_svg_symbolSqrt3),
+        ry = rx * d3_svg_symbolSqrt3 / 2;
+    return "M0," + -ry
+        + "L" + rx +"," + ry
+        + " " + -rx + "," + ry
+        + "Z";
+  }
+});
+
+d3.svg.symbolTypes = d3_svg_symbols.keys();
+
+var d3_svg_symbolSqrt3 = Math.sqrt(3),
+    d3_svg_symbolTan30 = Math.tan(30 * d3_radians);
diff --git a/static/demo/components/d3/src/time/day.js b/static/demo/components/d3/src/time/day.js
new file mode 100644
index 0000000000000000000000000000000000000000..83c49c42408c937433d469eaac0b7c1f0724e9af
--- /dev/null
+++ b/static/demo/components/d3/src/time/day.js
@@ -0,0 +1,17 @@
+d3.time.day = d3_time_interval(function(date) {
+  var day = new d3_time(1970, 0);
+  day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
+  return day;
+}, function(date, offset) {
+  date.setDate(date.getDate() + offset);
+}, function(date) {
+  return date.getDate() - 1;
+});
+
+d3.time.days = d3.time.day.range;
+d3.time.days.utc = d3.time.day.utc.range;
+
+d3.time.dayOfYear = function(date) {
+  var year = d3.time.year(date);
+  return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);
+};
diff --git a/static/demo/components/d3/src/time/format-iso.js b/static/demo/components/d3/src/time/format-iso.js
new file mode 100644
index 0000000000000000000000000000000000000000..b123d0147dea1fb88d35b2bace6edb5634137d98
--- /dev/null
+++ b/static/demo/components/d3/src/time/format-iso.js
@@ -0,0 +1,16 @@
+var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");
+
+d3.time.format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z")
+    ? d3_time_formatIsoNative
+    : d3_time_formatIso;
+
+function d3_time_formatIsoNative(date) {
+  return date.toISOString();
+}
+
+d3_time_formatIsoNative.parse = function(string) {
+  var date = new Date(string);
+  return isNaN(date) ? null : date;
+};
+
+d3_time_formatIsoNative.toString = d3_time_formatIso.toString;
diff --git a/static/demo/components/d3/src/time/format-locale.js b/static/demo/components/d3/src/time/format-locale.js
new file mode 100644
index 0000000000000000000000000000000000000000..934673ac6fd9aa465a6cd0c19edcb4439680a0a6
--- /dev/null
+++ b/static/demo/components/d3/src/time/format-locale.js
@@ -0,0 +1,10 @@
+// The date and time format (%c), date format (%x) and time format (%X).
+var d3_time_formatDateTime = {d_t_fmt},
+    d3_time_formatDate = {d_fmt},
+    d3_time_formatTime = {t_fmt};
+
+// The weekday and month names.
+var d3_time_days = {day},
+    d3_time_dayAbbreviations = {abday},
+    d3_time_months = {mon},
+    d3_time_monthAbbreviations = {abmon};
diff --git a/static/demo/components/d3/src/time/format-utc.js b/static/demo/components/d3/src/time/format-utc.js
new file mode 100644
index 0000000000000000000000000000000000000000..f40e175f09ed8c87df4b8a963e4cc4c899459541
--- /dev/null
+++ b/static/demo/components/d3/src/time/format-utc.js
@@ -0,0 +1,28 @@
+d3.time.format.utc = function(template) {
+  var local = d3.time.format(template);
+
+  function format(date) {
+    try {
+      d3_time = d3_time_utc;
+      var utc = new d3_time();
+      utc._ = date;
+      return local(utc);
+    } finally {
+      d3_time = Date;
+    }
+  }
+
+  format.parse = function(string) {
+    try {
+      d3_time = d3_time_utc;
+      var date = local.parse(string);
+      return date && date._;
+    } finally {
+      d3_time = Date;
+    }
+  };
+
+  format.toString = local.toString;
+
+  return format;
+};
diff --git a/static/demo/components/d3/src/time/format.js b/static/demo/components/d3/src/time/format.js
new file mode 100644
index 0000000000000000000000000000000000000000..12cb827f8eee1192b3e4af991fc081366c3899db
--- /dev/null
+++ b/static/demo/components/d3/src/time/format.js
@@ -0,0 +1,259 @@
+d3.time.format = function(template) {
+  var n = template.length;
+
+  function format(date) {
+    var string = [],
+        i = -1,
+        j = 0,
+        c,
+        p,
+        f;
+    while (++i < n) {
+      if (template.charCodeAt(i) === 37) {
+        string.push(template.substring(j, i));
+        if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);
+        if (f = d3_time_formats[c]) c = f(date, p == null ? (c === "e" ? " " : "0") : p);
+        string.push(c);
+        j = i + 1;
+      }
+    }
+    string.push(template.substring(j, i));
+    return string.join("");
+  }
+
+  format.parse = function(string) {
+    var d = {y: 1900, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0},
+        i = d3_time_parse(d, template, string, 0);
+    if (i != string.length) return null;
+
+    // The am-pm flag is 0 for AM, and 1 for PM.
+    if ("p" in d) d.H = d.H % 12 + d.p * 12;
+
+    var date = new d3_time();
+    date.setFullYear(d.y, d.m, d.d);
+    date.setHours(d.H, d.M, d.S, d.L);
+    return date;
+  };
+
+  format.toString = function() {
+    return template;
+  };
+
+  return format;
+};
+
+function d3_time_parse(date, template, string, j) {
+  var c,
+      p,
+      i = 0,
+      n = template.length,
+      m = string.length;
+  while (i < n) {
+    if (j >= m) return -1;
+    c = template.charCodeAt(i++);
+    if (c === 37) {
+      p = d3_time_parsers[template.charAt(i++)];
+      if (!p || ((j = p(date, string, j)) < 0)) return -1;
+    } else if (c != string.charCodeAt(j++)) {
+      return -1;
+    }
+  }
+  return j;
+}
+
+function d3_time_formatRe(names) {
+  return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i");
+}
+
+function d3_time_formatLookup(names) {
+  var map = new d3_Map, i = -1, n = names.length;
+  while (++i < n) map.set(names[i].toLowerCase(), i);
+  return map;
+}
+
+function d3_time_formatPad(value, fill, width) {
+  value += "";
+  var length = value.length;
+  return length < width ? new Array(width - length + 1).join(fill) + value : value;
+}
+
+var d3_time_dayRe = d3_time_formatRe(d3_time_days),
+    d3_time_dayAbbrevRe = d3_time_formatRe(d3_time_dayAbbreviations),
+    d3_time_monthRe = d3_time_formatRe(d3_time_months),
+    d3_time_monthLookup = d3_time_formatLookup(d3_time_months),
+    d3_time_monthAbbrevRe = d3_time_formatRe(d3_time_monthAbbreviations),
+    d3_time_monthAbbrevLookup = d3_time_formatLookup(d3_time_monthAbbreviations);
+
+var d3_time_formatPads = {
+  "-": "",
+  "_": " ",
+  "0": "0"
+};
+
+var d3_time_formats = {
+  a: function(d) { return d3_time_dayAbbreviations[d.getDay()]; },
+  A: function(d) { return d3_time_days[d.getDay()]; },
+  b: function(d) { return d3_time_monthAbbreviations[d.getMonth()]; },
+  B: function(d) { return d3_time_months[d.getMonth()]; },
+  c: d3.time.format(d3_time_formatDateTime),
+  d: function(d, p) { return d3_time_formatPad(d.getDate(), p, 2); },
+  e: function(d, p) { return d3_time_formatPad(d.getDate(), p, 2); },
+  H: function(d, p) { return d3_time_formatPad(d.getHours(), p, 2); },
+  I: function(d, p) { return d3_time_formatPad(d.getHours() % 12 || 12, p, 2); },
+  j: function(d, p) { return d3_time_formatPad(1 + d3.time.dayOfYear(d), p, 3); },
+  L: function(d, p) { return d3_time_formatPad(d.getMilliseconds(), p, 3); },
+  m: function(d, p) { return d3_time_formatPad(d.getMonth() + 1, p, 2); },
+  M: function(d, p) { return d3_time_formatPad(d.getMinutes(), p, 2); },
+  p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; },
+  S: function(d, p) { return d3_time_formatPad(d.getSeconds(), p, 2); },
+  U: function(d, p) { return d3_time_formatPad(d3.time.sundayOfYear(d), p, 2); },
+  w: function(d) { return d.getDay(); },
+  W: function(d, p) { return d3_time_formatPad(d3.time.mondayOfYear(d), p, 2); },
+  x: d3.time.format(d3_time_formatDate),
+  X: d3.time.format(d3_time_formatTime),
+  y: function(d, p) { return d3_time_formatPad(d.getFullYear() % 100, p, 2); },
+  Y: function(d, p) { return d3_time_formatPad(d.getFullYear() % 10000, p, 4); },
+  Z: d3_time_zone,
+  "%": function() { return "%"; }
+};
+
+var d3_time_parsers = {
+  a: d3_time_parseWeekdayAbbrev,
+  A: d3_time_parseWeekday,
+  b: d3_time_parseMonthAbbrev,
+  B: d3_time_parseMonth,
+  c: d3_time_parseLocaleFull,
+  d: d3_time_parseDay,
+  e: d3_time_parseDay,
+  H: d3_time_parseHour24,
+  I: d3_time_parseHour24,
+  // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; },
+  L: d3_time_parseMilliseconds,
+  m: d3_time_parseMonthNumber,
+  M: d3_time_parseMinutes,
+  p: d3_time_parseAmPm,
+  S: d3_time_parseSeconds,
+  // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; },
+  // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; },
+  // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; },
+  x: d3_time_parseLocaleDate,
+  X: d3_time_parseLocaleTime,
+  y: d3_time_parseYear,
+  Y: d3_time_parseFullYear
+  // ,
+  // Z: function(d, s, i) { /*TODO time zone */ return i; },
+  // "%": function(d, s, i) { /*TODO literal % */ return i; }
+};
+
+// Note: weekday is validated, but does not set the date.
+function d3_time_parseWeekdayAbbrev(date, string, i) {
+  d3_time_dayAbbrevRe.lastIndex = 0;
+  var n = d3_time_dayAbbrevRe.exec(string.substring(i));
+  return n ? i += n[0].length : -1;
+}
+
+// Note: weekday is validated, but does not set the date.
+function d3_time_parseWeekday(date, string, i) {
+  d3_time_dayRe.lastIndex = 0;
+  var n = d3_time_dayRe.exec(string.substring(i));
+  return n ? i += n[0].length : -1;
+}
+
+function d3_time_parseMonthAbbrev(date, string, i) {
+  d3_time_monthAbbrevRe.lastIndex = 0;
+  var n = d3_time_monthAbbrevRe.exec(string.substring(i));
+  return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i += n[0].length) : -1;
+}
+
+function d3_time_parseMonth(date, string, i) {
+  d3_time_monthRe.lastIndex = 0;
+  var n = d3_time_monthRe.exec(string.substring(i));
+  return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i += n[0].length) : -1;
+}
+
+function d3_time_parseLocaleFull(date, string, i) {
+  return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
+}
+
+function d3_time_parseLocaleDate(date, string, i) {
+  return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
+}
+
+function d3_time_parseLocaleTime(date, string, i) {
+  return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
+}
+
+function d3_time_parseFullYear(date, string, i) {
+  d3_time_numberRe.lastIndex = 0;
+  var n = d3_time_numberRe.exec(string.substring(i, i + 4));
+  return n ? (date.y = +n[0], i += n[0].length) : -1;
+}
+
+function d3_time_parseYear(date, string, i) {
+  d3_time_numberRe.lastIndex = 0;
+  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+  return n ? (date.y = d3_time_expandYear(+n[0]), i += n[0].length) : -1;
+}
+
+function d3_time_expandYear(d) {
+  return d + (d > 68 ? 1900 : 2000);
+}
+
+function d3_time_parseMonthNumber(date, string, i) {
+  d3_time_numberRe.lastIndex = 0;
+  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+  return n ? (date.m = n[0] - 1, i += n[0].length) : -1;
+}
+
+function d3_time_parseDay(date, string, i) {
+  d3_time_numberRe.lastIndex = 0;
+  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+  return n ? (date.d = +n[0], i += n[0].length) : -1;
+}
+
+// Note: we don't validate that the hour is in the range [0,23] or [1,12].
+function d3_time_parseHour24(date, string, i) {
+  d3_time_numberRe.lastIndex = 0;
+  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+  return n ? (date.H = +n[0], i += n[0].length) : -1;
+}
+
+function d3_time_parseMinutes(date, string, i) {
+  d3_time_numberRe.lastIndex = 0;
+  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+  return n ? (date.M = +n[0], i += n[0].length) : -1;
+}
+
+function d3_time_parseSeconds(date, string, i) {
+  d3_time_numberRe.lastIndex = 0;
+  var n = d3_time_numberRe.exec(string.substring(i, i + 2));
+  return n ? (date.S = +n[0], i += n[0].length) : -1;
+}
+
+function d3_time_parseMilliseconds(date, string, i) {
+  d3_time_numberRe.lastIndex = 0;
+  var n = d3_time_numberRe.exec(string.substring(i, i + 3));
+  return n ? (date.L = +n[0], i += n[0].length) : -1;
+}
+
+// Note: we don't look at the next directive.
+var d3_time_numberRe = /^\s*\d+/;
+
+function d3_time_parseAmPm(date, string, i) {
+  var n = d3_time_amPmLookup.get(string.substring(i, i += 2).toLowerCase());
+  return n == null ? -1 : (date.p = n, i);
+}
+
+var d3_time_amPmLookup = d3.map({
+  am: 0,
+  pm: 1
+});
+
+// TODO table of time zone offset names?
+function d3_time_zone(d) {
+  var z = d.getTimezoneOffset(),
+      zs = z > 0 ? "-" : "+",
+      zh = ~~(Math.abs(z) / 60),
+      zm = Math.abs(z) % 60;
+  return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2);
+}
diff --git a/static/demo/components/d3/src/time/hour.js b/static/demo/components/d3/src/time/hour.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e8f0f760dc67e73e5875c0fedfd50cd2883841a
--- /dev/null
+++ b/static/demo/components/d3/src/time/hour.js
@@ -0,0 +1,11 @@
+d3.time.hour = d3_time_interval(function(date) {
+  var timezone = date.getTimezoneOffset() / 60;
+  return new d3_time((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);
+}, function(date, offset) {
+  date.setTime(date.getTime() + Math.floor(offset) * 36e5); // DST breaks setHours
+}, function(date) {
+  return date.getHours();
+});
+
+d3.time.hours = d3.time.hour.range;
+d3.time.hours.utc = d3.time.hour.utc.range;
diff --git a/static/demo/components/d3/src/time/interval.js b/static/demo/components/d3/src/time/interval.js
new file mode 100644
index 0000000000000000000000000000000000000000..6914412854468d7d7cad030f1e97a5ed7bf97b7a
--- /dev/null
+++ b/static/demo/components/d3/src/time/interval.js
@@ -0,0 +1,69 @@
+function d3_time_interval(local, step, number) {
+
+  function round(date) {
+    var d0 = local(date), d1 = offset(d0, 1);
+    return date - d0 < d1 - date ? d0 : d1;
+  }
+
+  function ceil(date) {
+    step(date = local(new d3_time(date - 1)), 1);
+    return date;
+  }
+
+  function offset(date, k) {
+    step(date = new d3_time(+date), k);
+    return date;
+  }
+
+  function range(t0, t1, dt) {
+    var time = ceil(t0), times = [];
+    if (dt > 1) {
+      while (time < t1) {
+        if (!(number(time) % dt)) times.push(new Date(+time));
+        step(time, 1);
+      }
+    } else {
+      while (time < t1) times.push(new Date(+time)), step(time, 1);
+    }
+    return times;
+  }
+
+  function range_utc(t0, t1, dt) {
+    try {
+      d3_time = d3_time_utc;
+      var utc = new d3_time_utc();
+      utc._ = t0;
+      return range(utc, t1, dt);
+    } finally {
+      d3_time = Date;
+    }
+  }
+
+  local.floor = local;
+  local.round = round;
+  local.ceil = ceil;
+  local.offset = offset;
+  local.range = range;
+
+  var utc = local.utc = d3_time_interval_utc(local);
+  utc.floor = utc;
+  utc.round = d3_time_interval_utc(round);
+  utc.ceil = d3_time_interval_utc(ceil);
+  utc.offset = d3_time_interval_utc(offset);
+  utc.range = range_utc;
+
+  return local;
+}
+
+function d3_time_interval_utc(method) {
+  return function(date, k) {
+    try {
+      d3_time = d3_time_utc;
+      var utc = new d3_time_utc();
+      utc._ = date;
+      return method(utc, k)._;
+    } finally {
+      d3_time = Date;
+    }
+  };
+}
diff --git a/static/demo/components/d3/src/time/minute.js b/static/demo/components/d3/src/time/minute.js
new file mode 100644
index 0000000000000000000000000000000000000000..b23d29b106b558d889da2433e68c2e8076e6ae08
--- /dev/null
+++ b/static/demo/components/d3/src/time/minute.js
@@ -0,0 +1,10 @@
+d3.time.minute = d3_time_interval(function(date) {
+  return new d3_time(Math.floor(date / 6e4) * 6e4);
+}, function(date, offset) {
+  date.setTime(date.getTime() + Math.floor(offset) * 6e4); // DST breaks setMinutes
+}, function(date) {
+  return date.getMinutes();
+});
+
+d3.time.minutes = d3.time.minute.range;
+d3.time.minutes.utc = d3.time.minute.utc.range;
diff --git a/static/demo/components/d3/src/time/month.js b/static/demo/components/d3/src/time/month.js
new file mode 100644
index 0000000000000000000000000000000000000000..5514e1312e13c6ab6157721e4725ebc37434e75b
--- /dev/null
+++ b/static/demo/components/d3/src/time/month.js
@@ -0,0 +1,12 @@
+d3.time.month = d3_time_interval(function(date) {
+  date = d3.time.day(date);
+  date.setDate(1);
+  return date;
+}, function(date, offset) {
+  date.setMonth(date.getMonth() + offset);
+}, function(date) {
+  return date.getMonth();
+});
+
+d3.time.months = d3.time.month.range;
+d3.time.months.utc = d3.time.month.utc.range;
diff --git a/static/demo/components/d3/src/time/scale-utc.js b/static/demo/components/d3/src/time/scale-utc.js
new file mode 100644
index 0000000000000000000000000000000000000000..b65ff0a46e0b7fdcce79cd2028a5f7cd6f8469b4
--- /dev/null
+++ b/static/demo/components/d3/src/time/scale-utc.js
@@ -0,0 +1,37 @@
+var d3_time_scaleUTCMethods = d3_time_scaleLocalMethods.map(function(m) {
+  return [m[0].utc, m[1]];
+});
+
+var d3_time_scaleUTCFormats = [
+  [d3.time.format.utc("%Y"), d3_true],
+  [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }],
+  [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }],
+  [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }],
+  [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }],
+  [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }],
+  [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds(); }],
+  [d3.time.format.utc(".%L"), function(d) { return d.getUTCMilliseconds(); }]
+];
+
+var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats);
+
+function d3_time_scaleUTCSetYear(y) {
+  var d = new Date(Date.UTC(y, 0, 1));
+  d.setUTCFullYear(y); // Y2K fail
+  return d;
+}
+
+function d3_time_scaleUTCGetYear(d) {
+  var y = d.getUTCFullYear(),
+      d0 = d3_time_scaleUTCSetYear(y),
+      d1 = d3_time_scaleUTCSetYear(y + 1);
+  return y + (d - d0) / (d1 - d0);
+}
+
+d3_time_scaleUTCMethods.year = function(extent, m) {
+  return d3_time_scaleLinear.domain(extent.map(d3_time_scaleUTCGetYear)).ticks(m).map(d3_time_scaleUTCSetYear);
+};
+
+d3.time.scale.utc = function() {
+  return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat);
+};
diff --git a/static/demo/components/d3/src/time/scale.js b/static/demo/components/d3/src/time/scale.js
new file mode 100644
index 0000000000000000000000000000000000000000..fbc5cb0f4427000ae0b4a8e29c1481e7f0e84d03
--- /dev/null
+++ b/static/demo/components/d3/src/time/scale.js
@@ -0,0 +1,142 @@
+function d3_time_scale(linear, methods, format) {
+
+  function scale(x) {
+    return linear(x);
+  }
+
+  scale.invert = function(x) {
+    return d3_time_scaleDate(linear.invert(x));
+  };
+
+  scale.domain = function(x) {
+    if (!arguments.length) return linear.domain().map(d3_time_scaleDate);
+    linear.domain(x);
+    return scale;
+  };
+
+  scale.nice = function(m) {
+    return scale.domain(d3_scale_nice(scale.domain(), function() { return m; }));
+  };
+
+  scale.ticks = function(m, k) {
+    var extent = d3_time_scaleExtent(scale.domain());
+    if (typeof m !== "function") {
+      var span = extent[1] - extent[0],
+          target = span / m,
+          i = d3.bisect(d3_time_scaleSteps, target);
+      if (i == d3_time_scaleSteps.length) return methods.year(extent, m);
+      if (!i) return linear.ticks(m).map(d3_time_scaleDate);
+      if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i;
+      m = methods[i];
+      k = m[1];
+      m = m[0].range;
+    }
+    return m(extent[0], new Date(+extent[1] + 1), k); // inclusive upper bound
+  };
+
+  scale.tickFormat = function() {
+    return format;
+  };
+
+  scale.copy = function() {
+    return d3_time_scale(linear.copy(), methods, format);
+  };
+
+  // TOOD expose d3_scale_linear_rebind?
+  return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
+}
+
+// TODO expose d3_scaleExtent?
+function d3_time_scaleExtent(domain) {
+  var start = domain[0], stop = domain[domain.length - 1];
+  return start < stop ? [start, stop] : [stop, start];
+}
+
+function d3_time_scaleDate(t) {
+  return new Date(t);
+}
+
+function d3_time_scaleFormat(formats) {
+  return function(date) {
+    var i = formats.length - 1, f = formats[i];
+    while (!f[1](date)) f = formats[--i];
+    return f[0](date);
+  };
+}
+
+function d3_time_scaleSetYear(y) {
+  var d = new Date(y, 0, 1);
+  d.setFullYear(y); // Y2K fail
+  return d;
+}
+
+function d3_time_scaleGetYear(d) {
+  var y = d.getFullYear(),
+      d0 = d3_time_scaleSetYear(y),
+      d1 = d3_time_scaleSetYear(y + 1);
+  return y + (d - d0) / (d1 - d0);
+}
+
+var d3_time_scaleSteps = [
+  1e3,    // 1-second
+  5e3,    // 5-second
+  15e3,   // 15-second
+  3e4,    // 30-second
+  6e4,    // 1-minute
+  3e5,    // 5-minute
+  9e5,    // 15-minute
+  18e5,   // 30-minute
+  36e5,   // 1-hour
+  108e5,  // 3-hour
+  216e5,  // 6-hour
+  432e5,  // 12-hour
+  864e5,  // 1-day
+  1728e5, // 2-day
+  6048e5, // 1-week
+  2592e6, // 1-month
+  7776e6, // 3-month
+  31536e6 // 1-year
+];
+
+var d3_time_scaleLocalMethods = [
+  [d3.time.second, 1],
+  [d3.time.second, 5],
+  [d3.time.second, 15],
+  [d3.time.second, 30],
+  [d3.time.minute, 1],
+  [d3.time.minute, 5],
+  [d3.time.minute, 15],
+  [d3.time.minute, 30],
+  [d3.time.hour, 1],
+  [d3.time.hour, 3],
+  [d3.time.hour, 6],
+  [d3.time.hour, 12],
+  [d3.time.day, 1],
+  [d3.time.day, 2],
+  [d3.time.week, 1],
+  [d3.time.month, 1],
+  [d3.time.month, 3],
+  [d3.time.year, 1]
+];
+
+var d3_time_scaleLocalFormats = [
+  [d3.time.format("%Y"), d3_true],
+  [d3.time.format("%B"), function(d) { return d.getMonth(); }],
+  [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }],
+  [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }],
+  [d3.time.format("%I %p"), function(d) { return d.getHours(); }],
+  [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }],
+  [d3.time.format(":%S"), function(d) { return d.getSeconds(); }],
+  [d3.time.format(".%L"), function(d) { return d.getMilliseconds(); }]
+];
+
+var d3_time_scaleLinear = d3.scale.linear(),
+    d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats);
+
+d3_time_scaleLocalMethods.year = function(extent, m) {
+  return d3_time_scaleLinear.domain(extent.map(d3_time_scaleGetYear)).ticks(m).map(d3_time_scaleSetYear);
+};
+
+d3.time.scale = function() {
+  return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
+};
diff --git a/static/demo/components/d3/src/time/second.js b/static/demo/components/d3/src/time/second.js
new file mode 100644
index 0000000000000000000000000000000000000000..d9cdd65bee214fa559376c0a987be7ad4ed9a7bb
--- /dev/null
+++ b/static/demo/components/d3/src/time/second.js
@@ -0,0 +1,10 @@
+d3.time.second = d3_time_interval(function(date) {
+  return new d3_time(Math.floor(date / 1e3) * 1e3);
+}, function(date, offset) {
+  date.setTime(date.getTime() + Math.floor(offset) * 1e3); // DST breaks setSeconds
+}, function(date) {
+  return date.getSeconds();
+});
+
+d3.time.seconds = d3.time.second.range;
+d3.time.seconds.utc = d3.time.second.utc.range;
diff --git a/static/demo/components/d3/src/time/time.js b/static/demo/components/d3/src/time/time.js
new file mode 100644
index 0000000000000000000000000000000000000000..edecde8032b56824c28e4e9257c0588005d1250c
--- /dev/null
+++ b/static/demo/components/d3/src/time/time.js
@@ -0,0 +1,35 @@
+d3.time = {};
+
+var d3_time = Date,
+    d3_time_daySymbols = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
+
+function d3_time_utc() {
+  this._ = new Date(arguments.length > 1
+      ? Date.UTC.apply(this, arguments)
+      : arguments[0]);
+}
+
+d3_time_utc.prototype = {
+  getDate: function() { return this._.getUTCDate(); },
+  getDay: function() { return this._.getUTCDay(); },
+  getFullYear: function() { return this._.getUTCFullYear(); },
+  getHours: function() { return this._.getUTCHours(); },
+  getMilliseconds: function() { return this._.getUTCMilliseconds(); },
+  getMinutes: function() { return this._.getUTCMinutes(); },
+  getMonth: function() { return this._.getUTCMonth(); },
+  getSeconds: function() { return this._.getUTCSeconds(); },
+  getTime: function() { return this._.getTime(); },
+  getTimezoneOffset: function() { return 0; },
+  valueOf: function() { return this._.valueOf(); },
+  setDate: function() { d3_time_prototype.setUTCDate.apply(this._, arguments); },
+  setDay: function() { d3_time_prototype.setUTCDay.apply(this._, arguments); },
+  setFullYear: function() { d3_time_prototype.setUTCFullYear.apply(this._, arguments); },
+  setHours: function() { d3_time_prototype.setUTCHours.apply(this._, arguments); },
+  setMilliseconds: function() { d3_time_prototype.setUTCMilliseconds.apply(this._, arguments); },
+  setMinutes: function() { d3_time_prototype.setUTCMinutes.apply(this._, arguments); },
+  setMonth: function() { d3_time_prototype.setUTCMonth.apply(this._, arguments); },
+  setSeconds: function() { d3_time_prototype.setUTCSeconds.apply(this._, arguments); },
+  setTime: function() { d3_time_prototype.setTime.apply(this._, arguments); }
+};
+
+var d3_time_prototype = Date.prototype;
diff --git a/static/demo/components/d3/src/time/week.js b/static/demo/components/d3/src/time/week.js
new file mode 100644
index 0000000000000000000000000000000000000000..f0e960321ed672b1d017ca1080220b0d1194f052
--- /dev/null
+++ b/static/demo/components/d3/src/time/week.js
@@ -0,0 +1,27 @@
+d3_time_daySymbols.forEach(function(day, i) {
+  day = day.toLowerCase();
+  i = 7 - i;
+
+  var interval = d3.time[day] = d3_time_interval(function(date) {
+    (date = d3.time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);
+    return date;
+  }, function(date, offset) {
+    date.setDate(date.getDate() + Math.floor(offset) * 7);
+  }, function(date) {
+    var day = d3.time.year(date).getDay();
+    return Math.floor((d3.time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);
+  });
+
+  d3.time[day + "s"] = interval.range;
+  d3.time[day + "s"].utc = interval.utc.range;
+
+  d3.time[day + "OfYear"] = function(date) {
+    var day = d3.time.year(date).getDay();
+    return Math.floor((d3.time.dayOfYear(date) + (day + i) % 7) / 7);
+  };
+});
+
+d3.time.week = d3.time.sunday;
+d3.time.weeks = d3.time.sunday.range;
+d3.time.weeks.utc = d3.time.sunday.utc.range;
+d3.time.weekOfYear = d3.time.sundayOfYear;
diff --git a/static/demo/components/d3/src/time/year.js b/static/demo/components/d3/src/time/year.js
new file mode 100644
index 0000000000000000000000000000000000000000..5752aa53961b37eb915737c884a3625f2a41503a
--- /dev/null
+++ b/static/demo/components/d3/src/time/year.js
@@ -0,0 +1,12 @@
+d3.time.year = d3_time_interval(function(date) {
+  date = d3.time.day(date);
+  date.setMonth(0, 1);
+  return date;
+}, function(date, offset) {
+  date.setFullYear(date.getFullYear() + offset);
+}, function(date) {
+  return date.getFullYear();
+});
+
+d3.time.years = d3.time.year.range;
+d3.time.years.utc = d3.time.year.utc.range;
diff --git a/static/demo/components/d3/test/core/ascending-test.js b/static/demo/components/d3/test/core/ascending-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..20f1641233d457e1d8626352e465aa3e826553cb
--- /dev/null
+++ b/static/demo/components/d3/test/core/ascending-test.js
@@ -0,0 +1,46 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.ascending");
+
+suite.addBatch({
+  "numbers": {
+    "returns a negative number if a < b": function() {
+      assert.isTrue(d3.ascending(0, 1) < 0);
+    },
+    "returns a positive number if a > b": function() {
+      assert.isTrue(d3.ascending(1, 0) > 0);
+    },
+    "returns zero if a == b": function() {
+      assert.equal(d3.ascending(0, 0), 0);
+    },
+    "returns NaN if a or b is undefined": function() {
+      assert.isNaN(d3.ascending(0, undefined));
+      assert.isNaN(d3.ascending(undefined, 0));
+      assert.isNaN(d3.ascending(undefined, undefined));
+    },
+    "returns NaN if a or b is NaN": function() {
+      assert.isNaN(d3.ascending(0, NaN));
+      assert.isNaN(d3.ascending(NaN, 0));
+      assert.isNaN(d3.ascending(NaN, NaN));
+    }
+  }
+});
+
+suite.addBatch({
+  "strings": {
+    "returns a negative number if a < b": function() {
+      assert.isTrue(d3.ascending("a", "b") < 0);
+    },
+    "returns a positive number if a > b": function() {
+      assert.isTrue(d3.ascending("b", "a") > 0);
+    },
+    "returns zero if a == b": function() {
+      assert.equal(d3.ascending("a", "a"), 0);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/bisect-test.js b/static/demo/components/d3/test/core/bisect-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..2619161deb2d6b94a32f349a48025783fd5ca339
--- /dev/null
+++ b/static/demo/components/d3/test/core/bisect-test.js
@@ -0,0 +1,264 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.bisect");
+
+var i30 = 1 << 30;
+
+suite.addBatch({
+  "bisectLeft": {
+    topic: function() {
+      return d3.bisectLeft;
+    },
+    "finds the index of an exact match": function(bisect) {
+      var array = [1, 2, 3];
+      assert.equal(bisect(array, 1), 0);
+      assert.equal(bisect(array, 2), 1);
+      assert.equal(bisect(array, 3), 2);
+    },
+    "finds the index of the first match": function(bisect) {
+      var array = [1, 2, 2, 3];
+      assert.equal(bisect(array, 1), 0);
+      assert.equal(bisect(array, 2), 1);
+      assert.equal(bisect(array, 3), 3);
+    },
+    "finds the insertion point of a non-exact match": function(bisect) {
+      var array = [1, 2, 3];
+      assert.equal(bisect(array, 0.5), 0);
+      assert.equal(bisect(array, 1.5), 1);
+      assert.equal(bisect(array, 2.5), 2);
+      assert.equal(bisect(array, 3.5), 3);
+    },
+    "observes the optional lower bound": function(bisect) {
+      var array = [1, 2, 3, 4, 5];
+      assert.equal(bisect(array, 0, 2), 2);
+      assert.equal(bisect(array, 1, 2), 2);
+      assert.equal(bisect(array, 2, 2), 2);
+      assert.equal(bisect(array, 3, 2), 2);
+      assert.equal(bisect(array, 4, 2), 3);
+      assert.equal(bisect(array, 5, 2), 4);
+      assert.equal(bisect(array, 6, 2), 5);
+    },
+    "observes the optional bounds": function(bisect) {
+      var array = [1, 2, 3, 4, 5];
+      assert.equal(bisect(array, 0, 2, 3), 2);
+      assert.equal(bisect(array, 1, 2, 3), 2);
+      assert.equal(bisect(array, 2, 2, 3), 2);
+      assert.equal(bisect(array, 3, 2, 3), 2);
+      assert.equal(bisect(array, 4, 2, 3), 3);
+      assert.equal(bisect(array, 5, 2, 3), 3);
+      assert.equal(bisect(array, 6, 2, 3), 3);
+    },
+    "large arrays": function(bisect) {
+      var array = [],
+          i = i30;
+      array[i++] = 1;
+      array[i++] = 2;
+      array[i++] = 3;
+      array[i++] = 4;
+      array[i++] = 5;
+      assert.equal(bisect(array, 0, i - 5, i), i - 5);
+      assert.equal(bisect(array, 1, i - 5, i), i - 5);
+      assert.equal(bisect(array, 2, i - 5, i), i - 4);
+      assert.equal(bisect(array, 3, i - 5, i), i - 3);
+      assert.equal(bisect(array, 4, i - 5, i), i - 2);
+      assert.equal(bisect(array, 5, i - 5, i), i - 1);
+      assert.equal(bisect(array, 6, i - 5, i), i - 0);
+    }
+  }
+});
+
+suite.addBatch({
+  "bisectRight": {
+    topic: function() {
+      return d3.bisectRight;
+    },
+    "finds the index after an exact match": function(bisect) {
+      var array = [1, 2, 3];
+      assert.equal(bisect(array, 1), 1);
+      assert.equal(bisect(array, 2), 2);
+      assert.equal(bisect(array, 3), 3);
+    },
+    "finds the index after the last match": function(bisect) {
+      var array = [1, 2, 2, 3];
+      assert.equal(bisect(array, 1), 1);
+      assert.equal(bisect(array, 2), 3);
+      assert.equal(bisect(array, 3), 4);
+    },
+    "finds the insertion point of a non-exact match": function(bisect) {
+      var array = [1, 2, 3];
+      assert.equal(bisect(array, 0.5), 0);
+      assert.equal(bisect(array, 1.5), 1);
+      assert.equal(bisect(array, 2.5), 2);
+      assert.equal(bisect(array, 3.5), 3);
+    },
+    "observes the optional lower bound": function(bisect) {
+      var array = [1, 2, 3, 4, 5];
+      assert.equal(bisect(array, 0, 2), 2);
+      assert.equal(bisect(array, 1, 2), 2);
+      assert.equal(bisect(array, 2, 2), 2);
+      assert.equal(bisect(array, 3, 2), 3);
+      assert.equal(bisect(array, 4, 2), 4);
+      assert.equal(bisect(array, 5, 2), 5);
+      assert.equal(bisect(array, 6, 2), 5);
+    },
+    "observes the optional bounds": function(bisect) {
+      var array = [1, 2, 3, 4, 5];
+      assert.equal(bisect(array, 0, 2, 3), 2);
+      assert.equal(bisect(array, 1, 2, 3), 2);
+      assert.equal(bisect(array, 2, 2, 3), 2);
+      assert.equal(bisect(array, 3, 2, 3), 3);
+      assert.equal(bisect(array, 4, 2, 3), 3);
+      assert.equal(bisect(array, 5, 2, 3), 3);
+      assert.equal(bisect(array, 6, 2, 3), 3);
+    },
+    "large arrays": function(bisect) {
+      var array = [],
+          i = i30;
+      array[i++] = 1;
+      array[i++] = 2;
+      array[i++] = 3;
+      array[i++] = 4;
+      array[i++] = 5;
+      assert.equal(bisect(array, 0, i - 5, i), i - 5);
+      assert.equal(bisect(array, 1, i - 5, i), i - 4);
+      assert.equal(bisect(array, 2, i - 5, i), i - 3);
+      assert.equal(bisect(array, 3, i - 5, i), i - 2);
+      assert.equal(bisect(array, 4, i - 5, i), i - 1);
+      assert.equal(bisect(array, 5, i - 5, i), i - 0);
+      assert.equal(bisect(array, 6, i - 5, i), i - 0);
+    }
+  }
+});
+
+suite.addBatch({
+  "bisector(key)": {
+    topic: function() {
+      return d3.bisector(function(d) { return d.key; });
+    },
+    "left": {
+      topic: function(bisector) {
+        return bisector.left;
+      },
+      "finds the index of an exact match": function(bisect) {
+        var array = [{key: 1}, {key: 2}, {key: 3}];
+        assert.equal(bisect(array, 1), 0);
+        assert.equal(bisect(array, 2), 1);
+        assert.equal(bisect(array, 3), 2);
+      },
+      "finds the index of the first match": function(bisect) {
+        var array = [{key: 1}, {key: 2}, {key: 2}, {key: 3}];
+        assert.equal(bisect(array, 1), 0);
+        assert.equal(bisect(array, 2), 1);
+        assert.equal(bisect(array, 3), 3);
+      },
+      "finds the insertion point of a non-exact match": function(bisect) {
+        var array = [{key: 1}, {key: 2}, {key: 3}];
+        assert.equal(bisect(array, 0.5), 0);
+        assert.equal(bisect(array, 1.5), 1);
+        assert.equal(bisect(array, 2.5), 2);
+        assert.equal(bisect(array, 3.5), 3);
+      },
+      "observes the optional lower bound": function(bisect) {
+        var array = [{key: 1}, {key: 2}, {key: 3}, {key: 4}, {key: 5}];
+        assert.equal(bisect(array, 0, 2), 2);
+        assert.equal(bisect(array, 1, 2), 2);
+        assert.equal(bisect(array, 2, 2), 2);
+        assert.equal(bisect(array, 3, 2), 2);
+        assert.equal(bisect(array, 4, 2), 3);
+        assert.equal(bisect(array, 5, 2), 4);
+        assert.equal(bisect(array, 6, 2), 5);
+      },
+      "observes the optional bounds": function(bisect) {
+        var array = [{key: 1}, {key: 2}, {key: 3}, {key: 4}, {key: 5}];
+        assert.equal(bisect(array, 0, 2, 3), 2);
+        assert.equal(bisect(array, 1, 2, 3), 2);
+        assert.equal(bisect(array, 2, 2, 3), 2);
+        assert.equal(bisect(array, 3, 2, 3), 2);
+        assert.equal(bisect(array, 4, 2, 3), 3);
+        assert.equal(bisect(array, 5, 2, 3), 3);
+        assert.equal(bisect(array, 6, 2, 3), 3);
+      },
+      "large arrays": function(bisect) {
+        var array = [],
+            i = i30;
+        array[i++] = {key: 1};
+        array[i++] = {key: 2};
+        array[i++] = {key: 3};
+        array[i++] = {key: 4};
+        array[i++] = {key: 5};
+        assert.equal(bisect(array, 0, i - 5, i), i - 5);
+        assert.equal(bisect(array, 1, i - 5, i), i - 5);
+        assert.equal(bisect(array, 2, i - 5, i), i - 4);
+        assert.equal(bisect(array, 3, i - 5, i), i - 3);
+        assert.equal(bisect(array, 4, i - 5, i), i - 2);
+        assert.equal(bisect(array, 5, i - 5, i), i - 1);
+        assert.equal(bisect(array, 6, i - 5, i), i - 0);
+      }
+    },
+    "right": {
+      topic: function(bisector) {
+        return bisector.right;
+      },
+      "finds the index after an exact match": function(bisect) {
+        var array = [{key: 1}, {key: 2}, {key: 3}];
+        assert.equal(bisect(array, 1), 1);
+        assert.equal(bisect(array, 2), 2);
+        assert.equal(bisect(array, 3), 3);
+      },
+      "finds the index after the last match": function(bisect) {
+        var array = [{key: 1}, {key: 2}, {key: 2}, {key: 3}];
+        assert.equal(bisect(array, 1), 1);
+        assert.equal(bisect(array, 2), 3);
+        assert.equal(bisect(array, 3), 4);
+      },
+      "finds the insertion point of a non-exact match": function(bisect) {
+        var array = [{key: 1}, {key: 2}, {key: 3}];
+        assert.equal(bisect(array, 0.5), 0);
+        assert.equal(bisect(array, 1.5), 1);
+        assert.equal(bisect(array, 2.5), 2);
+        assert.equal(bisect(array, 3.5), 3);
+      },
+      "observes the optional lower bound": function(bisect) {
+        var array = [{key: 1}, {key: 2}, {key: 3}, {key: 4}, {key: 5}];
+        assert.equal(bisect(array, 0, 2), 2);
+        assert.equal(bisect(array, 1, 2), 2);
+        assert.equal(bisect(array, 2, 2), 2);
+        assert.equal(bisect(array, 3, 2), 3);
+        assert.equal(bisect(array, 4, 2), 4);
+        assert.equal(bisect(array, 5, 2), 5);
+        assert.equal(bisect(array, 6, 2), 5);
+      },
+      "observes the optional bounds": function(bisect) {
+        var array = [{key: 1}, {key: 2}, {key: 3}, {key: 4}, {key: 5}];
+        assert.equal(bisect(array, 0, 2, 3), 2);
+        assert.equal(bisect(array, 1, 2, 3), 2);
+        assert.equal(bisect(array, 2, 2, 3), 2);
+        assert.equal(bisect(array, 3, 2, 3), 3);
+        assert.equal(bisect(array, 4, 2, 3), 3);
+        assert.equal(bisect(array, 5, 2, 3), 3);
+        assert.equal(bisect(array, 6, 2, 3), 3);
+      },
+      "large arrays": function(bisect) {
+        var array = [],
+            i = i30;
+        array[i++] = {key: 1};
+        array[i++] = {key: 2};
+        array[i++] = {key: 3};
+        array[i++] = {key: 4};
+        array[i++] = {key: 5};
+        assert.equal(bisect(array, 0, i - 5, i), i - 5);
+        assert.equal(bisect(array, 1, i - 5, i), i - 4);
+        assert.equal(bisect(array, 2, i - 5, i), i - 3);
+        assert.equal(bisect(array, 3, i - 5, i), i - 2);
+        assert.equal(bisect(array, 4, i - 5, i), i - 1);
+        assert.equal(bisect(array, 5, i - 5, i), i - 0);
+        assert.equal(bisect(array, 6, i - 5, i), i - 0);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/descending-test.js b/static/demo/components/d3/test/core/descending-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..880936ec85011159281d65f10b6607574519f62e
--- /dev/null
+++ b/static/demo/components/d3/test/core/descending-test.js
@@ -0,0 +1,46 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.descending");
+
+suite.addBatch({
+  "numbers": {
+    "returns a negative number if a > b": function() {
+      assert.isTrue(d3.descending(1, 0) < 0);
+    },
+    "returns a positive number if a < b": function() {
+      assert.isTrue(d3.descending(0, 1) > 0);
+    },
+    "returns zero if a == b": function() {
+      assert.equal(d3.descending(0, 0), 0);
+    },
+    "returns NaN if a or b is undefined": function() {
+      assert.isNaN(d3.descending(0, undefined));
+      assert.isNaN(d3.descending(undefined, 0));
+      assert.isNaN(d3.descending(undefined, undefined));
+    },
+    "returns NaN if a or b is NaN": function() {
+      assert.isNaN(d3.descending(0, NaN));
+      assert.isNaN(d3.descending(NaN, 0));
+      assert.isNaN(d3.descending(NaN, NaN));
+    }
+  }
+});
+
+suite.addBatch({
+  "strings": {
+    "returns a negative number if a > b": function() {
+      assert.isTrue(d3.descending("b", "a") < 0);
+    },
+    "returns a positive number if a < b": function() {
+      assert.isTrue(d3.descending("a", "b") > 0);
+    },
+    "returns zero if a == b": function() {
+      assert.equal(d3.descending("a", "a"), 0);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/dispatch-test.js b/static/demo/components/d3/test/core/dispatch-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..4be37cc1b69adc78af21ffeb34239ce21e2c121c
--- /dev/null
+++ b/static/demo/components/d3/test/core/dispatch-test.js
@@ -0,0 +1,137 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.dispatch");
+
+suite.addBatch({
+  "dispatch": {
+    topic: function() {
+      return d3.dispatch;
+    },
+    "returns a map of dispatchers for each event type": function(dispatch) {
+      assert.deepEqual(dispatch(), {});
+      var d = dispatch("foo");
+      assert.isTrue("foo" in d);
+      assert.isFalse("bar" in d);
+      var d = dispatch("foo", "bar");
+      assert.isTrue("foo" in d);
+      assert.isTrue("bar" in d);
+    },
+    "added listeners receive subsequent events": function(dispatch) {
+      var d = dispatch("foo"), events = 0;
+      d.on("foo", function() { ++events; });
+      d.foo();
+      assert.equal(events, 1);
+      d.foo();
+      d.foo();
+      assert.equal(events, 3);
+    },
+    "the listener is passed any arguments to dispatch": function(dispatch) {
+      var d = dispatch("foo"), a = {}, b = {}, aa, bb;
+      d.on("foo", function(a, b) { aa = a; bb = b; });
+      d.foo(a, b);
+      assert.equal(aa, a);
+      assert.equal(bb, b);
+      d.foo(1, "foo");
+      assert.equal(aa, 1);
+      assert.equal(bb, "foo");
+    },
+    "the listener's context is the same as dispatch's": function(dispatch) {
+      var d = dispatch("foo"), a = {}, b = {}, that;
+      d.on("foo", function() { that = this; });
+      d.foo.call(a);
+      assert.equal(that, a);
+      d.foo.call(b);
+      assert.equal(that, b);
+    },
+    "listeners are notified in the order they are added": function(dispatch) {
+      var d = dispatch("foo"), a = {}, b = {}, those = [];
+      function A() { those.push(a); }
+      function B() { those.push(b); }
+      d.on("foo.a", A).on("foo.b", B);
+      d.foo();
+      assert.deepEqual(those, [a, b]);
+      those = [];
+      d.on("foo.a", A); // move to the end
+      d.foo();
+      assert.deepEqual(those, [b, a]);
+    },
+    "notifying listeners returns the dispatch object": function(dispatch) {
+      var d = dispatch("foo");
+      assert.equal(d.foo(), d);
+    },
+    "adding a listener returns the dispatch object": function(dispatch) {
+      var d = dispatch("foo");
+      function A() {}
+      assert.equal(d.on("foo", A), d);
+    },
+    "removed listeners do not receive subsequent events": function(dispatch) {
+      var d = dispatch("foo"), a = {}, b = {}, those = [];
+      function A() { those.push(a); }
+      function B() { those.push(b); }
+      d.on("foo.a", A).on("foo.b", B);
+      d.foo();
+      those = [];
+      d.on("foo.a", null);
+      d.foo();
+      assert.deepEqual(those, [b]);
+    },
+    "removing a shared listener only affects the intended event": function(dispatch) {
+      var d = dispatch("foo", "bar"), a = 0;
+      function A() { ++a; }
+      d.on("foo", A).on("bar", A);
+      d.foo();
+      d.bar();
+      assert.equal(a, 2);
+      d.on("foo", null);
+      d.bar();
+      assert.equal(a, 3);
+    },
+    "adding an existing listener has no effect": function(dispatch) {
+      var d = dispatch("foo"), events = 0;
+      function A() { ++events; }
+      d.on("foo.a", A);
+      d.foo();
+      d.on("foo.a", A).on("foo.a", A);
+      d.foo();
+      assert.equal(events, 2);
+    },
+    "removing a missing listener has no effect": function(dispatch) {
+      var d = dispatch("foo"), events = 0;
+      function A() { ++events; }
+      d.on("foo.a", null).on("foo", A).on("foo", null).on("foo", null);
+      d.foo();
+      assert.equal(events, 0);
+    },
+    "adding a listener does not affect the current event": function(dispatch) {
+      var d = dispatch("foo"), a = {}, b = {}, those = [];
+      function A() { d.on("foo.b", B); those.push(a); }
+      function B() { those.push(b); }
+      d.on("foo.a", A);
+      d.foo();
+      assert.deepEqual(those, [a]);
+    },
+    "removing a listener does affect the current event": function(dispatch) {
+      var d = dispatch("foo"), a = {}, b = {}, those = [];
+      function A() { d.on("foo.b", null); those.push(a); }
+      function B() { those.push(b); }
+      d.on("foo.a", A).on("foo.b", B);
+      d.foo();
+      assert.deepEqual(those, [a]);
+    },
+    "getting a listener returns the correct listener": function(dispatch) {
+      var d = dispatch("foo");
+      function A() {}
+      function B() {}
+      function C() {}
+      d.on("foo.a", A).on("foo.b", B).on("foo", C);
+      assert.equal(d.on("foo.a"), A);
+      assert.equal(d.on("foo.b"), B);
+      assert.equal(d.on("foo"), C);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/ease-test.js b/static/demo/components/d3/test/core/ease-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..dd92b97a1fd142a8e0980f9f85e75b5252f86182
--- /dev/null
+++ b/static/demo/components/d3/test/core/ease-test.js
@@ -0,0 +1,138 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.ease");
+
+suite.addBatch({
+  "ease": {
+    topic: function() {
+      return d3.ease;
+    },
+    "supports linear easing": function(ease) {
+      var e = ease("linear");
+      assert.inDelta(e(.5), .5, 1e-6);
+    },
+    "supports polynomial easing": function(ease) {
+      var e = ease("poly", 2);
+      assert.inDelta(e(.5), .25, 1e-6);
+    },
+    "supports quadratic easing": function(ease) {
+      var e = ease("quad");
+      assert.inDelta(e(.5), .25, 1e-6);
+    },
+    "supports cubic easing": function(ease) {
+      var e = ease("cubic");
+      assert.inDelta(e(.5), .125, 1e-6);
+    },
+    "supports sinusoidal easing": function(ease) {
+      var e = ease("sin");
+      assert.inDelta(e(.5), 1 - Math.cos(Math.PI / 4), 1e-6);
+    },
+    "supports exponential easing": function(ease) {
+      var e = ease("exp");
+      assert.inDelta(e(.5), 0.03125, 1e-6);
+    },
+    "supports circular easing": function(ease) {
+      var e = ease("circle");
+      assert.inDelta(e(.5), 0.133975, 1e-6);
+    },
+    "supports elastic easing": function(ease) {
+      var e = ease("elastic");
+      assert.inDelta(e(.5), 0.976061, 1e-6);
+    },
+    "supports back easing": function(ease) {
+      var e = ease("back");
+      assert.inDelta(e(.5), -0.0876975, 1e-6);
+    },
+    "supports bounce easing": function(ease) {
+      var e = ease("bounce");
+      assert.inDelta(e(.5), 0.765625, 1e-6);
+    },
+    "invalid eases and modes default to linear-in": function(ease) {
+      var e = ease("__proto__-__proto__");
+      assert.equal(e(0), 0);
+      assert.equal(e(.5), .5);
+      assert.equal(e(1), 1);
+      var e = ease("hasOwnProperty-constructor");
+      assert.equal(e(0), 0);
+      assert.equal(e(.5), .5);
+      assert.equal(e(1), 1);
+    },
+    "all easing functions return exactly 0 for t = 0": function(ease) {
+      assert.equal(ease("linear")(0), 0);
+      assert.equal(ease("poly", 2)(0), 0);
+      assert.equal(ease("quad")(0), 0);
+      assert.equal(ease("cubic")(0), 0);
+      assert.equal(ease("sin")(0), 0);
+      assert.equal(ease("exp")(0), 0);
+      assert.equal(ease("circle")(0), 0);
+      assert.equal(ease("elastic")(0), 0);
+      assert.equal(ease("back")(0), 0);
+      assert.equal(ease("bounce")(0), 0);
+    },
+    "all easing functions return exactly 1 for t = 1": function(ease) {
+      assert.equal(ease("linear")(1), 1);
+      assert.equal(ease("poly", 2)(1), 1);
+      assert.equal(ease("quad")(1), 1);
+      assert.equal(ease("cubic")(1), 1);
+      assert.equal(ease("sin")(1), 1);
+      assert.equal(ease("exp")(1), 1);
+      assert.equal(ease("circle")(1), 1);
+      assert.equal(ease("elastic")(1), 1);
+      assert.equal(ease("back")(1), 1);
+      assert.equal(ease("bounce")(1), 1);
+    },
+    "the -in suffix returns the identity": function(ease) {
+      assert.inDelta(ease("linear-in")(.25), ease("linear")(.25), 1e-6);
+      assert.inDelta(ease("quad-in")(.75), ease("quad")(.75), 1e-6);
+    },
+    "the -out suffix returns the reverse": function(ease) {
+      assert.inDelta(ease("sin-out")(.25), 1 - ease("sin-in")(.75), 1e-6);
+      assert.inDelta(ease("bounce-out")(.25), 1 - ease("bounce-in")(.75), 1e-6);
+      assert.inDelta(ease("elastic-out")(.25), 1 - ease("elastic-in")(.75), 1e-6);
+    },
+    "the -in-out suffix returns the reflection": function(ease) {
+      assert.inDelta(ease("sin-in-out")(.25), .5 * ease("sin-in")(.5), 1e-6);
+      assert.inDelta(ease("bounce-in-out")(.25), .5 * ease("bounce-in")(.5), 1e-6);
+      assert.inDelta(ease("elastic-in-out")(.25), .5 * ease("elastic-in")(.5), 1e-6);
+    },
+    "the -out-in suffix returns the reverse reflection": function(ease) {
+      assert.inDelta(ease("sin-out-in")(.25), .5 * ease("sin-out")(.5), 1e-6);
+      assert.inDelta(ease("bounce-out-in")(.25), .5 * ease("bounce-out")(.5), 1e-6);
+      assert.inDelta(ease("elastic-out-in")(.25), .5 * ease("elastic-out")(.5), 1e-6);
+    },
+    "clamps input time": function(ease) {
+      var e = ease("linear");
+      assert.inDelta(e(-1), 0, 1e-6);
+      assert.inDelta(e(2), 1, 1e-6);
+    },
+    "poly": {
+      "supports an optional polynomial": function(ease) {
+        var e = ease("poly", 1);
+        assert.inDelta(e(.5), .5, 1e-6);
+        var e = ease("poly", .5);
+        assert.inDelta(e(.5), Math.SQRT1_2, 1e-6);
+      }
+    },
+    "elastic": {
+      "supports an optional amplifier (>1)": function(ease) {
+        var e = ease("elastic", 1.5);
+        assert.inDelta(e(.5), 0.998519, 1e-6);
+      },
+      "supports an optional amplifier (>1) and period (>0)": function(ease) {
+        var e = ease("elastic", 1.5, .5);
+        assert.inDelta(e(.5), 0.96875, 1e-6);
+      }
+    },
+    "back": {
+      "supports an optional speed": function(ease) {
+        var e = ease("back", 2);
+        assert.inDelta(e(.5), -0.125, 1e-6);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/entries-test.js b/static/demo/components/d3/test/core/entries-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..8570456da78e36d5afd466fb15357e2c0b3a6bcf
--- /dev/null
+++ b/static/demo/components/d3/test/core/entries-test.js
@@ -0,0 +1,42 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.entries");
+
+suite.addBatch({
+  "entries": {
+    topic: function() {
+      return d3.entries;
+    },
+    "enumerates every entry": function(entries) {
+      assert.deepEqual(entries({a: 1, b: 2}), [
+        {key: "a", value: 1},
+        {key: "b", value: 2}
+      ]);
+    },
+    "includes entries defined on prototypes": function(entries) {
+      function abc() {
+        this.a = 1;
+        this.b = 2;
+      }
+      abc.prototype.c = 3;
+      assert.deepEqual(entries(new abc()), [
+        {key: "a", value: 1},
+        {key: "b", value: 2},
+        {key: "c", value: 3}
+      ]);
+    },
+    "includes null or undefined values": function(entries) {
+      var v = entries({a: undefined, b: null, c: NaN});
+      assert.equal(v.length, 3);
+      assert.deepEqual(v[0], {key: "a", value: undefined});
+      assert.deepEqual(v[1], {key: "b", value: null});
+      assert.equal(v[2].key, "c");
+      assert.isNaN(v[2].value);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/extent-test.js b/static/demo/components/d3/test/core/extent-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..53a5aab212bfad701c64b15206b4057517fdc010
--- /dev/null
+++ b/static/demo/components/d3/test/core/extent-test.js
@@ -0,0 +1,50 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.extent");
+
+suite.addBatch({
+  "extent": {
+    topic: function() {
+      return d3.extent;
+    },
+    "returns the numeric extent for numbers": function(extent) {
+      assert.deepEqual(extent([1]), [1, 1]);
+      assert.deepEqual(extent([5, 1, 2, 3, 4]), [1, 5]);
+      assert.deepEqual(extent([20, 3]), [3, 20]);
+      assert.deepEqual(extent([3, 20]), [3, 20]);
+    },
+    "returns the lexicographic extent for strings": function(extent) {
+      assert.deepEqual(extent(["c", "a", "b"]), ["a", "c"]);
+      assert.deepEqual(extent(["20", "3"]), ["20", "3"]);
+      assert.deepEqual(extent(["3", "20"]), ["20", "3"]);
+    },
+    "ignores null, undefined and NaN": function(extent) {
+      assert.deepEqual(extent([NaN, 1, 2, 3, 4, 5]), [1, 5]);
+      assert.deepEqual(extent([1, 2, 3, 4, 5, NaN]), [1, 5]);
+      assert.deepEqual(extent([10, null, 3, undefined, 5, NaN]), [3, 10]);
+      assert.deepEqual(extent([-1, null, -3, undefined, -5, NaN]), [-5, -1]);
+    },
+    "compares heterogenous types as numbers": function(extent) {
+      assert.deepEqual(extent([20, "3"]), ["3", 20]);
+      assert.deepEqual(extent(["20", 3]), [3, "20"]);
+      assert.deepEqual(extent([3, "20"]), [3, "20"]);
+      assert.deepEqual(extent(["3", 20]), ["3", 20]);
+    },
+    "returns undefined for empty array": function(extent) {
+      assert.deepEqual(extent([]), [undefined, undefined]);
+      assert.deepEqual(extent([null]), [undefined, undefined]);
+      assert.deepEqual(extent([undefined]), [undefined, undefined]);
+      assert.deepEqual(extent([NaN]), [undefined, undefined]);
+      assert.deepEqual(extent([NaN, NaN]), [undefined, undefined]);
+    },
+    "applies the optional accessor function exactly once": function(extent) {
+      var i = 10;
+      assert.deepEqual(d3.extent([0,1,2,3], function() { return ++i; }), [11, 14]);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/format-test.js b/static/demo/components/d3/test/core/format-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..8f650fdb8006b44b9567257689b2c3269b7b1d56
--- /dev/null
+++ b/static/demo/components/d3/test/core/format-test.js
@@ -0,0 +1,332 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.format");
+
+suite.addBatch({
+  "format": {
+    topic: function() {
+      return d3.format;
+    },
+    "returns a string": function(format) {
+      assert.isString(format("d")(0));
+    },
+    "can zero fill": function(format) {
+      var f = format("08d");
+      assert.strictEqual(f(0), "00000000");
+      assert.strictEqual(f(42), "00000042");
+      assert.strictEqual(f(42000000), "42000000");
+      assert.strictEqual(f(420000000), "420000000");
+      assert.strictEqual(f(-4), "-0000004");
+      assert.strictEqual(f(-42), "-0000042");
+      assert.strictEqual(f(-4200000), "-4200000");
+      assert.strictEqual(f(-42000000), "-42000000");
+    },
+    "can space fill": function(format) {
+      var f = format("8d");
+      assert.strictEqual(f(0), "       0");
+      assert.strictEqual(f(42), "      42");
+      assert.strictEqual(f(42000000), "42000000");
+      assert.strictEqual(f(420000000), "420000000");
+      assert.strictEqual(f(-4), "      -4");
+      assert.strictEqual(f(-42), "     -42");
+      assert.strictEqual(f(-4200000), "-4200000");
+      assert.strictEqual(f(-42000000), "-42000000");
+    },
+    "can output fixed-point notation": function(format) {
+      assert.strictEqual(format(".1f")(0.49), "0.5");
+      assert.strictEqual(format(".2f")(0.449), "0.45");
+      assert.strictEqual(format(".3f")(0.4449), "0.445");
+      assert.strictEqual(format(".5f")(0.444449), "0.44445");
+      assert.strictEqual(format(".1f")(100), "100.0");
+      assert.strictEqual(format(".2f")(100), "100.00");
+      assert.strictEqual(format(".3f")(100), "100.000");
+      assert.strictEqual(format(".5f")(100), "100.00000");
+    },
+    "can output general notation": function(format) {
+      assert.strictEqual(format(".1g")(0.049), "0.05");
+      assert.strictEqual(format(".1g")(0.49), "0.5");
+      assert.strictEqual(format(".2g")(0.449), "0.45");
+      assert.strictEqual(format(".3g")(0.4449), "0.445");
+      assert.strictEqual(format(".5g")(0.444449), "0.44445");
+      assert.strictEqual(format(".1g")(100), "1e+2");
+      assert.strictEqual(format(".2g")(100), "1.0e+2");
+      assert.strictEqual(format(".3g")(100), "100");
+      assert.strictEqual(format(".5g")(100), "100.00");
+      assert.strictEqual(format(".5g")(100.2), "100.20");
+      assert.strictEqual(format(".2g")(0.002), "0.0020");
+    },
+    "can output exponent notation ": function(format) {
+      var f = format("e");
+      assert.strictEqual(f(0), "0e+0");
+      assert.strictEqual(f(42), "4.2e+1");
+      assert.strictEqual(f(42000000), "4.2e+7");
+      assert.strictEqual(f(420000000), "4.2e+8");
+      assert.strictEqual(f(-4), "-4e+0");
+      assert.strictEqual(f(-42), "-4.2e+1");
+      assert.strictEqual(f(-4200000), "-4.2e+6");
+      assert.strictEqual(f(-42000000), "-4.2e+7");
+    },
+    "can output SI prefix notation": function(format) {
+      var f = format("s");
+      assert.strictEqual(f(0), "0");
+      assert.strictEqual(f(1), "1");
+      assert.strictEqual(f(10), "10");
+      assert.strictEqual(f(100), "100");
+      assert.strictEqual(f(999.5), "999.5");
+      assert.strictEqual(f(999500), "999.5k");
+      assert.strictEqual(f(1000), "1k");
+      assert.strictEqual(f(1400), "1.4k");
+      assert.strictEqual(f(1500.5), "1.5005k");
+      assert.strictEqual(f(.000001), "1µ");
+    },
+    "can output SI prefix notation with appropriate rounding": function(format) {
+      var f = format(".3s");
+      assert.strictEqual(f(0), "0.00");
+      assert.strictEqual(f(1), "1.00");
+      assert.strictEqual(f(10), "10.0");
+      assert.strictEqual(f(100), "100");
+      assert.strictEqual(f(999.5), "1.00k");
+      assert.strictEqual(f(999500), "1.00M");
+      assert.strictEqual(f(1000), "1.00k");
+      assert.strictEqual(f(1500.5), "1.50k");
+      assert.strictEqual(f(145500000), "146M");
+      assert.strictEqual(f(145999999.999999347), "146M");
+      assert.strictEqual(f(1e26), "100Y");
+      assert.strictEqual(f(.000001), "1.00µ");
+      assert.strictEqual(f(.009995), "0.0100");
+      var f = format(".4s");
+      assert.strictEqual(f(999.5), "999.5");
+      assert.strictEqual(f(999500), "999.5k");
+      assert.strictEqual(f(.009995), "9.995m");
+    },
+    "can output a percentage": function(format) {
+      var f = format("%");
+      assert.strictEqual(f(0), "0%");
+      assert.strictEqual(f(.042), "4%");
+      assert.strictEqual(f(.42), "42%");
+      assert.strictEqual(f(4.2), "420%");
+      assert.strictEqual(f(-.042), "-4%");
+      assert.strictEqual(f(-.42), "-42%");
+      assert.strictEqual(f(-4.2), "-420%");
+    },
+    "can output a percentage with rounding and sign": function(format) {
+      var f = format("+.2p");
+      assert.strictEqual(f(.00123), "+0.12%");
+      assert.strictEqual(f(.0123), "+1.2%");
+      assert.strictEqual(f(.123), "+12%");
+      assert.strictEqual(f(1.23), "+120%");
+      assert.strictEqual(f(-.00123), "-0.12%");
+      assert.strictEqual(f(-.0123), "-1.2%");
+      assert.strictEqual(f(-.123), "-12%");
+      assert.strictEqual(f(-1.23), "-120%");
+    },
+    "can round to significant digits": function(format) {
+      assert.strictEqual(format(".2r")(0), "0.0");
+      assert.strictEqual(format(".1r")(0.049), "0.05");
+      assert.strictEqual(format(".1r")(-0.049), "-0.05");
+      assert.strictEqual(format(".1r")(0.49), "0.5");
+      assert.strictEqual(format(".1r")(-0.49), "-0.5");
+      assert.strictEqual(format(".2r")(0.449), "0.45");
+      assert.strictEqual(format(".3r")(0.4449), "0.445");
+      assert.strictEqual(format(".3r")(1.00), "1.00");
+      assert.strictEqual(format(".3r")(0.9995), "1.00");
+      assert.strictEqual(format(".5r")(0.444449), "0.44445");
+      assert.strictEqual(format("r")(123.45), "123.45");
+      assert.strictEqual(format(".1r")(123.45), "100");
+      assert.strictEqual(format(".2r")(123.45), "120");
+      assert.strictEqual(format(".3r")(123.45), "123");
+      assert.strictEqual(format(".4r")(123.45), "123.5");
+      assert.strictEqual(format(".5r")(123.45), "123.45");
+      assert.strictEqual(format(".6r")(123.45), "123.450");
+      assert.strictEqual(format(".1r")(.9), "0.9");
+      assert.strictEqual(format(".1r")(.09), "0.09");
+      assert.strictEqual(format(".1r")(.949), "0.9");
+      assert.strictEqual(format(".1r")(.0949), "0.09");
+      assert.strictEqual(format(".10r")(.9999999999), "0.9999999999");
+      assert.strictEqual(format(".15r")(.999999999999999), "0.999999999999999");
+    },
+    "can round very small numbers": function(format) {
+      var f = format(".2r");
+      assert.strictEqual(f(1e-22), "0.00000000000000000000");
+    },
+    "can group thousands": function(format) {
+      var f = format(",d");
+      assert.strictEqual(f(0), "0");
+      assert.strictEqual(f(42), "42");
+      assert.strictEqual(f(42000000), "42,000,000");
+      assert.strictEqual(f(420000000), "420,000,000");
+      assert.strictEqual(f(-4), "-4");
+      assert.strictEqual(f(-42), "-42");
+      assert.strictEqual(f(-4200000), "-4,200,000");
+      assert.strictEqual(f(-42000000), "-42,000,000");
+    },
+    "can group thousands and zero fill": function(format) {
+      assert.strictEqual(format("01,d")(0), "0");
+      assert.strictEqual(format("01,d")(0), "0");
+      assert.strictEqual(format("02,d")(0), "00");
+      assert.strictEqual(format("03,d")(0), "000");
+      assert.strictEqual(format("05,d")(0), "0,000");
+      assert.strictEqual(format("08,d")(0), "0,000,000");
+      assert.strictEqual(format("013,d")(0), "0,000,000,000");
+      assert.strictEqual(format("021,d")(0), "0,000,000,000,000,000");
+      assert.strictEqual(format("013,d")(-42000000), "-0,042,000,000");
+    },
+    "can group thousands and zero fill with overflow": function(format) {
+      assert.strictEqual(format("01,d")(1), "1");
+      assert.strictEqual(format("01,d")(1), "1");
+      assert.strictEqual(format("02,d")(12), "12");
+      assert.strictEqual(format("03,d")(123), "123");
+      assert.strictEqual(format("05,d")(12345), "12,345");
+      assert.strictEqual(format("08,d")(12345678), "12,345,678");
+      assert.strictEqual(format("013,d")(1234567890123), "1,234,567,890,123");
+    },
+    "can group thousands and space fill": function(format) {
+      assert.strictEqual(format("1,d")(0), "0");
+      assert.strictEqual(format("1,d")(0), "0");
+      assert.strictEqual(format("2,d")(0), " 0");
+      assert.strictEqual(format("3,d")(0), "  0");
+      assert.strictEqual(format("5,d")(0), "    0");
+      assert.strictEqual(format("8,d")(0), "       0");
+      assert.strictEqual(format("13,d")(0), "            0");
+      assert.strictEqual(format("21,d")(0), "                    0");
+    },
+    "can group thousands and space fill with overflow": function(format) {
+      assert.strictEqual(format("1,d")(1), "1");
+      assert.strictEqual(format("1,d")(1), "1");
+      assert.strictEqual(format("2,d")(12), "12");
+      assert.strictEqual(format("3,d")(123), "123");
+      assert.strictEqual(format("5,d")(12345), "12,345");
+      assert.strictEqual(format("8,d")(12345678), "12,345,678");
+      assert.strictEqual(format("13,d")(1234567890123), "1,234,567,890,123");
+    },
+    "can group thousands with general notation": function(format) {
+      var f = format(",g");
+      assert.strictEqual(f(0), "0");
+      assert.strictEqual(f(42), "42");
+      assert.strictEqual(f(42000000), "42,000,000");
+      assert.strictEqual(f(420000000), "420,000,000");
+      assert.strictEqual(f(-4), "-4");
+      assert.strictEqual(f(-42), "-42");
+      assert.strictEqual(f(-4200000), "-4,200,000");
+      assert.strictEqual(f(-42000000), "-42,000,000");
+    },
+    "can group thousands, space fill, and round to significant digits": function(format) {
+      assert.strictEqual(format("10,.1f")(123456.49), " 123,456.5");
+      assert.strictEqual(format("10,.2f")(1234567.449), "1,234,567.45");
+      assert.strictEqual(format("10,.3f")(12345678.4449), "12,345,678.445");
+      assert.strictEqual(format("10,.5f")(123456789.444449), "123,456,789.44445");
+      assert.strictEqual(format("10,.1f")(123456), " 123,456.0");
+      assert.strictEqual(format("10,.2f")(1234567), "1,234,567.00");
+      assert.strictEqual(format("10,.3f")(12345678), "12,345,678.000");
+      assert.strictEqual(format("10,.5f")(123456789), "123,456,789.00000");
+    },
+    "can display integers in fixed-point notation": function(format) {
+      assert.strictEqual(format("f")(42), "42");
+    },
+    "will not display non-integers in integer format": function(format) {
+      assert.strictEqual(format("d")(4.2), "");
+    },
+    "unicode character": function(format) {
+      assert.strictEqual(format("c")(9731), "☃");
+    },
+    "binary": function(format) {
+      assert.strictEqual(format("b")(10), "1010");
+    },
+    "binary with prefix": function(format) {
+      assert.strictEqual(format("#b")(10), "0b1010");
+    },
+    "octal": function(format) {
+      assert.strictEqual(format("o")(10), "12");
+    },
+    "octal with prefix": function(format) {
+      assert.strictEqual(format("#o")(10), "0o12");
+    },
+    "hexadecimal (lowercase)": function(format) {
+      assert.strictEqual(format("x")(3735928559), "deadbeef");
+    },
+    "hexadecimal (lowercase) with prefix": function(format) {
+      assert.strictEqual(format("#x")(3735928559), "0xdeadbeef");
+    },
+    "hexadecimal (uppercase)": function(format) {
+      assert.strictEqual(format("X")(3735928559), "DEADBEEF");
+    },
+    "hexadecimal (uppercase) with prefix": function(format) {
+      assert.strictEqual(format("#X")(3735928559), "0xDEADBEEF");
+    },
+    "fill respects prefix": function(format) {
+      assert.strictEqual(format("#20x")(3735928559), "          0xdeadbeef");
+    },
+    "align left": function(format) {
+      assert.strictEqual(format("<1,d")(0), "0");
+      assert.strictEqual(format("<1,d")(0), "0");
+      assert.strictEqual(format("<2,d")(0), "0 ");
+      assert.strictEqual(format("<3,d")(0), "0  ");
+      assert.strictEqual(format("<5,d")(0), "0    ");
+      assert.strictEqual(format("<8,d")(0), "0       ");
+      assert.strictEqual(format("<13,d")(0), "0            ");
+      assert.strictEqual(format("<21,d")(0), "0                    ");
+    },
+    "align right": function(format) {
+      assert.strictEqual(format(">1,d")(0), "0");
+      assert.strictEqual(format(">1,d")(0), "0");
+      assert.strictEqual(format(">2,d")(0), " 0");
+      assert.strictEqual(format(">3,d")(0), "  0");
+      assert.strictEqual(format(">5,d")(0), "    0");
+      assert.strictEqual(format(">8,d")(0), "       0");
+      assert.strictEqual(format(">13,d")(0), "            0");
+      assert.strictEqual(format(">21,d")(0), "                    0");
+    },
+    "align center": function(format) {
+      assert.strictEqual(format("^1,d")(0), "0");
+      assert.strictEqual(format("^1,d")(0), "0");
+      assert.strictEqual(format("^2,d")(0), " 0");
+      assert.strictEqual(format("^3,d")(0), " 0 ");
+      assert.strictEqual(format("^5,d")(0), "  0  ");
+      assert.strictEqual(format("^8,d")(0), "    0   ");
+      assert.strictEqual(format("^13,d")(0), "      0      ");
+      assert.strictEqual(format("^21,d")(0), "          0          ");
+    },
+    "pad after sign": function(format) {
+      assert.strictEqual(format("=+1,d")(0), "+0");
+      assert.strictEqual(format("=+1,d")(0), "+0");
+      assert.strictEqual(format("=+2,d")(0), "+0");
+      assert.strictEqual(format("=+3,d")(0), "+ 0");
+      assert.strictEqual(format("=+5,d")(0), "+   0");
+      assert.strictEqual(format("=+8,d")(0), "+      0");
+      assert.strictEqual(format("=+13,d")(0), "+           0");
+      assert.strictEqual(format("=+21,d")(0), "+                   0");
+    },
+    "a space can denote positive numbers": function(format) {
+      assert.strictEqual(format(" 1,d")(-1), "-1");
+      assert.strictEqual(format(" 1,d")(0), " 0");
+      assert.strictEqual(format(" 2,d")(0), " 0");
+      assert.strictEqual(format(" 3,d")(0), "  0");
+      assert.strictEqual(format(" 5,d")(0), "    0");
+      assert.strictEqual(format(" 8,d")(0), "       0");
+      assert.strictEqual(format(" 13,d")(0), "            0");
+      assert.strictEqual(format(" 21,d")(0), "                    0");
+    },
+    "can format negative zero": function(format) {
+      assert.strictEqual(format("1d")(-0), "-0");
+      assert.strictEqual(format("1f")(-0), "-0");
+    },
+    "supports \"n\" as an alias for \",g\"": function(format) {
+      var f = format("n");
+      assert.strictEqual(f(.0042), "0.0042");
+      assert.strictEqual(f(.42), "0.42");
+      assert.strictEqual(f(0), "0");
+      assert.strictEqual(f(42), "42");
+      assert.strictEqual(f(42000000), "42,000,000");
+      assert.strictEqual(f(420000000), "420,000,000");
+      assert.strictEqual(f(-4), "-4");
+      assert.strictEqual(f(-42), "-42");
+      assert.strictEqual(f(-4200000), "-4,200,000");
+      assert.strictEqual(f(-42000000), "-42,000,000");
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/formatPrefix-test.js b/static/demo/components/d3/test/core/formatPrefix-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..97f0a68ddead1c251c407434dfa571f08e5124bd
--- /dev/null
+++ b/static/demo/components/d3/test/core/formatPrefix-test.js
@@ -0,0 +1,115 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.formatPrefix");
+
+suite.addBatch({
+  "formatPrefix": {
+    topic: function() {
+      return d3.formatPrefix;
+    },
+    "determines the appropriate prefix for small numbers": function(prefix) {
+      assert.equal(prefix(0).symbol, "");
+      assert.equal(prefix(1e-00).symbol, "");
+      assert.equal(prefix(1e-01).symbol, "");
+      assert.equal(prefix(1e-02).symbol, "");
+      assert.equal(prefix(1e-03).symbol, "m");
+      assert.equal(prefix(1e-04).symbol, "m");
+      assert.equal(prefix(1e-05).symbol, "m");
+      assert.equal(prefix(1e-06).symbol, "µ");
+      assert.equal(prefix(1e-07).symbol, "µ");
+      assert.equal(prefix(1e-08).symbol, "µ");
+      assert.equal(prefix(1e-09).symbol, "n");
+      assert.equal(prefix(1e-10).symbol, "n");
+      assert.equal(prefix(1e-11).symbol, "n");
+      assert.equal(prefix(1e-12).symbol, "p");
+      assert.equal(prefix(1e-13).symbol, "p");
+      assert.equal(prefix(1e-14).symbol, "p");
+      assert.equal(prefix(1e-15).symbol, "f");
+      assert.equal(prefix(1e-16).symbol, "f");
+      assert.equal(prefix(1e-17).symbol, "f");
+      assert.equal(prefix(1e-18).symbol, "a");
+      assert.equal(prefix(1e-19).symbol, "a");
+      assert.equal(prefix(1e-20).symbol, "a");
+      assert.equal(prefix(1e-21).symbol, "z");
+      assert.equal(prefix(1e-22).symbol, "z");
+      assert.equal(prefix(1e-23).symbol, "z");
+      assert.equal(prefix(1e-24).symbol, "y");
+      assert.equal(prefix(1e-25).symbol, "y");
+      assert.equal(prefix(1e-26).symbol, "y");
+      assert.equal(prefix(1e-27).symbol, "y");
+    },
+    "determines the appropriate prefix for large numbers": function(prefix) {
+      assert.equal(prefix(0).symbol, "");
+      assert.equal(prefix(1e00).symbol, "");
+      assert.equal(prefix(1e01).symbol, "");
+      assert.equal(prefix(1e02).symbol, "");
+      assert.equal(prefix(1e03).symbol, "k");
+      assert.equal(prefix(1e04).symbol, "k");
+      assert.equal(prefix(1e05).symbol, "k");
+      assert.equal(prefix(1e06).symbol, "M");
+      assert.equal(prefix(1e07).symbol, "M");
+      assert.equal(prefix(1e08).symbol, "M");
+      assert.equal(prefix(1e09).symbol, "G");
+      assert.equal(prefix(1e10).symbol, "G");
+      assert.equal(prefix(1e11).symbol, "G");
+      assert.equal(prefix(1e12).symbol, "T");
+      assert.equal(prefix(1e13).symbol, "T");
+      assert.equal(prefix(1e14).symbol, "T");
+      assert.equal(prefix(1e15).symbol, "P");
+      assert.equal(prefix(1e16).symbol, "P");
+      assert.equal(prefix(1e17).symbol, "P");
+      assert.equal(prefix(1e18).symbol, "E");
+      assert.equal(prefix(1e19).symbol, "E");
+      assert.equal(prefix(1e20).symbol, "E");
+      assert.equal(prefix(1e21).symbol, "Z");
+      assert.equal(prefix(1e22).symbol, "Z");
+      assert.equal(prefix(1e23).symbol, "Z");
+      assert.equal(prefix(1e24).symbol, "Y");
+      assert.equal(prefix(1e25).symbol, "Y");
+      assert.equal(prefix(1e26).symbol, "Y");
+      assert.equal(prefix(1e27).symbol, "Y");
+    },
+    "determines the appropriate prefix for negative numbers": function(prefix) {
+      assert.equal(prefix(-0).symbol, "");
+      assert.equal(prefix(-1e-00).symbol, "");
+      assert.equal(prefix(-1e-03).symbol, "m");
+      assert.equal(prefix(-1e-06).symbol, "µ");
+      assert.equal(prefix(-1e-09).symbol, "n");
+      assert.equal(prefix(-1e-12).symbol, "p");
+      assert.equal(prefix(-1e-15).symbol, "f");
+      assert.equal(prefix(-1e-18).symbol, "a");
+      assert.equal(prefix(-1e-21).symbol, "z");
+      assert.equal(prefix(-1e-24).symbol, "y");
+      assert.equal(prefix(-1e-27).symbol, "y");
+      assert.equal(prefix(-1e00).symbol, "");
+      assert.equal(prefix(-1e03).symbol, "k");
+      assert.equal(prefix(-1e06).symbol, "M");
+      assert.equal(prefix(-1e09).symbol, "G");
+      assert.equal(prefix(-1e12).symbol, "T");
+      assert.equal(prefix(-1e15).symbol, "P");
+      assert.equal(prefix(-1e18).symbol, "E");
+      assert.equal(prefix(-1e21).symbol, "Z");
+      assert.equal(prefix(-1e24).symbol, "Y");
+      assert.equal(prefix(-1e27).symbol, "Y");
+    },
+    "considers the effect of rounding based on precision": function(prefix) {
+      assert.equal(prefix(999.5000000, 4).symbol, "");
+      assert.equal(prefix(999.5000000, 3).symbol, "k");
+      assert.equal(prefix(995.0000000, 3).symbol, "");
+      assert.equal(prefix(995.0000000, 2).symbol, "k");
+      assert.equal(prefix(950.0000000, 2).symbol, "");
+      assert.equal(prefix(950.0000000, 1).symbol, "k");
+      assert.equal(prefix(0.000009995, 4).symbol, "µ");
+      assert.equal(prefix(0.000009995, 3).symbol, "m");
+      assert.equal(prefix(0.000009950, 3).symbol, "µ");
+      assert.equal(prefix(0.000009950, 2).symbol, "m");
+      assert.equal(prefix(0.000009500, 2).symbol, "µ");
+      assert.equal(prefix(0.000009500, 1).symbol, "m");
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/functor-test.js b/static/demo/components/d3/test/core/functor-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..62b96a2680c9ff79349c1c3ef2e03b0d38d58f3b
--- /dev/null
+++ b/static/demo/components/d3/test/core/functor-test.js
@@ -0,0 +1,28 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.functor");
+
+suite.addBatch({
+  "functor": {
+    topic: function() {
+      return d3.functor;
+    },
+    "when passed a function, returns the function": function(functor) {
+      function foo() {}
+      assert.strictEqual(functor(foo), foo);
+    },
+    "when passed a non-function, returns a wrapper function": function(functor) {
+      var a = {};
+      assert.isNull(functor(null)());
+      assert.isUndefined(functor(undefined)());
+      assert.strictEqual(functor(a)(), a);
+      assert.strictEqual(functor(1)(), 1);
+      assert.deepEqual(functor([1])(), [1]);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/hcl-test.js b/static/demo/components/d3/test/core/hcl-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..02b57593729e2545f76b1a49bb0f5fcf8335302d
--- /dev/null
+++ b/static/demo/components/d3/test/core/hcl-test.js
@@ -0,0 +1,89 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.hcl");
+
+suite.addBatch({
+  "hcl": {
+    topic: function() {
+      return d3.hcl;
+    },
+    "converts string channel values to numbers": function(hcl) {
+      assertHclEqual(hcl("50", "-4", "32"), 50, -4, 32);
+    },
+    "converts null channel values to zero": function(hcl) {
+      assertHclEqual(hcl(null, null, null), 0, 0, 0);
+    },
+    "exposes h, c and l properties": function(hcl) {
+      var color = hcl(50, -4, 32);
+      assert.equal(color.h, 50);
+      assert.equal(color.c, -4);
+      assert.equal(color.l, 32);
+    },
+    "changing h, c or l affects the string format": function(hcl) {
+      var color = hcl(50, -4, 32);
+      assert.equal(color + "", "#444d50");
+      color.h++;
+      assert.equal(color + "", "#444d50");
+      color.c++;
+      assert.equal(color + "", "#464c4f");
+      color.l++;
+      assert.equal(color + "", "#494f51");
+    },
+    "parses hexadecimal shorthand format (e.g., \"#abc\")": function(hcl) {
+      assertHclEqual(hcl("#abc"), -102.28223831811077, 10.774886733325554, 75.10497524893663);
+    },
+    "parses hexadecimal format (e.g., \"#abcdef\")": function(hcl) {
+      assertHclEqual(hcl("#abcdef"), -100.15785184209284, 20.768234621934273, 81.04386565274363);
+    },
+    "parses HSL format (e.g., \"hsl(210, 64%, 13%)\")": function(hcl) {
+      assertHclEqual(hcl("hsl(210, 64.7058%, 13.33333%)"), -89.58282792342067, 16.833655998102003, 12.65624852526134);
+    },
+    "parses color names (e.g., \"moccasin\")": function(hcl) {
+      assertHclEqual(hcl("moccasin"), 84.71288921124494, 26.472460854104156, 91.72317744746022);
+    },
+    "parses and converts RGB format (e.g., \"rgb(102, 102, 0)\")": function(hcl) {
+      assertHclEqual(hcl("rgb(102, 102, 0)"), 102.85124420310271, 49.44871600399321, 41.73251953866431);
+    },
+    "can convert from RGB": function(hcl) {
+      assertHclEqual(hcl(d3.rgb(12, 34, 56)), -89.58282792342067, 16.833655998102003, 12.65624852526134);
+    },
+    "can convert from HSL": function(hcl) {
+      assertHclEqual(hcl(d3.hcl(20, .8, .3)), 20, 0.8, 0.3);
+    },
+    "can convert to RGB": function(hcl) {
+      assert.rgbEqual(hcl("steelblue").rgb(), 70, 130, 180);
+    },
+    "can derive a brighter color": function(hcl) {
+      assertHclEqual(hcl("steelblue").brighter(), -97.21873224090723, 32.44906314974561, 70.46551718768575);
+      assertHclEqual(hcl("steelblue").brighter(.5), -97.21873224090723, 32.44906314974561, 61.46551718768575);
+    },
+    "can derive a darker color": function(hcl) {
+      assertHclEqual(hcl("lightsteelblue").darker(), -94.8160116310511, 15.26488988314746, 60.45157936968134);
+      assertHclEqual(hcl("lightsteelblue").darker(.5), -94.8160116310511, 15.26488988314746, 69.45157936968134);
+    },
+    "string coercion returns RGB format": function(hcl) {
+      assert.strictEqual(hcl("hsl(60, 100%, 20%)") + "", "#666600");
+      assert.strictEqual(hcl(d3.hcl(60, -4, 32)) + "", "#454c51");
+    },
+    "roundtrip to HSL is idempotent": function(hcl) {
+      assert.hslEqual(d3.hsl(hcl("steelblue")), d3.hsl("steelblue"));
+    },
+    "roundtrip to RGB is idempotent": function(hcl) {
+      assert.hslEqual(d3.rgb(hcl("steelblue")), d3.rgb("steelblue"));
+    },
+    "roundtrip to Lab is idempotent": function(hcl) {
+      assert.hslEqual(d3.lab(hcl("steelblue")), d3.lab("steelblue"));
+    }
+  }
+});
+
+suite.export(module);
+
+function assertHclEqual(actual, h, c, l, message) {
+  if (Math.abs(actual.h - h) > 1e-6 || Math.abs(actual.c - c) > 1e-6 || Math.abs(actual.l - l) > 1e-6) {
+    assert.fail("hcl(" + actual.h + ", " + actual.c + ", " + actual.l + ")", "hcl(" + h + ", " + c + ", " + l + ")", message || "expected {expected}, got {actual}", null, assertHclEqual);
+  }
+}
diff --git a/static/demo/components/d3/test/core/hsl-test.js b/static/demo/components/d3/test/core/hsl-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..28c597fdc2165df6ec483adb4b377ef1f16c9058
--- /dev/null
+++ b/static/demo/components/d3/test/core/hsl-test.js
@@ -0,0 +1,81 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.hsl");
+
+suite.addBatch({
+  "hsl": {
+    topic: function() {
+      return d3.hsl;
+    },
+    "does not clamp channel values": function(hsl) {
+      assert.hslEqual(hsl(-100, -1, -2), -100, -1, -2);
+      assert.hslEqual(hsl(400, 2, 3), 400, 2, 3);
+    },
+    "converts string channel values to numbers": function(hsl) {
+      assert.hslEqual(hsl("180", ".5", ".6"), 180, .5, .6);
+    },
+    "converts null channel values to zero": function(hsl) {
+      assert.hslEqual(hsl(null, null, null), 0, 0, 0);
+    },
+    "exposes h, s and l properties": function(hsl) {
+      var color = hsl("hsl(180, 50%, 60%)");
+      assert.equal(color.h, 180);
+      assert.equal(color.s, .5);
+      assert.equal(color.l, .6);
+    },
+    "changing h, s or l affects the string format": function(hsl) {
+      var color = hsl("hsl(180, 50%, 60%)");
+      color.h++;
+      color.s += .1;
+      color.l += .1;
+      assert.equal(color + "", "#85dfe0");
+    },
+    "parses hexadecimal shorthand format (e.g., \"#abc\")": function(hsl) {
+      assert.hslEqual(hsl("#abc"), 210, .25, .733333);
+    },
+    "parses hexadecimal format (e.g., \"#abcdef\")": function(hsl) {
+      assert.hslEqual(hsl("#abcdef"), 210, .68, .803922);
+    },
+    "parses HSL format (e.g., \"hsl(210, 64%, 13%)\")": function(hsl) {
+      assert.hslEqual(hsl("hsl(210, 64.7058%, 13.33333%)"), 210, .647058, .133333);
+    },
+    "parses color names (e.g., \"moccasin\")": function(hsl) {
+      assert.hslEqual(hsl("moccasin"), 38.108108, 1, .854902);
+      assert.hslEqual(hsl("aliceblue"), 208, 1, .970588);
+      assert.hslEqual(hsl("yellow"), 60, 1, .5);
+    },
+    "parses and converts RGB format (e.g., \"rgb(102, 102, 0)\")": function(hsl) {
+      assert.hslEqual(hsl("rgb(102, 102, 0)"), 60, 1, .2);
+    },
+    "can convert from RGB": function(hsl) {
+      assert.hslEqual(hsl(d3.rgb(12, 34, 56)), 210, .647058, .133333);
+    },
+    "can convert from HSL": function(hsl) {
+      assert.hslEqual(hsl(d3.hsl(20, .8, .3)), 20, .8, .3);
+    },
+    "can convert to RGB": function(hsl) {
+      assert.rgbEqual(hsl("steelblue").rgb(), 70, 130, 180);
+    },
+    "can derive a brighter color": function(hsl) {
+      assert.hslEqual(hsl("steelblue").brighter(), 207.272727, .44, .7002801);
+      assert.hslEqual(hsl("steelblue").brighter(.5), 207.272727, .44, .5858964);
+      assert.hslEqual(hsl("steelblue").brighter(1), 207.272727, .44, .7002801);
+      assert.hslEqual(hsl("steelblue").brighter(2), 207.272727, .44, 1.0004002);
+    },
+    "can derive a darker color": function(hsl) {
+      assert.hslEqual(hsl("lightsteelblue").darker(), 213.913043, .4107143, .5462745);
+      assert.hslEqual(hsl("lightsteelblue").darker(.5), 213.913043, .4107143, .6529229);
+      assert.hslEqual(hsl("lightsteelblue").darker(1), 213.913043, .4107143, .5462745);
+      assert.hslEqual(hsl("lightsteelblue").darker(2), 213.913043, .4107143, .38239216);
+    },
+    "string coercion returns RGB format": function(hsl) {
+      assert.strictEqual(hsl("hsl(60, 100%, 20%)") + "", "#666600");
+      assert.strictEqual(hsl(d3.hsl(60, 1, .2)) + "", "#666600");
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/html-test.js b/static/demo/components/d3/test/core/html-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..fe5586b90a952f97af62a9efea4d9c2bee02221e
--- /dev/null
+++ b/static/demo/components/d3/test/core/html-test.js
@@ -0,0 +1,36 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.html");
+
+suite.addBatch({
+  "html": {
+    topic: function() {
+      var cb = this.callback;
+      d3.html("test/data/sample.html", function(error, document) {
+        cb(null, document);
+      });
+    },
+    "invokes the callback with the loaded html": function(document) {
+      assert.equal(document.getElementsByTagName("H1")[0].textContent, "Hello & world!");
+    },
+    "override the mime type to text/html": function(xml) {
+      assert.equal(XMLHttpRequest._last._info.mimeType, "text/html");
+    },
+    "": {
+      topic: function() {
+        var cb = this.callback;
+        d3.html("//does/not/exist.html", function(error, document) {
+          cb(null, document);
+        });
+      },
+      "invokes the callback with undefined when an error occurs": function(document) {
+        assert.isUndefined(document);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/interpolate-test.js b/static/demo/components/d3/test/core/interpolate-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..81aae76a903fa6fe6a4ff061fc23272317414d42
--- /dev/null
+++ b/static/demo/components/d3/test/core/interpolate-test.js
@@ -0,0 +1,240 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.interpolate");
+
+suite.addBatch({
+  "interpolate": {
+    topic: function() {
+      return d3.interpolate;
+    },
+    "interpolates numbers": function(interpolate) {
+      assert.equal(interpolate(2, 12)(.4), 6);
+      assert.equal(interpolate("2px", 12)(.4), 6);
+    },
+    "interpolates colors": function(interpolate) {
+      assert.equal(interpolate("#abcdef", "#fedcba")(.4), "#ccd3da");
+      assert.equal(interpolate("#abcdef", d3.rgb("#fedcba"))(.4), "#ccd3da");
+      assert.equal(interpolate("#abcdef", d3.hsl("#fedcba"))(.4), "#ccd3da");
+      assert.equal(interpolate("#abcdef", d3.lab("#fedcba"))(.4), "#ccd3da");
+    },
+    "interpolates strings": function(interpolate) {
+      assert.equal(interpolate("width:10px;", "width:50px;")(.2), "width:18px;");
+      assert.equal(interpolate(2, "12px")(.4), "6px");
+    },
+    "interpolates arrays": function(interpolate) {
+      assert.deepEqual(interpolate([2, 4], [12, 24])(.4), [6, 12]);
+    },
+    "interpolates objects": function(interpolate) {
+      assert.deepEqual(interpolate({foo: 2}, {foo: 12})(.4), {foo: 6});
+    },
+    "may or may not interpolate between enumerable and non-enumerable properties": function(interpolate) {
+      var a = Object.create({}, {foo: {value: 1, enumerable: true}}),
+          b = Object.create({}, {foo: {value: 2, enumerable: false}});
+      try {
+        assert.deepEqual(interpolate(a, b)(1), {});
+      } catch (e) {
+        assert.deepEqual(interpolate(a, b)(1), {foo: 2});
+      }
+      try {
+        assert.deepEqual(interpolate(b, a)(1), {});
+      } catch (e) {
+        assert.deepEqual(interpolate(b, a)(1), {foo: 1});
+      }
+    },
+    "interpolates inherited properties of objects": function(interpolate) {
+      var a = Object.create({foo: 0}),
+          b = Object.create({foo: 2});
+      assert.deepEqual(interpolate(a, b)(.5), {foo: 1});
+    },
+    "doesn't interpret properties in the default object's prototype chain as RGB": function(interpolate) {
+      assert.equal(interpolate("hasOwnProperty", "hasOwnProperty")(0), "hasOwnProperty");
+    }
+  }
+});
+
+suite.addBatch({
+  "interpolateNumber": {
+    topic: function() {
+      return d3.interpolateNumber;
+    },
+    "interpolates numbers": function(interpolate) {
+      assert.equal(interpolate(2, 12)(.4), 6);
+      assert.equal(interpolate(2, 12)(.6), 8);
+    }
+  }
+});
+
+suite.addBatch({
+  "interpolateRound": {
+    topic: function() {
+      return d3.interpolateRound;
+    },
+    "interpolates integers": function(interpolate) {
+      assert.equal(interpolate(2, 12)(.456), 7);
+      assert.equal(interpolate(2, 12)(.678), 9);
+    }
+  }
+});
+
+suite.addBatch({
+  "interpolateString": {
+    topic: function() {
+      return d3.interpolateString;
+    },
+    "interpolates matching numbers in both strings": function(interpolate) {
+      assert.equal(interpolate(" 10/20 30", "50/10 100 ")(.2), "18/18 44 ");
+      assert.equal(interpolate(" 10/20 30", "50/10 100 ")(.4), "26/16 58 ");
+    },
+    "preserves non-numbers in string b": function(interpolate) {
+      assert.equal(interpolate(" 10/20 30", "50/10 foo ")(.2), "18/18 foo ");
+      assert.equal(interpolate(" 10/20 30", "50/10 foo ")(.4), "26/16 foo ");
+    },
+    "preserves non-matching numbers in string b": function(interpolate) {
+      assert.equal(interpolate(" 10/20 foo", "50/10 100 ")(.2), "18/18 100 ");
+      assert.equal(interpolate(" 10/20 bar", "50/10 100 ")(.4), "26/16 100 ");
+    },
+    "preserves equal-value numbers in both strings": function(interpolate) {
+      assert.equal(interpolate(" 10/20 100 20", "50/10 100, 20 ")(.2), "18/18 100, 20 ");
+      assert.equal(interpolate(" 10/20 100 20", "50/10 100, 20 ")(.4), "26/16 100, 20 ");
+    },
+    "interpolates decimal notation correctly": function(interpolate) {
+      assert.equal(interpolate("1.", "2.")(.5), "1.5");
+    },
+    "interpolates exponent notation correctly": function(interpolate) {
+      assert.equal(interpolate("1e+3", "1e+4")(.5), "5500");
+      assert.equal(interpolate("1e-3", "1e-4")(.5), "0.00055");
+      assert.equal(interpolate("1.e-3", "1.e-4")(.5), "0.00055");
+      assert.equal(interpolate("-1.e-3", "-1.e-4")(.5), "-0.00055");
+      assert.equal(interpolate("+1.e-3", "+1.e-4")(.5), "0.00055");
+      assert.equal(interpolate(".1e-2", ".1e-3")(.5), "0.00055");
+    }
+  }
+});
+
+suite.addBatch({
+  "interpolateRgb": {
+    topic: function() {
+      return d3.interpolateRgb;
+    },
+    "parses string input": function(interpolate) {
+      assert.equal(interpolate("steelblue", "#f00")(.2), "#6b6890");
+      assert.equal(interpolate("steelblue", "#f00")(.6), "#b53448");
+    },
+    "parses d3.rgb input": function(interpolate) {
+      assert.equal(interpolate(d3.rgb("steelblue"), "#f00")(.2), "#6b6890");
+      assert.equal(interpolate("steelblue", d3.rgb(255, 0, 0))(.6), "#b53448");
+    },
+    "parses d3.hsl input": function(interpolate) {
+      assert.equal(interpolate(d3.hsl("steelblue"), "#f00")(.2), "#6b6890");
+      assert.equal(interpolate("steelblue", d3.hsl(0, 1, .5))(.6), "#b53448");
+    },
+    "interpolates in RGB color space": function(interpolate) {
+      assert.equal(interpolate("steelblue", "#f00")(.2), "#6b6890");
+    },
+    "outputs an RGB string": function(interpolate) {
+      assert.equal(interpolate("steelblue", "#f00")(.2), "#6b6890");
+    }
+  }
+});
+
+suite.addBatch({
+  "interpolateHsl": {
+    topic: function() {
+      return d3.interpolateHsl;
+    },
+    "parses string input": function(interpolate) {
+      assert.equal(interpolate("steelblue", "#f00")(.2), "#383dc3");
+      assert.equal(interpolate("steelblue", "#f00")(.6), "#dd1ce1");
+    },
+    "parses d3.hsl input": function(interpolate) {
+      assert.equal(interpolate(d3.hsl("steelblue"), "#f00")(.2), "#383dc3");
+      assert.equal(interpolate("steelblue", d3.hsl(0, 1, .5))(.6), "#dd1ce1");
+    },
+    "parses d3.rgb input": function(interpolate) {
+      assert.equal(interpolate(d3.rgb("steelblue"), "#f00")(.2), "#383dc3");
+      assert.equal(interpolate("steelblue", d3.rgb(255, 0, 0))(.6), "#dd1ce1");
+    },
+    "interpolates in HSL color space": function(interpolate) {
+      assert.equal(interpolate("steelblue", "#f00")(.2), "#383dc3");
+    },
+    "outputs a hexadecimal string": function(interpolate) {
+      assert.equal(interpolate("steelblue", "#f00")(.2), "#383dc3");
+    }
+  }
+});
+
+suite.addBatch({
+  "interpolateArray": {
+    topic: function() {
+      return d3.interpolateArray;
+    },
+    "interpolates defined elements": function(interpolate) {
+      assert.deepEqual(interpolate([2, 12], [4, 24])(.5), [3, 18]);
+    },
+    "interpolates nested objects and arrays": function(interpolate) {
+      assert.deepEqual(interpolate([[2, 12]], [[4, 24]])(.5), [[3, 18]]);
+      assert.deepEqual(interpolate([{foo: [2, 12]}], [{foo: [4, 24]}])(.5), [{foo: [3, 18]}]);
+    },
+    "merges non-shared elements": function(interpolate) {
+      assert.deepEqual(interpolate([2, 12], [4, 24, 12])(.5), [3, 18, 12]);
+      assert.deepEqual(interpolate([2, 12, 12], [4, 24])(.5), [3, 18, 12]);
+    }
+  }
+});
+
+suite.addBatch({
+  "interpolateObject": {
+    topic: function() {
+      return d3.interpolateObject;
+    },
+    "interpolates defined properties": function(interpolate) {
+      assert.deepEqual(interpolate({a: 2, b: 12}, {a: 4, b: 24})(.5), {a: 3, b: 18});
+    },
+    "interpolates inherited properties": function(interpolate) {
+      function a(a) { this.a = a; }
+      a.prototype.b = 12;
+      assert.deepEqual(interpolate(new a(2), new a(4))(.5), {a: 3, b: 12});
+    },
+    "interpolates color properties as rgb": function(interpolate) {
+      assert.deepEqual(interpolate({background: "red"}, {background: "green"})(.5), {background: "#804000"});
+      assert.deepEqual(interpolate({fill: "red"}, {fill: "green"})(.5), {fill: "#804000"});
+      assert.deepEqual(interpolate({stroke: "red"}, {stroke: "green"})(.5), {stroke: "#804000"});
+      assert.deepEqual(interpolate({color: "red"}, {color: "green"})(.5), {color: "#804000"});
+    },
+    "interpolates nested objects and arrays": function(interpolate) {
+      assert.deepEqual(interpolate({foo: [2, 12]}, {foo: [4, 24]})(.5), {foo: [3, 18]});
+      assert.deepEqual(interpolate({foo: {bar: [2, 12]}}, {foo: {bar: [4, 24]}})(.5), {foo: {bar: [3, 18]}});
+    },
+    "merges non-shared properties": function(interpolate) {
+      assert.deepEqual(interpolate({foo: 2}, {foo: 4, bar: 12})(.5), {foo: 3, bar: 12});
+      assert.deepEqual(interpolate({foo: 2, bar: 12}, {foo: 4})(.5), {foo: 3, bar: 12});
+    }
+  }
+});
+
+suite.addBatch({
+  "interpolators": {
+    topic: function() {
+      return d3.interpolate;
+    },
+    "can register a custom interpolator": function(interpolate) {
+      try {
+        d3.interpolators.push(function(a, b) {
+          return a == "one" && b == "two" && d3.interpolateNumber(1, 2);
+        });
+        assert.equal(interpolate("one", "two")(-.5), .5);
+        assert.equal(interpolate("one", "two")(0), 1);
+        assert.equal(interpolate("one", "two")(.5), 1.5);
+        assert.equal(interpolate("one", "two")(1), 2);
+        assert.equal(interpolate("one", "two")(1.5), 2.5);
+      } finally {
+        d3.interpolators.pop();
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/json-test.js b/static/demo/components/d3/test/core/json-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..b23348608d2ed7a9a2a71e5cf9ae72a2af828638
--- /dev/null
+++ b/static/demo/components/d3/test/core/json-test.js
@@ -0,0 +1,36 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.json");
+
+suite.addBatch({
+  "json": {
+    topic: function() {
+      var cb = this.callback;
+      d3.json("test/data/sample.json", function(error, json) {
+        cb(null, json);
+      });
+    },
+    "invokes the callback with the loaded JSON": function(json) {
+      assert.deepEqual(json, [{"Hello":42,"World":"\"fish\""}]);
+    },
+    "overrides the mime type to application/json": function(json) {
+      assert.equal(XMLHttpRequest._last._info.mimeType, "application/json");
+    },
+    "": {
+      topic: function() {
+        var cb = this.callback;
+        d3.json("//does/not/exist.json", function(error, json) {
+          cb(null, json);
+        });
+      },
+      "invokes the callback with undefined when an error occurs": function(json) {
+        assert.isUndefined(json);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/keys-test.js b/static/demo/components/d3/test/core/keys-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..4576b85a68b16c61fb1775f722ce57465ea642ed
--- /dev/null
+++ b/static/demo/components/d3/test/core/keys-test.js
@@ -0,0 +1,30 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.keys");
+
+suite.addBatch({
+  "keys": {
+    topic: function() {
+      return d3.keys;
+    },
+    "enumerates every defined key": function(keys) {
+      assert.deepEqual(keys({a: 1, b: 1}), ["a", "b"]);
+    },
+    "includes keys defined on prototypes": function(keys) {
+      function abc() {
+        this.a = 1;
+        this.b = 2;
+      }
+      abc.prototype.c = 3;
+      assert.deepEqual(keys(new abc()), ["a", "b", "c"]);
+    },
+    "includes keys with null or undefined values": function(keys) {
+      assert.deepEqual(keys({a: undefined, b: null, c: NaN}), ["a", "b", "c"]);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/lab-test.js b/static/demo/components/d3/test/core/lab-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..32701396e8046ae51db0f82dea6399d8059db22c
--- /dev/null
+++ b/static/demo/components/d3/test/core/lab-test.js
@@ -0,0 +1,89 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.lab");
+
+suite.addBatch({
+  "lab": {
+    topic: function() {
+      return d3.lab;
+    },
+    "converts string channel values to numbers": function(lab) {
+      assertLabEqual(lab("50", "-4", "-32"), 50, -4, -32);
+    },
+    "converts null channel values to zero": function(lab) {
+      assertLabEqual(lab(null, null, null), 0, 0, 0);
+    },
+    "exposes l, a and b properties": function(lab) {
+      var color = lab(50, -4, -32);
+      assert.equal(color.l, 50);
+      assert.equal(color.a, -4);
+      assert.equal(color.b, -32);
+    },
+    "changing l, a or b affects the string format": function(lab) {
+      var color = lab(50, -4, -32);
+      assert.equal(color + "", "#3f7cad");
+      color.l++;
+      assert.equal(color + "", "#427eb0");
+      color.a++;
+      assert.equal(color + "", "#467eb0");
+      color.b++;
+      assert.equal(color + "", "#487eae");
+    },
+    "parses hexadecimal shorthand format (e.g., \"#abc\")": function(lab) {
+      assertLabEqual(lab("#abc"), 75.10497524893663, -2.292114632248876, -10.528266458853786);
+    },
+    "parses hexadecimal format (e.g., \"#abcdef\")": function(lab) {
+      assertLabEqual(lab("#abcdef"), 81.04386565274363, -3.6627002800885267, -20.442705201854984);
+    },
+    "parses HSL format (e.g., \"hsl(210, 64%, 13%)\")": function(lab) {
+      assertLabEqual(lab("hsl(210, 64.7058%, 13.33333%)"), 12.65624852526134, 0.12256520883417721, -16.833209795877284);
+    },
+    "parses color names (e.g., \"moccasin\")": function(lab) {
+      assertLabEqual(lab("moccasin"), 91.72317744746022, 2.4393469358685027, 26.359832514614844);
+    },
+    "parses and converts RGB format (e.g., \"rgb(102, 102, 0)\")": function(lab) {
+      assertLabEqual(lab("rgb(102, 102, 0)"), 41.73251953866431, -10.998411255098816, 48.21006600604577);
+    },
+    "can convert from RGB": function(lab) {
+      assertLabEqual(lab(d3.rgb(12, 34, 56)), 12.65624852526134, 0.12256520883417721, -16.833209795877284);
+    },
+    "can convert from HSL": function(lab) {
+      assertLabEqual(lab(d3.lab(20, .8, .3)), 20, 0.8, 0.3);
+    },
+    "can convert to RGB": function(lab) {
+      assert.rgbEqual(lab("steelblue").rgb(), 70, 130, 180);
+    },
+    "can derive a brighter color": function(lab) {
+      assertLabEqual(lab("steelblue").brighter(), 70.46551718768575, -4.0774710123572255, -32.19186122981343);
+      assertLabEqual(lab("steelblue").brighter(.5), 61.46551718768575, -4.0774710123572255, -32.19186122981343);
+    },
+    "can derive a darker color": function(lab) {
+      assertLabEqual(lab("lightsteelblue").darker(), 60.45157936968134, -1.2815839134120433, -15.210996213841522);
+      assertLabEqual(lab("lightsteelblue").darker(.5), 69.45157936968134, -1.2815839134120433, -15.210996213841522);
+    },
+    "string coercion returns RGB format": function(lab) {
+      assert.strictEqual(lab("hsl(60, 100%, 20%)") + "", "#666600");
+      assert.strictEqual(lab(d3.lab(60, -4, -32)) + "", "#5d95c8");
+    },
+    "roundtrip to HSL is idempotent": function(lab) {
+      assert.hslEqual(d3.hsl(lab("steelblue")), d3.hsl("steelblue"));
+    },
+    "roundtrip to RGB is idempotent": function(lab) {
+      assert.hslEqual(d3.rgb(lab("steelblue")), d3.rgb("steelblue"));
+    },
+    "roundtrip to HCL is idempotent": function(lab) {
+      assert.hslEqual(d3.hcl(lab("steelblue")), d3.hcl("steelblue"));
+    }
+  }
+});
+
+suite.export(module);
+
+function assertLabEqual(actual, l, a, b, message) {
+  if (Math.abs(actual.l - l) > 1e-6 || Math.abs(actual.a - a) > 1e-6 || Math.abs(actual.b - b) > 1e-6) {
+    assert.fail("lab(" + actual.l + ", " + actual.a + ", " + actual.b + ")", "lab(" + l + ", " + a + ", " + b + ")", message || "expected {expected}, got {actual}", null, assertLabEqual);
+  }
+}
diff --git a/static/demo/components/d3/test/core/map-test.js b/static/demo/components/d3/test/core/map-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..aa729a6af08bb1940069b0c7f4819c073f1326ce
--- /dev/null
+++ b/static/demo/components/d3/test/core/map-test.js
@@ -0,0 +1,212 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.map");
+
+suite.addBatch({
+  "constructor": {
+    "map() returns an empty map": function() {
+      var map = d3.map();
+      assert.deepEqual(map.keys(), []);
+    },
+    "map(null) returns an empty map": function() {
+      var map = d3.map(null);
+      assert.deepEqual(map.keys(), []);
+    },
+    "map(object) copies enumerable keys": function() {
+      var map = d3.map({foo: 42});
+      assert.isTrue(map.has("foo"));
+      assert.equal(map.get("foo"), 42);
+      var map = d3.map(Object.create(null, {foo: {value: 42, enumerable: true}}));
+      assert.isTrue(map.has("foo"));
+      assert.equal(map.get("foo"), 42);
+    },
+    "map(object) copies inherited keys": function() {
+      function Foo() {}
+      Foo.prototype.foo = 42;
+      var map = d3.map(Object.create({foo: 42}));
+      assert.isTrue(map.has("foo"));
+      assert.equal(map.get("foo"), 42);
+      var map = d3.map(new Foo());
+      assert.isTrue(map.has("foo"));
+      assert.equal(map.get("foo"), 42);
+    },
+    "map(object) does not copy non-enumerable keys": function() {
+      var map = d3.map({__proto__: 42}); // because __proto__ isn't enumerable
+      assert.isFalse(map.has("__proto__"));
+      assert.isUndefined(map.get("__proto__"));
+      var map = d3.map(Object.create(null, {foo: {value: 42, enumerable: false}}));
+      assert.isFalse(map.has("foo"));
+      assert.isUndefined(map.get("foo"));
+    }
+  },
+  "forEach": {
+    "empty maps have an empty keys array": function() {
+      var map = d3.map();
+      assert.deepEqual(map.entries(), []);
+      map.set("foo", "bar");
+      assert.deepEqual(map.entries(), [{key: "foo", value: "bar"}]);
+      map.remove("foo");
+      assert.deepEqual(map.entries(), []);
+    },
+    "keys are returned in arbitrary order": function() {
+      var map = d3.map({foo: 1, bar: "42"});
+      assert.deepEqual(map.entries().sort(ascendingByKey), [{key: "bar", value: "42"}, {key: "foo", value: 1}]);
+      var map = d3.map({bar: "42", foo: 1});
+      assert.deepEqual(map.entries().sort(ascendingByKey), [{key: "bar", value: "42"}, {key: "foo", value: 1}]);
+    },
+    "observes changes via set and remove": function() {
+      var map = d3.map({foo: 1, bar: "42"});
+      assert.deepEqual(map.entries().sort(ascendingByKey), [{key: "bar", value: "42"}, {key: "foo", value: 1}]);
+      map.remove("foo");
+      assert.deepEqual(map.entries(), [{key: "bar", value: "42"}]);
+      map.set("bar", "bar");
+      assert.deepEqual(map.entries(), [{key: "bar", value: "bar"}]);
+      map.set("foo", "foo");
+      assert.deepEqual(map.entries().sort(ascendingByKey), [{key: "bar", value: "bar"}, {key: "foo", value: "foo"}]);
+      map.remove("bar");
+      assert.deepEqual(map.entries(), [{key: "foo", value: "foo"}]);
+      map.remove("foo");
+      assert.deepEqual(map.entries(), []);
+      map.remove("foo");
+      assert.deepEqual(map.entries(), []);
+    }
+  },
+  "keys": {
+    "returns an array of string keys": function() {
+      var map = d3.map({foo: 1, bar: "42"});
+      assert.deepEqual(map.keys().sort(), ["bar", "foo"]);
+    }
+  },
+  "values": {
+    "returns an array of arbitrary values": function() {
+      var map = d3.map({foo: 1, bar: "42"});
+      assert.deepEqual(map.values().sort(), [1, "42"]);
+    }
+  },
+  "entries": {
+    "returns an array of key-value objects": function() {
+      var map = d3.map({foo: 1, bar: "42"});
+      assert.deepEqual(map.entries().sort(ascendingByKey), [{key: "bar", value: "42"}, {key: "foo", value: 1}]);
+    }
+  },
+  "has": {
+    "empty maps do not have object built-ins": function() {
+      var map = d3.map();
+      assert.isFalse(map.has("__proto__"));
+      assert.isFalse(map.has("hasOwnProperty"));
+    },
+    "can has keys using built-in names": function() {
+      var map = d3.map();
+      map.set("__proto__", 42);
+      assert.isTrue(map.has("__proto__"));
+    },
+    "can has keys with null or undefined properties": function() {
+      var map = d3.map();
+      map.set("", "");
+      map.set("null", null);
+      map.set("undefined", undefined);
+      assert.isTrue(map.has(""));
+      assert.isTrue(map.has("null"));
+      assert.isTrue(map.has("undefined"));
+    },
+    "coerces keys to strings": function() {
+      var map = d3.map({"42": "foo", "null": 1, "undefined": 2});
+      assert.isTrue(map.has(42));
+      assert.isTrue(map.has(null));
+      assert.isTrue(map.has(undefined));
+    },
+    "returns the latest value": function() {
+      var map = d3.map({foo: 42});
+      assert.isTrue(map.has("foo"));
+      map.set("foo", 43);
+      assert.isTrue(map.has("foo"));
+      map.remove("foo");
+      assert.isFalse(map.has("foo"));
+      map.set("foo", "bar");
+      assert.isTrue(map.has("foo"));
+    },
+    "returns undefined for missing keys": function() {
+      var map = d3.map({foo: 42});
+      assert.isFalse(map.has("bar"));
+    }
+  },
+  "get": {
+    "empty maps do not have object built-ins": function() {
+      var map = d3.map();
+      assert.isUndefined(map.get("__proto__"));
+      assert.isUndefined(map.get("hasOwnProperty"));
+    },
+    "can get keys using built-in names": function() {
+      var map = d3.map();
+      map.set("__proto__", 42);
+      assert.equal(map.get("__proto__"), 42);
+    },
+    "coerces keys to strings": function() {
+      var map = d3.map({"42": 1, "null": 2, "undefined": 3});
+      assert.equal(map.get(42), 1);
+      assert.equal(map.get(null), 2);
+      assert.equal(map.get(undefined), 3);
+    },
+    "returns the latest value": function() {
+      var map = d3.map({foo: 42});
+      assert.equal(map.get("foo"), 42);
+      map.set("foo", 43);
+      assert.equal(map.get("foo"), 43);
+      map.remove("foo");
+      assert.isUndefined(map.get("foo"));
+      map.set("foo", "bar");
+      assert.equal(map.get("foo"), "bar");
+    },
+    "returns undefined for missing keys": function() {
+      var map = d3.map({foo: 42});
+      assert.isUndefined(map.get("bar"));
+    }
+  },
+  "set": {
+    "returns the set value": function() {
+      var map = d3.map();
+      assert.equal(map.set("foo", 42), 42);
+    },
+    "can set keys using built-in names": function() {
+      var map = d3.map();
+      map.set("__proto__", 42);
+      assert.equal(map.get("__proto__"), 42);
+    },
+    "coerces keys to strings": function() {
+      var map = d3.map();
+      map.set(42, 1);
+      assert.equal(map.get(42), 1);
+      map.set(null, 2);
+      assert.equal(map.get(null), 2);
+      map.set(undefined, 3);
+      assert.equal(map.get(undefined), 3);
+      assert.deepEqual(map.keys().sort(), ["42", "null", "undefined"]);
+    },
+    "can replace values": function() {
+      var map = d3.map({foo: 42});
+      assert.equal(map.get("foo"), 42);
+      map.set("foo", 43);
+      assert.equal(map.get("foo"), 43);
+      map.set("foo", "bar");
+      assert.equal(map.get("foo"), "bar");
+    },
+    "can set null, undefined or empty string values": function() {
+      var map = d3.map();
+      map.set("", "");
+      map.set("null", null);
+      map.set("undefined", undefined);
+      assert.equal(map.get(""), "");
+      assert.isNull(map.get("null"));
+      assert.isUndefined(map.get("undefined"));
+    }
+  }
+});
+
+function ascendingByKey(a, b) {
+  return d3.ascending(a.key, b.key);
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/max-test.js b/static/demo/components/d3/test/core/max-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..4f3eaefaa213e21008c2547d8c21881c3e141da4
--- /dev/null
+++ b/static/demo/components/d3/test/core/max-test.js
@@ -0,0 +1,50 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.max");
+
+suite.addBatch({
+  "max": {
+    topic: function() {
+      return d3.max;
+    },
+    "returns the greatest numeric value for numbers": function(max) {
+      assert.equal(max([1]), 1);
+      assert.equal(max([5, 1, 2, 3, 4]), 5);
+      assert.equal(max([20, 3]), 20);
+      assert.equal(max([3, 20]), 20);
+    },
+    "returns the greatest lexicographic value for strings": function(max) {
+      assert.equal(max(["c", "a", "b"]), "c");
+      assert.equal(max(["20", "3"]), "3");
+      assert.equal(max(["3", "20"]), "3");
+    },
+    "ignores null, undefined and NaN": function(max) {
+      assert.equal(max([NaN, 1, 2, 3, 4, 5]), 5);
+      assert.equal(max([1, 2, 3, 4, 5, NaN]), 5);
+      assert.equal(max([10, null, 3, undefined, 5, NaN]), 10);
+      assert.equal(max([-1, null, -3, undefined, -5, NaN]), -1);
+    },
+    "compares heterogenous types as numbers": function(max) {
+      assert.strictEqual(max([20, "3"]), 20);
+      assert.strictEqual(max(["20", 3]), "20");
+      assert.strictEqual(max([3, "20"]), "20");
+      assert.strictEqual(max(["3", 20]), 20);
+    },
+    "returns undefined for empty array": function(max) {
+      assert.isUndefined(max([]));
+      assert.isUndefined(max([null]));
+      assert.isUndefined(max([undefined]));
+      assert.isUndefined(max([NaN]));
+      assert.isUndefined(max([NaN, NaN]));
+    },
+    "applies the optional accessor function": function(max) {
+      assert.equal(d3.max([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10]], function(d) { return d3.min(d); }), 2);
+      assert.equal(d3.max([1, 2, 3, 4, 5], function(d, i) { return i; }), 4);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/mean-test.js b/static/demo/components/d3/test/core/mean-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..827e0bc723b371ddd471f0ea20ae93a5e908cccd
--- /dev/null
+++ b/static/demo/components/d3/test/core/mean-test.js
@@ -0,0 +1,42 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.mean");
+
+suite.addBatch({
+  "mean": {
+    topic: function() {
+      return d3.mean;
+    },
+    "returns the mean value for numbers": function(mean) {
+      assert.equal(mean([1]), 1);
+      assert.equal(mean([5, 1, 2, 3, 4]), 3);
+      assert.equal(mean([20, 3]), 11.5);
+      assert.equal(mean([3, 20]), 11.5);
+    },
+    "ignores null, undefined and NaN": function(mean) {
+      assert.equal(mean([NaN, 1, 2, 3, 4, 5]), 3);
+      assert.equal(mean([1, 2, 3, 4, 5, NaN]), 3);
+      assert.equal(mean([10, null, 3, undefined, 5, NaN]), 6);
+    },
+    "can handle large numbers without overflowing": function(mean) {
+      assert.equal(mean([Number.MAX_VALUE, Number.MAX_VALUE]), Number.MAX_VALUE);
+      assert.equal(mean([-Number.MAX_VALUE, -Number.MAX_VALUE]), -Number.MAX_VALUE);
+    },
+    "returns undefined for empty array": function(mean) {
+      assert.isUndefined(mean([]));
+      assert.isUndefined(mean([null]));
+      assert.isUndefined(mean([undefined]));
+      assert.isUndefined(mean([NaN]));
+      assert.isUndefined(mean([NaN, NaN]));
+    },
+    "applies the optional accessor function": function(mean) {
+      assert.equal(d3.mean([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10]], function(d) { return d3.mean(d); }), 4.5);
+      assert.equal(d3.mean([1, 2, 3, 4, 5], function(d, i) { return i; }), 2);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/median-test.js b/static/demo/components/d3/test/core/median-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..e543e3041bd6c72320e038baa447c420ddca0160
--- /dev/null
+++ b/static/demo/components/d3/test/core/median-test.js
@@ -0,0 +1,42 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.median");
+
+suite.addBatch({
+  "median": {
+    topic: function() {
+      return d3.median;
+    },
+    "returns the median value for numbers": function(median) {
+      assert.equal(median([1]), 1);
+      assert.equal(median([5, 1, 2, 3, 4]), 3);
+      assert.equal(median([20, 3]), 11.5);
+      assert.equal(median([3, 20]), 11.5);
+    },
+    "ignores null, undefined and NaN": function(median) {
+      assert.equal(median([NaN, 1, 2, 3, 4, 5]), 3);
+      assert.equal(median([1, 2, 3, 4, 5, NaN]), 3);
+      assert.equal(median([10, null, 3, undefined, 5, NaN]), 5);
+    },
+    "can handle large numbers without overflowing": function(median) {
+      assert.equal(median([Number.MAX_VALUE, Number.MAX_VALUE]), Number.MAX_VALUE);
+      assert.equal(median([-Number.MAX_VALUE, -Number.MAX_VALUE]), -Number.MAX_VALUE);
+    },
+    "returns undefined for empty array": function(median) {
+      assert.isUndefined(median([]));
+      assert.isUndefined(median([null]));
+      assert.isUndefined(median([undefined]));
+      assert.isUndefined(median([NaN]));
+      assert.isUndefined(median([NaN, NaN]));
+    },
+    "applies the optional accessor function": function(median) {
+      assert.equal(d3.median([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10]], function(d) { return d3.median(d); }), 4.5);
+      assert.equal(d3.median([1, 2, 3, 4, 5], function(d, i) { return i; }), 2);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/merge-test.js b/static/demo/components/d3/test/core/merge-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..5176819228c43d5a3c85ee51d904ea22ca425deb
--- /dev/null
+++ b/static/demo/components/d3/test/core/merge-test.js
@@ -0,0 +1,26 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.merge");
+
+suite.addBatch({
+  "merge": {
+    "merges an array of arrays": function() {
+      var a = {}, b = {}, c = {}, d = {}, e = {}, f = {};
+      assert.deepEqual(d3.merge([[a], [b, c], [d, e, f]]), [a, b, c, d, e, f]);
+    },
+    "returns a new array": function() {
+      var input = [[1, 2, 3], [4, 5], [6]];
+      assert.isFalse(d3.merge(input) === input);
+    },
+    "does not modify the input arrays": function() {
+      var input = [[1, 2, 3], [4, 5], [6]];
+      d3.merge(input);
+      assert.deepEqual(input, [[1, 2, 3], [4, 5], [6]]);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/min-test.js b/static/demo/components/d3/test/core/min-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..fcf21127b80a2885c5e150b045835748265a0fd4
--- /dev/null
+++ b/static/demo/components/d3/test/core/min-test.js
@@ -0,0 +1,49 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.min");
+
+suite.addBatch({
+  "min": {
+    topic: function() {
+      return d3.min;
+    },
+    "returns the least numeric value for numbers": function(min) {
+      assert.equal(min([1]), 1);
+      assert.equal(min([5, 1, 2, 3, 4]), 1);
+      assert.equal(min([20, 3]), 3);
+      assert.equal(min([3, 20]), 3);
+    },
+    "returns the least lexicographic value for strings": function(min) {
+      assert.equal(min(["c", "a", "b"]), "a");
+      assert.equal(min(["20", "3"]), "20");
+      assert.equal(min(["3", "20"]), "20");
+    },
+    "ignores null, undefined and NaN": function(min) {
+      assert.equal(min([NaN, 1, 2, 3, 4, 5]), 1);
+      assert.equal(min([1, 2, 3, 4, 5, NaN]), 1);
+      assert.equal(min([10, null, 3, undefined, 5, NaN]), 3);
+    },
+    "compares heterogenous types as numbers": function(min) {
+      assert.strictEqual(min([20, "3"]), "3");
+      assert.strictEqual(min(["20", 3]), 3);
+      assert.strictEqual(min([3, "20"]), 3);
+      assert.strictEqual(min(["3", 20]), "3");
+    },
+    "returns undefined for empty array": function(min) {
+      assert.isUndefined(min([]));
+      assert.isUndefined(min([null]));
+      assert.isUndefined(min([undefined]));
+      assert.isUndefined(min([NaN]));
+      assert.isUndefined(min([NaN, NaN]));
+    },
+    "applies the optional accessor function": function(min) {
+      assert.equal(d3.min([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10]], function(d) { return d3.max(d); }), 5);
+      assert.equal(d3.min([1, 2, 3, 4, 5], function(d, i) { return i; }), 0);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/mouse-test.html b/static/demo/components/d3/test/core/mouse-test.html
new file mode 100644
index 0000000000000000000000000000000000000000..219f8eca29fc35c5b0642a5d96628ecebb10ea58
--- /dev/null
+++ b/static/demo/components/d3/test/core/mouse-test.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>HTML Mouse Test</title>
+<body>
+<script src="../../d3.js"></script>
+<script>
+
+var body = d3.select("body");
+
+var div = body.append("div")
+    .style("width", "1000px")
+    .style("height", "500px")
+    .style("border", "solid black 1px")
+    .style("cursor", "crosshair");
+
+var span = body.append("span");
+
+d3.select(window).on("mousemove", function() {
+  span.text(d3.mouse(div[0][0]));
+});
+
+</script>
diff --git a/static/demo/components/d3/test/core/nest-test.js b/static/demo/components/d3/test/core/nest-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..59b8da9f8f0ade127de08189b156ab9826c624cc
--- /dev/null
+++ b/static/demo/components/d3/test/core/nest-test.js
@@ -0,0 +1,241 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.nest");
+
+suite.addBatch({
+  "entries": {
+    topic: function() {
+      return d3.nest;
+    },
+    "returns an array of each distinct key in arbitrary order": function(nest) {
+      var keys = nest()
+          .key(function(d) { return d.foo; })
+          .entries([{foo: 1}, {foo: 1}, {foo: 2}])
+          .map(function(d) { return d.key; })
+          .sort(d3.ascending);
+      assert.deepEqual(keys, ["1", "2"]);
+    },
+    "each entry is a key-values object, with values in input order": function(nest) {
+      var entries = nest()
+          .key(function(d) { return d.foo; })
+          .entries([{foo: 1, bar: 0}, {foo: 2}, {foo: 1, bar: 1}]);
+      assert.deepEqual(entries, [
+        {key: "1", values: [{foo: 1, bar: 0}, {foo: 1, bar: 1}]},
+        {key: "2", values: [{foo: 2}]}
+      ]);
+    },
+    "keys can be sorted using an optional comparator": function(nest) {
+      var keys = nest()
+          .key(function(d) { return d.foo; }).sortKeys(d3.descending)
+          .entries([{foo: 1}, {foo: 1}, {foo: 2}])
+          .map(function(d) { return d.key; });
+      assert.deepEqual(keys, ["2", "1"]);
+    },
+    "values can be sorted using an optional comparator": function(nest) {
+      var entries = nest()
+          .key(function(d) { return d.foo; })
+          .sortValues(function(a, b) { return a.bar - b.bar; })
+          .entries([{foo: 1, bar: 2}, {foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 2}]);
+      assert.deepEqual(entries, [
+        {key: "1", values: [{foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 1, bar: 2}]},
+        {key: "2", values: [{foo: 2}]}
+      ]);
+    },
+    "values can be aggregated using an optional rollup": function(nest) {
+      var entries = nest()
+          .key(function(d) { return d.foo; })
+          .rollup(function(values) { return d3.sum(values, function(d) { return d.bar; }); })
+          .entries([{foo: 1, bar: 2}, {foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 2}]);
+      assert.deepEqual(entries, [
+        {key: "1", values: 3},
+        {key: "2", values: 0}
+      ]);
+    },
+    "multiple key functions can be specified": function(nest) {
+      var entries = nest()
+          .key(function(d) { return d[0]; }).sortKeys(d3.ascending)
+          .key(function(d) { return d[1]; }).sortKeys(d3.ascending)
+          .entries([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
+      assert.deepEqual(entries, [
+        {key: "0", values: [
+          {key: "1", values: [[0, 1]]},
+          {key: "2", values: [[0, 2], [0, 2]]}
+        ]},
+        {key: "1", values: [
+          {key: "1", values: [[1, 1]]},
+          {key: "2", values: [[1, 2]]}
+        ]}
+      ]);
+    },
+    "the rollup function only applies to leaf values": function(nest) {
+      var entries = nest()
+          .key(function(d) { return d[0]; }).sortKeys(d3.ascending)
+          .key(function(d) { return d[1]; }).sortKeys(d3.ascending)
+          .rollup(function(values) { return values.length; })
+          .entries([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
+      assert.deepEqual(entries, [
+        {key: "0", values: [
+          {key: "1", values: 1},
+          {key: "2", values: 2}
+        ]},
+        {key: "1", values: [
+          {key: "1", values: 1},
+          {key: "2", values: 1}
+        ]}
+      ]);
+    },
+    "the value comparator only applies to leaf values": function(nest) {
+      var entries = nest()
+          .key(function(d) { return d[0]; }).sortKeys(d3.ascending)
+          .key(function(d) { return d[1]; }).sortKeys(d3.ascending)
+          .sortValues(function(a, b) { return a[2] - b[2]; })
+          .entries([[0, 1], [0, 2, 1], [1, 1], [1, 2], [0, 2, 0]]);
+      assert.deepEqual(entries, [
+        {key: "0", values: [
+          {key: "1", values: [[0, 1]]},
+          {key: "2", values: [[0, 2, 0], [0, 2, 1]]}
+        ]},
+        {key: "1", values: [
+          {key: "1", values: [[1, 1]]},
+          {key: "2", values: [[1, 2]]}
+        ]}
+      ]);
+    },
+    "the key comparator only applies to the last-specified key": function(nest) {
+      var entries = nest()
+          .key(function(d) { return d[0]; }).sortKeys(d3.ascending)
+          .key(function(d) { return d[1]; }).sortKeys(d3.descending)
+          .entries([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
+      assert.deepEqual(entries, [
+        {key: "0", values: [
+          {key: "2", values: [[0, 2], [0, 2]]},
+          {key: "1", values: [[0, 1]]}
+        ]},
+        {key: "1", values: [
+          {key: "2", values: [[1, 2]]},
+          {key: "1", values: [[1, 1]]}
+        ]}
+      ]);
+      var entries = nest()
+          .key(function(d) { return d[0]; }).sortKeys(d3.descending)
+          .key(function(d) { return d[1]; }).sortKeys(d3.ascending)
+          .entries([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
+      assert.deepEqual(entries, [
+        {key: "1", values: [
+          {key: "1", values: [[1, 1]]},
+          {key: "2", values: [[1, 2]]}
+        ]},
+        {key: "0", values: [
+          {key: "1", values: [[0, 1]]},
+          {key: "2", values: [[0, 2], [0, 2]]}
+        ]}
+      ]);
+    },
+    "if no keys are specified, the input array is returned": function(nest) {
+      var array = [new Object()];
+      assert.strictEqual(nest().entries(array), array);
+    }
+  }
+});
+
+suite.addBatch({
+  "map": {
+    topic: function() {
+      return d3.nest;
+    },
+    "returns a map of each distinct key": function(nest) {
+      var map = nest()
+          .key(function(d) { return d.foo; })
+          .map([{foo: 1, bar: 0}, {foo: 2}, {foo: 1, bar: 1}]);
+      assert.deepEqual(map, {
+        "1": [{foo: 1, bar: 0}, {foo: 1, bar: 1}],
+        "2": [{foo: 2}]
+      });
+    },
+    "values can be sorted using an optional comparator": function(nest) {
+      var map = nest()
+          .key(function(d) { return d.foo; })
+          .sortValues(function(a, b) { return a.bar - b.bar; })
+          .map([{foo: 1, bar: 2}, {foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 2}]);
+      assert.deepEqual(map, {
+        "1": [{foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 1, bar: 2}],
+        "2": [{foo: 2}]
+      });
+    },
+    "values can be aggregated using an optional rollup": function(nest) {
+      var map = nest()
+          .key(function(d) { return d.foo; })
+          .rollup(function(values) { return d3.sum(values, function(d) { return d.bar; }); })
+          .map([{foo: 1, bar: 2}, {foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 2}]);
+      assert.deepEqual(map, {
+        "1": 3,
+        "2": 0
+      });
+    },
+    "multiple key functions can be specified": function(nest) {
+      var map = nest()
+          .key(function(d) { return d[0]; }).sortKeys(d3.ascending)
+          .key(function(d) { return d[1]; }).sortKeys(d3.ascending)
+          .map([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
+      assert.deepEqual(map, {
+        "0": {
+          "1": [[0, 1]],
+          "2": [[0, 2], [0, 2]]
+        },
+        "1": {
+          "1": [[1, 1]],
+          "2": [[1, 2]]
+        }
+      });
+    },
+    "the rollup function only applies to leaf values": function(nest) {
+      var map = nest()
+          .key(function(d) { return d[0]; }).sortKeys(d3.ascending)
+          .key(function(d) { return d[1]; }).sortKeys(d3.ascending)
+          .rollup(function(values) { return values.length; })
+          .map([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
+      assert.deepEqual(map, {
+        "0": {
+          "1": 1,
+          "2": 2
+        },
+        "1": {
+          "1": 1,
+          "2": 1
+        }
+      });
+    },
+    "the value comparator only applies to leaf values": function(nest) {
+      var map = nest()
+          .key(function(d) { return d[0]; }).sortKeys(d3.ascending)
+          .key(function(d) { return d[1]; }).sortKeys(d3.ascending)
+          .sortValues(function(a, b) { return a[2] - b[2]; })
+          .map([[0, 1], [0, 2, 1], [1, 1], [1, 2], [0, 2, 0]]);
+      assert.deepEqual(map, {
+        "0": {
+          "1": [[0, 1]],
+          "2": [[0, 2, 0], [0, 2, 1]]
+        },
+        "1": {
+          "1": [[1, 1]],
+          "2": [[1, 2]]
+        }
+      });
+    },
+    "if no keys are specified, the input array is returned": function(nest) {
+      var array = [new Object()];
+      assert.strictEqual(nest().map(array), array);
+    },
+    "handles keys that are built-in prototype properties": function(nest) {
+      var keys = nest()
+          .key(String)
+          .map(["hasOwnProperty"]);
+      assert.deepEqual(keys, {hasOwnProperty: ["hasOwnProperty"]});
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/ns-test.js b/static/demo/components/d3/test/core/ns-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..653990aba7df9e302b46e1c2d462462e804ee5ec
--- /dev/null
+++ b/static/demo/components/d3/test/core/ns-test.js
@@ -0,0 +1,58 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("ns");
+
+suite.addBatch({
+  "prefix": {
+    topic: function() {
+      return d3.ns.prefix;
+    },
+    "svg is http://www.w3.org/2000/svg": function(prefix) {
+      assert.equal(prefix.svg, "http://www.w3.org/2000/svg");
+    },
+    "xhtml is http://www.w3.org/1999/xhtml": function(prefix) {
+      assert.equal(prefix.xhtml, "http://www.w3.org/1999/xhtml");
+    },
+    "xlink is http://www.w3.org/1999/xlink": function(prefix) {
+      assert.equal(prefix.xlink, "http://www.w3.org/1999/xlink");
+    },
+    "xml is http://www.w3.org/XML/1998/namespace": function(prefix) {
+      assert.equal(prefix.xml, "http://www.w3.org/XML/1998/namespace");
+    },
+    "xmlns is http://www.w3.org/2000/xmlns/": function(prefix) {
+      assert.equal(prefix.xmlns, "http://www.w3.org/2000/xmlns/");
+    }
+  }
+});
+
+suite.addBatch({
+  "qualify": {
+    topic: function() {
+      return d3.ns.qualify;
+    },
+    "local name returns name": function() {
+      assert.equal(d3.ns.qualify("local"), "local");
+    },
+    "known qualified name returns space and local": function() {
+      var name = d3.ns.qualify("svg:path");
+      assert.equal(name.space, "http://www.w3.org/2000/svg");
+      assert.equal(name.local, "path");
+    },
+    "unknown qualified name returns name": function() {
+      assert.equal(d3.ns.qualify("foo:bar"), "bar");
+    },
+    "known local name returns space and local": function() {
+      var name = d3.ns.qualify("svg");
+      assert.equal(name.space, "http://www.w3.org/2000/svg");
+      assert.equal(name.local, "svg");
+    },
+    "names that collide with built-ins are ignored": function(qualify) {
+      assert.equal(qualify("hasOwnProperty:test"), "test");
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/permute-test.js b/static/demo/components/d3/test/core/permute-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..90ad5fd975ba5ebdee93286031d051736ef93f1a
--- /dev/null
+++ b/static/demo/components/d3/test/core/permute-test.js
@@ -0,0 +1,52 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.permute");
+
+suite.addBatch({
+  "permute": {
+    topic: function() {
+      return d3.permute;
+    },
+    "permutes according to the specified index": function(permute) {
+      assert.deepEqual(permute([3, 4, 5], [2, 1, 0]), [5, 4, 3]);
+      assert.deepEqual(permute([3, 4, 5], [2, 0, 1]), [5, 3, 4]);
+      assert.deepEqual(permute([3, 4, 5], [0, 1, 2]), [3, 4, 5]);
+    },
+    "does not modify the input array": function(permute) {
+      var input = [3, 4, 5];
+      permute(input, [2, 1, 0]);
+      assert.deepEqual(input, [3, 4, 5]);
+    },
+    "can duplicate input values": function(permute) {
+      assert.deepEqual(permute([3, 4, 5], [0, 1, 0]), [3, 4, 3]);
+      assert.deepEqual(permute([3, 4, 5], [2, 2, 2]), [5, 5, 5]);
+      assert.deepEqual(permute([3, 4, 5], [0, 1, 1]), [3, 4, 4]);
+    },
+    "can return more elements": function(permute) {
+      assert.deepEqual(permute([3, 4, 5], [0, 0, 1, 2]), [3, 3, 4, 5]);
+      assert.deepEqual(permute([3, 4, 5], [0, 1, 1, 1]), [3, 4, 4, 4]);
+    },
+    "can return fewer elements": function(permute) {
+      assert.deepEqual(permute([3, 4, 5], [0]), [3]);
+      assert.deepEqual(permute([3, 4, 5], [1, 2]), [4, 5]);
+      assert.deepEqual(permute([3, 4, 5], []), []);
+    },
+    "can return undefined elements": function(permute) {
+      var v1 = permute([3, 4, 5], [10]);
+      assert.equal(v1.length, 1);
+      assert.isUndefined(v1[0]);
+      var v2 = permute([3, 4, 5], [-1]);
+      assert.equal(v2.length, 1);
+      assert.isUndefined(v2[0]);
+      var v3 = permute([3, 4, 5], [0, -1]);
+      assert.equal(v3.length, 2);
+      assert.equal(v3[0], 3);
+      assert.isUndefined(v3[1]);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/quantile-test.js b/static/demo/components/d3/test/core/quantile-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..7c969dbf1c3a758252a6bac079e5310653f0175d
--- /dev/null
+++ b/static/demo/components/d3/test/core/quantile-test.js
@@ -0,0 +1,59 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.quantile");
+
+suite.addBatch({
+  "quantile": {
+    topic: function() {
+      return d3.quantile;
+    },
+    "requires sorted numeric input": function(quantile) {
+      assert.equal(quantile([1, 2, 3, 4], 0), 1);
+      assert.equal(quantile([1, 2, 3, 4], 1), 4);
+      assert.equal(quantile([4, 3, 2, 1], 0), 4);
+      assert.equal(quantile([4, 3, 2, 1], 1), 1);
+    },
+    "uses the R-7 algorithm": function(quantile) {
+      var data = [3, 6, 7, 8, 8, 10, 13, 15, 16, 20];
+      assert.equal(quantile(data, 0), 3);
+      assert.equal(quantile(data, .25), 7.25);
+      assert.equal(quantile(data, .5), 9);
+      assert.equal(quantile(data, .75), 14.5);
+      assert.equal(quantile(data, 1), 20);
+      var data = [3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20];
+      assert.equal(quantile(data, 0), 3);
+      assert.equal(quantile(data, .25), 7.5);
+      assert.equal(quantile(data, .5), 9);
+      assert.equal(quantile(data, .75), 14);
+      assert.equal(quantile(data, 1), 20);
+    },
+    "coerces values to numbers": function(quantile) {
+      var strings = ["1", "2", "3", "4"];
+      assert.strictEqual(quantile(strings, 1/3), 2);
+      assert.strictEqual(quantile(strings, 1/2), 2.5);
+      assert.strictEqual(quantile(strings, 2/3), 3);
+      var dates = [new Date(2011, 0, 1), new Date(2012, 0, 1)];
+      assert.strictEqual(quantile(dates, 0), +new Date(2011, 0, 1));
+      assert.strictEqual(quantile(dates, 1/2), +new Date(2011, 6, 2, 13));
+      assert.strictEqual(quantile(dates, 1), +new Date(2012, 0, 1));
+    },
+    "returns an exact value for integer p-values": function(quantile) {
+      var data = [1, 2, 3, 4];
+      assert.equal(quantile(data, 1/3), 2);
+      assert.equal(quantile(data, 2/3), 3);
+    },
+    "returns the first value for p = 0": function(quantile) {
+      var data = [1, 2, 3, 4];
+      assert.equal(quantile(data, 0), 1);
+    },
+    "returns the last value for p = 1": function(quantile) {
+      var data = [1, 2, 3, 4];
+      assert.equal(quantile(data, 1), 4);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/random-test.js b/static/demo/components/d3/test/core/random-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..eeb6332289802cf9bf0b5f7e59aaecbda67df249
--- /dev/null
+++ b/static/demo/components/d3/test/core/random-test.js
@@ -0,0 +1,35 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.random");
+
+suite.addBatch({
+  "normal": {
+    "topic": function() {
+      return d3.random.normal();
+    },
+    "returns a number": function(random) {
+      assert.typeOf(random(), "number");
+    }
+  },
+  "logNormal": {
+    "topic": function() {
+      return d3.random.logNormal();
+    },
+    "returns a number": function(random) {
+      assert.typeOf(random(), "number");
+    }
+  },
+  "irwinHall": {
+    "topic": function() {
+      return d3.random.irwinHall(10);
+    },
+    "returns a number": function(random) {
+      assert.typeOf(random(), "number");
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/range-test.js b/static/demo/components/d3/test/core/range-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..18b4aa85eb7eefbe7cde6d65bfc1284af727b0dd
--- /dev/null
+++ b/static/demo/components/d3/test/core/range-test.js
@@ -0,0 +1,102 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.range");
+
+suite.addBatch({
+  "range": {
+    topic: function() {
+      return d3.range;
+    },
+    "start is an inclusive lower bound": function(range) {
+      assert.equal(range(5)[0], 0);
+      assert.equal(range(1, 5)[0], 1);
+      assert.equal(range(5, 1, -1)[0], 5);
+    },
+    "stop is an exclusive upper bound": function(range) {
+      assert.equal(range(5)[4], 4);
+      assert.equal(range(1, 5)[3], 4);
+      assert.equal(range(5, 1, -1)[3], 2);
+    },
+    "with one argument, returns integers [0 … stop)": function(range) {
+      assert.deepEqual(range(0), []);
+      assert.deepEqual(range(1), [0]);
+      assert.deepEqual(range(5), [0, 1, 2, 3, 4]);
+    },
+    "with two arguments, returns integers [start … stop)": function(range) {
+      assert.deepEqual(range(0, 5), [0, 1, 2, 3, 4]);
+      assert.deepEqual(range(5, 9), [5, 6, 7, 8]);
+    },
+    "with three arguments, returns start + k * step": function(range) {
+      assert.deepEqual(range(0, 5, 1), [0, 1, 2, 3, 4]);
+      assert.deepEqual(range(5, 9, .5), [5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5]);
+      assert.deepEqual(range(5, 8.5, .5), [5, 5.5, 6, 6.5, 7, 7.5, 8]);
+      assert.deepEqual(range(2, 0, -.5), [2, 1.5, 1, .5]);
+    },
+    "handles fractional steps without rounding errors": function(range) {
+      assert.deepEqual(range(0, 0.5, 0.1), [0, 0.1, 0.2, 0.3, 0.4]);
+      assert.deepEqual(range(-2, -1.2, 0.1), [-2, -1.9, -1.8, -1.7, -1.6, -1.5, -1.4, -1.3]);
+    },
+    "handles extremely small steps without rounding errors": function(range) {
+      assert.deepEqual(range(2.1e-31, 5e-31, 1.1e-31), [2.1e-31, 3.2e-31, 4.3e-31]);
+    },
+    "handles extremely large steps without rounding errors": function(range) {
+      assert.deepEqual(range(1e300, 2e300, 0.3e300), [1e300, 1.3e300, 1.6e300, 1.9e300]);
+    },
+    "returns an ascending range if step is positive": function(range) {
+      assert.deepEqual(range(0, 5, 1), [0, 1, 2, 3, 4]);
+    },
+    "returns a descending range if step is negative": function(range) {
+      assert.deepEqual(range(5, 0, -1), [5, 4, 3, 2, 1]);
+    },
+    "returns an empty range if start, stop or step are NaN": function(range) {
+      assert.isEmpty(range(0, NaN));
+      assert.isEmpty(range(1, NaN));
+      assert.isEmpty(range(-1, NaN));
+      assert.isEmpty(range(0, undefined));
+      assert.isEmpty(range(1, undefined));
+      assert.isEmpty(range(-1, undefined));
+      assert.isEmpty(range(NaN, 0));
+      assert.isEmpty(range(NaN, 1));
+      assert.isEmpty(range(NaN, -1));
+      assert.isEmpty(range(undefined, 0));
+      assert.isEmpty(range(undefined, 1));
+      assert.isEmpty(range(undefined, -1));
+      assert.isEmpty(range(NaN, NaN));
+      assert.isEmpty(range(undefined, undefined));
+      assert.isEmpty(range(NaN, NaN, NaN));
+      assert.isEmpty(range(undefined, undefined, undefined));
+      assert.isEmpty(range(0, 10, NaN));
+      assert.isEmpty(range(10, 0, NaN));
+      assert.isEmpty(range(0, 10, undefined));
+      assert.isEmpty(range(10, 0, undefined));
+    },
+    "returns an empty range if start equals stop": function(range) {
+      assert.isEmpty(range(10, 10));
+      assert.isEmpty(range(10, 10, 1));
+      assert.isEmpty(range(10, 10, -1));
+      assert.isEmpty(range(10, 10, -.5));
+      assert.isEmpty(range(10, 10, .5));
+      assert.isEmpty(range(0, 0));
+      assert.isEmpty(range(0, 0, 1));
+      assert.isEmpty(range(0, 0, -1));
+      assert.isEmpty(range(0, 0, -.5));
+      assert.isEmpty(range(0, 0, .5));
+    },
+    "returns an empty range if stop is less than start and step is positive": function(range) {
+      assert.isEmpty(range(20, 10));
+      assert.isEmpty(range(20, 10, 2));
+      assert.isEmpty(range(20, 10, 1));
+      assert.isEmpty(range(20, 10, .5));
+    },
+    "returns an empty range if stop is greater than start and step is negative": function(range) {
+      assert.isEmpty(range(10, 20, -2));
+      assert.isEmpty(range(10, 20, -1));
+      assert.isEmpty(range(10, 20, -.5));
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/rebind-test.js b/static/demo/components/d3/test/core/rebind-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..81d4de54dedd5d63fcf22a2a6bf5a0652218f402
--- /dev/null
+++ b/static/demo/components/d3/test/core/rebind-test.js
@@ -0,0 +1,53 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.rebind");
+
+suite.addBatch({
+  "rebind": {
+    topic: function() {
+      return d3.rebind;
+    },
+    "source function always has source as context": function(rebind) {
+      var target = {}, source = {method: function() { that = this; }}, that;
+      rebind(target, source, "method");
+      assert.strictEqual((target.method(), that), source);
+      assert.strictEqual((target.method.call({}), that), source);
+    },
+    "source function receives target function's arguments": function(rebind) {
+      var target = {}, source = {method: function() { those = Array.prototype.slice.call(arguments); }}, those;
+      rebind(target, source, "method");
+      assert.deepEqual((target.method(), those), []);
+      assert.deepEqual((target.method(1), those), [1]);
+      assert.deepEqual((target.method(null), those), [null]);
+      assert.deepEqual((target.method(source, source, 1), those), [source, source, 1]);
+    },
+    "target function returns target if source function returns source": function(rebind) {
+      var target = {}, source = {method: function(value) { return value ? source : 42; }};
+      rebind(target, source, "method");
+      assert.strictEqual(target.method(true), target);
+    },
+    "otherwise, target function returns source function return value": function(rebind) {
+      var target = {}, source = {method: function(value) { return value ? source : 42; }};
+      rebind(target, source, "method");
+      assert.strictEqual(target.method(false), 42);
+    },
+    "can bind multiple methods": function(rebind) {
+      var target = {}, source = {
+        foo: function() { return 1; },
+        bar: function() { return 2; }
+      };
+      rebind(target, source, "foo", "bar");
+      assert.strictEqual(target.foo(), 1);
+      assert.strictEqual(target.bar(), 2);
+    },
+    "returns the target object": function(rebind) {
+      var target = {}, source = {foo: function() {}};
+      assert.strictEqual(rebind(target, source, "foo"), target);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/requote-test.js b/static/demo/components/d3/test/core/requote-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..86fdff65c1e0dce8e79afcec98da2255b8eb5bc3
--- /dev/null
+++ b/static/demo/components/d3/test/core/requote-test.js
@@ -0,0 +1,52 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.requote");
+
+suite.addBatch({
+  "requote": {
+    topic: function() {
+      return d3.requote;
+    },
+    "quotes backslashes": function(quote) {
+      assert.equal(quote("\\"), "\\\\");
+    },
+    "quotes carets": function(quote) {
+      assert.equal(quote("^"), "\\^");
+    },
+    "quotes dollar signs": function(quote) {
+      assert.equal(quote("$"), "\\$");
+    },
+    "quotes stars": function(quote) {
+      assert.equal(quote("*"), "\\*");
+    },
+    "quotes plusses": function(quote) {
+      assert.equal(quote("+"), "\\+");
+    },
+    "quotes question marks": function(quote) {
+      assert.equal(quote("?"), "\\?");
+    },
+    "quotes periods": function(quote) {
+      assert.equal(quote("."), "\\.");
+    },
+    "quotes parentheses": function(quote) {
+      assert.equal(quote("("), "\\(");
+      assert.equal(quote(")"), "\\)");
+    },
+    "quotes pipes": function(quote) {
+      assert.equal(quote("|"), "\\|");
+    },
+    "quotes curly braces": function(quote) {
+      assert.equal(quote("{"), "\\{");
+      assert.equal(quote("}"), "\\}");
+    },
+    "quotes square brackets": function(quote) {
+      assert.equal(quote("["), "\\[");
+      assert.equal(quote("]"), "\\]");
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/rgb-test.js b/static/demo/components/d3/test/core/rgb-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..dbc32c247885222736248f3af0f936b4c3caffde
--- /dev/null
+++ b/static/demo/components/d3/test/core/rgb-test.js
@@ -0,0 +1,93 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.rgb");
+
+suite.addBatch({
+  "rgb": {
+    topic: function() {
+      return d3.rgb;
+    },
+    "floors channel values": function(rgb) {
+      assert.rgbEqual(rgb(1.2, 2.6, 42.9), 1, 2, 42);
+    },
+    "defaults to black for invalid inputs": function(rgb) {
+      assert.rgbEqual(rgb("invalid"), 0, 0, 0);
+      assert.rgbEqual(rgb("hasOwnProperty"), 0, 0, 0);
+      assert.rgbEqual(rgb("__proto__"), 0, 0, 0);
+    },
+    "does not clamp channel values": function(rgb) {
+      assert.rgbEqual(rgb(-10, -20, -30), -10, -20, -30);
+      assert.rgbEqual(rgb(300, 400, 500), 300, 400, 500);
+    },
+    "converts string channel values to numbers": function(rgb) {
+      assert.rgbEqual(rgb("12", "34", "56"), 12, 34, 56);
+    },
+    "converts null channel values to zero": function(rgb) {
+      assert.rgbEqual(rgb(null, null, null), 0, 0, 0);
+    },
+    "exposes r, g and b properties": function(rgb) {
+      var color = rgb("#abc");
+      assert.equal(color.r, 170);
+      assert.equal(color.g, 187);
+      assert.equal(color.b, 204);
+    },
+    "changing r, g or b affects the string format": function(rgb) {
+      var color = rgb("#abc");
+      color.r++;
+      color.g++;
+      color.b++;
+      assert.equal(color + "", "#abbccd");
+    },
+    "parses hexadecimal shorthand format (e.g., \"#abc\")": function(rgb) {
+      assert.rgbEqual(rgb("#abc"), 170, 187, 204);
+    },
+    "parses hexadecimal format (e.g., \"#abcdef\")": function(rgb) {
+      assert.rgbEqual(rgb("#abcdef"), 171, 205, 239);
+    },
+    "parses RGB format (e.g., \"rgb(12, 34, 56)\")": function(rgb) {
+      assert.rgbEqual(rgb("rgb(12, 34, 56)"), 12, 34, 56);
+    },
+    "parses color names (e.g., \"moccasin\")": function(rgb) {
+      assert.rgbEqual(rgb("moccasin"), 255, 228, 181);
+      assert.rgbEqual(rgb("aliceblue"), 240, 248, 255);
+      assert.rgbEqual(rgb("yellow"), 255, 255, 0);
+    },
+    "parses and converts HSL format (e.g., \"hsl(60, 100%, 20%)\")": function(rgb) {
+      assert.rgbEqual(rgb("hsl(60, 100%, 20%)"), 102, 102, 0);
+    },
+    "can convert from RGB": function(rgb) {
+      assert.rgbEqual(rgb(d3.rgb(12, 34, 56)), 12, 34, 56);
+    },
+    "can convert from HSL": function(rgb) {
+      assert.rgbEqual(rgb(d3.hsl(0, 1, .5)), 255, 0, 0);
+    },
+    "can convert to HSL": function(rgb) {
+      assert.hslEqual(rgb("red").hsl(), 0, 1, .5);
+    },
+    "can derive a brighter color": function(rgb) {
+      assert.rgbEqual(rgb("brown").brighter(), 235, 60, 60);
+      assert.rgbEqual(rgb("brown").brighter(.5), 197, 50, 50);
+      assert.rgbEqual(rgb("brown").brighter(1), 235, 60, 60);
+      assert.rgbEqual(rgb("brown").brighter(2), 255, 85, 85);
+    },
+    "can derive a darker color": function(rgb) {
+      assert.rgbEqual(rgb("coral").darker(), 178, 88, 56);
+      assert.rgbEqual(rgb("coral").darker(.5), 213, 106, 66);
+      assert.rgbEqual(rgb("coral").darker(1), 178, 88, 56);
+      assert.rgbEqual(rgb("coral").darker(2), 124, 62, 39);
+    },
+    "string coercion returns hexadecimal format": function(rgb) {
+      assert.strictEqual(rgb("#abcdef") + "", "#abcdef");
+      assert.strictEqual(rgb("moccasin") + "", "#ffe4b5");
+      assert.strictEqual(rgb("hsl(60, 100%, 20%)") + "", "#666600");
+      assert.strictEqual(rgb("rgb(12, 34, 56)") + "", "#0c2238");
+      assert.strictEqual(rgb(d3.rgb(12, 34, 56)) + "", "#0c2238");
+      assert.strictEqual(rgb(d3.hsl(60, 1, .2)) + "", "#666600");
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/round-test.js b/static/demo/components/d3/test/core/round-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..43d347c0f65f3ae844c421e61794a8d276604912
--- /dev/null
+++ b/static/demo/components/d3/test/core/round-test.js
@@ -0,0 +1,69 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.round");
+
+suite.addBatch({
+  "round": {
+    topic: function() {
+      return d3.round;
+    },
+    "returns a number": function(round) {
+      assert.isNumber(round(42));
+    },
+    "returns zero for zero": function(round) {
+      assert.equal(round(0), 0);
+    },
+    "ignores degenerate input": function(round) {
+      assert.isNaN(round(NaN));
+      assert.equal(round(Infinity), Infinity);
+      assert.equal(round(-Infinity), -Infinity);
+    },
+    "returns integers by default": function(round) {
+      assert.equal(round(10.6), 11);
+      assert.equal(round(10.4), 10);
+      assert.equal(round(0.6), 1);
+      assert.equal(round(0.4), 0);
+      assert.equal(round(-0.6), -1);
+      assert.equal(round(-0.4), 0);
+      assert.equal(round(-10.6), -11);
+      assert.equal(round(-10.4), -10);
+    },
+    "rounds to the specified decimal place": function(round) {
+      assert.inDelta(round(10.56, 1), 10.6, 1e-6);
+      assert.inDelta(round(10.54, 1), 10.5, 1e-6);
+      assert.inDelta(round(0.56, 1), 0.6, 1e-6);
+      assert.inDelta(round(0.54, 1), 0.5, 1e-6);
+      assert.inDelta(round(-0.56, 1), -0.6, 1e-6);
+      assert.inDelta(round(-0.54, 1), -0.5, 1e-6);
+      assert.inDelta(round(-10.56, 1), -10.6, 1e-6);
+      assert.inDelta(round(-10.54, 1), -10.5, 1e-6);
+      assert.inDelta(round(10.556, 2), 10.56, 1e-6);
+      assert.inDelta(round(10.554, 2), 10.55, 1e-6);
+      assert.inDelta(round(0.556, 2), 0.56, 1e-6);
+      assert.inDelta(round(0.554, 2), 0.55, 1e-6);
+      assert.inDelta(round(-0.556, 2), -0.56, 1e-6);
+      assert.inDelta(round(-0.554, 2), -0.55, 1e-6);
+      assert.inDelta(round(-10.556, 2), -10.56, 1e-6);
+      assert.inDelta(round(-10.554, 2), -10.55, 1e-6);
+    },
+    "rounds to the specified significant digits": function(round) {
+      assert.equal(round(123.45, -1), 120);
+      assert.equal(round(345.67, -1), 350);
+      assert.equal(round(-123.45, -1), -120);
+      assert.equal(round(-345.67, -1), -350);
+      assert.equal(round(123.45, -2), 100);
+      assert.equal(round(456.78, -2), 500);
+      assert.equal(round(-123.45, -2), -100);
+      assert.equal(round(-456.78, -2), -500);
+      assert.equal(round(123.45, -3), 0);
+      assert.equal(round(567.89, -3), 1000);
+      assert.equal(round(-123.45, -3), 0);
+      assert.equal(round(-567.89, -3), -1000);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/select-test.js b/static/demo/components/d3/test/core/select-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..924ceac24400b120b89b9f64c97ab13fc0fac97a
--- /dev/null
+++ b/static/demo/components/d3/test/core/select-test.js
@@ -0,0 +1,41 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.select");
+
+suite.addBatch({
+  "select": {
+    topic: function() {
+      var body = d3.select("body").html("");
+      body.append("span").attr("class", "f00").attr("id", "b4r").attr("name", "b4z");
+      body.append("div").attr("class", "foo").attr("id", "bar").attr("name", "baz");
+      return body;
+    },
+    "selects by element name": function() {
+      var div = d3.select("div");
+      assert.equal(div[0][0].tagName, "DIV");
+    },
+    "selects by class name": function() {
+      var div = d3.select(".foo");
+      assert.equal(div[0][0].className, "foo");
+    },
+    "selects by id": function() {
+      var div = d3.select("div#bar");
+      assert.equal(div[0][0].id, "bar");
+    },
+    "selects by attribute value": function() {
+      var div = d3.select("[name=baz]");
+      assert.equal(div[0][0].getAttribute("name"), "baz");
+    },
+    "selects by node": function() {
+      var div = d3.select(document.body.lastChild);
+      assert.isTrue(div[0][0] === document.body.lastChild);
+      assert.lengthOf(div, 1);
+      assert.lengthOf(div[0], 1);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selectAll-test.js b/static/demo/components/d3/test/core/selectAll-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..9ac4646d8ace18bf581e9811982251bb72cce66a
--- /dev/null
+++ b/static/demo/components/d3/test/core/selectAll-test.js
@@ -0,0 +1,45 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.selectAll");
+
+suite.addBatch({
+  "selectAll": {
+    topic: function() {
+      var body = d3.select("body").html("");
+      body.append("span").attr("class", "f00").attr("id", "b4r").attr("name", "b4z");
+      body.append("div").attr("class", "foo").attr("id", "bar").attr("name", "baz");
+      return body;
+    },
+    "selects by element name": function() {
+      var div = d3.selectAll("div");
+      assert.equal(div[0][0].tagName, "DIV");
+    },
+    "selects by class name": function() {
+      var div = d3.selectAll(".foo");
+      assert.equal(div[0][0].className, "foo");
+    },
+    "selects by id": function() {
+      var div = d3.select("div#bar");
+      assert.equal(div[0][0].id, "bar");
+    },
+    "selects by attribute value": function() {
+      var div = d3.selectAll("[name=baz]");
+      assert.equal(div[0][0].getAttribute("name"), "baz");
+    },
+    "selects by array": function() {
+      var div = d3.selectAll([document.body.lastChild]);
+      assert.isTrue(div[0][0] === document.body.lastChild);
+      assert.lengthOf(div, 1);
+      assert.lengthOf(div[0], 1);
+    },
+    "groups are not instances of NodeList": function() {
+      var div = d3.select("body").selectAll(function() { return this.getElementsByClassName("div"); });
+      assert.isFalse(div[0] instanceof window.NodeList);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-append-test.js b/static/demo/components/d3/test/core/selection-append-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..8565be43a8ba784df7582e2a5f36deef41459078
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-append-test.js
@@ -0,0 +1,122 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.append");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "appends an HTML element": function(body) {
+      var div = body.append("div");
+      assert.equal(div[0][0].tagName, "DIV");
+      assert.isNull(div[0][0].namespaceURI);
+      assert.isTrue(div[0][0].parentNode === document.body);
+      assert.isTrue(div[0][0] === document.body.lastChild);
+    },
+    "appends an SVG element": function(body) {
+      var svg = body.append("svg:svg");
+      assert.equal(svg[0][0].tagName, "SVG");
+      assert.equal(svg[0][0].namespaceURI, "http://www.w3.org/2000/svg");
+      assert.isTrue(svg[0][0].parentNode === document.body);
+      assert.isTrue(svg[0][0] === document.body.lastChild);
+    },
+    "propagates data to new element": function(body) {
+      var data = new Object(), div = body.data([data]).append("div");
+      assert.strictEqual(div[0][0].__data__, data);
+    },
+    "returns a new selection": function(body) {
+      assert.isFalse(body.append("div") === body);
+    },
+    "inherits namespace from parent node": function(body) {
+      var g = body.append("svg:svg").append("g");
+      assert.equal(g[0][0].namespaceURI, "http://www.w3.org/2000/svg");
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "appends an HTML element": function(div) {
+      var span = div.append("span");
+      assert.equal(span[0].length, 2);
+      assert.equal(span[0][0].tagName, "SPAN");
+      assert.equal(span[0][1].tagName, "SPAN");
+      assert.isNull(span[0][0].namespaceURI);
+      assert.isNull(span[0][1].namespaceURI);
+      assert.isTrue(span[0][0].parentNode === div[0][0]);
+      assert.isTrue(span[0][1].parentNode === div[0][1]);
+      assert.isTrue(div[0][0].lastChild === span[0][0]);
+      assert.isTrue(div[0][1].lastChild === span[0][1]);
+    },
+    "appends an SVG element": function(div) {
+      var svg = div.append("svg:svg");
+      assert.equal(svg[0].length, 2);
+      assert.equal(svg[0][0].tagName, "SVG");
+      assert.equal(svg[0][1].tagName, "SVG");
+      assert.equal(svg[0][0].namespaceURI, "http://www.w3.org/2000/svg");
+      assert.equal(svg[0][1].namespaceURI, "http://www.w3.org/2000/svg");
+      assert.isTrue(svg[0][0].parentNode === div[0][0]);
+      assert.isTrue(svg[0][1].parentNode === div[0][1]);
+      assert.isTrue(div[0][0].lastChild === svg[0][0]);
+      assert.isTrue(div[0][1].lastChild === svg[0][1]);
+    },
+    "ignores null nodes": function(div) {
+      div.html("");
+      var some = d3.selectAll("div");
+      some[0][1] = null;
+      var span = some.append("span");
+      assert.equal(span[0].length, 2);
+      assert.equal(span[0][0].tagName, "SPAN");
+      assert.isNull(span[0][1]);
+      assert.isTrue(span[0][0].parentNode === div[0][0]);
+      assert.isTrue(div[0][0].lastChild === span[0][0]);
+      assert.isNull(div[0][1].lastChild);
+    },
+    "propagates data to new elements": function(div) {
+      var a = new Object(), b = new Object(), span = div.data([a, b]).append("span");
+      assert.strictEqual(span[0][0].__data__, a);
+      assert.strictEqual(span[0][1].__data__, b);
+    },
+    "returns a new selection": function(div) {
+      assert.isFalse(div.append("div") === div);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div).data(…).enter()": {
+    topic: function() {
+      return d3.select("body");
+    },
+    "appends to the parent node": function(body) {
+      var div = body.html("").selectAll("div").data(d3.range(2)).enter().append("div");
+      assert.equal(div.length, 1);
+      assert.equal(div[0].length, 2);
+      assert.domEqual(div[0][0].parentNode, document.body);
+      assert.domEqual(div[0][1].parentNode, document.body);
+    },
+    "propagates data to new elements": function(body) {
+      var a = new Object(), b = new Object(), div = body.html("").selectAll("div").data([a, b]).enter().append("div");
+      assert.strictEqual(div[0][0].__data__, a);
+      assert.strictEqual(div[0][1].__data__, b);
+    },
+    "ignores null nodes": function(body) {
+      body.html("").append("div");
+      var div = body.selectAll("div").data(d3.range(3)).enter().append("div");
+      assert.equal(div.length, 1);
+      assert.equal(div[0].length, 3);
+      assert.domNull(div[0][0]);
+      assert.domEqual(div[0][1].parentNode, document.body);
+      assert.domEqual(div[0][2].parentNode, document.body);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-attr-test.js b/static/demo/components/d3/test/core/selection-attr-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..c08baea27fefa472984b560ab1c906226fd65ab5
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-attr-test.js
@@ -0,0 +1,175 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.attr");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body");
+    },
+    "sets an attribute as a string": function(body) {
+      body.attr("bgcolor", "red");
+      assert.equal(document.body.getAttribute("bgcolor"), "red");
+    },
+    "sets an attribute as a number": function(body) {
+      body.attr("opacity", 1);
+      assert.equal(document.body.getAttribute("opacity"), "1");
+    },
+    "sets an attribute as a function": function(body) {
+      body.attr("bgcolor", function() { return "orange"; });
+      assert.equal(document.body.getAttribute("bgcolor"), "orange");
+    },
+    "sets an attribute as a function of data": function(body) {
+      body.data(["cyan"]).attr("bgcolor", String);
+      assert.equal(document.body.getAttribute("bgcolor"), "cyan");
+    },
+    "sets an attribute as a function of index": function(body) {
+      body.attr("bgcolor", function(d, i) { return "orange-" + i; });
+      assert.equal(document.body.getAttribute("bgcolor"), "orange-0");
+    },
+    "sets a namespaced attribute as a string": function(body) {
+      body.attr("xlink:href", "url");
+      assert.equal(document.body.getAttributeNS("http://www.w3.org/1999/xlink", "href"), "url");
+    },
+    "sets a namespaced attribute as a function": function(body) {
+      body.data(["orange"]).attr("xlink:href", function(d, i) { return d + "-" + i; });
+      assert.equal(document.body.getAttributeNS("http://www.w3.org/1999/xlink", "href"), "orange-0");
+    },
+    "sets attributes as a map of constants": function(body) {
+      body.attr({bgcolor: "white", "xlink:href": "url.png"});
+      assert.equal(document.body.getAttribute("bgcolor"), "white");
+      assert.equal(document.body.getAttributeNS("http://www.w3.org/1999/xlink", "href"), "url.png");
+    },
+    "sets attributes as a map of functions": function(body) {
+      body.data(["orange"]).attr({"xlink:href": function(d, i) { return d + "-" + i + ".png"; }});
+      assert.equal(document.body.getAttributeNS("http://www.w3.org/1999/xlink", "href"), "orange-0.png");
+    },
+    "gets an attribute value": function(body) {
+      document.body.setAttribute("bgcolor", "yellow");
+      assert.equal(body.attr("bgcolor"), "yellow");
+    },
+    "gets a namespaced attribute value": function(body) {
+      document.body.setAttributeNS("http://www.w3.org/1999/xlink", "foo", "bar");
+      assert.equal(body.attr("xlink:foo"), "bar");
+    },
+    "removes an attribute as null": function(body) {
+      body.attr("bgcolor", "red").attr("bgcolor", null);
+      assert.equal(body.attr("bgcolor"), "");
+    },
+    "removes an attribute as a function": function(body) {
+      body.attr("bgcolor", "red").attr("bgcolor", function() { return null; });
+      assert.equal(body.attr("bgcolor"), "");
+    },
+    "removes a namespaced attribute as null": function(body) {
+      body.attr("xlink:href", "url").attr("xlink:href", null);
+      assert.equal(body.attr("bgcolor"), "");
+    },
+    "removes a namespaced attribute as a function": function(body) {
+      body.attr("xlink:href", "url").attr("xlink:href", function() { return null; });
+      assert.equal(body.attr("xlink:href"), "");
+    },
+    "removes attributes as a map of null": function(body) {
+      document.body.setAttribute("bgcolor", "white");
+      document.body.setAttributeNS("http://www.w3.org/1999/xlink", "href", "foo.png");
+      body.attr({bgcolor: null, "xlink:href": null});
+      assert.equal(document.body.getAttribute("bgcolor"), "");
+      assert.equal(document.body.getAttributeNS("http://www.w3.org/1999/xlink", "href"), "");
+    },
+    "removes attributes as a map of functions that return null": function(body) {
+      document.body.setAttribute("bgcolor", "white");
+      document.body.setAttributeNS("http://www.w3.org/1999/xlink", "href", "foo.png");
+      body.attr({bgcolor: function() {}, "xlink:href": function() {}});
+      assert.equal(document.body.getAttribute("bgcolor"), "");
+      assert.equal(document.body.getAttributeNS("http://www.w3.org/1999/xlink", "href"), "");
+    },
+    "returns the current selection": function(body) {
+      assert.isTrue(body.attr("foo", "bar") === body);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "sets an attribute as a string": function(div) {
+      div.attr("bgcolor", "red");
+      assert.equal(div[0][0].getAttribute("bgcolor"), "red");
+      assert.equal(div[0][1].getAttribute("bgcolor"), "red");
+    },
+    "sets an attribute as a number": function(div) {
+      div.attr("opacity", 0.4);
+      assert.equal(div[0][0].getAttribute("opacity"), "0.4");
+      assert.equal(div[0][1].getAttribute("opacity"), "0.4");
+    },
+    "sets an attribute as a function": function(div) {
+      div.attr("bgcolor", function() { return "coral"; });
+      assert.equal(div[0][0].getAttribute("bgcolor"), "coral");
+      assert.equal(div[0][1].getAttribute("bgcolor"), "coral");
+    },
+    "sets an attribute as a function of data": function(div) {
+      div.attr("bgcolor", d3.interpolateRgb("brown", "steelblue"));
+      assert.equal(div[0][0].getAttribute("bgcolor"), "#a52a2a");
+      assert.equal(div[0][1].getAttribute("bgcolor"), "#4682b4");
+    },
+    "sets an attribute as a function of index": function(div) {
+      div.attr("bgcolor", function(d, i) { return "color-" + i; });
+      assert.equal(div[0][0].getAttribute("bgcolor"), "color-0");
+      assert.equal(div[0][1].getAttribute("bgcolor"), "color-1");
+    },
+    "sets a namespaced attribute as a string": function(div) {
+      div.attr("xlink:href", "url");
+      assert.equal(div[0][0].getAttributeNS("http://www.w3.org/1999/xlink", "href"), "url");
+      assert.equal(div[0][1].getAttributeNS("http://www.w3.org/1999/xlink", "href"), "url");
+    },
+    "sets a namespaced attribute as a function": function(div) {
+      div.data(["red", "blue"]).attr("xlink:href", function(d, i) { return d + "-" + i; });
+      assert.equal(div[0][0].getAttributeNS("http://www.w3.org/1999/xlink", "href"), "red-0");
+      assert.equal(div[0][1].getAttributeNS("http://www.w3.org/1999/xlink", "href"), "blue-1");
+    },
+    "gets an attribute value": function(div) {
+      div[0][0].setAttribute("bgcolor", "purple");
+      assert.equal(div.attr("bgcolor"), "purple");
+    },
+    "gets a namespaced attribute value": function(div) {
+      div[0][0].setAttributeNS("http://www.w3.org/1999/xlink", "foo", "bar");
+      assert.equal(div.attr("xlink:foo"), "bar");
+    },
+    "removes an attribute as null": function(div) {
+      div.attr("href", "url").attr("href", null);
+      assert.equal(div[0][0].getAttribute("href"), "");
+      assert.equal(div[0][1].getAttribute("href"), "");
+    },
+    "removes an attribute as a function": function(div) {
+      div.attr("href", "url").attr("href", function() { return null; });
+      assert.equal(div[0][0].getAttribute("href"), "");
+      assert.equal(div[0][1].getAttribute("href"), "");
+    },
+    "removes a namespaced attribute as null": function(div) {
+      div.attr("xlink:foo", "bar").attr("xlink:foo", null);
+      assert.equal(div[0][0].getAttributeNS("http://www.w3.org/1999/xlink", "foo"), "");
+      assert.equal(div[0][1].getAttributeNS("http://www.w3.org/1999/xlink", "foo"), "");
+    },
+    "removes a namespaced attribute as a function": function(div) {
+      div.attr("xlink:foo", "bar").attr("xlink:foo", function() { return null; });
+      assert.equal(div[0][0].getAttributeNS("http://www.w3.org/1999/xlink", "foo"), "");
+      assert.equal(div[0][1].getAttributeNS("http://www.w3.org/1999/xlink", "foo"), "");
+    },
+    "ignores null nodes": function(div) {
+      var some = d3.selectAll("div");
+      some[0][1] = null;
+      some.attr("href", null).attr("href", "url");
+      assert.equal(div[0][0].getAttribute("href"), "url");
+      assert.equal(div[0][1].getAttribute("href"), "");
+    },
+    "returns the current selection": function(div) {
+      assert.isTrue(div.attr("foo", "bar") === div);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-call-test.js b/static/demo/components/d3/test/core/selection-call-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5fd25906348a777dfb9b8ea6677897542b026bc
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-call-test.js
@@ -0,0 +1,70 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.call");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "calls the function once": function(body) {
+      var count = 0;
+      body.call(function() { ++count; });
+      assert.equal(count, 1);
+    },
+    "passes any optional arguments": function(body) {
+      var abc;
+      body.call(function(selection, a, b, c) { abc = [a, b, c]; }, "a", "b", "c");
+      assert.deepEqual(abc, ["a", "b", "c"]);
+    },
+    "passes the selection as the first argument": function(body) {
+      var s;
+      body.call(function(selection) { s = selection; });
+      assert.isTrue(s === body);
+    },
+    "uses the selection as the context": function(body) {
+      var s;
+      body.call(function() { s = this; });
+      assert.isTrue(s === body);
+    },
+    "returns the current selection": function(body) {
+      assert.isTrue(body.call(function() {}) === body);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "calls the function once": function(div) {
+      var count = 0;
+      div.call(function() { ++count; });
+      assert.equal(count, 1);
+    },
+    "passes any optional arguments": function(div) {
+      var abc;
+      div.call(function(selection, a, b, c) { abc = [a, b, c]; }, "a", "b", "c");
+      assert.deepEqual(abc, ["a", "b", "c"]);
+    },
+    "passes the selection as the first argument": function(div) {
+      var s;
+      div.call(function(selection) { s = selection; });
+      assert.isTrue(s === div);
+    },
+    "uses the selection as the context": function(div) {
+      var s;
+      div.call(function() { s = this; });
+      assert.isTrue(s === div);
+    },
+    "returns the current selection": function(div) {
+      assert.isTrue(div.call(function() {}) === div);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-classed-test.js b/static/demo/components/d3/test/core/selection-classed-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..3317a41f181acf62cb9e07e2c8a9b5a0a29f1f19
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-classed-test.js
@@ -0,0 +1,263 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.call");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "adds a missing class as true": function(body) {
+      body.attr("class", null);
+      body.classed("foo", true);
+      assert.equal(document.body.className, "foo");
+      body.classed("bar", true);
+      assert.equal(document.body.className, "foo bar");
+    },
+    "removes an existing class as false": function(body) {
+      body.attr("class", "bar foo");
+      body.classed("foo", false);
+      assert.equal(document.body.className, "bar");
+      body.classed("bar", false);
+      assert.equal(document.body.className, "");
+    },
+    "preserves an existing class as true": function(body) {
+      body.attr("class", "bar foo");
+      body.classed("foo", true);
+      assert.equal(document.body.className, "bar foo");
+      body.classed("bar", true);
+      assert.equal(document.body.className, "bar foo");
+    },
+    "preserves a missing class as false": function(body) {
+      body.attr("class", "baz");
+      body.classed("foo", false);
+      assert.equal(document.body.className, "baz");
+      body.attr("class", null);
+      body.classed("bar", false);
+      assert.equal(document.body.className, "");
+    },
+    "gets an existing class": function(body) {
+      body.attr("class", " foo\tbar  baz");
+      assert.isTrue(body.classed("foo"));
+      assert.isTrue(body.classed("bar"));
+      assert.isTrue(body.classed("baz"));
+    },
+    "does not get a missing class": function(body) {
+      body.attr("class", " foo\tbar  baz");
+      assert.isFalse(body.classed("foob"));
+      assert.isFalse(body.classed("bare"));
+      assert.isFalse(body.classed("rbaz"));
+    },
+    "accepts a name with whitespace, collapsing it": function(body) {
+      body.attr("class", null);
+      body.classed(" foo\t", true);
+      assert.equal(document.body.className, "foo");
+      body.classed("\tfoo  ", false);
+      assert.equal(document.body.className, "");
+    },
+    "accepts a name with multiple classes separated by whitespace": function(body) {
+      body.attr("class", null);
+      body.classed("foo bar", true);
+      assert.equal(document.body.className, "foo bar");
+      assert.isTrue(body.classed("foo bar"));
+      assert.isTrue(body.classed("bar foo"));
+      assert.isFalse(body.classed("foo bar baz"));
+      assert.isFalse(body.classed("foob bar"));
+      body.classed("bar foo", false);
+      assert.equal(document.body.className, "");
+    },
+    "accepts a silly class name with unsafe characters": function(body) {
+      body.attr("class", null);
+      body.classed("foo.bar", true);
+      assert.equal(document.body.className, "foo.bar");
+      assert.isTrue(body.classed("foo.bar"));
+      assert.isFalse(body.classed("foo"));
+      assert.isFalse(body.classed("bar"));
+      body.classed("bar.foo", false);
+      assert.equal(document.body.className, "foo.bar");
+      body.classed("foo.bar", false);
+      assert.equal(document.body.className, "");
+    },
+    "accepts a name with duplicate classes, ignoring them": function(body) {
+      body.attr("class", null);
+      body.classed(" foo\tfoo  ", true);
+      assert.equal(document.body.className, "foo");
+      body.classed("\tfoo  foo ", false);
+      assert.equal(document.body.className, "");
+    },
+    "accepts a value function returning true or false": function(body) {
+      body.attr("class", null);
+      body.classed("foo", function() { return true; });
+      assert.equal(document.body.className, "foo");
+      body.classed("foo bar", function() { return true; });
+      assert.equal(document.body.className, "foo bar");
+      body.classed("foo", function() { return false; });
+      assert.equal(document.body.className, "bar");
+    },
+    "accepts a name object containing true or false": function(body) {
+      body.attr("class", null);
+      body.classed({foo: true});
+      assert.equal(document.body.className, "foo");
+      body.classed({bar: true, foo: false});
+      assert.equal(document.body.className, "bar");
+    },
+    "accepts a name object containing a function returning true or false": function(body) {
+      body.attr("class", null);
+      body.classed({foo: function() { return true; }});
+      assert.equal(document.body.className, "foo");
+    },
+    "accepts a name object containing a mix of functions and non-functions": function(body) {
+      body.attr("class", "foo");
+      body.classed({foo: false, bar: function() { return true; }});
+      assert.equal(document.body.className, "bar");
+    },
+    "the value may be truthy or falsey": function(body) {
+      body.attr("class", "foo");
+      body.classed({foo: null, bar: function() { return 1; }});
+      assert.equal(document.body.className, "bar");
+    },
+    "keys in the name object may contain whitespace": function(body) {
+      body.attr("class", null);
+      body.classed({" foo\t": function() { return true; }});
+      assert.equal(document.body.className, "foo");
+      body.attr("class", null);
+    },
+    "keys in the name object may reference multiple classes": function(body) {
+      body.attr("class", null);
+      body.classed({"foo bar": function() { return true; }});
+      assert.equal(document.body.className, "foo bar");
+      body.attr("class", null);
+    },
+    "keys in the name object may contain duplicates": function(body) {
+      body.attr("class", null);
+      body.classed({"foo foo": function() { return true; }});
+      assert.equal(document.body.className, "foo");
+      body.attr("class", null);
+    },
+    "value functions are only evaluated once when used for multiple classes": function(body) {
+      var count = 0;
+      body.attr("class", null);
+      body.classed({"foo bar": function() { return ++count; }});
+      assert.equal(document.body.className, "foo bar");
+      assert.equal(count, 1);
+    },
+    "returns the current selection": function(body) {
+      assert.isTrue(body.classed("foo", true) === body);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "adds a missing class as true": function(div) {
+      div.attr("class", null);
+      div.classed("foo", true);
+      assert.equal(div[0][0].className, "foo");
+      assert.equal(div[0][1].className, "foo");
+      div.classed("bar", true);
+      assert.equal(div[0][0].className, "foo bar");
+      assert.equal(div[0][1].className, "foo bar");
+    },
+    "adds a missing class as a function": function(div) {
+      div.data([0, 1]).attr("class", null);
+      div.classed("foo", function(d, i) { return d === 0; });
+      assert.equal(div[0][0].className, "foo");
+      assert.equal(div[0][1].className, "");
+      div.classed("bar", function(d, i) { return i === 1; });
+      assert.equal(div[0][0].className, "foo");
+      assert.equal(div[0][1].className, "bar");
+    },
+    "removes an existing class as false": function(div) {
+      div.attr("class", "bar foo");
+      div.classed("foo", false);
+      assert.equal(div[0][0].className, "bar");
+      assert.equal(div[0][1].className, "bar");
+      div.classed("bar", false);
+      assert.equal(div[0][0].className, "");
+      assert.equal(div[0][1].className, "");
+    },
+    "removes an existing class as a function": function(div) {
+      div.data([0, 1]).attr("class", "bar foo");
+      div.classed("foo", function(d, i) { return d === 0; });
+      assert.equal(div[0][0].className, "bar foo");
+      assert.equal(div[0][1].className, "bar");
+      div.classed("bar", function(d, i) { return i === 1; });
+      assert.equal(div[0][0].className, "foo");
+      assert.equal(div[0][1].className, "bar");
+      div.classed("foo", function() { return false; });
+      assert.equal(div[0][0].className, "");
+      assert.equal(div[0][1].className, "bar");
+      div.classed("bar", function() { return false; });
+      assert.equal(div[0][0].className, "");
+      assert.equal(div[0][1].className, "");
+    },
+    "preserves an existing class as true": function(div) {
+      div.attr("class", "bar foo");
+      div.classed("foo", true);
+      assert.equal(div[0][0].className, "bar foo");
+      assert.equal(div[0][1].className, "bar foo");
+      div.classed("bar", true);
+      assert.equal(div[0][0].className, "bar foo");
+      assert.equal(div[0][1].className, "bar foo");
+    },
+    "preserves an existing class as a function": function(div) {
+      div.attr("class", "bar foo");
+      div.classed("foo", function() { return true; });
+      assert.equal(div[0][0].className, "bar foo");
+      assert.equal(div[0][1].className, "bar foo");
+      div.classed("bar", function() { return true; });
+      assert.equal(div[0][0].className, "bar foo");
+      assert.equal(div[0][1].className, "bar foo");
+    },
+    "preserves a missing class as false": function(div) {
+      div.attr("class", "baz");
+      div.classed("foo", false);
+      assert.equal(div[0][0].className, "baz");
+      assert.equal(div[0][1].className, "baz");
+      div.attr("class", null);
+      div.classed("bar", false);
+      assert.equal(div[0][0].className, "");
+      assert.equal(div[0][1].className, "");
+    },
+    "preserves a missing class as a function": function(div) {
+      div.attr("class", "baz");
+      div.classed("foo", function() { return false; });
+      assert.equal(div[0][0].className, "baz");
+      assert.equal(div[0][1].className, "baz");
+      div.attr("class", null);
+      div.classed("bar", function() { return false; });
+      assert.equal(div[0][0].className, "");
+      assert.equal(div[0][1].className, "");
+    },
+    "gets an existing class": function(div) {
+      div[0][0].className = " foo\tbar  baz";
+      assert.isTrue(div.classed("foo"));
+      assert.isTrue(div.classed("bar"));
+      assert.isTrue(div.classed("baz"));
+    },
+    "does not get a missing class": function(div) {
+      div[0][0].className = " foo\tbar  baz";
+      assert.isFalse(div.classed("foob"));
+      assert.isFalse(div.classed("bare"));
+      assert.isFalse(div.classed("rbaz"));
+    },
+    "ignores null nodes": function(div) {
+      var some = d3.selectAll("div");
+      some[0][1] = null;
+      some.attr("class", null).classed("foo", true);
+      assert.equal(div[0][0].className, "foo");
+      assert.equal(div[0][1].className, "");
+    },
+    "returns the current selection": function(div) {
+      assert.isTrue(div.classed("foo", true) === div);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-data-test.js b/static/demo/components/d3/test/core/selection-data-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..5d3932118e8123113dd14153f75662695af5c6e4
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-data-test.js
@@ -0,0 +1,242 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.data");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "assigns data as an array": function(body) {
+      var data = new Object();
+      body.data([data]);
+      assert.strictEqual(document.body.__data__, data);
+    },
+    "assigns data as a function": function(body) {
+      var data = new Object();
+      body.data(function() { return [data]; });
+      assert.strictEqual(document.body.__data__, data);
+    },
+    "stores data in the DOM": function(body) {
+      var expected = new Object(), actual;
+      document.body.__data__ = expected;
+      body.each(function(d) { actual = d; });
+      assert.strictEqual(actual, expected);
+    },
+    "returns a new selection": function(body) {
+      assert.isFalse(body.data([1]) === body);
+    },
+    "with no arguments, returns an array of data": function(body) {
+      var data = new Object();
+      body.data([data]);
+      assert.deepEqual(body.data(), [data]);
+      assert.strictEqual(body.data()[0], data);
+    },
+    "throws an error if data is null or undefined": function(body) {
+      assert.throws(function() { body.data(null); }, Error);
+      assert.throws(function() { body.data(function() {}); }, Error);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "assigns data as an array": function(div) {
+      var a = new Object(), b = new Object();
+      div.data([a, b]);
+      assert.strictEqual(div[0][0].__data__, a);
+      assert.strictEqual(div[0][1].__data__, b);
+    },
+    "assigns data as a function": function(div) {
+      var a = new Object(), b = new Object();
+      div.data(function() { return [a, b]; });
+      assert.strictEqual(div[0][0].__data__, a);
+      assert.strictEqual(div[0][1].__data__, b);
+    },
+    "stores data in the DOM": function(div) {
+      var a = new Object(), b = new Object(), actual = [];
+      div[0][0].__data__ = a;
+      div[0][1].__data__ = b;
+      div.each(function(d) { actual.push(d); });
+      assert.deepEqual(actual, [a, b]);
+    },
+    "returns a new selection": function(div) {
+      assert.isFalse(div.data([0, 1]) === div);
+    },
+    "throws an error if data is null or undefined": function(div) {
+      assert.throws(function() { div.data(null); }, Error);
+      assert.throws(function() { div.data(function() {}); }, Error);
+    },
+    "with no arguments, returns an array of data": function(div) {
+      var a = new Object(), b = new Object(), actual = [];
+      div[0][0].__data__ = a;
+      div[0][1].__data__ = b;
+      assert.deepEqual(div.data(), [a, b]);
+    },
+    "with no arguments, returned array has undefined for null nodes": function(div) {
+      var b = new Object(), actual = [];
+      div[0][0] = null;
+      div[0][1].__data__ = b;
+      var data = div.data();
+      assert.isUndefined(data[0]);
+      assert.strictEqual(data[1], b);
+      assert.equal(data.length, 2);
+    },
+    "ignores duplicate keys in both data and selection": function() {
+      var div = d3.select("body").html("").selectAll("div")
+          .data(["aa", "ab", "ac", "ba", "bb", "bc"])
+        .enter().append("div")
+          .text(function(d) { return d; });
+
+      var update = div.data(["aa", "ab", "ba", "bb"], function(d) { return d.substring(0, 1); }),
+          enter = update.enter(),
+          exit = update.exit();
+
+      assert.equal(update.length, 1);
+
+      // enter     - [   null,   null,   null,   null]
+      assert.equal(enter[0].length, 4);
+      assert.equal(enter[0][0], null);
+      assert.equal(enter[0][1], null);
+      assert.equal(enter[0][2], null);
+      assert.equal(enter[0][3], null);
+
+      // update    - [ aa (a),   null, ba (b),   null]
+      assert.equal(update[0].length, 4);
+      assert.strictEqual(update[0][0], div[0][0]);
+      assert.equal(update[0][1], null);
+      assert.strictEqual(update[0][2], div[0][3]);
+      assert.equal(update[0][3], null);
+
+      // exit      - [   null, ab (a), ac (a),   null, bb (b), bc (b)]
+      assert.equal(exit[0].length, 6);
+      assert.equal(exit[0][0], null);
+      assert.strictEqual(exit[0][1], div[0][1]);
+      assert.strictEqual(exit[0][2], div[0][2]);
+      assert.equal(exit[0][3], null);
+      assert.strictEqual(exit[0][4], div[0][4]);
+      assert.strictEqual(exit[0][5], div[0][5]);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div).selectAll(span)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div")
+          .data(d3.range(2))
+        .enter().append("div").selectAll("span")
+          .data(d3.range(2))
+        .enter().append("span");
+    },
+    "assigns data as an array": function(span) {
+      var a = new Object(), b = new Object();
+      span.data([a, b]);
+      assert.strictEqual(span[0][0].__data__, a);
+      assert.strictEqual(span[0][1].__data__, b);
+      assert.strictEqual(span[1][0].__data__, a);
+      assert.strictEqual(span[1][1].__data__, b);
+    },
+    "assigns data as a function": function(span) {
+      var a = new Object(), b = new Object(), c = new Object(), d = new Object();
+      span.data(function(z, i) { return i ? [c, d] : [a, b]; });
+      assert.strictEqual(span[0][0].__data__, a);
+      assert.strictEqual(span[0][1].__data__, b);
+      assert.strictEqual(span[1][0].__data__, c);
+      assert.strictEqual(span[1][1].__data__, d);
+    },
+    "evaluates the function once per group": function(span) {
+      var count = 0;
+      span.data(function() { ++count; return [0, 1]; });
+      assert.equal(count, 2);
+    },
+    "defines an update selection for updating data": function(span) {
+      var update = span.data(d3.range(4));
+      assert.equal(update.length, 2);
+      assert.equal(update[0].length, 4);
+      assert.equal(update[1].length, 4);
+      assert.domEqual(update[0][0], span[0][0]);
+      assert.domEqual(update[0][1], span[0][1]);
+      assert.domNull(update[0][2]);
+      assert.domNull(update[0][3]);
+      assert.domEqual(update[1][0], span[1][0]);
+      assert.domEqual(update[1][1], span[1][1]);
+      assert.domNull(update[1][2]);
+      assert.domNull(update[1][3]);
+    },
+    "defines an enter selection for entering data": function(span) {
+      var enter = span.data(d3.range(4)).enter();
+      assert.isFalse(enter.empty());
+      assert.equal(enter.length, 2);
+      assert.equal(enter[0].length, 4);
+      assert.equal(enter[1].length, 4);
+      assert.domNull(enter[0][0]);
+      assert.domNull(enter[0][1]);
+      assert.deepEqual(enter[0][2], {__data__: 2});
+      assert.deepEqual(enter[0][3], {__data__: 3});
+      assert.domNull(enter[1][0]);
+      assert.domNull(enter[1][1]);
+      assert.deepEqual(enter[1][2], {__data__: 2});
+      assert.deepEqual(enter[1][3], {__data__: 3});
+    },
+    "defines an exit selection for exiting data": function(span) {
+      var exit = span.data(d3.range(1)).exit();
+      assert.isFalse(exit.empty());
+      assert.equal(exit.length, 2);
+      assert.equal(exit[0].length, 2);
+      assert.equal(exit[1].length, 2);
+      assert.domNull(exit[0][0]);
+      assert.domEqual(exit[0][1], span[0][1]);
+      assert.domNull(exit[1][0]);
+      assert.domEqual(exit[1][1], span[1][1]);
+    },
+    "observes the specified key function": function(span) {
+      var update = span.data([1, 2], Number);
+      assert.isFalse(update.empty());
+      assert.equal(update.length, 2);
+      assert.equal(update[0].length, 2);
+      assert.equal(update[1].length, 2);
+      assert.domEqual(update[0][0], span[0][1]);
+      assert.domNull(update[0][1]);
+      assert.domEqual(update[1][0], span[1][1]);
+      assert.domNull(update[1][1]);
+
+      var enter = update.enter();
+      assert.equal(enter.length, 2);
+      assert.equal(enter[0].length, 2);
+      assert.equal(enter[1].length, 2);
+      assert.domNull(enter[0][0]);
+      assert.deepEqual(enter[0][1], {__data__: 2});
+      assert.domNull(enter[1][0]);
+      assert.deepEqual(enter[1][1], {__data__: 2});
+
+      var exit = update.exit();
+      assert.equal(exit.length, 2);
+      assert.equal(exit[0].length, 2);
+      assert.equal(exit[1].length, 2);
+      assert.domEqual(exit[0][0], span[0][0]);
+      assert.domNull(exit[0][1]);
+      assert.domEqual(exit[1][0], span[1][0]);
+      assert.domNull(exit[1][1]);
+    },
+    "handles keys that are in the default object's prototype chain": function(span) {
+      // This also applies to the non-standard "watch" and "unwatch" in Mozilla Firefox.
+      var update = span.data(["hasOwnProperty", "isPrototypeOf", "toLocaleString", "toString", "valueOf"], String);
+      assert.domNull(update[0][0]);
+      assert.domNull(update[0][1]);
+      assert.domNull(update[0][2]);
+      assert.domNull(update[0][3]);
+      assert.domNull(update[0][4]);
+      // This throws an error if Object.hasOwnProperty isn't used.
+      span.data([0], function() { return "hasOwnProperty"; });
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-datum-test.js b/static/demo/components/d3/test/core/selection-datum-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..610f112a68897f8eba30ec6714d1cfbbbf492cb0
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-datum-test.js
@@ -0,0 +1,82 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.datum");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "updates the data according to the specified function": function(body) {
+      body.data([42]).datum(function(d, i) { return d + i; });
+      assert.equal(document.body.__data__, 42);
+    },
+    "updates the data to the specified constant": function(body) {
+      body.datum(43);
+      assert.equal(document.body.__data__, 43);
+    },
+    "deletes the data if the function returns null": function(body) {
+      body.data([42]).datum(function() { return null; });
+      assert.isFalse("__data__" in document.body);
+    },
+    "deletes the data if the constant is null": function(body) {
+      body.data([42]).datum(null);
+      assert.isFalse("__data__" in document.body);
+    },
+    "returns the current selection": function(body) {
+      assert.isTrue(body.datum(function() { return 1; }) === body);
+      assert.isTrue(body.datum(2) === body);
+    },
+    "with no arguments, returns the first node's datum": function(body) {
+      body.data([42]);
+      assert.equal(body.datum(), 42);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "updates the data according to the specified function": function(div) {
+      div.data([42, 43]).datum(function(d, i) { return d + i; });
+      assert.equal(div[0][0].__data__, 42);
+      assert.equal(div[0][1].__data__, 44);
+    },
+    "updates the data to the specified constant": function(div) {
+      div.datum(44);
+      assert.equal(div[0][0].__data__, 44);
+      assert.equal(div[0][1].__data__, 44);
+    },
+    "deletes the data if the function returns null": function(div) {
+      div.datum(function() { return null; });
+      assert.isFalse("__data__" in div[0][0]);
+      assert.isFalse("__data__" in div[0][1]);
+    },
+    "deletes the data if the constant is null": function(div) {
+      div.datum(null);
+      assert.isFalse("__data__" in div[0][0]);
+      assert.isFalse("__data__" in div[0][1]);
+    },
+    "returns the current selection": function(div) {
+      assert.isTrue(div.datum(function() { return 1; }) === div);
+      assert.isTrue(div.datum(2) === div);
+    },
+    "ignores null nodes": function(div) {
+      var some = d3.selectAll("div").data([42, 43]);
+      some[0][1] = null;
+      some.datum(function() { return 1; });
+      assert.equal(div[0][0].__data__, 1);
+      assert.equal(div[0][1].__data__, 43);
+      some.datum(2);
+      assert.equal(div[0][0].__data__, 2);
+      assert.equal(div[0][1].__data__, 43);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-each-test.js b/static/demo/components/d3/test/core/selection-each-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d54e679a06c995a70e5a87d506d41f3b3f55825
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-each-test.js
@@ -0,0 +1,82 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.each");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "calls the function once per element": function(body) {
+      var count = 0;
+      body.each(function() { ++count; });
+      assert.equal(count, 1);
+    },
+    "passes the data and index to the function": function(body) {
+      var data = new Object(), dd, ii;
+      body.data([data]).each(function(d, i) { dd = d; ii = i; });
+      assert.isTrue(dd === data);
+      assert.isTrue(ii === 0);
+    },
+    "uses the node as the context": function(body) {
+      var node;
+      body.each(function() { node = this; });
+      assert.isTrue(node === document.body);
+    },
+    "returns the same selection": function(body) {
+      assert.isTrue(body.each(function() {}) === body);
+    },
+    "ignores null nodes": function() {
+      var count = 0, body = d3.select("body");
+      body[0][0] = null;
+      body.each(function() { ++count; });
+      assert.equal(count, 0);
+    },
+    "returns the current selection": function(body) {
+      assert.isTrue(body.each(function() {}) === body);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "calls the function once per element": function(div) {
+      var count = 0;
+      div.each(function() { ++count; });
+      assert.equal(count, 2);
+    },
+    "passes the data and index to the function": function(div) {
+      var data = [new Object(), new Object()], dd = [], ii = [];
+      div.data(data).each(function(d, i) { dd.push(d); ii.push(i); });
+      assert.deepEqual(dd, data);
+      assert.deepEqual(ii, [0, 1]);
+    },
+    "uses the node as the context": function(div) {
+      var nodes = [];
+      div.each(function() { nodes.push(this); });
+      assert.equal(nodes.length, 2);
+      assert.isTrue(div[0][0] == nodes[0]);
+      assert.isTrue(div[0][1] == nodes[1]);
+    },
+    "returns the same selection": function(div) {
+      assert.isTrue(div.each(function() {}) === div);
+    },
+    "ignores null nodes": function(div) {
+      var count = 0, some = d3.selectAll("div");
+      some[0][0] = null;
+      some.each(function() { ++count; });
+      assert.equal(count, 1);
+    },
+    "returns the current selection": function(div) {
+      assert.isTrue(div.each(function() {}) === div);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-empty-test.js b/static/demo/components/d3/test/core/selection-empty-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..57aba37a46c832791c376c45aba5646c197612e9
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-empty-test.js
@@ -0,0 +1,50 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.empty");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "returns true for empty selections": function(body) {
+      assert.isTrue(body.select("foo").empty());
+    },
+    "returns false for non-empty selections": function(body) {
+      assert.isFalse(body.empty());
+    },
+    "ignores null nodes": function(body) {
+      var some = d3.select("body");
+      some[0][0] = null;
+      assert.isTrue(some.empty());
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      var body = d3.select("body").html("");
+      body.append("div").append("span");
+      body.append("div");
+      return body.selectAll("div");
+    },
+    "returns true for empty selections": function(div) {
+      assert.isTrue(div.select("foo").empty());
+    },
+    "returns false for non-empty selections": function(div) {
+      assert.isFalse(div.empty());
+      assert.isFalse(div.select("span").empty());
+    },
+    "ignores null nodes": function(div) {
+      var some = d3.selectAll("div");
+      some[0][0] = null;
+      assert.isTrue(some.select("span").empty());
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-enter-test.js b/static/demo/components/d3/test/core/selection-enter-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..257583501b4723e5b8943f459b8a0a6d230ab9ed
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-enter-test.js
@@ -0,0 +1,25 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.enter");
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter();
+    },
+    "is an instanceof d3.selection.enter": function(enter) {
+      assert.instanceOf(enter, d3.selection.enter);
+    },
+    "selection prototype can be extended": function(enter) {
+      d3.selection.enter.prototype.foo = function() { return this.append("foo"); };
+      var selection = enter.foo();
+      assert.equal(document.body.innerHTML, "<foo></foo><foo></foo>");
+      delete d3.selection.enter.prototype.foo;
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-filter-test.js b/static/demo/components/d3/test/core/selection-filter-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..3291f0508c88a71c6c9cec5e0680ce8dba995577
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-filter-test.js
@@ -0,0 +1,69 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.filter");
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div")
+          .data([0, 1])
+        .enter().append("div")
+        .selectAll("span")
+          .data(function(d) { d <<= 1; return [d, d + 1]; })
+        .enter().append("span");
+    },
+    "preserves matching elements": function(span) {
+      var some = span.filter(function(d, i) { return i === 0; });
+      assert.isTrue(some[0][0] === span[0][0]);
+      assert.isTrue(some[1][0] === span[1][0]);
+    },
+    "removes non-matching elements": function(span) {
+      var some = d3.merge(span.filter(function(d, i) { return d & 1; }));
+      assert.equal(some.indexOf(span[0][0]), -1);
+      assert.equal(some.indexOf(span[1][0]), -1);
+    },
+    "preserves data": function(span) {
+      var some = span.filter(function(d, i) { return d & 1; });
+      assert.equal(some[0][0].__data__, 1);
+      assert.equal(some[1][0].__data__, 3);
+    },
+    "preserves grouping": function(span) {
+      var some = span.filter(function(d, i) { return d & 1; });
+      assert.equal(some.length, 2);
+      assert.equal(some[0].length, 1);
+      assert.equal(some[1].length, 1);
+    },
+    "preserves parent node": function(span) {
+      var some = span.filter(function(d, i) { return d & 1; });
+      assert.isTrue(some[0].parentNode === span[0].parentNode);
+      assert.isTrue(some[1].parentNode === span[1].parentNode);
+    },
+    "does not preserve index": function(span) {
+      var indexes = [];
+      span.filter(function(d, i) { return d & 1; }).each(function(d, i) { indexes.push(i); });
+      assert.deepEqual(indexes, [0, 0]);
+    },
+    "ignores null nodes": function() {
+      var span = d3.selectAll("span");
+      span[0][1] = null;
+      var some = span.filter(function(d, i) { return d & 1; });
+      assert.isTrue(some[0][0] === span[0][3]);
+      assert.equal(some.length, 1);
+    },
+    "can be specified as a selector": function(span) {
+      span.classed("foo", function(d, i) { return d & 1; });
+      var some = span.filter(".foo");
+      assert.equal(some.length, 2);
+      assert.equal(some[0].length, 1);
+      assert.equal(some[1].length, 1);
+    },
+    "returns a new selection": function(span) {
+      assert.isFalse(span.filter(function() { return 1; }) === span);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-html-test.js b/static/demo/components/d3/test/core/selection-html-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..9425273ff696bea231c35544d0819454e154d9a3
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-html-test.js
@@ -0,0 +1,129 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.html");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "sets the inner HTML as a string": function(body) {
+      body.html("<h1>Hello, world!</h1>");
+      assert.equal(document.body.firstChild.tagName, "H1");
+      assert.equal(document.body.firstChild.textContent, "Hello, world!");
+    },
+    "sets the inner HTML as a number": function(body) {
+      body.html(42);
+      assert.equal(document.body.innerHTML, "42");
+      assert.equal(document.body.firstChild.nodeType, document.TEXT_NODE);
+    },
+    "sets the inner HTML as a function": function(body) {
+      body.data(["Subject"]).html(function(d, i) { return "<b>" + d + "</b><i>" + i + "</i>"; });
+      assert.equal(document.body.firstChild.tagName, "B");
+      assert.equal(document.body.firstChild.textContent, "Subject");
+      assert.equal(document.body.lastChild.tagName, "I");
+      assert.equal(document.body.lastChild.textContent, "0");
+    },
+    "clears the inner HTML as null": function(body) {
+      body.html(null);
+      assert.equal(document.body.innerHTML, "");
+      assert.isNull(document.body.firstChild);
+    },
+    "clears the inner HTML as undefined": function(body) {
+      body.html(undefined);
+      assert.equal(document.body.innerHTML, "");
+      assert.isNull(document.body.firstChild);
+    },
+    "clears the inner HTML as the empty string": function(body) {
+      body.html("");
+      assert.equal(document.body.innerHTML, "");
+      assert.isNull(document.body.firstChild);
+    },
+    "clears the inner HTML as a function returning the empty string": function(body) {
+      body.text(function() { return ""; });
+      assert.equal(document.body.innerHTML, "");
+      assert.isNull(document.body.firstChild);
+    },
+    "clears the inner HTML as a function returning null": function(body) {
+      body.text(function() { return null; });
+      assert.equal(document.body.innerHTML, "");
+      assert.isNull(document.body.firstChild);
+    },
+    "clears the inner HTML as a function returning undefined": function(body) {
+      body.text(function() { return undefined; });
+      assert.equal(document.body.innerHTML, "");
+      assert.isNull(document.body.firstChild);
+    },
+    "ignores null nodes": function() {
+      var body = d3.select("body");
+      body[0][0] = null;
+      document.body.innerHTML = "<h1>foo</h1>";
+      body.html("bar");
+      assert.equal(document.body.textContent, "foo");
+    },
+    "returns the current selection": function(body) {
+      assert.isTrue(body.html("foo") === body);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "sets the inner HTML as a string": function(div) {
+      div.html("<h1>Hello, world!</h1>");
+      assert.equal(div[0][0].firstChild.tagName, "H1");
+      assert.equal(div[0][0].firstChild.textContent, "Hello, world!");
+      assert.equal(div[0][1].firstChild.tagName, "H1");
+      assert.equal(div[0][1].firstChild.textContent, "Hello, world!");
+    },
+    "sets the inner HTML as a number": function(div) {
+      div.html(42);
+      assert.equal(div[0][0].innerHTML, "42");
+      assert.equal(div[0][0].firstChild.nodeType, document.TEXT_NODE);
+    },
+    "sets the inner HTML as a function": function(div) {
+      div.data(["foo", "bar"]).html(function(d, i) { return "<b>" + d + "</b><i>" + i + "</i>"; });
+      assert.equal(div[0][0].firstChild.tagName, "B");
+      assert.equal(div[0][0].firstChild.textContent, "foo");
+      assert.equal(div[0][0].lastChild.tagName, "I");
+      assert.equal(div[0][0].lastChild.textContent, "0");
+      assert.equal(div[0][1].firstChild.tagName, "B");
+      assert.equal(div[0][1].firstChild.textContent, "bar");
+      assert.equal(div[0][1].lastChild.tagName, "I");
+      assert.equal(div[0][1].lastChild.textContent, "1");
+    },
+    "clears the inner HTML as null": function(div) {
+      div.html(null);
+      assert.equal(div[0][0].innerHTML, "");
+      assert.isNull(div[0][0].firstChild);
+      assert.equal(div[0][1].innerHTML, "");
+      assert.isNull(div[0][1].firstChild);
+    },
+    "clears the inner HTML as a function": function(div) {
+      div.html(function() { return ""; });
+      assert.equal(div[0][0].innerHTML, "");
+      assert.isNull(div[0][0].firstChild);
+      assert.equal(div[0][1].innerHTML, "");
+      assert.isNull(div[0][1].firstChild);
+    },
+    "ignores null nodes": function(div) {
+      var some = d3.selectAll("div");
+      some[0][0] = null;
+      div[0][0].innerHTML = "<h1>foo</h1>";
+      some.html("bar");
+      assert.equal(div[0][0].textContent, "foo");
+      assert.equal(div[0][1].textContent, "bar");
+    },
+    "returns the current selection": function(div) {
+      assert.isTrue(div.html("foo") === div);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-insert-test.js b/static/demo/components/d3/test/core/selection-insert-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..cf0c27a7d25ceb7e3caa1bf6cc4066ea2e00af1d
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-insert-test.js
@@ -0,0 +1,135 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.insert");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "inserts before the specified selector": function(body) {
+      var span = body.html("").append("span");
+      var div = body.insert("div", "span");
+      assert.equal(div[0][0].tagName, "DIV");
+      assert.isNull(div[0][0].namespaceURI);
+      assert.domEqual(div[0][0], document.body.firstChild);
+      assert.domEqual(div[0][0].nextSibling, span[0][0]);
+    },
+    "appends an HTML element": function(body) {
+      var div = body.insert("div");
+      assert.equal(div[0][0].tagName, "DIV");
+      assert.isNull(div[0][0].namespaceURI);
+      assert.domEqual(div[0][0], document.body.lastChild);
+    },
+    "appends an SVG element": function(body) {
+      var svg = body.insert("svg:svg");
+      assert.equal(svg[0][0].tagName, "SVG");
+      assert.equal(svg[0][0].namespaceURI, "http://www.w3.org/2000/svg");
+      assert.domEqual(svg[0][0].parentNode, document.body);
+      assert.domEqual(svg[0][0], document.body.lastChild);
+    },
+    "propagates data to new element": function(body) {
+      var data = new Object(), div = body.data([data]).insert("div");
+      assert.strictEqual(div[0][0].__data__, data);
+    },
+    "returns a new selection": function(body) {
+      assert.isFalse(body.insert("div") === body);
+    },
+    "inherits namespace from parent node": function(body) {
+      var g = body.insert("svg:svg").insert("g");
+      assert.equal(g[0][0].namespaceURI, "http://www.w3.org/2000/svg");
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().insert("div");
+    },
+    "appends an HTML element": function(div) {
+      var span = div.insert("span");
+      assert.equal(span[0].length, 2);
+      assert.equal(span[0][0].tagName, "SPAN");
+      assert.equal(span[0][1].tagName, "SPAN");
+      assert.isNull(span[0][0].namespaceURI);
+      assert.isNull(span[0][1].namespaceURI);
+      assert.domEqual(span[0][0].parentNode, div[0][0]);
+      assert.domEqual(span[0][1].parentNode, div[0][1]);
+      assert.domEqual(div[0][0].lastChild, span[0][0]);
+      assert.domEqual(div[0][1].lastChild, span[0][1]);
+    },
+    "appends an SVG element": function(div) {
+      var svg = div.insert("svg:svg");
+      assert.equal(svg[0].length, 2);
+      assert.equal(svg[0][0].tagName, "SVG");
+      assert.equal(svg[0][1].tagName, "SVG");
+      assert.equal(svg[0][0].namespaceURI, "http://www.w3.org/2000/svg");
+      assert.equal(svg[0][1].namespaceURI, "http://www.w3.org/2000/svg");
+      assert.domEqual(svg[0][0].parentNode, div[0][0]);
+      assert.domEqual(svg[0][1].parentNode, div[0][1]);
+      assert.domEqual(div[0][0].lastChild, svg[0][0]);
+      assert.domEqual(div[0][1].lastChild, svg[0][1]);
+    },
+    "ignores null nodes": function(div) {
+      div.html("");
+      var some = d3.selectAll("div");
+      some[0][1] = null;
+      var span = some.insert("span");
+      assert.equal(span[0].length, 2);
+      assert.equal(span[0][0].tagName, "SPAN");
+      assert.domNull(span[0][1]);
+      assert.domEqual(span[0][0].parentNode, div[0][0]);
+      assert.domEqual(div[0][0].lastChild, span[0][0]);
+      assert.domNull(div[0][1].lastChild);
+    },
+    "propagates data to new elements": function(div) {
+      var a = new Object(), b = new Object(), span = div.data([a, b]).insert("span");
+      assert.strictEqual(span[0][0].__data__, a);
+      assert.strictEqual(span[0][1].__data__, b);
+    },
+    "returns a new selection": function(div) {
+      assert.isFalse(div.insert("div") === div);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div).data(…).enter()": {
+    topic: function() {
+      return d3.select("body");
+    },
+    "inserts before the specified selector": function(body) {
+      var span = body.html("").append("span");
+      var div = body.selectAll("div").data(d3.range(2)).enter().insert("div", "span");
+      assert.equal(div.length, 1);
+      assert.equal(div[0].length, 2);
+      assert.domEqual(div[0][0], document.body.firstChild);
+      assert.domEqual(div[0][1].previousSibling, div[0][0]);
+      assert.domEqual(div[0][1].nextSibling, span[0][0]);
+    },
+    "propagates data to new elements": function(body) {
+      var a = new Object(), b = new Object(), div = body.html("").selectAll("div").data([a, b]).enter().insert("div");
+      assert.strictEqual(div[0][0].__data__, a);
+      assert.strictEqual(div[0][1].__data__, b);
+    },
+    "ignores null nodes": function(body) {
+      body.html("").insert("div");
+      var div = body.selectAll("div").data(d3.range(3)).enter().insert("div");
+      assert.equal(div.length, 1);
+      assert.equal(div[0].length, 3);
+      assert.domNull(div[0][0]);
+      assert.domEqual(div[0][1].parentNode, document.body);
+      assert.domEqual(div[0][2].parentNode, document.body);
+    },
+    "returns a new selection": function(body) {
+      var enter = body.html("").selectAll("div").data([0, 1]).enter();
+      assert.isFalse(enter.insert("div") === enter);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-node-test.js b/static/demo/components/d3/test/core/selection-node-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..da7ec618a2bbeb90efefdcbf6319857b1f636471
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-node-test.js
@@ -0,0 +1,49 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.node");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "returns null for empty selections": function(body) {
+      assert.isNull(body.select("foo").node());
+    },
+    "returns the first element for non-empty selections": function(body) {
+      assert.isTrue(body.node() === document.body);
+    },
+    "ignores null nodes": function(body) {
+      var some = d3.select("body");
+      some[0][0] = null;
+      assert.isNull(some.node());
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      var body = d3.select("body").html("");
+      body.append("div").append("span");
+      body.append("div");
+      return body.selectAll("div");
+    },
+    "returns null for empty selections": function(div) {
+      assert.isNull(div.select("foo").node());
+    },
+    "returns the first element for non-empty selections": function(div) {
+      assert.isTrue(div.node() === div[0][0]);
+    },
+    "ignores null nodes": function(div) {
+      var some = d3.selectAll("div");
+      some[0][0] = null;
+      assert.isTrue(some.node() === div[0][1]);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-on-test.js b/static/demo/components/d3/test/core/selection-on-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..6c114c6cb0d1f074b3c290d5301d85c5c88e5c10
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-on-test.js
@@ -0,0 +1,114 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.on");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "registers an event listener for the specified type": function(body) {
+      var form = body.append("form"), count = 0;
+      form.on("submit", function() { ++count; }); // jsdom has spotty event support
+      form.append("input").attr("type", "submit").node().click();
+      assert.equal(count, 1);
+    },
+    "replaces an existing event listener for the same type": function(body) {
+      var form = body.append("form"), count = 0, fail = 0;
+      form.on("submit", function() { ++fail; });
+      form.on("submit", function() { ++count; });
+      form.append("input").attr("type", "submit").node().click();
+      assert.equal(count, 1);
+      assert.equal(fail, 0);
+    },
+    "removes an existing event listener": function(body) {
+      var form = body.append("form"), fail = 0;
+      form.on("submit", function() { ++fail; });
+      form.on("submit", null);
+      form.append("input").attr("type", "submit").node().click();
+      assert.equal(fail, 0);
+      assert.isUndefined(form.on("submit"));
+    },
+    /* Regrettably, JSDOM ignores the capture flag, so we can't test this yet…
+    "removing a listener doesn't require the capture flag": function(body) {
+      var form = body.append("form"), fail = 0;
+      form.on("submit", function() { ++fail; }, true);
+      form.on("submit", null);
+      form.append("input").attr("type", "submit").node().click();
+      assert.equal(fail, 0);
+      assert.isUndefined(form.on("submit"));
+    },
+    */
+    "ignores removal of non-matching event listener": function(body) {
+      body.append("form").on("submit", null);
+    },
+    "observes the specified namespace": function(body) {
+      var form = body.append("form"), foo = 0, bar = 0;
+      form.on("submit.foo", function() { ++foo; });
+      form.on({"submit.bar": function() { ++bar; }});
+      form.append("input").attr("type", "submit").node().click();
+      assert.equal(foo, 1);
+      assert.equal(bar, 1);
+    },
+    "can register listeners as a map": function(body) {
+      var form = body.append("form"), count = 0, fail = 0;
+      form.on({submit: function() { ++fail; }});
+      form.on({submit: function() { ++count; }});
+      form.append("input").attr("type", "submit").node().click();
+      assert.equal(count, 1);
+      assert.equal(fail, 0);
+      form.on({submit: null});
+      assert.isUndefined(form.on("submit"));
+    },
+    /* Not really sure how to test this one…
+    "observes the specified capture flag": function(body) {
+    },
+    */
+    "passes the current data and index to the event listener": function(body) {
+      var forms = body.html("").selectAll("form").data(["a", "b"]).enter().append("form"), dd, ii, data = new Object();
+      forms.on("submit", function(d, i) { dd = d; ii = i; });
+      forms.append("input").attr("type", "submit")[0][1].click();
+      assert.equal(dd, "b");
+      assert.equal(ii, 1);
+      forms[0][1].__data__ = data;
+      forms.append("input").attr("type", "submit")[0][1].click();
+      assert.equal(dd, data);
+      assert.equal(ii, 1);
+    },
+    "uses the current element as the context": function(body) {
+      var forms = body.html("").selectAll("form").data(["a", "b"]).enter().append("form"), context;
+      forms.on("submit", function() { context = this; });
+      forms.append("input").attr("type", "submit")[0][1].click();
+      assert.domEqual(context, forms[0][1]);
+    },
+    "sets the current event as d3.event": function(body) {
+      var form = body.append("form"), event;
+      form.on("submit", function() { event = d3.event; });
+      form.append("input").attr("type", "submit").node().click();
+      assert.equal(event.type, "submit");
+      assert.domEqual(event.target, form[0][0]);
+    },
+    "restores the original event after notifying listeners": function(body) {
+      var form = body.append("form"), event = d3.event = new Object();
+      form.on("submit", function() {});
+      form.append("input").attr("type", "submit").node().click();
+      assert.equal(d3.event, event);
+    },
+    "returns the current selection": function(body) {
+      assert.isTrue(body.on("submit", function() {}) === body);
+    },
+    "returns the assigned listener if called with one argument": function(body) {
+      body.on("mouseover", f).on("click.foo", f);
+      function f() {}
+      assert.equal(body.on("mouseover"), f);
+      assert.equal(body.on("click.foo"), f);
+      assert.isUndefined(body.on("click"));
+      assert.isUndefined(body.on("mouseover.foo"));
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-order-test.js b/static/demo/components/d3/test/core/selection-order-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..7ef6ed30383f1c9b196ad3198dffeb40f65adfa8
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-order-test.js
@@ -0,0 +1,31 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.order");
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div")
+          .data([1, 2, 10, 20])
+        .enter().append("div")
+          .attr("id", String);
+    },
+    "orders elements by data": function(div) {
+      div = div.data([1, 10, 20, 2], String).order();
+      assert.domNull(div[0][0].previousSibling);
+      assert.domEqual(div[0][1].previousSibling, div[0][0]);
+      assert.domEqual(div[0][2].previousSibling, div[0][1]);
+      assert.domEqual(div[0][3].previousSibling, div[0][2]);
+      assert.domNull(div[0][3].nextSibling);
+    },
+    "returns the current selection": function(span) {
+      span = d3.select("body"); // https://github.com/tmpvar/jsdom/issues/277
+      assert.isTrue(span.order() === span);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-property-test.js b/static/demo/components/d3/test/core/selection-property-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..9a4eff6df0e134ec372f52e0883d5221b205c6bb
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-property-test.js
@@ -0,0 +1,110 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.property");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "sets a property as a string": function(body) {
+      body.property("bgcolor", "red");
+      assert.equal(document.body.bgcolor, "red");
+    },
+    "sets a property as a number": function(body) {
+      body.property("opacity", 1);
+      assert.equal(document.body.opacity, "1");
+    },
+    "sets a property as a function": function(body) {
+      body.property("bgcolor", function() { return "orange"; });
+      assert.equal(document.body.bgcolor, "orange");
+    },
+    "sets properties as a map of constants": function(body) {
+      body.property({bgcolor: "purple", opacity: .41});
+      assert.equal(document.body.bgcolor, "purple");
+      assert.equal(document.body.opacity, .41);
+    },
+    "sets properties as a map of functions": function(body) {
+      body.data(["cyan"]).property({bgcolor: String, opacity: function(d, i) { return i; }});
+      assert.equal(document.body.bgcolor, "cyan");
+      assert.equal(document.body.opacity, 0);
+    },
+    "gets a property value": function(body) {
+      document.body.bgcolor = "yellow";
+      assert.equal(body.property("bgcolor"), "yellow");
+    },
+    "removes a property as null": function(body) {
+      body.property("bgcolor", "yellow").property("bgcolor", null);
+      assert.isFalse("bgcolor" in document.body);
+    },
+    "removes a property as a function": function(body) {
+      body.property("bgcolor", "yellow").property("bgcolor", function() { return null });
+      assert.isFalse("bgcolor" in document.body);
+    },
+    "removes properties as a map of nulls": function(body) {
+      document.body.bgcolor = "red";
+      body.property({bgcolor: null});
+      assert.isFalse("bgcolor" in document.body);
+    },
+    "removes properties as a map of functions that return null": function(body) {
+      document.body.bgcolor = "red";
+      body.property({bgcolor: function() {}});
+      assert.isFalse("bgcolor" in document.body);
+    },
+    "returns the current selection": function(body) {
+      assert.isTrue(body.property("bgcolor", "yellow") === body);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "sets a property as a string": function(div) {
+      div.property("bgcolor", "red");
+      assert.equal(div[0][0].bgcolor, "red");
+      assert.equal(div[0][1].bgcolor, "red");
+    },
+    "sets a property as a number": function(div) {
+      div.property("opacity", 0.4);
+      assert.equal(div[0][0].opacity, "0.4");
+      assert.equal(div[0][1].opacity, "0.4");
+    },
+    "sets a property as a function": function(div) {
+      div.property("bgcolor", d3.interpolateRgb("brown", "steelblue"));
+      assert.equal(div[0][0].bgcolor, "#a52a2a");
+      assert.equal(div[0][1].bgcolor, "#4682b4");
+    },
+    "gets a property value": function(div) {
+      div[0][0].bgcolor = "purple";
+      assert.equal(div.property("bgcolor"), "purple");
+    },
+    "removes a property as null": function(div) {
+      div.property("bgcolor", "yellow").property("bgcolor", null);
+      assert.isFalse("bgcolor" in div[0][0]);
+      assert.isFalse("bgcolor" in div[0][1]);
+    },
+    "removes a property as a function": function(div) {
+      div.property("bgcolor", "yellow").property("bgcolor", function() { return null });
+      assert.isFalse("bgcolor" in div[0][0]);
+      assert.isFalse("bgcolor" in div[0][1]);
+    },
+    "ignores null nodes": function(div) {
+      var some = d3.selectAll("div");
+      some[0][1] = null;
+      some.property("bgcolor", null).property("bgcolor", "red");
+      assert.equal(div[0][0].bgcolor, "red");
+      assert.isFalse("bgcolor" in div[0][1]);
+    },
+    "returns the current selection": function(div) {
+      assert.isTrue(div.property("bgcolor", "yellow") === div);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-remove-test.js b/static/demo/components/d3/test/core/selection-remove-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d362ebd14e4bcc79a2bc64a3ec6a543e93696aa
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-remove-test.js
@@ -0,0 +1,38 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.remove");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body");
+    },
+    "removes the matching elements": function(body) {
+      var div = body.append("div");
+      div.remove();
+      assert.domNull(div[0][0].parentNode);
+    },
+    "does not remove non-matching elements": function(body) {
+      var div1 = body.append("div"), div2 = body.append("div");
+      div1.remove();
+      assert.domEqual(div2[0][0].parentNode, document.body);
+    },
+    "ignores null nodes": function(body) {
+      var div = body.html("").selectAll("div").data([0, 1]).enter().append("div"),
+          some = d3.selectAll("div");
+      some[0][0] = null;
+      some.remove();
+      assert.domEqual(div[0][0].parentNode, document.body);
+      assert.domNull(div[0][1].parentNode);
+    },
+    "returns the current selection": function(body) {
+      var div = body.append("div");
+      assert.isTrue(div.remove() === div);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-select-test.js b/static/demo/components/d3/test/core/selection-select-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..7b77143217f50f13700d8d421211ea21d7221244
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-select-test.js
@@ -0,0 +1,124 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.select");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      var body = d3.select("body").html("");
+      body.append("div").attr("class", "first");
+      body.append("div").attr("class", "second");
+      return body;
+    },
+    "selects the first matching element": function(body) {
+      var div = body.select("div");
+      assert.isTrue(div[0][0] === document.body.firstChild);
+      assert.equal(div.length, 1);
+      assert.equal(div[0].length, 1);
+      assert.equal(div.attr("class"), "first");
+    },
+    "propagates parent node to the selected elements": function(body) {
+      var div = body.select("div");
+      assert.isNotNull(div[0].parentNode);
+      assert.isTrue(div[0].parentNode === document.documentElement);
+      assert.isTrue(div[0].parentNode === body[0].parentNode);
+    },
+    "propagates data to the selected elements": function(body) {
+      var data = new Object(), div = body.data([data]).select("div");
+      assert.strictEqual(div[0][0].__data__, data);
+    },
+    "does not propagate data if no data was specified": function(body) {
+      delete document.body.__data__;
+      var data = new Object(), div = body.select("div").data([data]);
+      div = body.select("div");
+      assert.strictEqual(div[0][0].__data__, data);
+      assert.isUndefined(document.body.__data__);
+    },
+    "returns null if no match is found": function(body) {
+      var span = body.select("span");
+      assert.equal(span[0][0], null);
+      assert.equal(span.length, 1);
+      assert.equal(span[0].length, 1);
+    },
+    "can select via function": function(body) {
+      body.append("foo");
+      var d = {}, dd = [], ii = [], tt = [],
+          s = body.data([d]).select(function(d, i) { dd.push(d); ii.push(i); tt.push(this); return this.firstChild; });
+      assert.deepEqual(dd, [d], "expected data, got {actual}");
+      assert.deepEqual(ii, [0], "expected index, got {actual}");
+      assert.domEqual(tt[0], document.body, "expected this, got {actual}");
+      assert.domEqual(s[0][0], document.body.firstChild);
+      delete document.body.__data__;
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      var div = d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+      div.append("span").attr("class", "first");
+      div.append("span").attr("class", "second");
+      return div;
+    },
+    "selects the first matching element": function(div) {
+      var span = div.select("span");
+      assert.isTrue(span[0][0].parentNode === div[0][0]);
+      assert.isTrue(span[0][1].parentNode === div[0][1]);
+      assert.equal(span.length, 1);
+      assert.equal(span[0].length, 2);
+      assert.equal(span.attr("class"), "first");
+    },
+    "propagates parent node to the selected elements": function(div) {
+      var span = div.select("span");
+      assert.isNotNull(span[0].parentNode);
+      assert.isTrue(span[0].parentNode === document.body);
+      assert.isTrue(span[0].parentNode === div[0].parentNode);
+    },
+    "propagates data to the selected elements": function(div) {
+      var data = new Object(), span = div.data([data]).select("span");
+      assert.strictEqual(span[0][0].__data__, data);
+    },
+    "does not propagate data if no data was specified": function(div) {
+      delete div[0][0].__data__;
+      delete div[0][1].__data__;
+      var a = new Object(), b = new Object(), span = div.select("span").data([a, b]);
+      span = div.select("span");
+      assert.strictEqual(span[0][0].__data__, a);
+      assert.strictEqual(span[0][1].__data__, b);
+      assert.isUndefined(div[0][0].__data__);
+      assert.isUndefined(div[0][1].__data__);
+    },
+    "returns null if no match is found": function(div) {
+      var div = div.select("div");
+      assert.equal(div[0][0], null);
+      assert.equal(div[0][1], null);
+      assert.equal(div.length, 1);
+      assert.equal(div[0].length, 2);
+    },
+    "ignores null nodes": function(div) {
+      var some = d3.selectAll("div");
+      some[0][1] = null;
+      var span = some.select("span");
+      assert.equal(span.length, 1);
+      assert.equal(span[0].length, 2);
+      assert.isTrue(span[0][0].parentNode === div[0][0]);
+      assert.isNull(span[0][1]);
+    },
+    "can select via function": function(div) {
+      var dd = [], ii = [], tt = [],
+          s = div.data(["a", "b"]).select(function(d, i) { dd.push(d); ii.push(i); tt.push(this); return this.firstChild; });
+      assert.deepEqual(dd, ["a", "b"], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+      assert.domEqual(tt[0], div[0][0], "expected this, got {actual}");
+      assert.domEqual(tt[1], div[0][1], "expected this, got {actual}");
+      assert.domEqual(s[0][0], div[0][0].firstChild);
+      assert.domEqual(s[0][1], div[0][1].firstChild);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-selectAll-test.js b/static/demo/components/d3/test/core/selection-selectAll-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..90129c025ab7edc001c1745662640ed26c7f3b06
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-selectAll-test.js
@@ -0,0 +1,127 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.selectAll");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      var body = d3.select("body").html("");
+      if ("__data__" in body[0][0]) delete body[0][0].__data__;
+      body.append("div").attr("class", "first");
+      body.append("div").attr("class", "second");
+      return body;
+    },
+    "selects all matching elements": function(body) {
+      var div = body.selectAll("div");
+      assert.isTrue(div[0][0] === document.body.firstChild);
+      assert.isTrue(div[0][1] === document.body.lastChild);
+      assert.equal(div.length, 1);
+      assert.equal(div[0].length, 2);
+    },
+    "propagates parent node to the selected elements": function(body) {
+      var div = body.selectAll("div");
+      assert.isNotNull(div[0].parentNode);
+      assert.isTrue(div[0].parentNode === document.body);
+    },
+    "does not propagate data if data was specified": function(body) {
+      var div = body.data([new Object()]).selectAll("div");
+      assert.isUndefined(div[0][0].__data__);
+      assert.isUndefined(div[0][1].__data__);
+    },
+    "does not propagate data if data was not specified": function(body) {
+      var div = body.selectAll("div").data([1, 2]);
+      div = body.data([new Object()]).selectAll("div");
+      assert.equal(div[0][0].__data__, 1);
+      assert.equal(div[0][1].__data__, 2);
+    },
+    "returns empty array if no match is found": function(body) {
+      var span = body.selectAll("span");
+      assert.equal(span.length, 1);
+      assert.equal(span[0].length, 0);
+    },
+    "can select via function": function(body) {
+      var d = {}, dd = [], ii = [], tt = [],
+          s = body.data([d]).selectAll(function(d, i) { dd.push(d); ii.push(i); tt.push(this); return this.childNodes; });
+      assert.deepEqual(dd, [d], "expected data, got {actual}");
+      assert.deepEqual(ii, [0], "expected index, got {actual}");
+      assert.domEqual(tt[0], document.body, "expected this, got {actual}");
+      assert.domEqual(s[0][0], document.body.firstChild);
+      assert.domEqual(s[0][1], document.body.lastChild);
+      delete document.body.__data__;
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      var div = d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+      div.append("span").attr("class", "first");
+      div.append("span").attr("class", "second");
+      return div;
+    },
+    "selects all matching elements": function(div) {
+      var span = div.selectAll("span");
+      assert.equal(span.length, 2);
+      assert.equal(span[0].length, 2);
+      assert.isTrue(span[0][0].parentNode === div[0][0]);
+      assert.isTrue(span[0][1].parentNode === div[0][0]);
+      assert.isTrue(span[1][0].parentNode === div[0][1]);
+      assert.isTrue(span[1][1].parentNode === div[0][1]);
+    },
+    "propagates parent node to the selected elements": function(div) {
+      var span = div.selectAll("span");
+      assert.isNotNull(span[0].parentNode);
+      assert.isTrue(span[0].parentNode === div[0][0]);
+      assert.isTrue(span[1].parentNode === div[0][1]);
+    },
+    "does not propagate data if data was specified": function(div) {
+      var span = div.selectAll("span");
+      delete span[0][0].__data__;
+      delete span[0][1].__data__;
+      span = div.data([new Object(), new Object()]).selectAll("span");
+      assert.isUndefined(span[0][0].__data__);
+      assert.isUndefined(span[0][1].__data__);
+    },
+    "does not propagate data if data was not specified": function(div) {
+      var a = new Object(), b = new Object(), span = div.selectAll("span").data([a, b]);
+      delete div[0][0].__data__;
+      delete div[0][1].__data__;
+      span = div.selectAll("span");
+      assert.equal(span[0][0].__data__, a);
+      assert.equal(span[0][1].__data__, b);
+    },
+    "returns empty array if no match is found": function(div) {
+      var div = div.selectAll("div");
+      assert.equal(div.length, 2);
+      assert.equal(div[0].length, 0);
+      assert.equal(div[1].length, 0);
+    },
+    "ignores null nodes": function(div) {
+      var some = d3.selectAll("div");
+      some[0][1] = null;
+      var span = some.selectAll("span");
+      assert.equal(span.length, 1);
+      assert.equal(span[0].length, 2);
+      assert.isTrue(span[0][0].parentNode === div[0][0]);
+      assert.isTrue(span[0][1].parentNode === div[0][0]);
+    },
+    "can select via function": function(div) {
+      var dd = [], ii = [], tt = [],
+          s = div.data(["a", "b"]).selectAll(function(d, i) { dd.push(d); ii.push(i); tt.push(this); return this.childNodes; });
+      assert.deepEqual(dd, ["a", "b"], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+      assert.domEqual(tt[0], div[0][0], "expected this, got {actual}");
+      assert.domEqual(tt[1], div[0][1], "expected this, got {actual}");
+      assert.domEqual(s[0][0], div[0][0].firstChild);
+      assert.domEqual(s[0][1], div[0][0].lastChild);
+      assert.domEqual(s[1][0], div[0][1].firstChild);
+      assert.domEqual(s[1][1], div[0][1].lastChild);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-sort-test.js b/static/demo/components/d3/test/core/selection-sort-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..eda88a07ed0e537c7bbccc203ca4446ec63dca59
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-sort-test.js
@@ -0,0 +1,79 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.sort");
+
+suite.addBatch({
+  "selectAll(div).selectAll(span)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div")
+          .data([1, 2, 10, 20])
+        .enter().append("div").selectAll("span")
+          .data(function(d) { return [20 + d, 2 + d, 10, 1]; })
+        .enter().append("span");
+    },
+    "sorts elements by natural order": function(span) {
+      span.sort();
+      assert.domNull(span[0][0].previousSibling);
+      assert.domEqual(span[0][1].previousSibling, span[0][0]);
+      assert.domEqual(span[0][2].previousSibling, span[0][1]);
+      assert.domEqual(span[0][3].previousSibling, span[0][2]);
+      assert.domNull(span[0][3].nextSibling);
+    },
+    "sorts each group independently": function(span) {
+      span.sort(d3.descending);
+      assert.deepEqual(span[0].map(data), [21, 10, 3, 1]);
+      assert.deepEqual(span[1].map(data), [22, 10, 4, 1]);
+      assert.deepEqual(span[2].map(data), [30, 12, 10, 1]);
+      assert.deepEqual(span[3].map(data), [40, 22, 10, 1]);
+    },
+    "sorts using the specified comparator": function(span) {
+      span.sort(function(a, b) { return d3.ascending(a+"", b+""); });
+      assert.deepEqual(span[0].map(data), [1, 10, 21, 3]);
+      assert.deepEqual(span[1].map(data), [1, 10, 22, 4]);
+      assert.deepEqual(span[2].map(data), [1, 10, 12, 30]);
+      assert.deepEqual(span[3].map(data), [1, 10, 22, 40]);
+    },
+    "sorts null nodes at the end of the selection": function() {
+      var span = d3.selectAll("div").selectAll("span"), nulls = 0;
+      d3.select(span[0][0]).remove();
+      span[0][0] = null;
+      span.sort(function(a, b) { if ((a === null) || (b === null)) ++nulls; return a - b; });
+      assert.equal(nulls, 0);
+
+      assert.isNull(span[0][3]);
+      assert.domNull(span[0][0].previousSibling);
+      assert.domEqual(span[0][1], span[0][0].nextSibling);
+      assert.domEqual(span[0][0], span[0][1].previousSibling);
+      assert.domEqual(span[0][2], span[0][1].nextSibling);
+      assert.domEqual(span[0][1], span[0][2].previousSibling);
+      assert.domNull(span[0][2].nextSibling);
+      assert.deepEqual(span[0].slice(0, -1).map(data), [3, 10, 21]);
+
+      for (var i = 1; i < 4; ++i) {
+        var d = span[i].parentNode.__data__;
+        assert.domNull(span[i][0].previousSibling);
+        assert.domEqual(span[i][1], span[i][0].nextSibling);
+        assert.domEqual(span[i][0], span[i][1].previousSibling);
+        assert.domEqual(span[i][2], span[i][1].nextSibling);
+        assert.domEqual(span[i][1], span[i][2].previousSibling);
+        assert.domEqual(span[i][3], span[i][2].nextSibling);
+        assert.domEqual(span[i][2], span[i][3].previousSibling);
+        assert.domNull(span[i][3].nextSibling);
+        assert.deepEqual(span[i].map(data), [1, 2 + d, 10, 20 + d].sort(d3.ascending));
+      }
+    },
+    "returns the current selection": function(span) {
+      span = d3.select("body"); // https://github.com/tmpvar/jsdom/issues/277
+      assert.isTrue(span.sort() === span);
+    }
+  }
+});
+
+function data(d) {
+  return d.__data__;
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-style-test.js b/static/demo/components/d3/test/core/selection-style-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..73e206711c27464d77f09c3cdf9391747be2a1e7
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-style-test.js
@@ -0,0 +1,123 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.style");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "sets a property as a string": function(body) {
+      body.style("background-color", "red");
+      assert.equal(document.body.style.getPropertyValue("background-color"), "red");
+    },
+    "sets a property as a number": function(body) {
+      body.style("opacity", .3);
+      assert.equal(document.body.style.getPropertyValue("opacity"), "0.3");
+    },
+    "sets a property as a function": function(body) {
+      body.style("background-color", function() { return "orange"; });
+      assert.equal(document.body.style.getPropertyValue("background-color"), "orange");
+    },
+    "sets properties as a map of constants": function(body) {
+      body.style({"background-color": "white", opacity: .42});
+      assert.equal(document.body.style.getPropertyValue("background-color"), "white");
+      assert.equal(document.body.style.getPropertyValue("opacity"), "0.42");
+    },
+    "sets properties as a map of functions": function(body) {
+      body.data(["orange"]).style({"background-color": String, opacity: function(d, i) { return i; }});
+      assert.equal(document.body.style.getPropertyValue("background-color"), "orange");
+      assert.equal(document.body.style.getPropertyValue("opacity"), "0");
+    },
+    "gets a property value": function(body) {
+      document.body.style.setProperty("background-color", "yellow", "");
+      assert.equal(body.style("background-color"), "yellow");
+    },
+    "observes the specified priority": function(body) {
+      body.style("background-color", "green", "important");
+      assert.equal(document.body.style.getPropertyPriority("background-color"), "important");
+      body.style({opacity: .52}, "important");
+      assert.equal(document.body.style.getPropertyPriority("opacity"), "important");
+      body.style({visibility: function() { return "visible"; }}, "important");
+      assert.equal(document.body.style.getPropertyPriority("visibility"), "important");
+    },
+    "removes a property as null": function(body) {
+      body.style("background-color", "green").style("background-color", null);
+      assert.equal(body.style("background-color"), "");
+    },
+    "removes a property as a function": function(body) {
+      body.style("background-color", "green").style("background-color", function() { return null; });
+      assert.equal(body.style("background-color"), "");
+    },
+    "removes properties as a map of nulls": function(body) {
+      document.body.style.setProperty("background-color", "purple");
+      body.style({"background-color": null});
+      assert.equal(body.style("background-color"), "");
+    },
+    "removes properties as a map of functions that return null": function(body) {
+      document.body.style.setProperty("background-color", "purple");
+      body.style({"background-color": function() {}});
+      assert.equal(body.style("background-color"), "");
+    },
+    "returns the current selection": function(body) {
+      assert.isTrue(body.style("background-color", "green") === body);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "sets a property as a string": function(div) {
+      div.style("background-color", "red");
+      assert.equal(div[0][0].style.getPropertyValue("background-color"), "red");
+      assert.equal(div[0][1].style.getPropertyValue("background-color"), "red");
+    },
+    "sets a property as a number": function(div) {
+      div.style("opacity", .5);
+      assert.equal(div[0][0].style.getPropertyValue("opacity"), "0.5");
+      assert.equal(div[0][1].style.getPropertyValue("opacity"), "0.5");
+    },
+    "sets a property as a function": function(div) {
+      div.style("background-color", d3.interpolateRgb("orange", "yellow"));
+      assert.equal(div[0][0].style.getPropertyValue("background-color"), "#ffa500");
+      assert.equal(div[0][1].style.getPropertyValue("background-color"), "#ffff00");
+    },
+    "gets a property value": function(div) {
+      div[0][0].style.setProperty("background-color", "green", "");
+      assert.equal(div.style("background-color"), "green");
+    },
+    "observes the specified priority": function(div) {
+      div.style("background-color", "blue", "important");
+      assert.equal(div[0][0].style.getPropertyPriority("background-color"), "important");
+      assert.equal(div[0][1].style.getPropertyPriority("background-color"), "important");
+    },
+    "removes a property as null": function(div) {
+      div.style("background-color", "red").style("background-color", null);
+      assert.equal(div[0][0].style.getPropertyValue("background-color"), "");
+      assert.equal(div[0][1].style.getPropertyValue("background-color"), "");
+    },
+    "removes a property as a function": function(div) {
+      div.style("background-color", "red").style("background-color", function() { return null; });
+      assert.equal(div[0][0].style.getPropertyValue("background-color"), "");
+      assert.equal(div[0][1].style.getPropertyValue("background-color"), "");
+    },
+    "ignores null nodes": function(div) {
+      var some = d3.selectAll("div");
+      some[0][1] = null;
+      some.style("background-color", null).style("background-color", "red");
+      assert.equal(div[0][0].style.getPropertyValue("background-color"), "red");
+      assert.equal(div[0][1].style.getPropertyValue("background-color"), "");
+    },
+    "returns the current selection": function(div) {
+      assert.isTrue(div.style("background-color", "green") === div);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-test.js b/static/demo/components/d3/test/core/selection-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..5a747e488f0c0b74ab6d36bfe6a530a7dddc9d71
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-test.js
@@ -0,0 +1,34 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.selection");
+
+suite.addBatch({
+  "selection": {
+    topic: function() {
+      return d3.selection();
+    },
+    "selects the document": function(selection) {
+      assert.equal(selection.length, 1);
+      assert.equal(selection[0].length, 1);
+      assert.equal(selection[0][0], document);
+    },
+    "is an instanceof d3.selection": function(selection) {
+      assert.instanceOf(selection, d3.selection);
+    },
+    "subselections are also instanceof d3.selection": function(selection) {
+      assert.instanceOf(selection.select("body"), d3.selection);
+      assert.instanceOf(selection.selectAll("body"), d3.selection);
+    },
+    "selection prototype can be extended": function(selection) {
+      d3.selection.prototype.foo = function(v) { return this.attr("foo", v); };
+      selection.select("body").foo(42);
+      assert.equal(document.body.getAttribute("foo"), "42");
+      delete d3.selection.prototype.foo;
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/selection-text-test.js b/static/demo/components/d3/test/core/selection-text-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..687924aefb69521a3147957d636848338764e50e
--- /dev/null
+++ b/static/demo/components/d3/test/core/selection-text-test.js
@@ -0,0 +1,113 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("selection.text");
+
+suite.addBatch({
+  "select(body)": {
+    topic: function() {
+      return d3.select("body").html("");
+    },
+    "sets the text content as a string": function(body) {
+      body.text("Hello, world!");
+      assert.equal(document.body.textContent, "Hello, world!");
+    },
+    "sets the text content as a number": function(body) {
+      body.text(42);
+      assert.equal(document.body.textContent, "42");
+    },
+    "sets the text content as a function": function(body) {
+      body.data(["Subject"]).text(function(d, i) { return "Hello, " + d + " " + i + "!"; });
+      assert.equal(document.body.textContent, "Hello, Subject 0!");
+    },
+    "escapes html content to text": function(body) {
+      body.text("<h1>Hello, world!</h1>");
+      assert.equal(document.body.textContent, "<h1>Hello, world!</h1>");
+      assert.equal(document.body.firstChild.nodeType, document.TEXT_NODE);
+    },
+    "clears the text content as null": function(body) {
+      body.text(null);
+      assert.equal(document.body.textContent, "");
+    },
+    "clears the text content as undefined": function(body) {
+      body.text(undefined);
+      assert.equal(document.body.textContent, "");
+    },
+    "clears the text content as a function returning null": function(body) {
+      body.text(function() { return null; });
+      assert.equal(document.body.textContent, "");
+    },
+    "clears the text content as a function returning undefined": function(body) {
+      body.text(function() { return undefined; });
+      assert.equal(document.body.textContent, "");
+    },
+    "ignores null nodes": function() {
+      var body = d3.select("body");
+      body[0][0] = null;
+      document.body.textContent = "foo";
+      body.text("bar");
+      assert.equal(document.body.textContent, "foo");
+    },
+    "returns the current selection": function(body) {
+      assert.isTrue(body.text("hello") === body);
+    }
+  }
+});
+
+suite.addBatch({
+  "selectAll(div)": {
+    topic: function() {
+      return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
+    },
+    "sets the text content as a string": function(div) {
+      div.text("Hello, world!");
+      assert.equal(div[0][0].textContent, "Hello, world!");
+      assert.equal(div[0][1].textContent, "Hello, world!");
+    },
+    "sets the text content as a number": function(div) {
+      div.text(42);
+      assert.equal(div[0][0].textContent, "42");
+      assert.equal(div[0][1].textContent, "42");
+    },
+    "sets the text content as a function": function(div) {
+      div.data(["foo", "bar"]).text(function(d, i) { return "Hello, " + d + " " + i + "!"; });
+      assert.equal(div[0][0].textContent, "Hello, foo 0!");
+      assert.equal(div[0][1].textContent, "Hello, bar 1!");
+    },
+    "escapes html content to text": function(div) {
+      div.text("<h1>Hello, world!</h1>");
+      assert.equal(div[0][0].textContent, "<h1>Hello, world!</h1>");
+      assert.equal(div[0][1].textContent, "<h1>Hello, world!</h1>");
+      assert.equal(div[0][0].firstChild.nodeType, document.TEXT_NODE);
+      assert.equal(div[0][1].firstChild.nodeType, document.TEXT_NODE);
+    },
+    /*
+    https://github.com/tmpvar/jsdom/issues/276
+    "clears the text content as null": function(div) {
+      div.text(null);
+      assert.equal(div[0][0].textContent, "");
+      assert.equal(div[0][1].textContent, "");
+    },
+    "clears the text content as a function": function(div) {
+      div.text(function() { return null; });
+      assert.equal(dv[0][0].textContent, "");
+      assert.equal(dv[0][1].textContent, "");
+    },
+    */
+    "ignores null nodes": function(div) {
+      div[0][0].textContent = "foo";
+      var some = d3.selectAll("div");
+      some[0][0] = null;
+      some.text("bar");
+      assert.equal(div[0][0].textContent, "foo");
+      assert.equal(div[0][1].textContent, "bar");
+    },
+    "returns the current selection": function(div) {
+      assert.isTrue(div.text("hello") === div);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/sum-test.js b/static/demo/components/d3/test/core/sum-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d358bced7994304ea03793279ba4c1470b6e3fb
--- /dev/null
+++ b/static/demo/components/d3/test/core/sum-test.js
@@ -0,0 +1,46 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.sum");
+
+suite.addBatch({
+  "sum": {
+    topic: function() {
+      return d3.sum;
+    },
+    "sums numbers": function(sum) {
+      assert.equal(d3.sum([1]), 1);
+      assert.equal(d3.sum([5, 1, 2, 3, 4]), 15);
+      assert.equal(d3.sum([20, 3]), 23);
+      assert.equal(d3.sum([3, 20]), 23);
+    },
+    "sums types that can be coerced to numbers": function(sum) {
+      assert.equal(d3.sum(["20", "3"]), 23);
+      assert.equal(d3.sum(["3", "20"]), 23);
+      assert.equal(d3.sum(["3", 20]), 23);
+      assert.equal(d3.sum([20, "3"]), 23);
+      assert.equal(d3.sum([3, "20"]), 23);
+      assert.equal(d3.sum(["20", 3]), 23);
+    },
+    "ignores non-numeric types": function(sum) {
+      assert.equal(d3.sum(["a", "b", "c"]), 0);
+      assert.equal(d3.sum(["a", 1, "2"]), 3);
+    },
+    "ignores null, undefined and NaN": function(sum) {
+      assert.equal(d3.sum([NaN, 1, 2, 3, 4, 5]), 15);
+      assert.equal(d3.sum([1, 2, 3, 4, 5, NaN]), 15);
+      assert.equal(d3.sum([10, null, 3, undefined, 5, NaN]), 18);
+    },
+    "applies the optional acccessor function": function(sum) {
+      assert.equal(d3.sum([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10]], function(d) { return d3.sum(d); }), 45);
+      assert.equal(d3.sum([1, 2, 3, 4, 5], function(d, i) { return i; }), 10);
+    },
+    "returns zero for the empty array": function(sum) {
+      assert.equal(d3.sum([]), 0);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/text-test.js b/static/demo/components/d3/test/core/text-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..b4323203944a5ef71b456f56f3122390ab0bc99b
--- /dev/null
+++ b/static/demo/components/d3/test/core/text-test.js
@@ -0,0 +1,47 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.text");
+
+suite.addBatch({
+  "text": {
+    topic: function() {
+      var cb = this.callback;
+      d3.text("test/data/sample.txt", function(error, text) {
+        cb(null, text);
+      });
+    },
+    "invokes the callback with the loaded text": function(text) {
+      assert.equal(text, "Hello, world!\n");
+    },
+    "does not override the mime type by default": function(text) {
+      assert.isUndefined(XMLHttpRequest._last._info.mimeType);
+    },
+    "": {
+      topic: function() {
+        var cb = this.callback;
+        d3.text("test/data/sample.txt", "text/plain+sample", function(error, text) {
+          cb(null, text);
+        });
+      },
+      "observes the optional mime type": function(text) {
+        assert.equal(XMLHttpRequest._last._info.mimeType, "text/plain+sample");
+      }
+    },
+    " ": {
+      topic: function() {
+        var cb = this.callback;
+        d3.text("//does/not/exist.txt", function(error, text) {
+          cb(null, text);
+        });
+      },
+      "invokes the callback with undefined when an error occurs": function(text) {
+        assert.isUndefined(text);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/timer-test.js b/static/demo/components/d3/test/core/timer-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..f191a9756f84721fd86a1c3978965cd22692f423
--- /dev/null
+++ b/static/demo/components/d3/test/core/timer-test.js
@@ -0,0 +1,61 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.timer");
+
+suite.addBatch({
+  "timer": {
+    topic: function() {
+      return d3.timer;
+    },
+    "with no delay": {
+      topic: timer(),
+      "first calls after 17 ms or less": function(info) {
+        assert.inDelta(info.start - info.scheduled, 17, 20);
+      },
+      "calls until the function returns true": function(info) {
+        assert.equal(info.count, 4);
+      },
+      "calls every 17 ms": function(info) {
+        assert.inDelta(info.stop - info.start, 17 * 3, 20);
+      }
+    },
+    "with a specified delay": {
+      topic: timer(250),
+      "first calls after the delay": function(info) {
+        assert.inDelta(info.start - info.scheduled, 250, 20);
+      },
+      "calls until the function returns true": function(info) {
+        assert.equal(info.count, 4);
+      },
+      "calls every 17 ms": function(info) {
+        assert.inDelta(info.stop - info.start, 17 * 3, 20);
+      }
+    }
+  }
+});
+
+function timer(delay) {
+  var args = Array.prototype.slice.call(arguments);
+  return function() {
+    var cb = this.callback,
+        info = {scheduled: Date.now(), count: 0};
+
+    args.unshift(function() {
+      var count = ++info.count;
+      if (count === 1) {
+        info.start = Date.now();
+      } else if (count === 4) {
+        info.stop = Date.now();
+        cb(null, info);
+        return true;
+      }
+    });
+
+    d3.timer.apply(this, args);
+  };
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/touch-test.html b/static/demo/components/d3/test/core/touch-test.html
new file mode 100644
index 0000000000000000000000000000000000000000..94f14518b08685c6a2bcda9030f12ab669fab135
--- /dev/null
+++ b/static/demo/components/d3/test/core/touch-test.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name="viewport" content="initial-scale=1,maximum-scale=1"/>
+<style>
+
+html, body {
+  height: 100%;
+}
+
+body {
+  margin: 0;
+}
+
+svg {
+  display: block;
+  overflow: hidden;
+  width: 100%;
+  height: 100%;
+}
+
+</style>
+<body>
+<script src="../../d3.js"></script>
+<script>
+
+var color = d3.scale.category10();
+
+var svg = d3.select("body").append("svg");
+
+d3.select("body")
+    .on("touchstart", touch)
+    .on("touchmove", touch)
+    .on("touchend", touch);
+
+function touch() {
+  d3.event.preventDefault();
+
+  var circle = svg.selectAll("circle.touch")
+      .data(d3.touches(svg.node()), function(d) { return d.identifier; })
+      .attr("cx", function(d) { return d[0]; })
+      .attr("cy", function(d) { return d[1]; });
+
+  circle.enter().append("circle")
+      .attr("class", "touch")
+      .attr("cx", function(d) { return d[0]; })
+      .attr("cy", function(d) { return d[1]; })
+      .style("fill", function(d) { return color(d.identifier); })
+      .attr("r", 1e-6)
+    .transition()
+      .duration(500)
+      .ease("elastic")
+      .attr("r", 48);
+
+  circle.exit()
+      .attr("class", null)
+    .transition()
+      .attr("r", 1e-6)
+      .remove();
+}
+
+</script>
diff --git a/static/demo/components/d3/test/core/transform-null-matrix-test.html b/static/demo/components/d3/test/core/transform-null-matrix-test.html
new file mode 100644
index 0000000000000000000000000000000000000000..7a5eec3c258a23a61783ff7d6ea530b6c76dd893
--- /dev/null
+++ b/static/demo/components/d3/test/core/transform-null-matrix-test.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<body>
+<script src="../../d3.js"></script>
+<script>
+
+var svg = d3.select("body").append("svg")
+    .attr("width", 960)
+    .attr("height", 500);
+
+var g = svg.append("g")
+    .attr("transform", "translate(100,100)")
+  .append("g")
+    .attr("transform", "matrix(1 0 0 1 0 0)rotate(0)");
+
+var rect = g.append("rect")
+    .attr("x", -25)
+    .attr("y", -50)
+    .attr("width", 50)
+    .attr("height", 100);
+
+g.transition()
+    .duration(3000)
+    .attrTween("transform", d3.tween("matrix(1 0 0 1 100 100)rotate(360)", d3.interpolateString));
+
+</script>
diff --git a/static/demo/components/d3/test/core/transform-null-test.html b/static/demo/components/d3/test/core/transform-null-test.html
new file mode 100644
index 0000000000000000000000000000000000000000..621168039791d72774e98384a0631af18bdf62dc
--- /dev/null
+++ b/static/demo/components/d3/test/core/transform-null-test.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<body>
+<script src="../../d3.js"></script>
+<script>
+
+var svg = d3.select("body").append("svg")
+    .attr("width", 960)
+    .attr("height", 500);
+
+var g = svg.append("g")
+    .attr("transform", "translate(100,100)")
+  .append("g")
+    .attr("transform", "translate(0,0)rotate(0)");
+
+var rect = g.append("rect")
+    .attr("x", -25)
+    .attr("y", -50)
+    .attr("width", 50)
+    .attr("height", 100);
+
+g.transition()
+    .duration(3000)
+    .attrTween("transform", d3.tween("translate(100,100)rotate(360)", d3.interpolateString));
+
+</script>
diff --git a/static/demo/components/d3/test/core/transform-rotate-origin-test.html b/static/demo/components/d3/test/core/transform-rotate-origin-test.html
new file mode 100644
index 0000000000000000000000000000000000000000..5a006f5cc85163cf7157bec11b5e9258f536e808
--- /dev/null
+++ b/static/demo/components/d3/test/core/transform-rotate-origin-test.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<body>
+<script src="../../d3.js"></script>
+<script>
+
+var width = 960,
+    height = 500;
+
+var cross = d3.svg.symbol()
+    .type("cross")
+    .size(10000);
+
+var svg = d3.select("body").append("svg")
+    .attr("width", width)
+    .attr("height", height)
+  .append("g")
+    .attr("transform", "translate(" + (width / 2) + "," + (height / 2) + ")");
+
+svg.append("path")
+    .style("fill", "steelblue")
+    .attr("d", cross);
+
+svg.append("path")
+    .style("fill", "darkgreen")
+    .attr("d", cross)
+    .attr("transform", "rotate(45 200,200)");
+
+svg.append("path")
+    .style("fill", "white")
+    .style("fill-opacity", .2)
+    .style("stroke", "steelblue")
+    .style("stroke-width", "4px")
+    .attr("d", cross)
+  .transition()
+    .duration(1000)
+    .style("stroke", "darkgreen")
+    .attr("transform", "rotate(45 200,200)");
+
+</script>
diff --git a/static/demo/components/d3/test/core/transform-rotate-test.html b/static/demo/components/d3/test/core/transform-rotate-test.html
new file mode 100644
index 0000000000000000000000000000000000000000..49fb5715a7824f99a4de13745f20f0a802aded5f
--- /dev/null
+++ b/static/demo/components/d3/test/core/transform-rotate-test.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+
+table {
+  width: 960px;
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+
+th, td {
+  padding: 4px;
+}
+
+th {
+  text-align: left;
+}
+
+td {
+  border: solid 1px #ccc;
+  text-align: right;
+}
+
+td.fail {
+  background: lightcoral;
+}
+
+td.success {
+  background: lightgreen;
+}
+
+</style>
+<table>
+  <thead>
+    <th>start</th>
+    <th>end</th>
+    <th colspan=5>actual intermediate values</th>
+    <th>exp.</th>
+    <th>act.</th>
+  </thead>
+  <tbody>
+  </tbody>
+</table>
+<script src="../../d3.js"></script>
+<script>
+
+var format = d3.format(",.2f");
+
+var tests = [
+  {start:  170, end:  225, expected: [ 170.00, -176.25, -162.50, -148.75, -135.00]},
+  {start:  225, end:  170, expected: [-135.00, -148.75, -162.50, -176.25,  170.00]},
+  {start: -170, end: -225, expected: [-170.00,  176.25,  162.50,  148.75,  135.00]},
+  {start: -225, end: -170, expected: [ 135.00,  148.75,  162.50,  176.25, -170.00]},
+  {start: -170, end:  170, expected: [-170.00, -175.00,  180.00,  175.00,  170.00]},
+  {start: -170, end:    0, expected: [-170.00, -127.50,  -85.00,  -42.50,    0.00]},
+  {start:  170, end:    0, expected: [ 170.00,  127.50,   85.00,   42.50,    0.00]},
+  {start: -180, end:   90, expected: [ 180.00,  157.50,  135.00,  112.50,   90.00]},
+  {start:  180, end:   90, expected: [ 180.00,  157.50,  135.00,  112.50,   90.00]},
+  {start: -180, end:  -90, expected: [-180.00, -157.50, -135.00, -112.50,  -90.00]},
+  {start:  180, end:  -90, expected: [ 180.00, -157.50, -135.00, -112.50,  -90.00]},
+  {start:  780, end:  -90, expected: [  60.00,  22.50,  -15.00,   -52.50,  -90.00]}
+];
+
+var tr = d3.select("tbody").selectAll("tr")
+    .data(tests)
+  .enter().append("tr");
+
+tr.append("td")
+    .text(function(d) { return format(d.start); });
+
+tr.append("td")
+    .text(function(d) { return format(d.end); });
+
+tr.selectAll(".actual")
+    .data(function(d) {
+      var interpolate = d3.interpolateTransform("rotate(" + d.start + ")", "rotate(" + d.end + ")");
+      return d.expected.map(function(expected, i) {
+        return {
+          expected: expected,
+          actual: d3.transform(interpolate(i / 4)).rotate
+        };
+      });
+    })
+  .enter().append("td")
+    .text(function(d, i) { return format(d.actual); })
+    .attr("class", function(d) { return Math.abs(d.actual - d.expected) < .01 ? "success" : "fail"; });
+
+var ga = tr.append("td").attr("width", 40).append("svg")
+    .attr("width", 40)
+    .attr("height", 20)
+  .append("g")
+    .attr("transform", "translate(20,10)")
+  .append("g")
+    .each(animateExpected);
+
+ga.append("path")
+    .attr("d", d3.svg.symbol().type("cross").size(120));
+
+ga.append("circle")
+    .attr("cx", 8)
+    .attr("r", 4);
+
+var gb = tr.append("td").attr("width", 40).append("svg")
+    .attr("width", 40)
+    .attr("height", 20)
+  .append("g")
+    .attr("transform", "translate(20,10)")
+  .append("g")
+    .each(animateActual);
+
+gb.append("path")
+    .attr("d", d3.svg.symbol().type("cross").size(120));
+
+gb.append("circle")
+    .attr("cx", 8)
+    .attr("r", 4);
+
+function animateExpected(d) {
+  d3.select(this).transition()
+      .duration(2500)
+      .attrTween("transform", function(d) {
+        var a = d.start % 360, b = d.end % 360;
+        if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
+        return d3.interpolateString("rotate(" + a + ")", "rotate(" + b + ")");
+      })
+      .each("end", animateExpected);
+}
+
+function animateActual(d) {
+  d3.select(this)
+      .attr("transform", "rotate(" + d.start + ")")
+    .transition()
+      .duration(2500)
+      .attr("transform", "rotate(" + d.end + ")")
+      .each("end", animateActual);
+}
+
+</script>
diff --git a/static/demo/components/d3/test/core/transform-test.html b/static/demo/components/d3/test/core/transform-test.html
new file mode 100644
index 0000000000000000000000000000000000000000..7e313d7876af67bc39633f2e6c6ce5de33eae0b5
--- /dev/null
+++ b/static/demo/components/d3/test/core/transform-test.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Transform Test</title>
+<style>
+
+th,
+td {
+  border: solid #ccc 1px;
+}
+
+</style>
+<body>
+<script src="../../d3.js"></script>
+<script>
+
+var outcome = d3.select("body").append("p");
+
+var g = d3.select("body").append("svg")
+    .attr("width", 10)
+    .attr("height", 10)
+  .append("g");
+
+var results = d3.select("body").append("table")
+    .style("display", "none");
+
+results.append("tr").selectAll("th")
+    .data(["Expected", "Actual", "Expected matrix", "Actual matrix"])
+  .enter().append("th")
+    .text(function(d) { return d; });
+
+var el = g[0][0],
+    v,
+    m,
+    a,
+    b,
+    failures = 0;
+
+for (var tx = -10; tx <= 10; tx += 5) {
+  for (var ty = -10; ty <= 10; ty += 5) {
+    for (var r = -180; r <= 180; r += 15) {
+      for (var skx = -45; skx <= 45; skx += 45) {
+        for (var sx = -2; sx <= 2; sx++) {
+          for (var sy = -2; sy <= 2; sy++) {
+            v = "translate(" + tx + "," + ty + ")rotate(" + r + ")skewX(" + skx + ")scale(" + sx + "," + sy + ")";
+            g.attr("transform", v);
+            a = matrix(el);
+            g.attr("transform", d3.transform(v));
+            b = matrix(el);
+            if (!deepEqual(a, b, 1e-6)) {
+              failures++;
+              results
+                  .style("display", null)
+                .append("tr").selectAll("td")
+                  .data([v, d3.transform(v), a, b])
+                .enter().append("td")
+                  .text(function(d) { return d; });
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+outcome.text(failures ? failures + " failures" : "Success!");
+
+function matrix(el) {
+  var t = el.transform.baseVal.consolidate();
+  if (t) {
+    var m = t.matrix;
+    return [m.a, m.b, m.c, m.d, m.e, m.f];
+  }
+  return null;
+}
+
+function deepEqual(actual, expected, epsilon) {
+  epsilon = epsilon || 0;
+  if (actual === expected) return true;
+  if (actual == null || expected == null) return false;
+  if (actual.length !== expected.length) return false;
+
+  for (var i = 0; i < actual.length; i++) {
+    if (Math.abs(actual[i] - expected[i]) > epsilon) return false;
+  }
+  return true;
+}
+
+</script>
diff --git a/static/demo/components/d3/test/core/transition-test-attr.js b/static/demo/components/d3/test/core/transition-test-attr.js
new file mode 100644
index 0000000000000000000000000000000000000000..1738b3e538dfb97aa26d4ad60aa66c097b4f4790
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-attr.js
@@ -0,0 +1,58 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    var s = d3.select("body").append("div")
+        .attr("display", "none")
+        .attr("font-size", "20px")
+        .attr("width", 20)
+        .attr("color", "red")
+        .attr("xlink:type", "simple")
+        .attr("xlink:href", "http://mbostock.github.com/d3/");
+
+    var t = s.transition()
+        .attr("display", null)
+        .attr("font-size", function() { return null; })
+        .attr("display", null)
+        .attr("width", 100)
+        .attr("width", 200)
+        .attr("color", function() { return "green"; })
+        .attr("xlink:href", null)
+        .attr("xlink:type", function() { return null; });
+
+    return {selection: s, transition: t};
+  },
+  "defines the corresponding attr tween": function(result) {
+    assert.typeOf(result.transition.tween("attr.width"), "function");
+    assert.typeOf(result.transition.tween("attr.color"), "function");
+  },
+  "on end": {
+    topic: function(result) {
+      var cb = this.callback;
+      result.transition.each("end", function() { cb(null, result); });
+    },
+    "the last attr operator takes precedence": function(result) {
+      assert.equal(result.selection.attr("width"), "200");
+    },
+    "sets an attribute as a number": function(result) {
+      assert.equal(result.selection.attr("width"), "200");
+    },
+    "sets an attribute as a function": function(result) {
+      assert.equal(result.selection.attr("color"), "#008000");
+    },
+    "removes an attribute using a constant null": function(result) {
+      assert.equal(result.selection.attr("display"), "");
+    },
+    "removes an attribute using a function null": function(result) {
+      assert.equal(result.selection.attr("font-size"), "");
+    },
+    "removes a namespaced attribute using a constant null": function(result) {
+      assert.equal(result.selection.attr("xlink:href"), "");
+    },
+    "removes a namespaced attribute using a function null": function(result) {
+      assert.equal(result.selection.attr("xlink:type"), "");
+    }
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-attrTween.js b/static/demo/components/d3/test/core/transition-test-attrTween.js
new file mode 100644
index 0000000000000000000000000000000000000000..617c6013dc5d14e2e560fb29cc797133f1820da9
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-attrTween.js
@@ -0,0 +1,66 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    var cb = this.callback,
+        dd = [],
+        ii = [],
+        tt = [],
+        vv = [];
+
+    var s = d3.select("body").html("").append("div").selectAll("div")
+        .data(["red", "green"])
+      .enter().append("div")
+        .attr("color", function(d) { return d3.rgb(d)+""; });
+
+    var t = s.transition()
+        .attrTween("color", tween);
+
+    function tween(d, i, v) {
+      dd.push(d);
+      ii.push(i);
+      vv.push(v);
+      if (tt.push(this) >= 2) cb(null, {
+        selection: s,
+        transition: t,
+        data: dd,
+        index: ii,
+        value: vv,
+        context: tt
+      });
+      return i && d3.interpolateHsl(v, "blue");
+    }
+  },
+
+  // The order here is a bit brittle: because the transition has zero delay,
+  // it's invoking the start event immediately for all nodes, rather than
+  // pushing each node onto the timer queue (which would reverse the order of
+  // callbacks). The order in which tweens are invoked is undefined, so perhaps
+  // we should sort the expected and actual values before comparing.
+
+  "defines the corresponding attr tween": function(result) {
+    assert.typeOf(result.transition.tween("attr.color"), "function");
+  },
+  "invokes the tween function": function(result) {
+    assert.deepEqual(result.data, ["green", "red"], "expected data, got {actual}");
+    assert.deepEqual(result.index, [1, 0], "expected data, got {actual}");
+    assert.deepEqual(result.value, ["#008000", "#ff0000"], "expected value, got {actual}");
+    assert.domEqual(result.context[0], result.selection[0][1], "expected this, got {actual}");
+    assert.domEqual(result.context[1], result.selection[0][0], "expected this, got {actual}");
+  },
+
+  "end": {
+    topic: function(result) {
+      var cb = this.callback;
+      result.transition.each("end", function(d, i) { if (i >= 1) cb(null, result); });
+    },
+    "uses the returned interpolator": function(result) {
+      assert.equal(result.selection[0][1].getAttribute("color"), "#0000ff");
+    },
+    "does nothing if the interpolator is falsey": function(result) {
+      assert.equal(result.selection[0][0].getAttribute("color"), "#ff0000");
+    }
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-call.js b/static/demo/components/d3/test/core/transition-test-call.js
new file mode 100644
index 0000000000000000000000000000000000000000..3bc8d41629716a583ac236cd380fec8c7e9023a7
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-call.js
@@ -0,0 +1,32 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    return d3.select("body").append("div").transition();
+  },
+  "calls the function once": function(transition) {
+    var count = 0;
+    transition.call(function() { ++count; });
+    assert.equal(count, 1);
+  },
+  "passes any optional arguments": function(transition) {
+    var abc;
+    transition.call(function(selection, a, b, c) { abc = [a, b, c]; }, "a", "b", "c");
+    assert.deepEqual(abc, ["a", "b", "c"]);
+  },
+  "passes the transition as the first argument": function(transition) {
+    var t;
+    transition.call(function(x) { t = x; });
+    assert.isTrue(t === transition);
+  },
+  "uses the transition as the context": function(transition) {
+    var t;
+    transition.call(function() { t = this; });
+    assert.isTrue(t === transition);
+  },
+  "returns the current transition": function(transition) {
+    assert.isTrue(transition.call(function() {}) === transition);
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-delay.js b/static/demo/components/d3/test/core/transition-test-delay.js
new file mode 100644
index 0000000000000000000000000000000000000000..34be6e00023fd713536d42e2e3221f346499a3f5
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-delay.js
@@ -0,0 +1,58 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    return d3.select("body").html("").selectAll()
+        .data(["foo", "bar"])
+      .enter().append("div")
+        .attr("class", String);
+  },
+  "defaults to zero": function(selection) {
+    var t = selection.transition();
+    assert.strictEqual(t[0][0].__transition__[t.id].delay, 0);
+    assert.strictEqual(t[0][1].__transition__[t.id].delay, 0);
+  },
+  "can specify delay as a number": function(selection) {
+    var t = selection.transition().delay(150);
+    assert.strictEqual(t[0][0].__transition__[t.id].delay, 150);
+    assert.strictEqual(t[0][1].__transition__[t.id].delay, 150);
+    t.delay(250);
+    assert.strictEqual(t[0][0].__transition__[t.id].delay, 250);
+    assert.strictEqual(t[0][1].__transition__[t.id].delay, 250);
+  },
+  "can specify delay as a negative number": function(selection) {
+    var t = selection.transition().delay(-250);
+    assert.strictEqual(t[0][0].__transition__[t.id].delay, -250);
+    assert.strictEqual(t[0][1].__transition__[t.id].delay, -250);
+  },
+  "NaN delays are treated as 0ms": function(selection) {
+    var t = selection.transition().delay(NaN);
+    assert.strictEqual(t[0][0].__transition__[t.id].delay, 0);
+    assert.strictEqual(t[0][1].__transition__[t.id].delay, 0);
+  },
+  "floating-point durations are floored to integers": function(selection) {
+    var t = selection.transition().delay(14.6);
+    assert.strictEqual(t[0][0].__transition__[t.id].delay, 14);
+    assert.strictEqual(t[0][1].__transition__[t.id].delay, 14);
+    var t = selection.transition().delay("16.99");
+    assert.strictEqual(t[0][0].__transition__[t.id].delay, 16);
+    assert.strictEqual(t[0][1].__transition__[t.id].delay, 16);
+  },
+  "can specify delay as a function": function(selection) {
+    var dd = [], ii = [], tt = [], t = selection.transition().delay(f);
+    function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return i * 20; }
+    assert.strictEqual(t[0][0].__transition__[t.id].delay, 0);
+    assert.strictEqual(t[0][1].__transition__[t.id].delay, 20);
+    assert.deepEqual(dd, ["foo", "bar"], "expected data, got {actual}");
+    assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+    assert.domEqual(tt[0], t[0][0], "expected this, got {actual}");
+    assert.domEqual(tt[1], t[0][1], "expected this, got {actual}");
+  },
+  "coerces delay to a number": function(selection) {
+    var t = selection.transition().delay("150");
+    assert.strictEqual(t[0][0].__transition__[t.id].delay, 150);
+    assert.strictEqual(t[0][1].__transition__[t.id].delay, 150);
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-duration.js b/static/demo/components/d3/test/core/transition-test-duration.js
new file mode 100644
index 0000000000000000000000000000000000000000..d6a9798a73019a6e40d673469ca8e0c1c38d6464
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-duration.js
@@ -0,0 +1,62 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    return d3.select("body").html("").selectAll()
+        .data(["foo", "bar"])
+      .enter().append("div")
+        .attr("class", String);
+  },
+  "defaults to 250 milliseconds": function(selection) {
+    var t = selection.transition();
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 250);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 250);
+  },
+  "can specify duration as a number": function(selection) {
+    var t = selection.transition().duration(150);
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 150);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 150);
+    t.duration(50);
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 50);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 50);
+  },
+  "NaN, zero, or negative durations are treated as 1ms": function(selection) {
+    var t = selection.transition().duration(NaN);
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 1);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 1);
+    t.duration(0);
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 1);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 1);
+    t.duration(-10);
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 1);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 1);
+    t.duration(-Infinity);
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 1);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 1);
+  },
+  "floating-point durations are floored to integers": function(selection) {
+    var t = selection.transition().duration(14.6);
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 14);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 14);
+    var t = selection.transition().duration("16.99");
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 16);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 16);
+  },
+  "can specify duration as a function": function(selection) {
+    var dd = [], ii = [], tt = [], t = selection.transition().duration(f);
+    function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return i * 20 + 10; }
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 10);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 30);
+    assert.deepEqual(dd, ["foo", "bar"], "expected data, got {actual}");
+    assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+    assert.domEqual(tt[0], t[0][0], "expected this, got {actual}");
+    assert.domEqual(tt[1], t[0][1], "expected this, got {actual}");
+  },
+  "coerces duration to a number": function(selection) {
+    var t = selection.transition().duration("150");
+    assert.strictEqual(t[0][0].__transition__[t.id].duration, 150);
+    assert.strictEqual(t[0][1].__transition__[t.id].duration, 150);
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-each.js b/static/demo/components/d3/test/core/transition-test-each.js
new file mode 100644
index 0000000000000000000000000000000000000000..a5b0c8d25747f4d41adb1828ff5059c006f07b52
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-each.js
@@ -0,0 +1,165 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  "start": {
+    topic: function() {
+      var cb = this.callback,
+          div = d3.select("body").html("").selectAll().data(["foo", "bar"]).enter().append("div").attr("class", String),
+          transition = div.transition().delay(350),
+          then = Date.now(),
+          n = 0,
+          calls = [],
+          context = [],
+          data = [],
+          index = [],
+          count = [],
+          delay = [];
+
+      // A callback to verify that multiple callbacks are allowed.
+      transition.each("start.other", function() {
+        ++n;
+      });
+
+      // A callback which captures arguments and context.
+      transition.each("start", function(d, i) {
+        context.push(this);
+        data.push(d);
+        index.push(i);
+        count.push(++n);
+        delay.push(Date.now() - then);
+        if (n >= 4) cb(null, {
+          selection: div,
+          delay: delay,
+          context: context,
+          data: data,
+          index: index,
+          count: count,
+          id: transition.id
+        });
+      });
+    },
+
+    "invokes the listener after the specified delay": function(result) {
+      assert.inDelta(result.delay, [350, 350], 20);
+    },
+    "invokes each listener exactly once, in order": function(result) {
+      assert.deepEqual(result.count, [2, 4]);
+    },
+
+    // For the same node, listeners will be called back in order, according to
+    // the implementation of d3.dispatch. However, the order of callbacks across
+    // nodes is not guaranteed; currently, callbacks are in reverse order if
+    // they share the same delay, because of the timer queue. I suppose it'd be
+    // slightly better if the callbacks were invoked in node order (consistent
+    // with selections), but since these callbacks happen asynchronously I don't
+    // think the API needs to guarantee the order of callbacks.
+
+    "uses the node as the context": function(result) {
+      assert.domEqual(result.context[0], result.selection[0][0]);
+      assert.domEqual(result.context[1], result.selection[0][1]);
+    },
+    "passes the data and index to the function": function(result) {
+      assert.deepEqual(result.data, ["foo", "bar"], "expected data, got {actual}");
+      assert.deepEqual(result.index, [0, 1], "expected index, got {actual}");
+    },
+
+    "sets an exclusive lock on transitioning nodes": function(result) {
+      var id = result.id;
+      assert.isTrue(id > 0);
+      assert.equal(result.selection[0][0].__transition__.count, 1);
+      assert.equal(result.selection[0][1].__transition__.count, 1);
+      assert.equal(result.selection[0][0].__transition__.active, id);
+      assert.equal(result.selection[0][1].__transition__.active, id);
+    }
+  },
+
+  "end": {
+    topic: function() {
+      var cb = this.callback,
+          div = d3.select("body").html("").selectAll().data(["foo", "bar"]).enter().append("div").attr("class", String),
+          transition = div.transition().duration(350),
+          then = Date.now(),
+          n = 0,
+          calls = [],
+          context = [],
+          data = [],
+          index = [],
+          count = [],
+          delay = [];
+
+      // A callback to verify that multiple callbacks are allowed.
+      transition.each("end.other", function() {
+        ++n;
+      });
+
+      // A callback which captures arguments and context.
+      transition.each("end", function(d, i) {
+        context.push(this);
+        data.push(d);
+        index.push(i);
+        count.push(++n);
+        delay.push(Date.now() - then);
+        if (n >= 4) cb(null, {
+          selection: div,
+          delay: delay,
+          context: context,
+          data: data,
+          index: index,
+          count: count,
+          id: transition.id
+        });
+      });
+    },
+
+    "invokes the listener after the specified delay": function(result) {
+      assert.inDelta(result.delay, [350, 350], 20);
+    },
+    "invokes each listener exactly once, in order": function(result) {
+      assert.deepEqual(result.count, [2, 4]);
+    },
+
+    // For the same node, listeners will be called back in order, according to
+    // the implementation of d3.dispatch. However, the order of callbacks across
+    // nodes is not guaranteed; currently, callbacks are in reverse order if
+    // they share the same delay, because of the timer queue. I suppose it'd be
+    // slightly better if the callbacks were invoked in node order (consistent
+    // with selections), but since these callbacks happen asynchronously I don't
+    // think the API needs to guarantee the order of callbacks.
+
+    "uses the node as the context": function(result) {
+      assert.domEqual(result.context[0], result.selection[0][0]);
+      assert.domEqual(result.context[1], result.selection[0][1]);
+    },
+    "passes the data and index to the function": function(result) {
+      assert.deepEqual(result.data, ["foo", "bar"], "expected data, got {actual}");
+      assert.deepEqual(result.index, [0, 1], "expected index, got {actual}");
+    },
+
+    "deletes the transition lock after end": function(result) {
+      assert.isFalse("__transition__" in result.selection[0][0]);
+      assert.isFalse("__transition__" in result.selection[0][1]);
+    },
+
+    // I'd like to test d3.timer.flush here, but unfortunately there's a bug in
+    // Vows where it really doesn't like to receive multiple callbacks from
+    // different tests at the same time!
+
+    "sequenced": {
+      topic: function(result) {
+        var cb = this.callback,
+            node = result.selection[0][0],
+            id = result.id;
+        d3.select(node).transition().delay(150).each("start", function() {
+          cb(null, {id: id, node: this});
+        });
+      },
+      "does not inherit the transition id": function(result) {
+        assert.isTrue(result.id > 0);
+        assert.equal(result.node.__transition__.count, 1);
+        assert.isTrue(result.node.__transition__.active > result.id);
+      }
+    }
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-filter.js b/static/demo/components/d3/test/core/transition-test-filter.js
new file mode 100644
index 0000000000000000000000000000000000000000..c18832a9c7c357bf8e0e85ba37c82d5c5cf9619d
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-filter.js
@@ -0,0 +1,84 @@
+require("../env");
+
+var assert = require("assert");
+
+var datum = {};
+
+module.exports = {
+  topic: function() {
+    return d3.select("body").html("").selectAll("div")
+        .data([0, 1])
+      .enter().append("div")
+      .selectAll("span")
+        .data(function(d) { d <<= 1; return [d, d + 1]; })
+      .enter().append("span")
+        .classed("foo", function(d, i) { return d & 1; })
+      .transition()
+        .delay(100)
+        .duration(150)
+        .ease("bounce");
+  },
+
+  "preserves matching elements": function(span) {
+    var some = span.filter(function(d, i) { return i === 0; });
+    assert.isTrue(some[0][0] === span[0][0]);
+    assert.isTrue(some[1][0] === span[1][0]);
+  },
+  "removes non-matching elements": function(span) {
+    var some = d3.merge(span.filter(function(d, i) { return d & 1; }));
+    assert.equal(some.indexOf(span[0][0]), -1);
+    assert.equal(some.indexOf(span[1][0]), -1);
+  },
+  "preserves data": function(span) {
+    var some = span.filter(function(d, i) { return d & 1; });
+    assert.equal(some[0][0].__data__, 1);
+    assert.equal(some[1][0].__data__, 3);
+  },
+  "preserves grouping": function(span) {
+    var some = span.filter(function(d, i) { return d & 1; });
+    assert.equal(some.length, 2);
+    assert.equal(some[0].length, 1);
+    assert.equal(some[1].length, 1);
+  },
+  "preserves parent node": function(span) {
+    var some = span.filter(function(d, i) { return d & 1; });
+    assert.isTrue(some[0].parentNode === span[0].parentNode);
+    assert.isTrue(some[1].parentNode === span[1].parentNode);
+  },
+  "does not preserve index": function(span) {
+    var indexes = [];
+    span.filter(function(d, i) { return d & 1; }).each(function(d, i) { indexes.push(i); });
+    assert.deepEqual(indexes, [0, 0]);
+  },
+  "ignores null nodes": function() {
+    var span = d3.selectAll("span");
+    span[0][1] = null;
+    var some = span.filter(function(d, i) { return d & 1; });
+    assert.isTrue(some[0][0] === span[0][3]);
+    assert.equal(some.length, 1);
+  },
+  "can be specified as a selector": function(span) {
+    var some = span.filter(".foo");
+    assert.equal(some.length, 2);
+    assert.equal(some[0].length, 1);
+    assert.equal(some[1].length, 1);
+  },
+  "returns a new selection": function(span) {
+    assert.isFalse(span.filter(function() { return 1; }) === span);
+  },
+  "inherits the delay": function(t1) {
+    var t2 = t1.filter(function() { return 1; });
+    assert.equal(t2[0][0].__transition__[t2.id].delay, 100); // TODO should inherit the whole transition object
+  },
+  "inherits the duration": function(t1) {
+    var t2 = t1.filter(function() { return 1; });
+    assert.equal(t2[0][0].__transition__[t2.id].duration, 150);
+  },
+  "inherits easing": function(t1) {
+    // TODO how to test this?
+  },
+  "inherits the transition id": function(t1) {
+    var t2 = t1.filter(function() { return 1; });
+    assert.equal(t2.id, t1.id);
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-id.js b/static/demo/components/d3/test/core/transition-test-id.js
new file mode 100644
index 0000000000000000000000000000000000000000..100fbc75715f4633399879b096f9252daffc5e0a
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-id.js
@@ -0,0 +1,19 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    return d3.select("body").append("div").transition();
+  },
+  "has a positive integer id": function(transition) {
+    var id = transition.id;
+    assert.isTrue(id > 0);
+    assert.equal(~~id, id);
+  },
+  "increases monotonically across transitions": function(transition) {
+    var t0 = d3.select("body").append("div").transition(),
+        t1 = d3.select("body").append("div").transition();
+    assert.isTrue(t1.id > t0.id);
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-remove.js b/static/demo/components/d3/test/core/transition-test-remove.js
new file mode 100644
index 0000000000000000000000000000000000000000..e283e55bd27c1f6f2c939c0b259ee4eea8cde1fa
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-remove.js
@@ -0,0 +1,45 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    var cb = this.callback,
+        t = d3.select("body").append("div").transition().remove();
+    t.each("end", function() { cb(null, t); });
+  },
+  "removes the selected elements": function(transition) {
+    assert.domEqual(transition[0][0].parentNode, null);
+  },
+
+  "when the element is already removed": {
+    topic: function() {
+      var cb = this.callback,
+          t = d3.select("body").append("div").remove().transition().remove();
+      t.each("end", function() { cb(null, t); });
+    },
+    "does nothing": function(transition) {
+      assert.domEqual(transition[0][0].parentNode, null);
+    }
+  },
+
+  // Since these tests are triggered inside the end event of the above topic,
+  // transitions will inherit ids from the original transition. But we want to
+  // test concurrent transitions, so we use timeouts to avoid inheritance. This
+  // test also verifies that if multiple transitions are created at the same
+  // time, the last transition becomes the owner.
+
+  "when another transition is scheduled": {
+    topic: function() {
+      var cb = this.callback,
+          s = d3.select("body").append("div");
+      setTimeout(function() {
+        s.transition().duration(150).remove().each("end", function() { cb(null, s); });
+        s.transition().delay(250);
+      }, 10);
+    },
+    "does nothing": function(selection) {
+      assert.domEqual(selection[0][0].parentNode, document.body);
+    }
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-select.js b/static/demo/components/d3/test/core/transition-test-select.js
new file mode 100644
index 0000000000000000000000000000000000000000..fce5f151286b643c211ec5e044136661a23200ab
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-select.js
@@ -0,0 +1,62 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    var s = d3.select("body").append("div").selectAll("div")
+        .data(["one", "two", "three", "four"])
+      .enter().append("div")
+        .attr("class", String);
+
+    s.filter(function(d, i) { return i > 0; }).append("span");
+    s[0][3] = null;
+
+    return s.transition()
+        .delay(function(d, i) { return i * 13; })
+        .duration(function(d, i) { return i * 21; });
+  },
+
+  "selects the first matching element": function(transition) {
+    var t = transition.select("span");
+    assert.domEqual(t[0][1].parentNode, transition[0][1]);
+    assert.domEqual(t[0][2].parentNode, transition[0][2]);
+  },
+  "ignores null elements": function(transition) {
+    var t = transition.select("span");
+    assert.isNull(t[0][3]);
+  },
+  "propagates data to the selected elements": function(transition) {
+    var t = transition.select("span");
+    assert.equal(t[0][1].__data__, "two");
+    assert.equal(t[0][2].__data__, "three");
+  },
+  "propagates delay to the selected elements": function(transition) {
+    var t = transition.select("span");
+    assert.equal(t[0][1].__transition__[t.id].delay, 13);
+    assert.equal(t[0][2].__transition__[t.id].delay, 26);
+  },
+  "propagates duration to the selected elements": function(transition) {
+    var t = transition.select("span");
+    assert.equal(t[0][1].__transition__[t.id].duration, 21);
+    assert.equal(t[0][2].__transition__[t.id].duration, 42);
+  },
+  "does not propagate data if no data was specified": function(transition) {
+    delete transition[0][1].__data__;
+    delete transition[0][1].firstChild.__data__;
+    var t = transition.select("span");
+    assert.isUndefined(t[0][1].__data__);
+    assert.equal(t[0][2].__data__, "three");
+  },
+  "returns null if no match is found": function(transition) {
+    var t = transition.select("span");
+    assert.isNull(t[0][0]);
+  },
+  "inherits transition id": function(transition) {
+    var id = transition.id,
+        t0 = transition.select("span"),
+        t1 = transition.select("span");
+    assert.equal(t0.id, id);
+    assert.equal(t1.id, id);
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-selectAll.js b/static/demo/components/d3/test/core/transition-test-selectAll.js
new file mode 100644
index 0000000000000000000000000000000000000000..3ea650bd71bc44a198f6981f293ca0cfda8d7e48
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-selectAll.js
@@ -0,0 +1,58 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    var s = d3.select("body").append("div").selectAll("div")
+        .data(["one", "two", "three", "four"])
+      .enter().append("div")
+        .attr("class", String);
+
+    s.filter(function(d, i) { return i > 0; }).append("span");
+    s.filter(function(d, i) { return i > 1; }).append("span");
+    s[0][3] = null;
+
+    return s.transition()
+        .delay(function(d, i) { return i * 13; })
+        .duration(function(d, i) { return i * 21; });
+  },
+
+  "selects all matching elements": function(transition) {
+    var t = transition.selectAll("span");
+    assert.domEqual(t[1][0].parentNode, transition[0][1]);
+    assert.domEqual(t[2][0].parentNode, transition[0][2]);
+    assert.domEqual(t[2][1].parentNode, transition[0][2]);
+  },
+  "ignores null elements": function(transition) {
+    var t = transition.selectAll("span");
+    assert.equal(t.length, 3);
+  },
+  "propagates delay to the selected elements": function(transition) {
+    var t = transition.selectAll("span");
+    assert.domEqual(t[1][0].__transition__[t.id].delay, 13);
+    assert.domEqual(t[2][0].__transition__[t.id].delay, 26);
+    assert.domEqual(t[2][1].__transition__[t.id].delay, 26);
+  },
+  "propagates duration to the selected elements": function(transition) {
+    var t = transition.selectAll("span");
+    assert.domEqual(t[1][0].__transition__[t.id].duration, 21);
+    assert.domEqual(t[2][0].__transition__[t.id].duration, 42);
+    assert.domEqual(t[2][1].__transition__[t.id].duration, 42);
+  },
+  "returns empty if no match is found": function(transition) {
+    var t = transition.selectAll("span");
+    assert.isEmpty(t[0]);
+  },
+  "inherits transition id": function(transition) {
+    var id = transition.id,
+        t0 = transition.selectAll("span"),
+        t1 = transition.selectAll("span");
+    assert.equal(t0.id, id);
+    assert.equal(t1.id, id);
+  },
+  "groups are not instances of NodeList": function(transition) {
+    var t = transition.selectAll(function() { return this.getElementsByClassName("span"); });
+    assert.isFalse(t[0] instanceof window.NodeList);
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-style.js b/static/demo/components/d3/test/core/transition-test-style.js
new file mode 100644
index 0000000000000000000000000000000000000000..78bdc33dc8f98ac8d8d44d516c6ee12603362b9c
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-style.js
@@ -0,0 +1,53 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    var s = d3.select("body").append("div")
+        .style("background-color", "white")
+        .style("color", "red")
+        .style("display", "none")
+        .style("font-size", "20px");
+
+    var t = s.transition()
+        .style("display", null)
+        .style("font-size", function() { return null; })
+        .style("display", null)
+        .style("background-color", "green")
+        .style("background-color", "red")
+        .style("color", function() { return "green"; }, "important");
+
+    return {selection: s, transition: t};
+  },
+  "defines the corresponding style tween": function(result) {
+    assert.typeOf(result.transition.tween("style.background-color"), "function");
+    assert.typeOf(result.transition.tween("style.color"), "function");
+  },
+  "on end": {
+    topic: function(result) {
+      var cb = this.callback;
+      result.transition.each("end", function() { cb(null, result); });
+    },
+    "the last style operator takes precedence": function(result) {
+      assert.equal(result.selection.style("background-color"), "#ff0000");
+    },
+    "sets a property as a string": function(result) {
+      assert.equal(result.selection.style("background-color"), "#ff0000");
+    },
+    "sets a property as a function": function(result) {
+      assert.equal(result.selection.style("color"), "#008000");
+    },
+    "observes the specified priority": function(result) {
+      var style = result.selection.node().style;
+      assert.equal(style.getPropertyPriority("background-color"), "");
+      assert.equal(style.getPropertyPriority("color"), "important");
+    },
+    "removes a property using a constant null": function(result) {
+      assert.equal(result.selection.style("display"), "");
+    },
+    "removes a property using a function null": function(result) {
+      assert.equal(result.selection.style("font-size"), "");
+    }
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-styleTween.js b/static/demo/components/d3/test/core/transition-test-styleTween.js
new file mode 100644
index 0000000000000000000000000000000000000000..80b97d267b3ae912bec98c7a2208e6af737aad0e
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-styleTween.js
@@ -0,0 +1,72 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    var cb = this.callback,
+        dd = [],
+        ii = [],
+        tt = [],
+        vv = [],
+        fails = 0;
+
+    var s = d3.select("body").html("").append("div").selectAll("div")
+        .data(["red", "green"])
+      .enter().append("div")
+        .style("background-color", function(d) { return d3.rgb(d)+""; });
+
+    var t = s.transition()
+        .styleTween("background-color", function() { ++fails; })
+        .styleTween("background-color", tween);
+
+    function tween(d, i, v) {
+      dd.push(d);
+      ii.push(i);
+      vv.push(v);
+      if (tt.push(this) >= 2) cb(null, {
+        selection: s,
+        transition: t,
+        data: dd,
+        index: ii,
+        value: vv,
+        context: tt,
+        fails: fails
+      });
+      return i && d3.interpolateHsl(v, "blue");
+    }
+  },
+
+  // The order here is a bit brittle: because the transition has zero delay,
+  // it's invoking the start event immediately for all nodes, rather than
+  // pushing each node onto the timer queue (which would reverse the order of
+  // callbacks). The order in which tweens are invoked is undefined, so perhaps
+  // we should sort the expected and actual values before comparing.
+
+  "defines the corresponding style tween": function(result) {
+    assert.typeOf(result.transition.tween("style.background-color"), "function");
+  },
+  "the last style tween takes precedence": function(result) {
+    assert.equal(result.fails, 0);
+  },
+  "invokes the tween function": function(result) {
+    assert.deepEqual(result.data, ["green", "red"], "expected data, got {actual}");
+    assert.deepEqual(result.index, [1, 0], "expected index, got {actual}");
+    assert.deepEqual(result.value, ["#008000", "#ff0000"], "expected value, got {actual}");
+    assert.domEqual(result.context[0], result.selection[0][1], "expected this, got {actual}");
+    assert.domEqual(result.context[1], result.selection[0][0], "expected this, got {actual}");
+  },
+
+  "end": {
+    topic: function(result) {
+      var cb = this.callback;
+      result.transition.each("end", function(d, i) { if (i >= 1) cb(null, result); });
+    },
+    "uses the returned interpolator": function(result) {
+      assert.equal(result.selection[0][1].style.getPropertyValue("background-color"), "#0000ff");
+    },
+    "does nothing if the interpolator is falsey": function(result) {
+      assert.equal(result.selection[0][0].style.getPropertyValue("background-color"), "#ff0000");
+    }
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-text.js b/static/demo/components/d3/test/core/transition-test-text.js
new file mode 100644
index 0000000000000000000000000000000000000000..e0cc48f48cb24eef45fa6a155a027c5afadfc422
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-text.js
@@ -0,0 +1,29 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    return d3.select("body").append("div").text("foo").transition().text("bar");
+  },
+  "sets the text tween": function(div) {
+    assert.typeOf(div.tween("text"), "function");
+  },
+  "start": {
+    topic: function(div) {
+      var cb = this.callback,
+          tween = div.tween("text");
+      div.tween("text", function() {
+        var result = tween.apply(this, arguments);
+        cb(null, {transition: div, tween: result});
+        return result;
+      });
+    },
+    "sets the text content as a string": function(result) {
+      assert.equal(result.transition[0][0].textContent, "bar");
+    },
+    "does not interpolate text": function(result) {
+      assert.isTrue(!result.tween);
+    }
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-time.js b/static/demo/components/d3/test/core/transition-test-time.js
new file mode 100644
index 0000000000000000000000000000000000000000..b83b1fba0a176f7474dd711a8ecebe7332b0eed4
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-time.js
@@ -0,0 +1,35 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    return d3.select("body").append("div").transition();
+  },
+  "is approximately equal to now": function(transition) {
+    var time = transition[0][0].__transition__[transition.id].time;
+    assert.inDelta(time, Date.now(), 20);
+  },
+  "increases monotonically across transitions": function(transition) {
+    var now = Date.now, then = Date.now();
+    try {
+      Date.now = function() { return ++then; };
+      var t0 = d3.select("body").append("div").transition(),
+          t1 = d3.select("body").append("div").transition();
+      assert.isTrue(t1[0][0].__transition__[t1.id].time > t0[0][0].__transition__[t0.id].time);
+    } finally {
+      Date.now = now;
+    }
+  },
+  "is inherited by subtransitions": function(transition) {
+    var now = Date.now, then = Date.now();
+    try {
+      Date.now = function() { return ++then; };
+      var t0 = d3.select("body").append("div").transition(),
+          t1 = t0.transition();
+      assert.equal(t1[0][0].__transition__[t1.id].time, t0[0][0].__transition__[t0.id].time);
+    } finally {
+      Date.now = now;
+    }
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-transition.js b/static/demo/components/d3/test/core/transition-test-transition.js
new file mode 100644
index 0000000000000000000000000000000000000000..eaf4be1e34c4a42f5f98b3363a82dffe8246eddf
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-transition.js
@@ -0,0 +1,60 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    return d3.select("body").append("div").transition()
+        .delay(101)
+        .duration(152)
+        .ease("bounce");
+  },
+
+  "starts immediately after the previous transition ends": function(t1) {
+    var t2 = t1.transition();
+    assert.equal(t2[0][0].__transition__[t2.id].delay, 253);
+  },
+  "inherits the previous transition's duration": function(t1) {
+    var t2 = t1.transition();
+    assert.equal(t2[0][0].__transition__[t2.id].duration, 152);
+  },
+  "inherits easing": function(t1) {
+    // TODO how to test this?
+  },
+  "gets a new transition id": function(t1) {
+    var t2 = t1.transition();
+    assert.isTrue(t2.id > t1.id);
+  },
+
+  "while transitioning": {
+    topic: function(t1) {
+      var t2 = t1.transition(),
+          cb = this.callback;
+      t2.each("start", function() {
+        d3.timer(function() {
+          cb(null, t2);
+          return true;
+        });
+      });
+    },
+    "increments the lock's reference count": function(t2) {
+      assert.isTrue(t2[0][0].__transition__.count > 1);
+    }
+  },
+
+  "after transitioning": {
+    topic: function(t1) {
+      var cb = this.callback;
+      var t2 = t1.transition();
+      t2.each("end", function() {
+        d3.timer(function() {
+          cb(null, t2);
+          return true;
+        }, 50);
+      });
+    },
+    "decrements the lock's reference count": function(t2) {
+      assert.isFalse("__transition__" in t2[0][0]);
+    }
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test-tween.js b/static/demo/components/d3/test/core/transition-test-tween.js
new file mode 100644
index 0000000000000000000000000000000000000000..6ffc0b1f58044664acc056b90eb3ef94e16398e7
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test-tween.js
@@ -0,0 +1,70 @@
+require("../env");
+
+var assert = require("assert");
+
+module.exports = {
+  topic: function() {
+    var cb = this.callback,
+        dd = [],
+        ii = [],
+        tt = [],
+        fails = 0;
+
+    var s = d3.select("body").append("div").selectAll("div")
+        .data(["red", "green"])
+      .enter().append("div")
+        .text(function(d) { return d3.rgb(d)+""; });
+
+    var t = s.transition()
+        .tween("text", function() { ++fails; })
+        .tween("text", tween);
+
+    function tween(d, i) {
+      dd.push(d);
+      ii.push(i);
+      if (tt.push(this) >= 2) cb(null, {
+        selection: s,
+        transition: t,
+        data: dd,
+        index: ii,
+        context: tt,
+        fails: fails
+      });
+      return i && function(t) {
+        this.textContent = d3.hsl(230, 0.5, t) + "";
+      };
+    }
+  },
+
+  // The order here is a bit brittle: because the transition has zero delay,
+  // it's invoking the start event immediately for all nodes, rather than
+  // pushing each node onto the timer queue (which would reverse the order of
+  // callbacks). The order in which tweens are invoked is undefined, so perhaps
+  // we should sort the expected and actual values before comparing.
+
+  "defines the corresponding tween": function(result) {
+    assert.typeOf(result.transition.tween("text"), "function");
+  },
+  "the last tween takes precedence": function(result) {
+    assert.equal(result.fails, 0);
+  },
+  "invokes the tween function": function(result) {
+    assert.deepEqual(result.data, ["green", "red"], "expected data, got {actual}");
+    assert.deepEqual(result.index, [1, 0], "expected data, got {actual}");
+    assert.domEqual(result.context[0], result.selection[0][1], "expected this, got {actual}");
+    assert.domEqual(result.context[1], result.selection[0][0], "expected this, got {actual}");
+  },
+
+  "end": {
+    topic: function(result) {
+      var cb = this.callback;
+      result.transition.each("end", function(d, i) { if (i >= 1) cb(null, result); });
+    },
+    "uses the returned tweener": function(result) {
+      assert.equal(result.selection[0][1].textContent, "#ffffff");
+    },
+    "does nothing if the tweener is falsey": function(result) {
+      assert.equal(result.selection[0][0].textContent, "#ff0000");
+    }
+  }
+};
diff --git a/static/demo/components/d3/test/core/transition-test.js b/static/demo/components/d3/test/core/transition-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..54ab3128e7334f2f679f2df5971271451e38ce1c
--- /dev/null
+++ b/static/demo/components/d3/test/core/transition-test.js
@@ -0,0 +1,70 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.transition");
+
+suite.addBatch({
+  "transition": {
+    topic: function() {
+      return d3.transition();
+    },
+    "selects the document": function(transition) {
+      assert.domEqual(transition[0][0], document);
+    },
+    "is an instanceof d3.transition": function(transition) {
+      assert.isTrue(transition instanceof d3.transition);
+    },
+    "subselections are also instanceof d3.transition": function(transition) {
+      assert.isTrue(transition.select("body") instanceof d3.transition);
+      assert.isTrue(transition.selectAll("body") instanceof d3.transition);
+    },
+    "transition prototype can be extended": function(transition) {
+      var vv = [];
+      d3.transition.prototype.foo = function(v) { vv.push(v); return this; };
+      transition.select("body").foo(42);
+      assert.deepEqual(vv, [42]);
+      delete d3.transition.prototype.foo;
+    }
+  }
+});
+
+suite.export(module);
+
+var suite = vows.describe("transition");
+
+// Subtransitions
+suite.addBatch({
+  "select": require("./transition-test-select"),
+  "selectAll": require("./transition-test-selectAll"),
+  "transition": require("./transition-test-transition"),
+  "filter": require("./transition-test-filter")
+});
+
+// Content
+suite.addBatch({
+  "attr": require("./transition-test-attr"),
+  "attrTween": require("./transition-test-attrTween"),
+  "style": require("./transition-test-style"),
+  "styleTween": require("./transition-test-styleTween"),
+  "text": require("./transition-test-text"),
+  "remove": require("./transition-test-remove")
+});
+
+// Animation
+suite.addBatch({
+  "delay": require("./transition-test-delay"),
+  "duration": require("./transition-test-duration")
+});
+
+// Control
+suite.addBatch({
+  "each": require("./transition-test-each"),
+  "call": require("./transition-test-call"),
+  "tween": require("./transition-test-tween"),
+  "id": require("./transition-test-id"),
+  "time": require("./transition-test-time")
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/transpose-test.js b/static/demo/components/d3/test/core/transpose-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..5ed83989460260e66de0ab6ca569edf8ae7b661b
--- /dev/null
+++ b/static/demo/components/d3/test/core/transpose-test.js
@@ -0,0 +1,31 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.transpose");
+
+suite.addBatch({
+  "transpose": {
+    topic: function() {
+      return d3.transpose;
+    },
+    "transposes a square matrix": function(transpose) {
+      assert.deepEqual(d3.transpose([[1, 2], [3, 4]]), [[1, 3], [2, 4]]);
+    },
+    "transposes a non-square matrix": function(transpose) {
+      assert.deepEqual(d3.transpose([[1, 2, 3, 4, 5], [2, 4, 6, 8, 10]]), [[1, 2], [2, 4], [3, 6], [4, 8], [5, 10]]);
+    },
+    "transposes a single-row matrix": function(transpose) {
+      assert.deepEqual(d3.transpose([[1, 2, 3, 4, 5]]), [[1], [2], [3], [4], [5]]);
+    },
+    "transposes an empty matrix": function(transpose) {
+      assert.deepEqual(d3.transpose([]), []);
+    },
+    "ignores extra elements given an irregular matrix": function(transpose) {
+      assert.deepEqual(d3.transpose([[1, 2], [3, 4], [5, 6, 7]]), [[1, 3, 5], [2, 4, 6]]);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/values-test.js b/static/demo/components/d3/test/core/values-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..ec0cc8e042b8c8323fa6ec4af135c5490ce88fd9
--- /dev/null
+++ b/static/demo/components/d3/test/core/values-test.js
@@ -0,0 +1,34 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.values");
+
+suite.addBatch({
+  "values": {
+    topic: function() {
+      return d3.values;
+    },
+    "enumerates every value": function(values) {
+      assert.deepEqual(values({a: 1, b: 2}), [1, 2]);
+    },
+    "includes values defined on prototypes": function(values) {
+      function abc() {
+        this.a = 1;
+        this.b = 2;
+      }
+      abc.prototype.c = 3;
+      assert.deepEqual(values(new abc()), [1, 2, 3]);
+    },
+    "includes null or undefined values": function(values) {
+      var v = values({a: undefined, b: null, c: NaN});
+      assert.isUndefined(v[0]);
+      assert.isNull(v[1]);
+      assert.isNaN(v[2]);
+      assert.equal(v.length, 3);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/version-test.js b/static/demo/components/d3/test/core/version-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..3a152b5eeb7ad84a2634e46e9b94014264c02db5
--- /dev/null
+++ b/static/demo/components/d3/test/core/version-test.js
@@ -0,0 +1,17 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.version");
+
+suite.addBatch({
+  "semantic versioning": {
+    topic: d3.version,
+    "has the form major.minor.patch": function(version) {
+      assert.match(version, /^[0-9]+\.[0-9]+\.[0-9]+/);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/xhr-test.js b/static/demo/components/d3/test/core/xhr-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..b6eb3ee1e9992f8faa0ec3b9ca60e7353d16bc97
--- /dev/null
+++ b/static/demo/components/d3/test/core/xhr-test.js
@@ -0,0 +1,55 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.xhr");
+
+suite.addBatch({
+  "xhr": {
+    topic: function() {
+      var cb = this.callback;
+      d3.xhr("test/data/sample.txt", function(error, req) {
+        cb(null, req);
+      });
+    },
+    "makes an asynchronous HTTP request": function(req) {
+      assert.equal(req._info.url, "test/data/sample.txt");
+      assert.isTrue(req._info.async);
+    },
+    "invokes the callback with the request object": function(req) {
+      assert.equal(req.responseText, "Hello, world!\n");
+    },
+    "does not override the mime type by default": function(req) {
+      assert.isUndefined(req._info.mimeType);
+    },
+    "waits until the request is done": function(req) {
+      assert.equal(req.readyState, 4);
+      assert.equal(req.status, 200);
+    },
+    "": {
+      topic: function() {
+        var cb = this.callback;
+        d3.xhr("test/data/sample.txt", "text/plain", function(error, req) {
+          cb(null, req);
+        });
+      },
+      "observes the optional mime type": function(req) {
+        assert.equal(req._info.mimeType, "text/plain");
+      }
+    },
+    " ": {
+      topic: function() {
+        var cb = this.callback;
+        d3.xhr("//does/not/exist.txt", function(error, req) {
+          cb(null, req);
+        });
+      },
+      "invokes the callback with undefined when an error occurs": function(req) {
+        assert.isUndefined(req);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/xml-test.js b/static/demo/components/d3/test/core/xml-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..2e3e745dd2cdafe4383bea472653a7a81ba9965d
--- /dev/null
+++ b/static/demo/components/d3/test/core/xml-test.js
@@ -0,0 +1,47 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.xml");
+
+suite.addBatch({
+  "xml": {
+    topic: function() {
+      var cb = this.callback;
+      d3.xml("test/data/sample.xml", function(error, xml) {
+        cb(null, xml);
+      });
+    },
+    "invokes the callback with the loaded xml": function(xml) {
+      assert.deepEqual(xml, {_xml: "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<hello>\n  <world name=\"Earth\"/>\n</hello>\n"});
+    },
+    "does not override the mime type by default": function(xml) {
+      assert.isUndefined(XMLHttpRequest._last._info.mimeType);
+    },
+    "": {
+      topic: function() {
+        var cb = this.callback;
+        d3.xml("test/data/sample.txt", "application/xml+sample", function(error, xml) {
+          cb(null, xml);
+        });
+      },
+      "observes the optional mime type": function(xml) {
+        assert.equal(XMLHttpRequest._last._info.mimeType, "application/xml+sample");
+      }
+    },
+    " ": {
+      topic: function() {
+        var cb = this.callback;
+        d3.xml("//does/not/exist.xml", function(error, xml) {
+          cb(null, xml);
+        });
+      },
+      "invokes the callback with undefined when an error occurs": function(xml) {
+        assert.isUndefined(xml);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/core/zip-test.js b/static/demo/components/d3/test/core/zip-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..5b8524622df97750b7782812b5cadfce723be528
--- /dev/null
+++ b/static/demo/components/d3/test/core/zip-test.js
@@ -0,0 +1,31 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.zip");
+
+suite.addBatch({
+  "zip": {
+    topic: function() {
+      return d3.zip;
+    },
+    "transposes a square matrix": function(zip) {
+      assert.deepEqual(d3.zip([1, 2], [3, 4]), [[1, 3], [2, 4]]);
+    },
+    "transposes a non-square matrix": function(zip) {
+      assert.deepEqual(d3.zip([1, 2, 3, 4, 5], [2, 4, 6, 8, 10]), [[1, 2], [2, 4], [3, 6], [4, 8], [5, 10]]);
+    },
+    "transposes a single-row matrix": function(zip) {
+      assert.deepEqual(d3.zip([1, 2, 3, 4, 5]), [[1], [2], [3], [4], [5]]);
+    },
+    "transposes an empty matrix": function(zip) {
+      assert.deepEqual(d3.zip(), []);
+    },
+    "ignores extra elements given an irregular matrix": function(zip) {
+      assert.deepEqual(d3.zip([1, 2], [3, 4], [5, 6, 7]), [[1, 3, 5], [2, 4, 6]]);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/data/sample.csv b/static/demo/components/d3/test/data/sample.csv
new file mode 100644
index 0000000000000000000000000000000000000000..89d73a0fc0c3e284372091c327967ebae9ef7f92
--- /dev/null
+++ b/static/demo/components/d3/test/data/sample.csv
@@ -0,0 +1,2 @@
+Hello,World
+42,"""fish"""
diff --git a/static/demo/components/d3/test/data/sample.html b/static/demo/components/d3/test/data/sample.html
new file mode 100644
index 0000000000000000000000000000000000000000..2029283a42e96411ae7cb1f6b893cdf2dc811be7
--- /dev/null
+++ b/static/demo/components/d3/test/data/sample.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<html>
+  <body>
+    <h1>Hello &amp; world!</h1>
+</html>
diff --git a/static/demo/components/d3/test/data/sample.json b/static/demo/components/d3/test/data/sample.json
new file mode 100644
index 0000000000000000000000000000000000000000..92c35fd7d66a6326c3e6e8137f223b84e30ac5ed
--- /dev/null
+++ b/static/demo/components/d3/test/data/sample.json
@@ -0,0 +1 @@
+[{"Hello": 42, "World": "\"fish\""}]
diff --git a/static/demo/components/d3/test/data/sample.tsv b/static/demo/components/d3/test/data/sample.tsv
new file mode 100644
index 0000000000000000000000000000000000000000..9998779de8a927b64a40e24192e438a56274f177
--- /dev/null
+++ b/static/demo/components/d3/test/data/sample.tsv
@@ -0,0 +1,2 @@
+Hello	World
+42	"""fish"""
diff --git a/static/demo/components/d3/test/data/sample.txt b/static/demo/components/d3/test/data/sample.txt
new file mode 100644
index 0000000000000000000000000000000000000000..af5626b4a114abcb82d63db7c8082c3c4756e51b
--- /dev/null
+++ b/static/demo/components/d3/test/data/sample.txt
@@ -0,0 +1 @@
+Hello, world!
diff --git a/static/demo/components/d3/test/data/sample.xml b/static/demo/components/d3/test/data/sample.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a2447a54cd0addedb3d55e91f27dc6b8a4359091
--- /dev/null
+++ b/static/demo/components/d3/test/data/sample.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<hello>
+  <world name="Earth"/>
+</hello>
diff --git a/static/demo/components/d3/test/data/us-counties.json b/static/demo/components/d3/test/data/us-counties.json
new file mode 100644
index 0000000000000000000000000000000000000000..2e0e3b6305fa10c1a89d1dfd6478b1fe7bc19c1e
--- /dev/null
+++ b/static/demo/components/d3/test/data/us-counties.json
@@ -0,0 +1,3186 @@
+{"type":"FeatureCollection","features":[
+{"type":"Feature","id":"01001","properties":{"name":"Autauga"},"geometry":{"type":"Polygon","coordinates":[[[-86.411786,32.706342],[-86.411786,32.410587],[-86.499417,32.344863],[-86.817079,32.339387],[-86.915664,32.662526],[-86.411786,32.706342]]]}},
+{"type":"Feature","id":"01003","properties":{"name":"Baldwin"},"geometry":{"type":"Polygon","coordinates":[[[-87.76459,31.298768],[-87.616713,31.243998],[-87.600282,30.997536],[-87.518128,30.280057],[-88.005575,30.685351],[-87.972714,31.161844],[-87.945329,31.194706],[-87.76459,31.298768]]]}},
+{"type":"Feature","id":"01005","properties":{"name":"Barbour"},"geometry":{"type":"Polygon","coordinates":[[[-85.354736,32.147694],[-85.053504,32.06554],[-85.069935,31.994339],[-85.141136,31.780739],[-85.124705,31.764308],[-85.414983,31.621907],[-85.694307,31.61643],[-85.749076,31.61643],[-85.655968,31.879324],[-85.409506,32.147694],[-85.354736,32.147694]]]}},
+{"type":"Feature","id":"01007","properties":{"name":"Bibb"},"geometry":{"type":"Polygon","coordinates":[[[-87.063542,33.248559],[-87.025203,33.248559],[-86.882803,33.051389],[-87.019726,32.837788],[-87.326435,32.876127],[-87.419543,32.876127],[-87.419543,33.002096],[-87.063542,33.248559]]]}},
+{"type":"Feature","id":"01009","properties":{"name":"Blount"},"geometry":{"type":"Polygon","coordinates":[[[-86.488463,34.261793],[-86.455601,34.261793],[-86.302247,34.097484],[-86.324155,33.938653],[-86.576094,33.763391],[-86.685633,33.796253],[-86.954003,33.812683],[-86.964957,33.856499],[-86.488463,34.261793]]]}},
+{"type":"Feature","id":"01011","properties":{"name":"Bullock"},"geometry":{"type":"Polygon","coordinates":[[[-85.918861,32.273663],[-85.431413,32.235325],[-85.409506,32.147694],[-85.655968,31.879324],[-85.995538,32.049109],[-85.918861,32.273663]]]}},
+{"type":"Feature","id":"01013","properties":{"name":"Butler"},"geometry":{"type":"Polygon","coordinates":[[[-86.477509,31.966955],[-86.450124,31.966955],[-86.499417,31.523322],[-86.702064,31.523322],[-86.90471,31.753354],[-86.90471,31.830031],[-86.855418,31.961478],[-86.477509,31.966955]]]}},
+{"type":"Feature","id":"01015","properties":{"name":"Calhoun"},"geometry":{"type":"Polygon","coordinates":[[[-85.738122,33.966038],[-85.529998,33.94413],[-85.798368,33.555267],[-86.143416,33.681237],[-86.066738,33.840068],[-85.738122,33.966038]]]}},
+{"type":"Feature","id":"01017","properties":{"name":"Chambers"},"geometry":{"type":"Polygon","coordinates":[[[-85.404029,33.106158],[-85.234244,33.106158],[-85.184951,32.87065],[-85.130182,32.74468],[-85.184951,32.74468],[-85.595722,32.728249],[-85.595722,33.106158],[-85.404029,33.106158]]]}},
+{"type":"Feature","id":"01019","properties":{"name":"Cherokee"},"geometry":{"type":"Polygon","coordinates":[[[-85.513567,34.524686],[-85.464275,34.2837],[-85.42046,34.081054],[-85.398552,33.966038],[-85.529998,33.94413],[-85.738122,33.966038],[-85.842184,34.201546],[-85.513567,34.524686]]]}},
+{"type":"Feature","id":"01021","properties":{"name":"Chilton"},"geometry":{"type":"Polygon","coordinates":[[[-86.515848,33.018527],[-86.378924,32.755634],[-86.411786,32.706342],[-86.915664,32.662526],[-87.019726,32.728249],[-87.019726,32.837788],[-86.882803,33.051389],[-86.515848,33.018527]]]}},
+{"type":"Feature","id":"01023","properties":{"name":"Choctaw"},"geometry":{"type":"Polygon","coordinates":[[[-87.994621,32.312002],[-87.928898,32.312002],[-88.071299,31.988862],[-88.087729,31.698584],[-88.186314,31.698584],[-88.465638,31.698584],[-88.471115,31.895754],[-88.432777,32.229848],[-88.421823,32.306525],[-87.994621,32.312002]]]}},
+{"type":"Feature","id":"01025","properties":{"name":"Clarke"},"geometry":{"type":"Polygon","coordinates":[[[-87.819359,31.988862],[-87.666005,31.988862],[-87.501697,31.830031],[-87.76459,31.298768],[-87.945329,31.194706],[-88.087729,31.698584],[-88.071299,31.988862],[-87.819359,31.988862]]]}},
+{"type":"Feature","id":"01027","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-85.875046,33.500498],[-85.853138,33.500498],[-85.645014,33.495021],[-85.655968,33.106158],[-86.006492,33.089727],[-86.176277,33.106158],[-85.875046,33.500498]]]}},
+{"type":"Feature","id":"01029","properties":{"name":"Cleburne"},"geometry":{"type":"Polygon","coordinates":[[[-85.398552,33.966038],[-85.387598,33.900315],[-85.338305,33.653852],[-85.305444,33.484067],[-85.645014,33.495021],[-85.853138,33.500498],[-85.798368,33.555267],[-85.529998,33.94413],[-85.398552,33.966038]]]}},
+{"type":"Feature","id":"01031","properties":{"name":"Coffee"},"geometry":{"type":"Polygon","coordinates":[[[-86.055785,31.61643],[-85.787415,31.61643],[-85.792891,31.194706],[-86.192708,31.194706],[-86.192708,31.441168],[-86.143416,31.61643],[-86.055785,31.61643]]]}},
+{"type":"Feature","id":"01033","properties":{"name":"Colbert"},"geometry":{"type":"Polygon","coordinates":[[[-88.098683,34.891641],[-87.42502,34.798533],[-87.529082,34.568501],[-88.142499,34.579455],[-88.098683,34.891641]]]}},
+{"type":"Feature","id":"01035","properties":{"name":"Conecuh"},"geometry":{"type":"Polygon","coordinates":[[[-86.910187,31.753354],[-86.90471,31.753354],[-86.702064,31.523322],[-86.702064,31.194706],[-86.948526,31.260429],[-87.42502,31.260429],[-86.910187,31.753354]]]}},
+{"type":"Feature","id":"01037","properties":{"name":"Coosa"},"geometry":{"type":"Polygon","coordinates":[[[-86.176277,33.106158],[-86.006492,33.089727],[-86.006492,32.755634],[-86.378924,32.755634],[-86.515848,33.018527],[-86.488463,33.100681],[-86.176277,33.106158]]]}},
+{"type":"Feature","id":"01039","properties":{"name":"Covington"},"geometry":{"type":"Polygon","coordinates":[[[-86.400832,31.47403],[-86.192708,31.441168],[-86.192708,31.194706],[-86.187231,30.992059],[-86.389878,30.992059],[-86.685633,30.992059],[-86.702064,31.194706],[-86.702064,31.523322],[-86.499417,31.523322],[-86.400832,31.47403]]]}},
+{"type":"Feature","id":"01041","properties":{"name":"Crenshaw"},"geometry":{"type":"Polygon","coordinates":[[[-86.302247,31.988862],[-86.192708,31.966955],[-86.143416,31.61643],[-86.192708,31.441168],[-86.400832,31.47403],[-86.499417,31.523322],[-86.450124,31.966955],[-86.406309,32.049109],[-86.302247,31.988862]]]}},
+{"type":"Feature","id":"01043","properties":{"name":"Cullman"},"geometry":{"type":"Polygon","coordinates":[[[-86.986864,34.311085],[-86.581571,34.305608],[-86.455601,34.261793],[-86.488463,34.261793],[-86.964957,33.856499],[-87.151173,33.993423],[-87.107357,34.300131],[-87.112834,34.311085],[-86.986864,34.311085]]]}},
+{"type":"Feature","id":"01045","properties":{"name":"Dale"},"geometry":{"type":"Polygon","coordinates":[[[-85.694307,31.61643],[-85.414983,31.621907],[-85.414983,31.315199],[-85.710737,31.194706],[-85.792891,31.194706],[-85.787415,31.61643],[-85.749076,31.61643],[-85.694307,31.61643]]]}},
+{"type":"Feature","id":"01047","properties":{"name":"Dallas"},"geometry":{"type":"Polygon","coordinates":[[[-87.025203,32.717295],[-87.019726,32.728249],[-86.915664,32.662526],[-86.817079,32.339387],[-86.90471,32.049109],[-87.277142,32.147694],[-87.474312,32.262709],[-87.474312,32.306525],[-87.025203,32.717295]]]}},
+{"type":"Feature","id":"01049","properties":{"name":"DeKalb"},"geometry":{"type":"Polygon","coordinates":[[[-85.584768,34.858779],[-85.535475,34.623271],[-85.529998,34.590409],[-85.513567,34.524686],[-85.842184,34.201546],[-86.105077,34.201546],[-86.055785,34.475393],[-85.584768,34.858779]]]}},
+{"type":"Feature","id":"01051","properties":{"name":"Elmore"},"geometry":{"type":"Polygon","coordinates":[[[-86.006492,32.755634],[-85.885999,32.492741],[-86.022923,32.421541],[-86.307724,32.416064],[-86.411786,32.410587],[-86.411786,32.706342],[-86.378924,32.755634],[-86.006492,32.755634]]]}},
+{"type":"Feature","id":"01053","properties":{"name":"Escambia"},"geometry":{"type":"Polygon","coordinates":[[[-86.948526,31.260429],[-86.702064,31.194706],[-86.685633,30.992059],[-86.784218,30.997536],[-87.162127,30.997536],[-87.249758,30.997536],[-87.600282,30.997536],[-87.616713,31.243998],[-87.42502,31.260429],[-86.948526,31.260429]]]}},
+{"type":"Feature","id":"01055","properties":{"name":"Etowah"},"geometry":{"type":"Polygon","coordinates":[[[-86.105077,34.201546],[-85.842184,34.201546],[-85.738122,33.966038],[-86.066738,33.840068],[-86.291293,33.982469],[-86.324155,33.938653],[-86.302247,34.097484],[-86.105077,34.201546]]]}},
+{"type":"Feature","id":"01057","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-87.950806,33.922222],[-87.63862,33.916745],[-87.42502,33.60456],[-87.841267,33.522406],[-87.945329,33.522406],[-87.950806,33.922222]]]}},
+{"type":"Feature","id":"01059","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-88.142499,34.579455],[-87.529082,34.568501],[-87.529082,34.305608],[-87.633143,34.305608],[-88.175361,34.322039],[-88.15893,34.464439],[-88.142499,34.579455]]]}},
+{"type":"Feature","id":"01061","properties":{"name":"Geneva"},"geometry":{"type":"Polygon","coordinates":[[[-85.486183,31.200183],[-85.486183,30.997536],[-85.497137,30.997536],[-86.033877,30.992059],[-86.187231,30.992059],[-86.192708,31.194706],[-85.792891,31.194706],[-85.710737,31.194706],[-85.486183,31.200183]]]}},
+{"type":"Feature","id":"01063","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-87.83579,33.155451],[-87.715298,33.007573],[-87.813882,32.525602],[-87.852221,32.531079],[-88.169884,32.996619],[-87.83579,33.155451]]]}},
+{"type":"Feature","id":"01065","properties":{"name":"Hale"},"geometry":{"type":"Polygon","coordinates":[[[-87.644097,33.007573],[-87.419543,33.002096],[-87.419543,32.876127],[-87.523605,32.481787],[-87.813882,32.525602],[-87.715298,33.007573],[-87.644097,33.007573]]]}},
+{"type":"Feature","id":"01067","properties":{"name":"Henry"},"geometry":{"type":"Polygon","coordinates":[[[-85.414983,31.621907],[-85.124705,31.764308],[-85.048028,31.517845],[-85.086366,31.309722],[-85.414983,31.315199],[-85.414983,31.621907]]]}},
+{"type":"Feature","id":"01069","properties":{"name":"Houston"},"geometry":{"type":"Polygon","coordinates":[[[-85.414983,31.315199],[-85.086366,31.309722],[-85.02612,31.074213],[-85.004212,31.003013],[-85.486183,30.997536],[-85.486183,31.200183],[-85.710737,31.194706],[-85.414983,31.315199]]]}},
+{"type":"Feature","id":"01071","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-85.864092,34.990226],[-85.606675,34.984749],[-85.584768,34.858779],[-86.055785,34.475393],[-86.329632,34.601363],[-86.313201,34.990226],[-85.864092,34.990226]]]}},
+{"type":"Feature","id":"01073","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-86.685633,33.796253],[-86.576094,33.763391],[-86.515848,33.544313],[-87.025203,33.248559],[-87.063542,33.248559],[-87.266188,33.511452],[-86.954003,33.812683],[-86.685633,33.796253]]]}},
+{"type":"Feature","id":"01075","properties":{"name":"Lamar"},"geometry":{"type":"Polygon","coordinates":[[[-88.208222,34.059146],[-87.950806,33.922222],[-87.945329,33.522406],[-88.273945,33.53336],[-88.246561,33.74696],[-88.208222,34.059146]]]}},
+{"type":"Feature","id":"01077","properties":{"name":"Lauderdale"},"geometry":{"type":"Polygon","coordinates":[[[-87.983668,35.006656],[-87.605759,35.00118],[-87.222373,35.00118],[-87.211419,35.00118],[-87.260711,34.760194],[-87.42502,34.798533],[-88.098683,34.891641],[-88.202745,34.995703],[-87.983668,35.006656]]]}},
+{"type":"Feature","id":"01079","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-87.42502,34.798533],[-87.260711,34.760194],[-87.107357,34.683517],[-87.112834,34.311085],[-87.107357,34.300131],[-87.529082,34.305608],[-87.529082,34.568501],[-87.42502,34.798533]]]}},
+{"type":"Feature","id":"01081","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-85.184951,32.74468],[-85.130182,32.74468],[-85.080889,32.607757],[-84.998735,32.509172],[-85.020643,32.509172],[-85.431413,32.410587],[-85.694307,32.580372],[-85.694307,32.596803],[-85.595722,32.728249],[-85.184951,32.74468]]]}},
+{"type":"Feature","id":"01083","properties":{"name":"Limestone"},"geometry":{"type":"Polygon","coordinates":[[[-87.211419,35.00118],[-86.838987,34.990226],[-86.784218,34.990226],[-86.789695,34.55207],[-87.03068,34.650655],[-87.107357,34.683517],[-87.260711,34.760194],[-87.211419,35.00118]]]}},
+{"type":"Feature","id":"01085","properties":{"name":"Lowndes"},"geometry":{"type":"Polygon","coordinates":[[[-86.499417,32.344863],[-86.406309,32.049109],[-86.450124,31.966955],[-86.477509,31.966955],[-86.855418,31.961478],[-86.90471,32.049109],[-86.817079,32.339387],[-86.499417,32.344863]]]}},
+{"type":"Feature","id":"01087","properties":{"name":"Macon"},"geometry":{"type":"Polygon","coordinates":[[[-85.694307,32.580372],[-85.431413,32.410587],[-85.431413,32.235325],[-85.918861,32.273663],[-86.022923,32.421541],[-85.885999,32.492741],[-85.694307,32.596803],[-85.694307,32.580372]]]}},
+{"type":"Feature","id":"01089","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-86.784218,34.990226],[-86.318678,34.990226],[-86.313201,34.990226],[-86.329632,34.601363],[-86.548709,34.546593],[-86.789695,34.55207],[-86.784218,34.990226]]]}},
+{"type":"Feature","id":"01091","properties":{"name":"Marengo"},"geometry":{"type":"Polygon","coordinates":[[[-87.813882,32.525602],[-87.523605,32.481787],[-87.474312,32.306525],[-87.474312,32.262709],[-87.666005,31.988862],[-87.819359,31.988862],[-88.071299,31.988862],[-87.928898,32.312002],[-87.852221,32.531079],[-87.813882,32.525602]]]}},
+{"type":"Feature","id":"01093","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-88.175361,34.322039],[-87.633143,34.305608],[-87.63862,34.004376],[-87.63862,33.916745],[-87.950806,33.922222],[-88.208222,34.059146],[-88.202745,34.08653],[-88.175361,34.322039]]]}},
+{"type":"Feature","id":"01095","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-86.329632,34.601363],[-86.055785,34.475393],[-86.105077,34.201546],[-86.302247,34.097484],[-86.455601,34.261793],[-86.581571,34.305608],[-86.548709,34.546593],[-86.329632,34.601363]]]}},
+{"type":"Feature","id":"01097","properties":{"name":"Mobile"},"geometry":{"type":"Polygon","coordinates":[[[-87.972714,31.161844],[-88.005575,30.685351],[-88.394438,30.367688],[-88.410869,30.734643],[-88.4273,30.997536],[-88.432777,31.112552],[-87.972714,31.161844]]]}},
+{"type":"Feature","id":"01099","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-87.501697,31.830031],[-86.90471,31.830031],[-86.90471,31.753354],[-86.910187,31.753354],[-87.42502,31.260429],[-87.616713,31.243998],[-87.76459,31.298768],[-87.501697,31.830031]]]}},
+{"type":"Feature","id":"01101","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-86.307724,32.416064],[-86.022923,32.421541],[-85.918861,32.273663],[-85.995538,32.049109],[-86.192708,31.966955],[-86.302247,31.988862],[-86.406309,32.049109],[-86.499417,32.344863],[-86.411786,32.410587],[-86.307724,32.416064]]]}},
+{"type":"Feature","id":"01103","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-87.03068,34.650655],[-86.789695,34.55207],[-86.548709,34.546593],[-86.581571,34.305608],[-86.986864,34.311085],[-87.112834,34.311085],[-87.107357,34.683517],[-87.03068,34.650655]]]}},
+{"type":"Feature","id":"01105","properties":{"name":"Perry"},"geometry":{"type":"Polygon","coordinates":[[[-87.326435,32.876127],[-87.019726,32.837788],[-87.019726,32.728249],[-87.025203,32.717295],[-87.474312,32.306525],[-87.523605,32.481787],[-87.419543,32.876127],[-87.326435,32.876127]]]}},
+{"type":"Feature","id":"01107","properties":{"name":"Pickens"},"geometry":{"type":"Polygon","coordinates":[[[-88.273945,33.53336],[-87.945329,33.522406],[-87.841267,33.522406],[-87.83579,33.155451],[-88.169884,32.996619],[-88.339669,32.991142],[-88.306807,33.286897],[-88.273945,33.53336]]]}},
+{"type":"Feature","id":"01109","properties":{"name":"Pike"},"geometry":{"type":"Polygon","coordinates":[[[-85.995538,32.049109],[-85.655968,31.879324],[-85.749076,31.61643],[-85.787415,31.61643],[-86.055785,31.61643],[-86.143416,31.61643],[-86.192708,31.966955],[-85.995538,32.049109]]]}},
+{"type":"Feature","id":"01111","properties":{"name":"Randolph"},"geometry":{"type":"Polygon","coordinates":[[[-85.645014,33.495021],[-85.305444,33.484067],[-85.29449,33.429298],[-85.234244,33.128066],[-85.234244,33.106158],[-85.404029,33.106158],[-85.595722,33.106158],[-85.655968,33.106158],[-85.645014,33.495021]]]}},
+{"type":"Feature","id":"01113","properties":{"name":"Russell"},"geometry":{"type":"Polygon","coordinates":[[[-85.020643,32.509172],[-84.998735,32.509172],[-84.982304,32.372248],[-84.922058,32.229848],[-85.053504,32.06554],[-85.354736,32.147694],[-85.409506,32.147694],[-85.431413,32.235325],[-85.431413,32.410587],[-85.020643,32.509172]]]}},
+{"type":"Feature","id":"01115","properties":{"name":"St. Clair"},"geometry":{"type":"Polygon","coordinates":[[[-86.291293,33.982469],[-86.066738,33.840068],[-86.143416,33.681237],[-86.198185,33.697668],[-86.378924,33.390959],[-86.515848,33.544313],[-86.576094,33.763391],[-86.324155,33.938653],[-86.291293,33.982469]]]}},
+{"type":"Feature","id":"01117","properties":{"name":"Shelby"},"geometry":{"type":"Polygon","coordinates":[[[-86.515848,33.544313],[-86.378924,33.390959],[-86.488463,33.100681],[-86.515848,33.018527],[-86.882803,33.051389],[-87.025203,33.248559],[-86.515848,33.544313]]]}},
+{"type":"Feature","id":"01119","properties":{"name":"Sumter"},"geometry":{"type":"Polygon","coordinates":[[[-88.339669,32.991142],[-88.169884,32.996619],[-87.852221,32.531079],[-87.928898,32.312002],[-87.994621,32.312002],[-88.421823,32.306525],[-88.388961,32.580372],[-88.345146,32.930896],[-88.339669,32.991142]]]}},
+{"type":"Feature","id":"01121","properties":{"name":"Talladega"},"geometry":{"type":"Polygon","coordinates":[[[-86.198185,33.697668],[-86.143416,33.681237],[-85.798368,33.555267],[-85.853138,33.500498],[-85.875046,33.500498],[-86.176277,33.106158],[-86.488463,33.100681],[-86.378924,33.390959],[-86.198185,33.697668]]]}},
+{"type":"Feature","id":"01123","properties":{"name":"Tallapoosa"},"geometry":{"type":"Polygon","coordinates":[[[-85.655968,33.106158],[-85.595722,33.106158],[-85.595722,32.728249],[-85.694307,32.596803],[-85.885999,32.492741],[-86.006492,32.755634],[-86.006492,33.089727],[-85.655968,33.106158]]]}},
+{"type":"Feature","id":"01125","properties":{"name":"Tuscaloosa"},"geometry":{"type":"Polygon","coordinates":[[[-87.841267,33.522406],[-87.42502,33.60456],[-87.266188,33.511452],[-87.063542,33.248559],[-87.419543,33.002096],[-87.644097,33.007573],[-87.715298,33.007573],[-87.83579,33.155451],[-87.841267,33.522406]]]}},
+{"type":"Feature","id":"01127","properties":{"name":"Walker"},"geometry":{"type":"Polygon","coordinates":[[[-87.627666,34.004376],[-87.151173,33.993423],[-86.964957,33.856499],[-86.954003,33.812683],[-87.266188,33.511452],[-87.42502,33.60456],[-87.63862,33.916745],[-87.63862,34.004376],[-87.627666,34.004376]]]}},
+{"type":"Feature","id":"01129","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-88.186314,31.698584],[-88.087729,31.698584],[-87.945329,31.194706],[-87.972714,31.161844],[-88.432777,31.112552],[-88.449208,31.435691],[-88.465638,31.698584],[-88.186314,31.698584]]]}},
+{"type":"Feature","id":"01131","properties":{"name":"Wilcox"},"geometry":{"type":"Polygon","coordinates":[[[-87.277142,32.147694],[-86.90471,32.049109],[-86.855418,31.961478],[-86.90471,31.830031],[-87.501697,31.830031],[-87.666005,31.988862],[-87.474312,32.262709],[-87.277142,32.147694]]]}},
+{"type":"Feature","id":"01133","properties":{"name":"Winston"},"geometry":{"type":"Polygon","coordinates":[[[-87.633143,34.305608],[-87.529082,34.305608],[-87.107357,34.300131],[-87.151173,33.993423],[-87.627666,34.004376],[-87.63862,34.004376],[-87.633143,34.305608]]]}},
+{"type":"Feature","id":"02013","properties":{"name":"Aleutians East"},"geometry":{"type":"Polygon","coordinates":[[[-158.893615,56.793925],[-159.901372,56.492694],[-159.86851,55.89023],[-159.561801,55.632814],[-159.813741,55.857368],[-160.536697,55.473983],[-161.506115,55.364444],[-161.960701,55.107028],[-163.034181,54.942719],[-163.587352,54.614103],[-164.847049,54.416933],[-164.551294,54.88795],[-162.880827,55.183705],[-161.807347,55.89023],[-160.585989,55.988815],[-159.813741,56.547463],[-158.893615,56.804879],[-158.893615,56.793925]]]}},
+{"type":"Feature","id":"02016","properties":{"name":"Aleutians West"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-166.375115,54.01164],[-166.117699,53.852808],[-166.878994,53.431084],[-167.032348,53.945916],[-166.375115,54.01164]]],[[[-168.790446,53.157237],[-168.007243,53.568007],[-167.842935,53.387268],[-168.971185,52.877913],[-168.790446,53.157237]]]]}},
+{"type":"Feature","id":"02020","properties":{"name":"Anchorage"},"geometry":{"type":"Polygon","coordinates":[[[-149.259676,61.482186],[-148.460043,61.427417],[-148.470997,60.852338],[-148.744844,60.731845],[-149.730693,60.994739],[-149.73617,60.994739],[-149.988109,61.230247],[-149.259676,61.482186]]]}},
+{"type":"Feature","id":"02050","properties":{"name":"Bethel"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-153.000427,62.292773],[-153.000427,61.427417],[-153.427628,61.427417],[-153.438582,60.907107],[-155.963451,60.907107],[-158.942907,60.901631],[-159.364631,60.644214],[-160.021864,59.784335],[-160.821498,59.264025],[-161.035098,58.842301],[-161.095345,58.820393],[-161.347284,58.732762],[-161.752577,58.552023],[-162.048332,59.253071],[-161.703285,59.48858],[-162.234548,60.091043],[-163.171105,59.844581],[-164.113139,59.839104],[-164.189816,60.02532],[-165.361881,60.507291],[-165.159234,60.918061],[-164.156954,61.022123],[-163.992646,61.372647],[-162.508395,61.558863],[-161.900455,61.482186],[-160.40525,61.810803],[-160.536697,61.947726],[-159.266046,61.947726],[-158.532136,62.117511],[-157.064316,62.02988],[-153.734337,62.02988],[-153.000427,62.292773]]],[[[-166.364161,60.359413],[-165.685021,60.277259],[-165.575482,59.904827],[-166.062929,59.745996],[-167.344534,60.074613],[-166.364161,60.359413]]]]}},
+{"type":"Feature","id":"02060","properties":{"name":"Bristol Bay"},"geometry":{"type":"Polygon","coordinates":[[[-156.987639,58.886116],[-156.319453,58.89707],[-156.319453,58.612269],[-157.266963,58.612269],[-156.987639,58.886116]]]}},
+{"type":"Feature","id":"02068","properties":{"name":"Denali"},"geometry":{"type":"Polygon","coordinates":[[[-149.232292,64.35758],[-147.99998,64.341149],[-147.003177,64.258995],[-146.975792,63.481269],[-148.038319,63.333392],[-149.506139,63.333392],[-151.888608,62.796652],[-153.000427,62.725452],[-152.436302,63.169084],[-152.852549,63.651055],[-152.244609,63.656532],[-152.047439,64.001579],[-151.302575,64.012533],[-150.749404,64.363057],[-149.232292,64.35758]]]}},
+{"type":"Feature","id":"02070","properties":{"name":"Dillingham"},"geometry":{"type":"Polygon","coordinates":[[[-155.963451,60.907107],[-155.957974,59.674796],[-157.245055,59.247595],[-157.157424,58.858732],[-158.039212,58.634177],[-158.619768,58.913501],[-158.701922,58.480823],[-159.0634,58.420577],[-159.731586,58.929932],[-160.317619,59.072332],[-161.035098,58.842301],[-160.821498,59.264025],[-160.021864,59.784335],[-159.364631,60.644214],[-158.942907,60.901631],[-155.963451,60.907107]]]}},
+{"type":"Feature","id":"02090","properties":{"name":"Fairbanks North Star"},"geometry":{"type":"Polygon","coordinates":[[[-146.696468,65.321521],[-146.19259,65.452968],[-145.644896,65.031244],[-143.886798,65.09149],[-144.06206,64.680719],[-146.236405,64.308287],[-147.003177,64.258995],[-147.99998,64.341149],[-148.646259,64.604042],[-148.66269,65.211983],[-146.696468,65.321521]]]}},
+{"type":"Feature","id":"02100","properties":{"name":"Haines"},"geometry":{"type":"Polygon","coordinates":[[[-135.72068,59.729565],[-135.030585,59.346179],[-134.329537,58.962794],[-135.178463,58.973748],[-135.38111,59.033994],[-135.05797,58.190545],[-135.446833,58.398669],[-135.567326,58.946363],[-136.487451,59.258548],[-136.25742,59.625503],[-135.72068,59.729565]]]}},
+{"type":"Feature","id":"02110","properties":{"name":"Juneau"},"geometry":{"type":"Polygon","coordinates":[[[-135.178463,58.973748],[-134.329537,58.962794],[-133.382026,58.426053],[-133.173903,58.152206],[-133.529904,57.911221],[-133.601104,57.861929],[-135.074401,58.502731],[-135.178463,58.973748]]]}},
+{"type":"Feature","id":"02122","properties":{"name":"Kenai Peninsula"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-153.427628,61.427417],[-153.000427,61.427417],[-151.335437,61.42194],[-150.973959,61.191908],[-152.080301,60.693507],[-152.567748,60.069136],[-153.214027,59.636457],[-153.608367,59.620026],[-154.260123,59.143533],[-153.312612,58.847778],[-153.329043,58.853255],[-154.303938,58.645131],[-154.638032,58.645131],[-154.747571,59.253071],[-153.652183,59.784335],[-153.438582,60.907107],[-153.427628,61.427417]]],[[[-149.730693,60.994739],[-148.744844,60.731845],[-148.586013,59.959597],[-149.358261,60.101997],[-149.741647,59.729565],[-151.592853,59.159963],[-151.888608,59.422857],[-151.160175,59.592642],[-151.8667,59.778858],[-151.423068,60.211536],[-151.406637,60.720892],[-150.404357,61.038554],[-149.73617,60.994739],[-149.730693,60.994739]]]]}},
+{"type":"Feature","id":"02130","properties":{"name":"Ketchikan Gateway"},"geometry":{"type":"Polygon","coordinates":[[[-131.706083,55.89023],[-131.240543,55.977861],[-131.032419,55.28229],[-131.843006,55.457552],[-131.706083,55.89023]]]}},
+{"type":"Feature","id":"02150","properties":{"name":"Kodiak Island"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-153.329043,58.853255],[-153.312612,58.847778],[-154.062953,58.4863],[-154.210831,58.135776],[-155.120003,57.955037],[-156.357791,57.16088],[-156.752131,57.16088],[-155.328126,57.878359],[-155.333603,58.190545],[-154.468247,58.36033],[-154.303938,58.645131],[-153.329043,58.853255]]],[[[-152.94018,58.026237],[-152.666333,58.562977],[-152.080301,58.152206],[-152.94018,58.026237]]],[[[-153.958891,57.538789],[-153.936983,57.812636],[-153.301658,57.993375],[-152.151501,57.620943],[-153.695998,56.859649],[-154.303938,56.848695],[-154.742094,57.314235],[-154.227261,57.659282],[-153.958891,57.538789]]]]}},
+{"type":"Feature","id":"02164","properties":{"name":"Lake and Peninsula"},"geometry":{"type":"Polygon","coordinates":[[[-153.438582,60.907107],[-153.652183,59.784335],[-154.747571,59.253071],[-154.638032,58.645131],[-154.303938,58.645131],[-154.468247,58.36033],[-155.333603,58.190545],[-155.328126,57.878359],[-156.752131,57.16088],[-156.357791,57.16088],[-157.464133,56.62414],[-158.32949,56.48174],[-158.115889,56.2298],[-158.510229,55.977861],[-159.496078,55.857368],[-159.561801,55.632814],[-159.86851,55.89023],[-159.901372,56.492694],[-158.893615,56.793925],[-158.893615,56.804879],[-158.378782,57.264942],[-157.601057,57.609989],[-157.453179,58.508208],[-157.266963,58.612269],[-156.319453,58.612269],[-156.319453,58.89707],[-156.987639,58.886116],[-157.157424,58.858732],[-157.245055,59.247595],[-155.957974,59.674796],[-155.963451,60.907107],[-153.438582,60.907107]]]}},
+{"type":"Feature","id":"02170","properties":{"name":"Matanuska-Susitna"},"geometry":{"type":"Polygon","coordinates":[[[-153.000427,62.725452],[-151.888608,62.796652],[-149.506139,63.333392],[-148.038319,63.333392],[-146.975792,63.481269],[-146.488345,63.481269],[-146.482868,63.174561],[-146.428098,62.248958],[-146.981269,62.248958],[-146.942931,61.476709],[-148.460043,61.427417],[-149.259676,61.482186],[-149.988109,61.230247],[-150.973959,61.191908],[-151.335437,61.42194],[-153.000427,61.427417],[-153.000427,62.292773],[-153.000427,62.725452]]]}},
+{"type":"Feature","id":"02180","properties":{"name":"Nome"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-164.403417,66.581218],[-164.244585,65.781584],[-163.757138,65.436537],[-159.802787,65.436537],[-159.594663,65.524168],[-159.578232,64.921705],[-159.978049,64.746443],[-159.956141,64.050871],[-159.698725,63.793455],[-160.690051,63.536039],[-160.848882,63.010253],[-161.993563,63.010253],[-162.585072,63.273146],[-162.294794,63.541516],[-161.13916,63.503177],[-160.766728,63.771547],[-161.374669,64.532842],[-160.783159,64.719058],[-161.144637,64.921705],[-162.541257,64.532842],[-162.787719,64.324718],[-163.598306,64.565704],[-165.000403,64.434257],[-166.188899,64.576658],[-166.884471,65.140782],[-166.34773,65.277706],[-167.47598,65.414629],[-168.105828,65.682999],[-165.88219,66.312848],[-164.403417,66.581218]]],[[[-171.742517,63.716778],[-170.94836,63.5689],[-170.488297,63.69487],[-169.518879,63.366254],[-168.686384,63.295053],[-169.639372,62.939052],[-170.866206,63.415546],[-171.463193,63.306007],[-171.742517,63.716778]]]]}},
+{"type":"Feature","id":"02185","properties":{"name":"North Slope"},"geometry":{"type":"Polygon","coordinates":[[[-141.00045,68.498147],[-146.000897,68.487193],[-145.99542,67.999745],[-146.970315,67.999745],[-155.300742,67.999745],[-157.157424,68.207869],[-161.993563,68.2243],[-162.683657,68.300977],[-164.502001,68.229777],[-164.496525,68.021653],[-165.361881,68.02713],[-166.681824,68.339316],[-166.216284,68.881533],[-164.255539,68.930825],[-163.110859,69.374457],[-163.034181,69.724981],[-161.851162,70.311014],[-161.396576,70.239814],[-159.649432,70.792985],[-158.033735,70.831323],[-156.812377,71.285909],[-155.585543,71.170894],[-155.974405,70.809416],[-155.032372,71.148986],[-154.183446,70.7656],[-153.235935,70.924431],[-152.26104,70.842277],[-152.419871,70.606769],[-151.877654,70.431507],[-149.462323,70.519138],[-147.682318,70.201475],[-145.858496,70.168614],[-144.620708,69.971444],[-143.914183,70.130275],[-142.747594,70.042644],[-141.378359,69.63735],[-141.00045,69.648304],[-141.00045,68.498147]]]}},
+{"type":"Feature","id":"02188","properties":{"name":"Northwest Arctic"},"geometry":{"type":"Polygon","coordinates":[[[-162.683657,68.300977],[-161.993563,68.2243],[-157.157424,68.207869],[-155.300742,67.999745],[-155.350034,67.775191],[-154.687324,67.599929],[-154.747571,67.254881],[-154.145107,67.161773],[-154.199877,66.718141],[-155.514342,66.570264],[-155.563635,66.307371],[-157.891334,66.477156],[-157.896811,66.126632],[-158.964815,66.121155],[-159.594663,65.956846],[-159.594663,65.524168],[-159.802787,65.436537],[-163.757138,65.436537],[-164.244585,65.781584],[-164.403417,66.581218],[-163.751661,66.553833],[-163.768091,66.060908],[-161.840208,66.02257],[-160.991283,66.23617],[-162.502918,66.740049],[-161.884024,66.718141],[-161.851162,67.052235],[-162.902735,67.008419],[-163.740707,67.128912],[-164.009077,67.534205],[-165.361881,68.02713],[-164.496525,68.021653],[-164.502001,68.229777],[-162.683657,68.300977]]]}},
+{"type":"Feature","id":"02201","properties":{"name":"Prince of Wales-Outer Ketchikan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-130.99408,56.262662],[-131.065281,56.405062],[-130.101339,56.114785],[-129.980846,55.28229],[-130.336847,54.920812],[-130.917403,54.789365],[-131.092665,55.189182],[-130.900972,55.698537],[-131.240543,55.977861],[-131.706083,55.89023],[-131.974453,55.49589],[-132.220915,55.736876],[-130.99408,56.262662]]],[[[-133.595627,56.350293],[-133.162949,56.317431],[-131.97993,55.178228],[-132.029222,54.701734],[-132.544054,55.096074],[-132.867194,54.701734],[-133.157472,54.95915],[-133.102702,55.42469],[-133.694212,55.780691],[-133.32178,55.81903],[-133.595627,56.350293]]]]}},
+{"type":"Feature","id":"02220","properties":{"name":"Sitka"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-136.372436,57.829067],[-135.589233,57.89479],[-134.937477,57.763344],[-134.822462,57.500451],[-135.572802,57.675713],[-135.890465,57.407343],[-136.372436,57.829067]]],[[[-134.66363,56.28457],[-134.669107,56.169554],[-135.413971,56.810356],[-135.687818,57.369004],[-135.419448,57.566174],[-134.849846,57.407343],[-134.636246,56.28457],[-134.66363,56.28457]]]]}},
+{"type":"Feature","id":"02232","properties":{"name":"Skagway-Hoonah-Angoon"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-135.030585,59.346179],[-135.72068,59.729565],[-135.025108,59.565257],[-135.030585,59.346179]]],[[[-135.567326,58.946363],[-135.446833,58.398669],[-136.591513,58.21793],[-137.944318,58.803962],[-137.522593,58.908024],[-136.487451,59.258548],[-135.567326,58.946363]]],[[[-134.712923,58.223407],[-134.176183,58.157683],[-133.869474,57.363527],[-134.565045,57.023957],[-134.712923,58.223407]]],[[[-135.589233,57.89479],[-136.372436,57.829067],[-136.377913,58.267222],[-135.780926,58.28913],[-134.91557,57.976944],[-135.589233,57.89479]]],[[[-133.529904,57.911221],[-133.173903,58.152206],[-132.368792,57.347096],[-133.12461,57.188265],[-133.51895,57.177311],[-133.601104,57.861929],[-133.529904,57.911221]]]]}},
+{"type":"Feature","id":"02240","properties":{"name":"Southeast Fairbanks"},"geometry":{"type":"Polygon","coordinates":[[[-141.838422,65.463922],[-141.00045,65.841831],[-141.00045,61.903911],[-141.827468,61.898434],[-141.964392,62.511851],[-142.314916,62.681636],[-143.103595,62.615913],[-143.125503,63.114314],[-145.146494,63.136222],[-145.360095,63.223853],[-146.482868,63.174561],[-146.488345,63.481269],[-146.975792,63.481269],[-147.003177,64.258995],[-146.236405,64.308287],[-144.06206,64.680719],[-142.605194,65.392722],[-141.838422,65.463922]]]}},
+{"type":"Feature","id":"02261","properties":{"name":"Valdez-Cordova"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-145.360095,63.223853],[-145.146494,63.136222],[-143.125503,63.114314],[-143.103595,62.615913],[-142.314916,62.681636],[-141.964392,62.511851],[-141.827468,61.898434],[-141.00045,61.903911],[-141.00045,60.392275],[-141.78913,60.518245],[-143.169319,60.518245],[-143.886798,59.997935],[-144.231845,60.140336],[-146.110436,60.468952],[-146.044712,60.742799],[-146.669084,60.693507],[-146.745761,60.9564],[-148.366935,60.764707],[-147.961642,60.140336],[-148.586013,59.959597],[-148.744844,60.731845],[-148.470997,60.852338],[-148.460043,61.427417],[-146.942931,61.476709],[-146.981269,62.248958],[-146.428098,62.248958],[-146.482868,63.174561],[-145.360095,63.223853]]],[[[-147.079854,60.200582],[-147.874011,59.784335],[-147.112716,60.381321],[-147.079854,60.200582]]]]}},
+{"type":"Feature","id":"02270","properties":{"name":"Wade Hampton"},"geometry":{"type":"Polygon","coordinates":[[[-162.585072,63.273146],[-161.993563,63.010253],[-160.848882,63.010253],[-161.046052,62.205142],[-160.536697,61.947726],[-160.40525,61.810803],[-161.900455,61.482186],[-162.508395,61.558863],[-163.992646,61.372647],[-164.156954,61.022123],[-165.159234,60.918061],[-164.962064,61.022123],[-166.106745,61.49314],[-165.59739,61.860095],[-165.674067,62.139419],[-165.044219,62.539236],[-164.633448,63.097884],[-164.069323,63.262192],[-163.313505,63.037637],[-162.585072,63.273146]]]}},
+{"type":"Feature","id":"02280","properties":{"name":"Wrangell-Petersburg"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-133.12461,57.188265],[-132.368792,57.347096],[-131.837529,56.602232],[-131.065281,56.405062],[-130.99408,56.262662],[-132.220915,55.736876],[-132.719317,56.218847],[-132.450946,56.673433],[-133.51895,57.177311],[-133.12461,57.188265]]],[[[-133.907813,56.930849],[-133.102702,57.007526],[-132.538577,56.585802],[-133.66135,56.448878],[-133.907813,56.930849]]],[[[-134.115936,56.48174],[-134.417168,56.848695],[-133.880428,56.722725],[-134.115936,56.48174]]],[[[-134.66363,56.28457],[-134.636246,56.28457],[-134.669107,56.169554],[-134.66363,56.28457]]]]}},
+{"type":"Feature","id":"02282","properties":{"name":"Yakutat"},"geometry":{"type":"Polygon","coordinates":[[[-137.522593,58.908024],[-137.944318,58.803962],[-138.11958,59.02304],[-139.85577,59.537872],[-139.625738,59.88292],[-140.315833,59.696704],[-141.46599,59.970551],[-142.906426,60.091043],[-143.886798,59.997935],[-143.169319,60.518245],[-141.78913,60.518245],[-141.00045,60.392275],[-139.987216,60.184151],[-139.088998,60.359413],[-139.198537,60.091043],[-137.604747,59.242118],[-137.522593,58.908024]]]}},
+{"type":"Feature","id":"02290","properties":{"name":"Yukon-Koyukuk"},"geometry":{"type":"Polygon","coordinates":[[[-146.970315,67.999745],[-145.99542,67.999745],[-146.000897,68.487193],[-141.00045,68.498147],[-141.00045,65.841831],[-141.838422,65.463922],[-142.605194,65.392722],[-144.06206,64.680719],[-143.886798,65.09149],[-145.644896,65.031244],[-146.19259,65.452968],[-146.696468,65.321521],[-148.66269,65.211983],[-148.646259,64.604042],[-147.99998,64.341149],[-149.232292,64.35758],[-150.749404,64.363057],[-151.302575,64.012533],[-152.047439,64.001579],[-152.244609,63.656532],[-152.852549,63.651055],[-152.436302,63.169084],[-153.000427,62.725452],[-153.000427,62.292773],[-153.734337,62.02988],[-157.064316,62.02988],[-158.532136,62.117511],[-159.266046,61.947726],[-160.536697,61.947726],[-161.046052,62.205142],[-160.848882,63.010253],[-160.690051,63.536039],[-159.698725,63.793455],[-159.956141,64.050871],[-159.978049,64.746443],[-159.578232,64.921705],[-159.594663,65.524168],[-159.594663,65.956846],[-158.964815,66.121155],[-157.896811,66.126632],[-157.891334,66.477156],[-155.563635,66.307371],[-155.514342,66.570264],[-154.199877,66.718141],[-154.145107,67.161773],[-154.747571,67.254881],[-154.687324,67.599929],[-155.350034,67.775191],[-155.300742,67.999745],[-146.970315,67.999745]]]}},
+{"type":"Feature","id":"04001","properties":{"name":"Apache"},"geometry":{"type":"Polygon","coordinates":[[[-110.000968,37.000263],[-109.042503,37.000263],[-109.04798,36.00346],[-109.04798,34.957364],[-109.04798,34.579455],[-109.04798,33.779822],[-109.497089,33.653852],[-109.743552,33.500498],[-109.891429,33.566221],[-109.842137,35.516012],[-110.000968,35.663889],[-110.000968,37.000263]]]}},
+{"type":"Feature","id":"04003","properties":{"name":"Cochise"},"geometry":{"type":"Polygon","coordinates":[[[-109.831183,32.427018],[-109.113704,32.427018],[-109.04798,32.427018],[-109.04798,31.331629],[-110.461031,31.331629],[-110.450077,31.731446],[-110.450077,32.427018],[-109.831183,32.427018]]]}},
+{"type":"Feature","id":"04005","properties":{"name":"Coconino"},"geometry":{"type":"Polygon","coordinates":[[[-110.751309,37.00574],[-110.751309,34.261793],[-111.556419,34.469916],[-111.775497,34.979272],[-112.334144,34.973795],[-112.438206,35.258596],[-113.336425,35.526966],[-113.352855,36.047275],[-112.629899,36.392322],[-112.542268,37.000263],[-111.414018,37.000263],[-110.751309,37.00574]]]}},
+{"type":"Feature","id":"04007","properties":{"name":"Gila"},"geometry":{"type":"Polygon","coordinates":[[[-111.556419,34.469916],[-110.751309,34.261793],[-110.751309,33.998899],[-110.000968,33.998899],[-110.000968,33.577175],[-110.450077,33.193789],[-110.778693,32.985665],[-111.041587,33.467636],[-111.496173,33.998899],[-111.556419,34.469916]]]}},
+{"type":"Feature","id":"04009","properties":{"name":"Graham"},"geometry":{"type":"Polygon","coordinates":[[[-109.743552,33.500498],[-109.497089,33.653852],[-109.497089,33.078773],[-109.113704,32.427018],[-109.831183,32.427018],[-110.450077,32.427018],[-110.450077,32.514649],[-110.450077,33.193789],[-110.000968,33.577175],[-109.891429,33.566221],[-109.743552,33.500498]]]}},
+{"type":"Feature","id":"04011","properties":{"name":"Greenlee"},"geometry":{"type":"Polygon","coordinates":[[[-109.497089,33.653852],[-109.04798,33.779822],[-109.04798,33.21022],[-109.04798,32.777542],[-109.04798,32.427018],[-109.113704,32.427018],[-109.497089,33.078773],[-109.497089,33.653852]]]}},
+{"type":"Feature","id":"04012","properties":{"name":"La Paz"},"geometry":{"type":"Polygon","coordinates":[[[-113.418579,34.300131],[-113.330948,34.316562],[-113.336425,33.998899],[-113.336425,33.380005],[-113.993657,33.462159],[-114.513967,33.029481],[-114.628982,33.434775],[-114.43729,34.081054],[-114.136058,34.305608],[-113.418579,34.300131]]]}},
+{"type":"Feature","id":"04013","properties":{"name":"Maricopa"},"geometry":{"type":"Polygon","coordinates":[[[-111.496173,33.998899],[-111.041587,33.467636],[-111.578327,33.467636],[-111.583804,33.204743],[-112.202698,33.308805],[-112.202698,32.509172],[-113.336425,32.503695],[-113.336425,33.380005],[-113.336425,33.998899],[-112.273898,33.883884],[-111.496173,33.998899]]]}},
+{"type":"Feature","id":"04015","properties":{"name":"Mohave"},"geometry":{"type":"Polygon","coordinates":[[[-112.898269,37.000263],[-112.542268,37.000263],[-112.629899,36.392322],[-113.352855,36.047275],[-113.336425,35.526966],[-113.330948,34.316562],[-113.418579,34.300131],[-114.136058,34.305608],[-114.634459,35.00118],[-114.754952,36.085614],[-114.048427,36.195153],[-114.048427,36.841432],[-114.048427,37.000263],[-112.898269,37.000263]]]}},
+{"type":"Feature","id":"04017","properties":{"name":"Navajo"},"geometry":{"type":"Polygon","coordinates":[[[-110.000968,37.000263],[-110.000968,35.663889],[-109.842137,35.516012],[-109.891429,33.566221],[-110.000968,33.577175],[-110.000968,33.998899],[-110.751309,33.998899],[-110.751309,34.261793],[-110.751309,37.00574],[-110.000968,37.000263]]]}},
+{"type":"Feature","id":"04019","properties":{"name":"Pima"},"geometry":{"type":"Polygon","coordinates":[[[-110.696539,32.514649],[-110.450077,32.514649],[-110.450077,32.427018],[-110.450077,31.731446],[-110.789647,31.731446],[-111.364726,31.424737],[-113.336425,32.038155],[-113.336425,32.503695],[-112.202698,32.509172],[-110.696539,32.514649]]]}},
+{"type":"Feature","id":"04021","properties":{"name":"Pinal"},"geometry":{"type":"Polygon","coordinates":[[[-111.578327,33.467636],[-111.041587,33.467636],[-110.778693,32.985665],[-110.450077,33.193789],[-110.450077,32.514649],[-110.696539,32.514649],[-112.202698,32.509172],[-112.202698,33.308805],[-111.583804,33.204743],[-111.578327,33.467636]]]}},
+{"type":"Feature","id":"04023","properties":{"name":"Santa Cruz"},"geometry":{"type":"Polygon","coordinates":[[[-110.789647,31.731446],[-110.450077,31.731446],[-110.461031,31.331629],[-111.364726,31.424737],[-110.789647,31.731446]]]}},
+{"type":"Feature","id":"04025","properties":{"name":"Yavapai"},"geometry":{"type":"Polygon","coordinates":[[[-113.336425,35.526966],[-112.438206,35.258596],[-112.334144,34.973795],[-111.775497,34.979272],[-111.556419,34.469916],[-111.496173,33.998899],[-112.273898,33.883884],[-113.336425,33.998899],[-113.330948,34.316562],[-113.336425,35.526966]]]}},
+{"type":"Feature","id":"04027","properties":{"name":"Yuma"},"geometry":{"type":"Polygon","coordinates":[[[-113.993657,33.462159],[-113.336425,33.380005],[-113.336425,32.503695],[-113.336425,32.038155],[-114.815198,32.492741],[-114.72209,32.717295],[-114.513967,33.029481],[-113.993657,33.462159]]]}},
+{"type":"Feature","id":"05001","properties":{"name":"Arkansas"},"geometry":{"type":"Polygon","coordinates":[[[-91.587494,34.568501],[-91.379371,34.563024],[-91.056231,34.33847],[-91.116477,34.119392],[-91.423186,34.01533],[-91.445094,34.081054],[-91.70251,34.48087],[-91.680602,34.48087],[-91.587494,34.568501]]]}},
+{"type":"Feature","id":"05003","properties":{"name":"Ashley"},"geometry":{"type":"Polygon","coordinates":[[[-91.992788,33.396436],[-91.456048,33.390959],[-91.461525,33.007573],[-92.069465,33.007573],[-92.135188,33.160928],[-91.992788,33.396436]]]}},
+{"type":"Feature","id":"05005","properties":{"name":"Baxter"},"geometry":{"type":"Polygon","coordinates":[[[-92.529528,36.496384],[-92.151619,36.496384],[-92.157096,36.260876],[-92.195435,36.134906],[-92.414512,35.976075],[-92.409035,36.063706],[-92.529528,36.496384]]]}},
+{"type":"Feature","id":"05007","properties":{"name":"Benton"},"geometry":{"type":"Polygon","coordinates":[[[-94.473842,36.501861],[-94.079502,36.496384],[-93.865902,36.496384],[-93.816609,36.304691],[-93.887809,36.233491],[-94.013779,36.206106],[-94.550519,36.102045],[-94.561473,36.162291],[-94.616242,36.501861],[-94.473842,36.501861]]]}},
+{"type":"Feature","id":"05009","properties":{"name":"Boone"},"geometry":{"type":"Polygon","coordinates":[[[-93.066268,36.496384],[-92.852668,36.496384],[-92.891006,36.112998],[-92.945776,36.112998],[-93.301777,36.123952],[-93.2963,36.496384],[-93.066268,36.496384]]]}},
+{"type":"Feature","id":"05011","properties":{"name":"Bradley"},"geometry":{"type":"Polygon","coordinates":[[[-92.332358,33.708622],[-91.976357,33.703145],[-91.992788,33.396436],[-92.135188,33.160928],[-92.348789,33.297851],[-92.332358,33.708622]]]}},
+{"type":"Feature","id":"05013","properties":{"name":"Calhoun"},"geometry":{"type":"Polygon","coordinates":[[[-92.584298,33.80173],[-92.332358,33.796253],[-92.332358,33.708622],[-92.348789,33.297851],[-92.567867,33.369051],[-92.584298,33.80173]]]}},
+{"type":"Feature","id":"05015","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-93.728978,36.496384],[-93.586578,36.496384],[-93.312731,36.496384],[-93.2963,36.496384],[-93.301777,36.123952],[-93.477039,36.123952],[-93.816609,36.304691],[-93.865902,36.496384],[-93.728978,36.496384]]]}},
+{"type":"Feature","id":"05017","properties":{"name":"Chicot"},"geometry":{"type":"Polygon","coordinates":[[[-91.390325,33.560744],[-91.231493,33.560744],[-91.215062,33.527883],[-91.16577,33.01305],[-91.16577,33.002096],[-91.264355,33.007573],[-91.30817,33.007573],[-91.43414,33.007573],[-91.461525,33.007573],[-91.456048,33.390959],[-91.456048,33.566221],[-91.390325,33.560744]]]}},
+{"type":"Feature","id":"05019","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-93.477039,34.33847],[-93.405839,34.33847],[-92.885529,34.157731],[-92.891006,33.807207],[-93.104607,33.779822],[-93.372977,33.955084],[-93.477039,34.33847]]]}},
+{"type":"Feature","id":"05021","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-90.782384,36.496384],[-90.57426,36.496384],[-90.218259,36.496384],[-90.190875,36.200629],[-90.804292,36.266353],[-90.782384,36.496384]]]}},
+{"type":"Feature","id":"05023","properties":{"name":"Cleburne"},"geometry":{"type":"Polygon","coordinates":[[[-91.998265,35.707705],[-91.839434,35.702228],[-91.795618,35.532443],[-92.113281,35.362658],[-92.250204,35.362658],[-92.23925,35.713182],[-91.998265,35.707705]]]}},
+{"type":"Feature","id":"05025","properties":{"name":"Cleveland"},"geometry":{"type":"Polygon","coordinates":[[[-92.058511,34.064623],[-91.954449,34.064623],[-91.976357,33.790776],[-91.976357,33.703145],[-92.332358,33.708622],[-92.332358,33.796253],[-92.337835,34.059146],[-92.233773,34.064623],[-92.058511,34.064623]]]}},
+{"type":"Feature","id":"05027","properties":{"name":"Columbia"},"geometry":{"type":"Polygon","coordinates":[[[-93.247007,33.440252],[-93.115561,33.451205],[-92.978637,33.380005],[-92.989591,33.018527],[-93.236053,33.018527],[-93.487993,33.018527],[-93.3675,33.445728],[-93.247007,33.440252]]]}},
+{"type":"Feature","id":"05029","properties":{"name":"Conway"},"geometry":{"type":"Polygon","coordinates":[[[-92.852668,35.461243],[-92.480236,35.368135],[-92.556913,35.110718],[-93.038884,35.077857],[-92.896483,35.170965],[-92.852668,35.461243]]]}},
+{"type":"Feature","id":"05031","properties":{"name":"Craighead"},"geometry":{"type":"Polygon","coordinates":[[[-90.289459,35.997983],[-90.289459,35.702228],[-90.930262,35.707705],[-91.034323,35.707705],[-91.034323,35.882967],[-90.853584,35.970598],[-90.377091,35.997983],[-90.289459,35.997983]]]}},
+{"type":"Feature","id":"05033","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-93.964486,35.762474],[-93.909717,35.762474],[-94.074025,35.444812],[-94.380734,35.444812],[-94.430026,35.395519],[-94.473842,35.636505],[-94.490273,35.756997],[-93.964486,35.762474]]]}},
+{"type":"Feature","id":"05035","properties":{"name":"Crittenden"},"geometry":{"type":"Polygon","coordinates":[[[-90.50306,35.439335],[-90.289459,35.439335],[-90.141582,35.439335],[-90.075859,35.384565],[-90.311367,34.995703],[-90.30589,34.858779],[-90.409952,34.831394],[-90.409952,34.902595],[-90.50306,35.14358],[-90.50306,35.439335]]]}},
+{"type":"Feature","id":"05037","properties":{"name":"Cross"},"geometry":{"type":"Polygon","coordinates":[[[-90.744046,35.444812],[-90.50306,35.439335],[-90.50306,35.14358],[-90.831677,35.149057],[-91.045277,35.149057],[-91.0398,35.351704],[-91.0398,35.444812],[-90.744046,35.444812]]]}},
+{"type":"Feature","id":"05039","properties":{"name":"Dallas"},"geometry":{"type":"Polygon","coordinates":[[[-92.885529,34.157731],[-92.677405,34.152254],[-92.337835,34.059146],[-92.332358,33.796253],[-92.584298,33.80173],[-92.891006,33.807207],[-92.885529,34.157731]]]}},
+{"type":"Feature","id":"05041","properties":{"name":"Desha"},"geometry":{"type":"Polygon","coordinates":[[[-91.116477,34.119392],[-90.952169,34.119392],[-91.231493,33.560744],[-91.390325,33.560744],[-91.456048,33.566221],[-91.56011,33.785299],[-91.423186,34.01533],[-91.116477,34.119392]]]}},
+{"type":"Feature","id":"05043","properties":{"name":"Drew"},"geometry":{"type":"Polygon","coordinates":[[[-91.664172,33.790776],[-91.56011,33.785299],[-91.456048,33.566221],[-91.456048,33.390959],[-91.992788,33.396436],[-91.976357,33.703145],[-91.976357,33.790776],[-91.664172,33.790776]]]}},
+{"type":"Feature","id":"05045","properties":{"name":"Faulkner"},"geometry":{"type":"Polygon","coordinates":[[[-92.480236,35.368135],[-92.250204,35.362658],[-92.113281,35.362658],[-92.118758,35.066903],[-92.118758,35.012133],[-92.228296,34.957364],[-92.545959,34.951887],[-92.556913,35.110718],[-92.480236,35.368135],[-92.480236,35.368135]]]}},
+{"type":"Feature","id":"05047","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-93.909717,35.762474],[-93.696116,35.767951],[-93.712547,35.373611],[-94.03021,35.21478],[-94.074025,35.444812],[-93.909717,35.762474]]]}},
+{"type":"Feature","id":"05049","properties":{"name":"Fulton"},"geometry":{"type":"Polygon","coordinates":[[[-91.669648,36.501861],[-91.450571,36.496384],[-91.691556,36.255399],[-92.124235,36.260876],[-92.157096,36.260876],[-92.151619,36.496384],[-92.118758,36.496384],[-91.669648,36.501861]]]}},
+{"type":"Feature","id":"05051","properties":{"name":"Garland"},"geometry":{"type":"Polygon","coordinates":[[[-93.285346,34.771148],[-93.077222,34.771148],[-92.792421,34.502778],[-93.405839,34.398716],[-93.394885,34.743763],[-93.285346,34.771148]]]}},
+{"type":"Feature","id":"05053","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-92.392605,34.497301],[-92.244727,34.491824],[-92.206389,34.491824],[-92.233773,34.064623],[-92.337835,34.059146],[-92.677405,34.152254],[-92.666452,34.415147],[-92.392605,34.497301]]]}},
+{"type":"Feature","id":"05055","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-90.804292,36.266353],[-90.190875,36.200629],[-90.377091,35.997983],[-90.853584,35.970598],[-90.809769,36.151337],[-90.804292,36.266353]]]}},
+{"type":"Feature","id":"05057","properties":{"name":"Hempstead"},"geometry":{"type":"Polygon","coordinates":[[[-93.811132,34.009853],[-93.455131,33.955084],[-93.482516,33.47859],[-93.723501,33.484067],[-93.827563,33.610037],[-93.95901,33.752437],[-93.822086,34.009853],[-93.811132,34.009853]]]}},
+{"type":"Feature","id":"05059","properties":{"name":"Hot Spring"},"geometry":{"type":"Polygon","coordinates":[[[-92.792421,34.502778],[-92.666452,34.415147],[-92.677405,34.152254],[-92.885529,34.157731],[-93.405839,34.33847],[-93.405839,34.398716],[-92.792421,34.502778]]]}},
+{"type":"Feature","id":"05061","properties":{"name":"Howard"},"geometry":{"type":"Polygon","coordinates":[[[-94.24381,34.190592],[-93.937102,34.349424],[-93.822086,34.009853],[-93.95901,33.752437],[-93.95901,33.752437],[-94.189041,34.190592],[-94.24381,34.190592]]]}},
+{"type":"Feature","id":"05063","properties":{"name":"Independence"},"geometry":{"type":"Polygon","coordinates":[[[-91.850387,35.866536],[-91.707987,35.943213],[-91.357463,35.888444],[-91.198632,35.888444],[-91.582017,35.532443],[-91.795618,35.532443],[-91.839434,35.702228],[-91.850387,35.866536]]]}},
+{"type":"Feature","id":"05065","properties":{"name":"Izard"},"geometry":{"type":"Polygon","coordinates":[[[-92.124235,36.260876],[-91.691556,36.255399],[-91.707987,35.943213],[-91.850387,35.866536],[-92.195435,36.134906],[-92.157096,36.260876],[-92.124235,36.260876]]]}},
+{"type":"Feature","id":"05067","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-91.198632,35.888444],[-91.034323,35.882967],[-91.034323,35.707705],[-91.0398,35.444812],[-91.0398,35.351704],[-91.346509,35.439335],[-91.582017,35.532443],[-91.198632,35.888444]]]}},
+{"type":"Feature","id":"05069","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-92.069465,34.491824],[-92.031127,34.491824],[-91.70251,34.48087],[-91.445094,34.081054],[-91.603925,34.113915],[-91.954449,34.064623],[-92.058511,34.064623],[-92.233773,34.064623],[-92.206389,34.491824],[-92.069465,34.491824]]]}},
+{"type":"Feature","id":"05071","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-93.696116,35.767951],[-93.520854,35.762474],[-93.164853,35.729613],[-93.2963,35.329796],[-93.422269,35.329796],[-93.712547,35.373611],[-93.696116,35.767951]]]}},
+{"type":"Feature","id":"05073","properties":{"name":"Lafayette"},"geometry":{"type":"Polygon","coordinates":[[[-93.723501,33.484067],[-93.482516,33.47859],[-93.3675,33.445728],[-93.487993,33.018527],[-93.49347,33.018527],[-93.520854,33.018527],[-93.805655,33.018527],[-93.723501,33.484067]]]}},
+{"type":"Feature","id":"05075","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-91.242447,36.255399],[-90.809769,36.151337],[-90.853584,35.970598],[-91.034323,35.882967],[-91.198632,35.888444],[-91.357463,35.888444],[-91.258878,36.255399],[-91.242447,36.255399]]]}},
+{"type":"Feature","id":"05077","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-91.100047,34.869733],[-90.409952,34.902595],[-90.409952,34.831394],[-90.585214,34.639701],[-91.050754,34.645178],[-91.100047,34.869733]]]}},
+{"type":"Feature","id":"05079","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-91.603925,34.113915],[-91.445094,34.081054],[-91.423186,34.01533],[-91.56011,33.785299],[-91.664172,33.790776],[-91.976357,33.790776],[-91.954449,34.064623],[-91.603925,34.113915]]]}},
+{"type":"Feature","id":"05081","properties":{"name":"Little River"},"geometry":{"type":"Polygon","coordinates":[[[-94.446457,33.927699],[-93.95901,33.752437],[-93.95901,33.752437],[-93.827563,33.610037],[-94.041164,33.54979],[-94.484796,33.637421],[-94.479319,33.938653],[-94.446457,33.927699]]]}},
+{"type":"Feature","id":"05083","properties":{"name":"Logan"},"geometry":{"type":"Polygon","coordinates":[[[-93.422269,35.329796],[-93.2963,35.329796],[-93.279869,35.318842],[-93.70707,35.01761],[-94.139749,35.099764],[-94.03021,35.21478],[-93.712547,35.373611],[-93.422269,35.329796]]]}},
+{"type":"Feature","id":"05085","properties":{"name":"Lonoke"},"geometry":{"type":"Polygon","coordinates":[[[-91.801095,35.028564],[-91.680602,34.48087],[-91.70251,34.48087],[-92.031127,34.491824],[-92.118758,35.012133],[-92.118758,35.066903],[-91.801095,35.028564]]]}},
+{"type":"Feature","id":"05087","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-93.816609,36.304691],[-93.477039,36.123952],[-93.520854,35.762474],[-93.696116,35.767951],[-93.909717,35.762474],[-93.964486,35.762474],[-93.887809,36.233491],[-93.816609,36.304691]]]}},
+{"type":"Feature","id":"05089","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-92.770513,36.496384],[-92.529528,36.496384],[-92.409035,36.063706],[-92.891006,36.112998],[-92.852668,36.496384],[-92.770513,36.496384]]]}},
+{"type":"Feature","id":"05091","properties":{"name":"Miller"},"geometry":{"type":"Polygon","coordinates":[[[-93.827563,33.610037],[-93.723501,33.484067],[-93.805655,33.018527],[-93.816609,33.018527],[-94.041164,33.018527],[-94.041164,33.270466],[-94.041164,33.54979],[-93.827563,33.610037]]]}},
+{"type":"Feature","id":"05093","properties":{"name":"Mississippi"},"geometry":{"type":"Polygon","coordinates":[[[-89.730812,35.997983],[-89.643181,35.904875],[-89.911551,35.53792],[-90.141582,35.439335],[-90.289459,35.439335],[-90.289459,35.702228],[-90.289459,35.997983],[-89.960843,35.997983],[-89.730812,35.997983]]]}},
+{"type":"Feature","id":"05095","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-91.275309,34.984749],[-91.149339,35.00118],[-91.100047,34.869733],[-91.050754,34.645178],[-91.056231,34.33847],[-91.379371,34.563024],[-91.368417,34.913548],[-91.275309,34.984749]]]}},
+{"type":"Feature","id":"05097","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-93.570147,34.743763],[-93.394885,34.743763],[-93.405839,34.398716],[-93.405839,34.33847],[-93.477039,34.33847],[-93.750886,34.349424],[-93.937102,34.349424],[-93.931625,34.667086],[-93.712547,34.743763],[-93.570147,34.743763]]]}},
+{"type":"Feature","id":"05099","properties":{"name":"Nevada"},"geometry":{"type":"Polygon","coordinates":[[[-93.455131,33.955084],[-93.372977,33.955084],[-93.104607,33.779822],[-93.115561,33.451205],[-93.247007,33.440252],[-93.3675,33.445728],[-93.482516,33.47859],[-93.455131,33.955084]]]}},
+{"type":"Feature","id":"05101","properties":{"name":"Newton"},"geometry":{"type":"Polygon","coordinates":[[[-93.301777,36.123952],[-92.945776,36.112998],[-92.951253,35.724136],[-93.016976,35.724136],[-93.164853,35.729613],[-93.520854,35.762474],[-93.477039,36.123952],[-93.301777,36.123952]]]}},
+{"type":"Feature","id":"05103","properties":{"name":"Ouachita"},"geometry":{"type":"Polygon","coordinates":[[[-92.891006,33.807207],[-92.584298,33.80173],[-92.567867,33.369051],[-92.737652,33.385482],[-92.978637,33.380005],[-93.115561,33.451205],[-93.104607,33.779822],[-92.891006,33.807207]]]}},
+{"type":"Feature","id":"05105","properties":{"name":"Perry"},"geometry":{"type":"Polygon","coordinates":[[[-93.038884,35.077857],[-92.556913,35.110718],[-92.545959,34.951887],[-92.737652,34.853302],[-92.967683,34.858779],[-93.077222,34.771148],[-93.285346,34.771148],[-93.038884,35.077857]]]}},
+{"type":"Feature","id":"05107","properties":{"name":"Phillips"},"geometry":{"type":"Polygon","coordinates":[[[-91.050754,34.645178],[-90.585214,34.639701],[-90.568783,34.524686],[-90.957646,34.119392],[-90.952169,34.119392],[-91.116477,34.119392],[-91.056231,34.33847],[-91.050754,34.645178]]]}},
+{"type":"Feature","id":"05109","properties":{"name":"Pike"},"geometry":{"type":"Polygon","coordinates":[[[-93.750886,34.349424],[-93.477039,34.33847],[-93.372977,33.955084],[-93.455131,33.955084],[-93.811132,34.009853],[-93.822086,34.009853],[-93.937102,34.349424],[-93.750886,34.349424]]]}},
+{"type":"Feature","id":"05111","properties":{"name":"Poinsett"},"geometry":{"type":"Polygon","coordinates":[[[-90.930262,35.707705],[-90.289459,35.702228],[-90.289459,35.439335],[-90.50306,35.439335],[-90.744046,35.444812],[-91.0398,35.444812],[-91.034323,35.707705],[-90.930262,35.707705]]]}},
+{"type":"Feature","id":"05113","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-94.451934,34.727333],[-93.931625,34.667086],[-93.937102,34.349424],[-94.24381,34.190592],[-94.468365,34.190592],[-94.462888,34.508255],[-94.451934,34.727333]]]}},
+{"type":"Feature","id":"05115","properties":{"name":"Pope"},"geometry":{"type":"Polygon","coordinates":[[[-93.016976,35.724136],[-92.951253,35.724136],[-92.808852,35.724136],[-92.852668,35.461243],[-92.896483,35.170965],[-93.279869,35.318842],[-93.2963,35.329796],[-93.164853,35.729613],[-93.016976,35.724136]]]}},
+{"type":"Feature","id":"05117","properties":{"name":"Prairie"},"geometry":{"type":"Polygon","coordinates":[[[-91.587494,35.023087],[-91.467002,35.088811],[-91.368417,34.913548],[-91.379371,34.563024],[-91.587494,34.568501],[-91.680602,34.48087],[-91.801095,35.028564],[-91.587494,35.023087]]]}},
+{"type":"Feature","id":"05119","properties":{"name":"Pulaski"},"geometry":{"type":"Polygon","coordinates":[[[-92.228296,34.957364],[-92.118758,35.012133],[-92.031127,34.491824],[-92.069465,34.491824],[-92.206389,34.491824],[-92.244727,34.491824],[-92.737652,34.853302],[-92.545959,34.951887],[-92.228296,34.957364]]]}},
+{"type":"Feature","id":"05121","properties":{"name":"Randolph"},"geometry":{"type":"Polygon","coordinates":[[[-90.848107,36.496384],[-90.782384,36.496384],[-90.804292,36.266353],[-90.809769,36.151337],[-91.242447,36.255399],[-91.258878,36.255399],[-91.406755,36.496384],[-91.127431,36.496384],[-90.848107,36.496384]]]}},
+{"type":"Feature","id":"05123","properties":{"name":"St. Francis"},"geometry":{"type":"Polygon","coordinates":[[[-90.831677,35.149057],[-90.50306,35.14358],[-90.409952,34.902595],[-91.100047,34.869733],[-91.149339,35.00118],[-91.045277,35.149057],[-90.831677,35.149057]]]}},
+{"type":"Feature","id":"05125","properties":{"name":"Saline"},"geometry":{"type":"Polygon","coordinates":[[[-92.967683,34.858779],[-92.737652,34.853302],[-92.244727,34.491824],[-92.392605,34.497301],[-92.666452,34.415147],[-92.792421,34.502778],[-93.077222,34.771148],[-92.967683,34.858779]]]}},
+{"type":"Feature","id":"05127","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-94.183564,35.083334],[-94.139749,35.099764],[-93.70707,35.01761],[-93.712547,34.743763],[-93.931625,34.667086],[-94.451934,34.727333],[-94.446457,34.935456],[-94.183564,35.083334]]]}},
+{"type":"Feature","id":"05129","properties":{"name":"Searcy"},"geometry":{"type":"Polygon","coordinates":[[[-92.945776,36.112998],[-92.891006,36.112998],[-92.409035,36.063706],[-92.414512,35.976075],[-92.414512,35.789859],[-92.611682,35.789859],[-92.808852,35.724136],[-92.951253,35.724136],[-92.945776,36.112998]]]}},
+{"type":"Feature","id":"05131","properties":{"name":"Sebastian"},"geometry":{"type":"Polygon","coordinates":[[[-94.380734,35.444812],[-94.074025,35.444812],[-94.03021,35.21478],[-94.139749,35.099764],[-94.183564,35.083334],[-94.446457,34.935456],[-94.430026,35.379088],[-94.430026,35.395519],[-94.380734,35.444812]]]}},
+{"type":"Feature","id":"05133","properties":{"name":"Sevier"},"geometry":{"type":"Polygon","coordinates":[[[-94.189041,34.190592],[-93.95901,33.752437],[-94.446457,33.927699],[-94.479319,33.938653],[-94.468365,34.190592],[-94.24381,34.190592],[-94.189041,34.190592]]]}},
+{"type":"Feature","id":"05135","properties":{"name":"Sharp"},"geometry":{"type":"Polygon","coordinates":[[[-91.450571,36.496384],[-91.406755,36.496384],[-91.258878,36.255399],[-91.357463,35.888444],[-91.707987,35.943213],[-91.691556,36.255399],[-91.450571,36.496384],[-91.450571,36.496384]]]}},
+{"type":"Feature","id":"05137","properties":{"name":"Stone"},"geometry":{"type":"Polygon","coordinates":[[[-92.195435,36.134906],[-91.850387,35.866536],[-91.839434,35.702228],[-91.998265,35.707705],[-92.23925,35.713182],[-92.414512,35.789859],[-92.414512,35.976075],[-92.195435,36.134906]]]}},
+{"type":"Feature","id":"05139","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-92.737652,33.385482],[-92.567867,33.369051],[-92.348789,33.297851],[-92.135188,33.160928],[-92.069465,33.007573],[-92.710267,33.01305],[-92.726698,33.01305],[-92.989591,33.018527],[-92.978637,33.380005],[-92.737652,33.385482]]]}},
+{"type":"Feature","id":"05141","properties":{"name":"Van Buren"},"geometry":{"type":"Polygon","coordinates":[[[-92.611682,35.789859],[-92.414512,35.789859],[-92.23925,35.713182],[-92.250204,35.362658],[-92.480236,35.368135],[-92.480236,35.368135],[-92.852668,35.461243],[-92.808852,35.724136],[-92.611682,35.789859]]]}},
+{"type":"Feature","id":"05143","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-94.013779,36.206106],[-93.887809,36.233491],[-93.964486,35.762474],[-94.490273,35.756997],[-94.550519,36.102045],[-94.013779,36.206106]]]}},
+{"type":"Feature","id":"05145","properties":{"name":"White"},"geometry":{"type":"Polygon","coordinates":[[[-91.795618,35.532443],[-91.582017,35.532443],[-91.346509,35.439335],[-91.467002,35.088811],[-91.587494,35.023087],[-91.801095,35.028564],[-92.118758,35.066903],[-92.113281,35.362658],[-91.795618,35.532443]]]}},
+{"type":"Feature","id":"05147","properties":{"name":"Woodruff"},"geometry":{"type":"Polygon","coordinates":[[[-91.346509,35.439335],[-91.0398,35.351704],[-91.045277,35.149057],[-91.149339,35.00118],[-91.275309,34.984749],[-91.368417,34.913548],[-91.467002,35.088811],[-91.346509,35.439335]]]}},
+{"type":"Feature","id":"05149","properties":{"name":"Yell"},"geometry":{"type":"Polygon","coordinates":[[[-93.279869,35.318842],[-92.896483,35.170965],[-93.038884,35.077857],[-93.285346,34.771148],[-93.394885,34.743763],[-93.570147,34.743763],[-93.712547,34.743763],[-93.70707,35.01761],[-93.279869,35.318842]]]}},
+{"type":"Feature","id":"06001","properties":{"name":"Alameda"},"geometry":{"type":"Polygon","coordinates":[[[-122.269314,37.903958],[-121.557312,37.821804],[-121.469681,37.482234],[-121.475158,37.482234],[-121.853067,37.482234],[-122.083098,37.476757],[-122.11596,37.504141],[-122.31313,37.898481],[-122.269314,37.903958]]]}},
+{"type":"Feature","id":"06003","properties":{"name":"Alpine"},"geometry":{"type":"Polygon","coordinates":[[[-119.585614,38.714545],[-119.640383,38.325682],[-120.018292,38.435221],[-120.073061,38.506421],[-120.073061,38.511898],[-120.073061,38.698114],[-120.073061,38.703591],[-119.903276,38.933623],[-119.585614,38.714545]]]}},
+{"type":"Feature","id":"06005","properties":{"name":"Amador"},"geometry":{"type":"Polygon","coordinates":[[[-120.073061,38.698114],[-120.073061,38.511898],[-120.993187,38.227097],[-121.026049,38.298298],[-121.026049,38.506421],[-120.073061,38.703591],[-120.073061,38.698114]]]}},
+{"type":"Feature","id":"06007","properties":{"name":"Butte"},"geometry":{"type":"Polygon","coordinates":[[[-121.584697,40.100211],[-121.436819,40.149503],[-121.075341,39.596333],[-121.623035,39.295101],[-121.907836,39.306055],[-121.891405,39.382732],[-122.04476,39.798979],[-121.584697,40.100211]]]}},
+{"type":"Feature","id":"06009","properties":{"name":"Calaveras"},"geometry":{"type":"Polygon","coordinates":[[[-120.073061,38.506421],[-120.018292,38.435221],[-120.045677,38.424267],[-120.653617,37.832758],[-120.927464,38.07922],[-120.993187,38.227097],[-120.073061,38.511898],[-120.073061,38.506421]]]}},
+{"type":"Feature","id":"06011","properties":{"name":"Colusa"},"geometry":{"type":"Polygon","coordinates":[[[-122.077621,39.415593],[-121.891405,39.382732],[-121.907836,39.306055],[-121.836636,38.922669],[-122.061191,38.928146],[-122.340515,38.922669],[-122.740331,39.382732],[-122.077621,39.415593]]]}},
+{"type":"Feature","id":"06013","properties":{"name":"Contra Costa"},"geometry":{"type":"Polygon","coordinates":[[[-121.628512,38.101128],[-121.57922,38.095651],[-121.557312,37.821804],[-122.269314,37.903958],[-122.31313,37.898481],[-122.269314,38.062789],[-121.864021,38.068266],[-121.628512,38.101128]]]}},
+{"type":"Feature","id":"06015","properties":{"name":"Del Norte"},"geometry":{"type":"Polygon","coordinates":[[[-124.213628,42.000709],[-123.819288,41.995232],[-123.518057,42.000709],[-123.660457,41.381815],[-124.054797,41.463969],[-124.065751,41.463969],[-124.213628,42.000709]]]}},
+{"type":"Feature","id":"06017","properties":{"name":"El Dorado"},"geometry":{"type":"Polygon","coordinates":[[[-120.001861,39.065069],[-119.903276,38.933623],[-120.073061,38.703591],[-121.026049,38.506421],[-121.141065,38.714545],[-121.04248,38.917192],[-120.001861,39.065069]]]}},
+{"type":"Feature","id":"06019","properties":{"name":"Fresno"},"geometry":{"type":"Polygon","coordinates":[[[-119.021489,37.586295],[-118.775026,37.460326],[-118.358779,36.742847],[-118.98315,36.742847],[-119.57466,36.490907],[-119.958045,36.403276],[-120.314047,35.904875],[-120.681002,36.266353],[-120.91651,36.742847],[-120.544078,37.044078],[-120.281185,36.764754],[-119.821122,36.846908],[-119.021489,37.586295]]]}},
+{"type":"Feature","id":"06021","properties":{"name":"Glenn"},"geometry":{"type":"Polygon","coordinates":[[[-122.937501,39.798979],[-122.04476,39.798979],[-121.891405,39.382732],[-122.077621,39.415593],[-122.740331,39.382732],[-122.882732,39.579902],[-122.937501,39.798979]]]}},
+{"type":"Feature","id":"06023","properties":{"name":"Humboldt"},"geometry":{"type":"Polygon","coordinates":[[[-124.054797,41.463969],[-123.660457,41.381815],[-123.408518,41.179168],[-123.545441,40.001626],[-124.021935,40.001626],[-124.410798,40.439781],[-124.065751,41.463969],[-124.054797,41.463969]]]}},
+{"type":"Feature","id":"06025","properties":{"name":"Imperial"},"geometry":{"type":"Polygon","coordinates":[[[-114.733044,33.434775],[-114.628982,33.434775],[-114.513967,33.029481],[-114.72209,32.717295],[-116.107756,32.61871],[-116.085849,33.423821],[-114.733044,33.434775]]]}},
+{"type":"Feature","id":"06027","properties":{"name":"Inyo"},"geometry":{"type":"Polygon","coordinates":[[[-117.937054,37.465803],[-117.832993,37.465803],[-117.164806,36.972878],[-115.899633,36.00346],[-115.647693,35.80629],[-117.630346,35.795336],[-118.008255,35.789859],[-118.358779,36.742847],[-118.775026,37.460326],[-117.937054,37.465803]]]}},
+{"type":"Feature","id":"06029","properties":{"name":"Kern"},"geometry":{"type":"Polygon","coordinates":[[[-118.008255,35.789859],[-117.630346,35.795336],[-117.668684,34.820441],[-118.884565,34.793056],[-119.443213,34.902595],[-119.470598,34.902595],[-120.193554,35.789859],[-119.536321,35.789859],[-118.008255,35.789859]]]}},
+{"type":"Feature","id":"06031","properties":{"name":"Kings"},"geometry":{"type":"Polygon","coordinates":[[[-119.57466,36.490907],[-119.536321,35.789859],[-120.193554,35.789859],[-120.215462,35.789859],[-120.314047,35.904875],[-119.958045,36.403276],[-119.57466,36.490907]]]}},
+{"type":"Feature","id":"06033","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-122.882732,39.579902],[-122.740331,39.382732],[-122.340515,38.922669],[-122.395284,38.862422],[-122.625315,38.665253],[-122.822485,38.851469],[-123.090855,39.070546],[-122.882732,39.579902]]]}},
+{"type":"Feature","id":"06035","properties":{"name":"Lassen"},"geometry":{"type":"Polygon","coordinates":[[[-120.943895,41.184645],[-120.001861,41.184645],[-120.001861,39.722302],[-120.149738,39.705871],[-120.209985,40.08378],[-121.119157,40.445258],[-121.327281,40.445258],[-121.332757,41.184645],[-120.943895,41.184645]]]}},
+{"type":"Feature","id":"06037","properties":{"name":"Los Angeles"},"geometry":{"type":"Polygon","coordinates":[[[-117.668684,34.820441],[-117.7837,33.94413],[-118.117793,33.741483],[-118.944811,34.042715],[-118.638103,34.289177],[-118.884565,34.793056],[-117.668684,34.820441]]]}},
+{"type":"Feature","id":"06039","properties":{"name":"Madera"},"geometry":{"type":"Polygon","coordinates":[[[-119.267951,37.73965],[-119.021489,37.586295],[-119.821122,36.846908],[-120.281185,36.764754],[-120.544078,37.044078],[-120.051153,37.181002],[-119.30629,37.777988],[-119.267951,37.73965]]]}},
+{"type":"Feature","id":"06041","properties":{"name":"Marin"},"geometry":{"type":"Polygon","coordinates":[[[-122.844393,38.27639],[-122.488392,38.112082],[-122.504823,37.821804],[-123.014178,38.002543],[-123.003224,38.298298],[-122.844393,38.27639]]]}},
+{"type":"Feature","id":"06043","properties":{"name":"Mariposa"},"geometry":{"type":"Polygon","coordinates":[[[-120.084015,37.827281],[-119.30629,37.777988],[-120.051153,37.181002],[-120.385247,37.635588],[-120.385247,37.635588],[-120.084015,37.827281]]]}},
+{"type":"Feature","id":"06045","properties":{"name":"Mendocino"},"geometry":{"type":"Polygon","coordinates":[[[-124.021935,40.001626],[-123.545441,40.001626],[-122.932024,39.979718],[-122.937501,39.798979],[-122.882732,39.579902],[-123.090855,39.070546],[-122.822485,38.851469],[-123.074425,38.851469],[-123.534488,38.769315],[-123.737134,38.95553],[-124.021935,40.001626]]]}},
+{"type":"Feature","id":"06047","properties":{"name":"Merced"},"geometry":{"type":"Polygon","coordinates":[[[-120.385247,37.635588],[-120.051153,37.181002],[-120.544078,37.044078],[-120.91651,36.742847],[-121.217742,36.961924],[-121.228696,37.137186],[-120.385247,37.635588]]]}},
+{"type":"Feature","id":"06049","properties":{"name":"Modoc"},"geometry":{"type":"Polygon","coordinates":[[[-121.316327,41.995232],[-120.878171,41.995232],[-120.001861,41.995232],[-120.001861,41.184645],[-120.943895,41.184645],[-121.332757,41.184645],[-121.447773,41.184645],[-121.447773,41.995232],[-121.316327,41.995232]]]}},
+{"type":"Feature","id":"06051","properties":{"name":"Mono"},"geometry":{"type":"Polygon","coordinates":[[[-119.585614,38.714545],[-119.328197,38.533806],[-119.158412,38.413313],[-118.429979,37.898481],[-117.832993,37.465803],[-117.937054,37.465803],[-118.775026,37.460326],[-119.021489,37.586295],[-119.267951,37.73965],[-119.640383,38.325682],[-119.585614,38.714545]]]}},
+{"type":"Feature","id":"06053","properties":{"name":"Monterey"},"geometry":{"type":"Polygon","coordinates":[[[-121.699712,36.918109],[-121.644943,36.896201],[-121.31085,36.501861],[-120.681002,36.266353],[-120.314047,35.904875],[-120.215462,35.789859],[-121.343711,35.795336],[-121.896882,36.315645],[-121.809251,36.852385],[-121.699712,36.918109]]]}},
+{"type":"Feature","id":"06055","properties":{"name":"Napa"},"geometry":{"type":"Polygon","coordinates":[[[-122.395284,38.862422],[-122.105006,38.511898],[-122.406238,38.155897],[-122.625315,38.665253],[-122.395284,38.862422]]]}},
+{"type":"Feature","id":"06057","properties":{"name":"Nevada"},"geometry":{"type":"Polygon","coordinates":[[[-120.555032,39.508701],[-120.001861,39.442978],[-120.007338,39.317009],[-120.149738,39.317009],[-121.277988,39.032208],[-121.020572,39.393686],[-120.555032,39.508701]]]}},
+{"type":"Feature","id":"06059","properties":{"name":"Orange"},"geometry":{"type":"Polygon","coordinates":[[[-117.7837,33.94413],[-117.674161,33.87293],[-117.509853,33.505975],[-117.597484,33.385482],[-118.117793,33.741483],[-117.7837,33.94413]]]}},
+{"type":"Feature","id":"06061","properties":{"name":"Placer"},"geometry":{"type":"Polygon","coordinates":[[[-120.149738,39.317009],[-120.007338,39.317009],[-120.001861,39.163654],[-120.001861,39.114362],[-120.001861,39.065069],[-121.04248,38.917192],[-121.141065,38.714545],[-121.486112,38.736453],[-121.414912,38.999346],[-121.277988,39.032208],[-120.149738,39.317009]]]}},
+{"type":"Feature","id":"06063","properties":{"name":"Plumas"},"geometry":{"type":"Polygon","coordinates":[[[-121.119157,40.445258],[-120.209985,40.08378],[-120.149738,39.705871],[-121.009618,39.640148],[-121.075341,39.596333],[-121.436819,40.149503],[-121.497066,40.445258],[-121.327281,40.445258],[-121.119157,40.445258]]]}},
+{"type":"Feature","id":"06065","properties":{"name":"Riverside"},"geometry":{"type":"Polygon","coordinates":[[[-114.733044,34.081054],[-114.43729,34.081054],[-114.628982,33.434775],[-114.733044,33.434775],[-116.085849,33.423821],[-117.476991,33.505975],[-117.509853,33.505975],[-117.674161,33.87293],[-117.559146,34.031761],[-114.733044,34.081054]]]}},
+{"type":"Feature","id":"06067","properties":{"name":"Sacramento"},"geometry":{"type":"Polygon","coordinates":[[[-121.557312,38.736453],[-121.486112,38.736453],[-121.141065,38.714545],[-121.026049,38.506421],[-121.026049,38.298298],[-121.097249,38.287344],[-121.57922,38.095651],[-121.628512,38.101128],[-121.864021,38.068266],[-121.590174,38.314728],[-121.601128,38.736453],[-121.557312,38.736453]]]}},
+{"type":"Feature","id":"06069","properties":{"name":"San Benito"},"geometry":{"type":"Polygon","coordinates":[[[-121.447773,36.989309],[-121.217742,36.961924],[-120.91651,36.742847],[-120.681002,36.266353],[-121.31085,36.501861],[-121.644943,36.896201],[-121.57922,36.901678],[-121.447773,36.989309]]]}},
+{"type":"Feature","id":"06071","properties":{"name":"San Bernardino"},"geometry":{"type":"Polygon","coordinates":[[[-117.630346,35.795336],[-115.647693,35.80629],[-114.634459,35.00118],[-114.136058,34.305608],[-114.43729,34.081054],[-114.733044,34.081054],[-117.559146,34.031761],[-117.674161,33.87293],[-117.7837,33.94413],[-117.668684,34.820441],[-117.630346,35.795336]]]}},
+{"type":"Feature","id":"06073","properties":{"name":"San Diego"},"geometry":{"type":"Polygon","coordinates":[[[-117.476991,33.505975],[-116.085849,33.423821],[-116.107756,32.61871],[-117.126467,32.536556],[-117.597484,33.385482],[-117.509853,33.505975],[-117.476991,33.505975]]]}},
+{"type":"Feature","id":"06075","properties":{"name":"San Francisco"},"geometry":{"type":"Polygon","coordinates":[[[-122.428146,37.706788],[-122.504823,37.706788],[-122.389807,37.706788],[-122.428146,37.706788]]]}},
+{"type":"Feature","id":"06077","properties":{"name":"San Joaquin"},"geometry":{"type":"Polygon","coordinates":[[[-121.097249,38.287344],[-121.026049,38.298298],[-120.993187,38.227097],[-120.927464,38.07922],[-120.921987,37.805373],[-121.469681,37.482234],[-121.557312,37.821804],[-121.57922,38.095651],[-121.097249,38.287344]]]}},
+{"type":"Feature","id":"06079","properties":{"name":"San Luis Obispo"},"geometry":{"type":"Polygon","coordinates":[[[-121.343711,35.795336],[-120.215462,35.789859],[-120.193554,35.789859],[-119.470598,34.902595],[-120.094969,35.116195],[-120.64814,34.973795],[-121.343711,35.795336]]]}},
+{"type":"Feature","id":"06081","properties":{"name":"San Mateo"},"geometry":{"type":"Polygon","coordinates":[[[-122.428146,37.706788],[-122.389807,37.706788],[-122.11596,37.504141],[-122.083098,37.476757],[-122.154299,37.285064],[-122.291222,37.109802],[-122.504823,37.706788],[-122.428146,37.706788]]]}},
+{"type":"Feature","id":"06083","properties":{"name":"Santa Barbara"},"geometry":{"type":"Polygon","coordinates":[[[-120.094969,35.116195],[-119.470598,34.902595],[-119.443213,34.902595],[-119.476075,34.376808],[-120.64814,34.579455],[-120.64814,34.973795],[-120.094969,35.116195]]]}},
+{"type":"Feature","id":"06085","properties":{"name":"Santa Clara"},"geometry":{"type":"Polygon","coordinates":[[[-121.853067,37.482234],[-121.475158,37.482234],[-121.228696,37.137186],[-121.217742,36.961924],[-121.447773,36.989309],[-121.57922,36.901678],[-122.154299,37.285064],[-122.083098,37.476757],[-121.853067,37.482234]]]}},
+{"type":"Feature","id":"06087","properties":{"name":"Santa Cruz"},"geometry":{"type":"Polygon","coordinates":[[[-122.154299,37.285064],[-121.57922,36.901678],[-121.644943,36.896201],[-121.699712,36.918109],[-121.809251,36.852385],[-122.291222,37.109802],[-122.154299,37.285064]]]}},
+{"type":"Feature","id":"06089","properties":{"name":"Shasta"},"geometry":{"type":"Polygon","coordinates":[[[-121.447773,41.184645],[-121.332757,41.184645],[-121.327281,40.445258],[-121.497066,40.445258],[-123.063471,40.286427],[-122.691039,40.576705],[-122.499346,41.184645],[-121.447773,41.184645]]]}},
+{"type":"Feature","id":"06091","properties":{"name":"Sierra"},"geometry":{"type":"Polygon","coordinates":[[[-120.149738,39.705871],[-120.001861,39.722302],[-120.001861,39.442978],[-120.555032,39.508701],[-121.020572,39.393686],[-121.009618,39.640148],[-120.149738,39.705871]]]}},
+{"type":"Feature","id":"06093","properties":{"name":"Siskiyou"},"geometry":{"type":"Polygon","coordinates":[[[-123.233256,42.006186],[-122.291222,42.006186],[-121.447773,41.995232],[-121.447773,41.184645],[-122.499346,41.184645],[-122.586977,41.35443],[-122.915593,40.992952],[-123.408518,41.179168],[-123.660457,41.381815],[-123.518057,42.000709],[-123.233256,42.006186]]]}},
+{"type":"Feature","id":"06095","properties":{"name":"Solano"},"geometry":{"type":"Polygon","coordinates":[[[-121.738051,38.539283],[-121.590174,38.314728],[-121.864021,38.068266],[-122.269314,38.062789],[-122.406238,38.15042],[-122.406238,38.155897],[-122.105006,38.511898],[-121.738051,38.539283]]]}},
+{"type":"Feature","id":"06097","properties":{"name":"Sonoma"},"geometry":{"type":"Polygon","coordinates":[[[-123.074425,38.851469],[-122.822485,38.851469],[-122.625315,38.665253],[-122.406238,38.155897],[-122.406238,38.15042],[-122.488392,38.112082],[-122.844393,38.27639],[-123.003224,38.298298],[-123.534488,38.769315],[-123.074425,38.851469]]]}},
+{"type":"Feature","id":"06099","properties":{"name":"Stanislaus"},"geometry":{"type":"Polygon","coordinates":[[[-120.921987,37.805373],[-120.927464,38.07922],[-120.653617,37.832758],[-120.385247,37.635588],[-120.385247,37.635588],[-121.228696,37.137186],[-121.475158,37.482234],[-121.469681,37.482234],[-120.921987,37.805373]]]}},
+{"type":"Feature","id":"06101","properties":{"name":"Sutter"},"geometry":{"type":"Polygon","coordinates":[[[-121.623035,39.295101],[-121.414912,38.999346],[-121.486112,38.736453],[-121.557312,38.736453],[-121.601128,38.736453],[-121.836636,38.922669],[-121.907836,39.306055],[-121.623035,39.295101]]]}},
+{"type":"Feature","id":"06103","properties":{"name":"Tehama"},"geometry":{"type":"Polygon","coordinates":[[[-121.497066,40.445258],[-121.436819,40.149503],[-121.584697,40.100211],[-122.04476,39.798979],[-122.937501,39.798979],[-122.932024,39.979718],[-123.063471,40.286427],[-121.497066,40.445258]]]}},
+{"type":"Feature","id":"06105","properties":{"name":"Trinity"},"geometry":{"type":"Polygon","coordinates":[[[-122.586977,41.35443],[-122.499346,41.184645],[-122.691039,40.576705],[-123.063471,40.286427],[-122.932024,39.979718],[-123.545441,40.001626],[-123.408518,41.179168],[-122.915593,40.992952],[-122.586977,41.35443]]]}},
+{"type":"Feature","id":"06107","properties":{"name":"Tulare"},"geometry":{"type":"Polygon","coordinates":[[[-118.358779,36.742847],[-118.008255,35.789859],[-119.536321,35.789859],[-119.57466,36.490907],[-118.98315,36.742847],[-118.358779,36.742847]]]}},
+{"type":"Feature","id":"06109","properties":{"name":"Tuolumne"},"geometry":{"type":"Polygon","coordinates":[[[-120.045677,38.424267],[-120.018292,38.435221],[-119.640383,38.325682],[-119.267951,37.73965],[-119.30629,37.777988],[-120.084015,37.827281],[-120.385247,37.635588],[-120.653617,37.832758],[-120.045677,38.424267]]]}},
+{"type":"Feature","id":"06111","properties":{"name":"Ventura"},"geometry":{"type":"Polygon","coordinates":[[[-119.443213,34.902595],[-118.884565,34.793056],[-118.638103,34.289177],[-118.944811,34.042715],[-119.476075,34.376808],[-119.443213,34.902595]]]}},
+{"type":"Feature","id":"06113","properties":{"name":"Yolo"},"geometry":{"type":"Polygon","coordinates":[[[-122.061191,38.928146],[-121.836636,38.922669],[-121.601128,38.736453],[-121.590174,38.314728],[-121.738051,38.539283],[-122.105006,38.511898],[-122.395284,38.862422],[-122.340515,38.922669],[-122.061191,38.928146]]]}},
+{"type":"Feature","id":"06115","properties":{"name":"Yuba"},"geometry":{"type":"Polygon","coordinates":[[[-121.075341,39.596333],[-121.009618,39.640148],[-121.020572,39.393686],[-121.277988,39.032208],[-121.414912,38.999346],[-121.623035,39.295101],[-121.075341,39.596333]]]}},
+{"type":"Feature","id":"08001","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-103.795594,40.001626],[-103.707963,40.001626],[-103.707963,39.738733],[-104.830736,39.738733],[-104.885506,39.738733],[-104.704767,39.903041],[-105.055291,39.793502],[-105.055291,39.913995],[-105.055291,40.001626],[-104.151596,40.001626],[-103.795594,40.001626]]]}},
+{"type":"Feature","id":"08003","properties":{"name":"Alamosa"},"geometry":{"type":"Polygon","coordinates":[[[-105.707047,37.750604],[-105.455107,37.750604],[-105.487969,37.575342],[-105.745385,37.356264],[-106.04114,37.400079],[-106.04114,37.750604],[-105.707047,37.750604]]]}},
+{"type":"Feature","id":"08005","properties":{"name":"Arapahoe"},"geometry":{"type":"Polygon","coordinates":[[[-104.830736,39.738733],[-103.707963,39.738733],[-103.707963,39.568948],[-103.71344,39.568948],[-104.195411,39.563471],[-104.660951,39.563471],[-104.989567,39.568948],[-105.049814,39.563471],[-105.055291,39.623717],[-105.055291,39.629194],[-105.055291,39.629194],[-104.885506,39.738733],[-104.830736,39.738733]]]}},
+{"type":"Feature","id":"08007","properties":{"name":"Archuleta"},"geometry":{"type":"Polygon","coordinates":[[[-107.131051,37.421987],[-106.709327,37.405556],[-106.676465,37.405556],[-106.473818,36.994786],[-107.421329,37.000263],[-107.481575,37.000263],[-107.481575,37.421987],[-107.131051,37.421987]]]}},
+{"type":"Feature","id":"08009","properties":{"name":"Baca"},"geometry":{"type":"Polygon","coordinates":[[[-102.749499,37.641065],[-102.042974,37.646542],[-102.042974,37.389126],[-102.042974,36.994786],[-103.001438,37.000263],[-103.083592,37.000263],[-103.078115,37.641065],[-102.749499,37.641065]]]}},
+{"type":"Feature","id":"08011","properties":{"name":"Bent"},"geometry":{"type":"Polygon","coordinates":[[[-102.744022,38.265436],[-102.749499,37.641065],[-103.078115,37.641065],[-103.406732,37.641065],[-103.401255,38.265436],[-102.744022,38.265436]]]}},
+{"type":"Feature","id":"08013","properties":{"name":"Boulder"},"geometry":{"type":"Polygon","coordinates":[[[-105.340092,40.259042],[-105.055291,40.264519],[-105.055291,40.001626],[-105.055291,39.913995],[-105.055291,39.913995],[-105.400338,39.913995],[-105.674185,39.930426],[-105.652277,40.259042],[-105.340092,40.259042]]]}},
+{"type":"Feature","id":"08015","properties":{"name":"Chaffee"},"geometry":{"type":"Polygon","coordinates":[[[-106.375233,39.054115],[-106.189017,39.054115],[-105.96994,38.692637],[-106.008278,38.446175],[-106.249264,38.424267],[-106.599788,38.999346],[-106.57788,39.059592],[-106.375233,39.054115]]]}},
+{"type":"Feature","id":"08017","properties":{"name":"Cheyenne"},"geometry":{"type":"Polygon","coordinates":[[[-102.04845,39.048638],[-102.042974,38.698114],[-102.042974,38.61596],[-103.171223,38.610483],[-103.165746,39.037685],[-102.04845,39.048638]]]}},
+{"type":"Feature","id":"08019","properties":{"name":"Clear Creek"},"geometry":{"type":"Polygon","coordinates":[[[-105.926124,39.700394],[-105.690616,39.853749],[-105.400338,39.749687],[-105.400338,39.563471],[-105.827539,39.563471],[-105.926124,39.700394]]]}},
+{"type":"Feature","id":"08021","properties":{"name":"Conejos"},"geometry":{"type":"Polygon","coordinates":[[[-106.523111,37.400079],[-106.04114,37.400079],[-105.745385,37.356264],[-105.718001,36.994786],[-106.008278,36.994786],[-106.473818,36.994786],[-106.676465,37.405556],[-106.523111,37.400079]]]}},
+{"type":"Feature","id":"08023","properties":{"name":"Costilla"},"geometry":{"type":"Polygon","coordinates":[[[-105.23603,37.624634],[-105.153876,37.290541],[-105.153876,36.994786],[-105.219599,36.994786],[-105.718001,36.994786],[-105.745385,37.356264],[-105.487969,37.575342],[-105.23603,37.624634]]]}},
+{"type":"Feature","id":"08025","properties":{"name":"Crowley"},"geometry":{"type":"Polygon","coordinates":[[[-104.053011,38.522852],[-103.505317,38.517375],[-103.49984,38.265436],[-104.058488,38.144943],[-104.053011,38.522852]]]}},
+{"type":"Feature","id":"08027","properties":{"name":"Custer"},"geometry":{"type":"Polygon","coordinates":[[[-105.794678,38.265436],[-105.049814,38.259959],[-105.049814,37.914912],[-105.186737,38.00802],[-105.471538,37.898481],[-105.794678,38.265436]]]}},
+{"type":"Feature","id":"08029","properties":{"name":"Delta"},"geometry":{"type":"Polygon","coordinates":[[[-107.514437,39.212947],[-107.503483,39.218424],[-107.498006,38.67073],[-108.001885,38.67073],[-108.379794,38.67073],[-107.514437,39.212947]]]}},
+{"type":"Feature","id":"08031","properties":{"name":"Denver"},"geometry":{"type":"Polygon","coordinates":[[[-104.704767,39.903041],[-104.885506,39.738733],[-105.055291,39.629194],[-105.055291,39.629194],[-105.055291,39.623717],[-105.055291,39.793502],[-104.704767,39.903041]]]}},
+{"type":"Feature","id":"08033","properties":{"name":"Dolores"},"geometry":{"type":"Polygon","coordinates":[[[-109.042503,37.88205],[-107.859484,37.777988],[-107.9745,37.641065],[-109.042503,37.482234],[-109.042503,37.88205]]]}},
+{"type":"Feature","id":"08035","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-104.989567,39.568948],[-104.660951,39.563471],[-104.660951,39.130793],[-104.995044,39.130793],[-105.033383,39.130793],[-105.329138,39.130793],[-105.049814,39.563471],[-104.989567,39.568948]]]}},
+{"type":"Feature","id":"08037","properties":{"name":"Eagle"},"geometry":{"type":"Polygon","coordinates":[[[-106.627173,39.924949],[-106.43548,39.924949],[-106.205448,39.377255],[-106.424526,39.360824],[-107.04342,39.366301],[-107.11462,39.366301],[-107.032466,39.919472],[-106.627173,39.924949]]]}},
+{"type":"Feature","id":"08039","properties":{"name":"Elbert"},"geometry":{"type":"Polygon","coordinates":[[[-104.195411,39.563471],[-103.71344,39.568948],[-103.718917,38.867899],[-104.053011,38.867899],[-104.053011,39.130793],[-104.660951,39.130793],[-104.660951,39.563471],[-104.195411,39.563471]]]}},
+{"type":"Feature","id":"08041","properties":{"name":"El Paso"},"geometry":{"type":"Polygon","coordinates":[[[-104.995044,39.130793],[-104.660951,39.130793],[-104.053011,39.130793],[-104.053011,38.867899],[-104.053011,38.522852],[-104.940275,38.517375],[-104.940275,38.648822],[-105.033383,39.130793],[-104.995044,39.130793]]]}},
+{"type":"Feature","id":"08043","properties":{"name":"Fremont"},"geometry":{"type":"Polygon","coordinates":[[[-105.329138,38.698114],[-104.940275,38.648822],[-104.940275,38.517375],[-105.049814,38.259959],[-105.794678,38.265436],[-106.008278,38.446175],[-105.96994,38.692637],[-105.329138,38.698114]]]}},
+{"type":"Feature","id":"08045","properties":{"name":"Garfield"},"geometry":{"type":"Polygon","coordinates":[[[-107.037943,40.089257],[-107.032466,39.919472],[-107.11462,39.366301],[-107.432283,39.366301],[-108.774133,39.366301],[-109.053457,39.366301],[-109.053457,39.497748],[-109.053457,39.662056],[-107.936161,39.694917],[-107.037943,40.089257]]]}},
+{"type":"Feature","id":"08047","properties":{"name":"Gilpin"},"geometry":{"type":"Polygon","coordinates":[[[-105.674185,39.930426],[-105.400338,39.913995],[-105.400338,39.749687],[-105.690616,39.853749],[-105.674185,39.930426]]]}},
+{"type":"Feature","id":"08049","properties":{"name":"Grand"},"geometry":{"type":"Polygon","coordinates":[[[-105.854924,40.483597],[-105.652277,40.259042],[-105.674185,39.930426],[-105.690616,39.853749],[-105.926124,39.700394],[-106.43548,39.924949],[-106.627173,39.924949],[-106.654557,40.445258],[-105.854924,40.483597]]]}},
+{"type":"Feature","id":"08051","properties":{"name":"Gunnison"},"geometry":{"type":"Polygon","coordinates":[[[-107.503483,39.218424],[-107.393944,39.256762],[-106.599788,38.999346],[-106.249264,38.424267],[-106.999605,38.424267],[-106.999605,38.144943],[-107.569206,38.144943],[-107.63493,38.303775],[-107.498006,38.67073],[-107.503483,39.218424]]]}},
+{"type":"Feature","id":"08053","properties":{"name":"Hinsdale"},"geometry":{"type":"Polygon","coordinates":[[[-106.999605,38.144943],[-106.999605,37.958727],[-107.103666,37.95325],[-107.131051,37.421987],[-107.481575,37.421987],[-107.481575,37.641065],[-107.569206,37.964204],[-107.569206,38.144943],[-106.999605,38.144943]]]}},
+{"type":"Feature","id":"08055","properties":{"name":"Huerfano"},"geometry":{"type":"Polygon","coordinates":[[[-105.186737,38.00802],[-105.049814,37.914912],[-104.348765,37.816327],[-105.153876,37.290541],[-105.23603,37.624634],[-105.487969,37.575342],[-105.455107,37.750604],[-105.471538,37.898481],[-105.186737,38.00802]]]}},
+{"type":"Feature","id":"08057","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-106.857204,41.003906],[-106.320464,40.998429],[-106.189017,40.998429],[-105.854924,40.483597],[-106.654557,40.445258],[-106.857204,41.003906]]]}},
+{"type":"Feature","id":"08059","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-105.055291,39.913995],[-105.055291,39.913995],[-105.055291,39.793502],[-105.055291,39.623717],[-105.049814,39.563471],[-105.329138,39.130793],[-105.329138,39.130793],[-105.400338,39.563471],[-105.400338,39.749687],[-105.400338,39.913995],[-105.055291,39.913995]]]}},
+{"type":"Feature","id":"08061","properties":{"name":"Kiowa"},"geometry":{"type":"Polygon","coordinates":[[[-102.042974,38.61596],[-102.042974,38.270913],[-102.212759,38.265436],[-102.744022,38.265436],[-103.401255,38.265436],[-103.49984,38.265436],[-103.505317,38.517375],[-103.171223,38.610483],[-102.042974,38.61596]]]}},
+{"type":"Feature","id":"08063","properties":{"name":"Kit Carson"},"geometry":{"type":"Polygon","coordinates":[[[-102.426359,39.568948],[-102.04845,39.574425],[-102.04845,39.568948],[-102.04845,39.130793],[-102.04845,39.048638],[-103.165746,39.037685],[-103.154792,39.563471],[-102.804268,39.568948],[-102.426359,39.568948]]]}},
+{"type":"Feature","id":"08065","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-106.134248,39.377255],[-106.189017,39.054115],[-106.375233,39.054115],[-106.57788,39.059592],[-106.424526,39.360824],[-106.205448,39.377255],[-106.134248,39.377255]]]}},
+{"type":"Feature","id":"08067","properties":{"name":"La Plata"},"geometry":{"type":"Polygon","coordinates":[[[-107.804715,37.641065],[-107.481575,37.641065],[-107.481575,37.421987],[-107.481575,37.000263],[-108.379794,37.000263],[-107.9745,37.641065],[-107.804715,37.641065]]]}},
+{"type":"Feature","id":"08069","properties":{"name":"Larimer"},"geometry":{"type":"Polygon","coordinates":[[[-105.279845,40.998429],[-104.945752,40.998429],[-105.055291,40.264519],[-105.340092,40.259042],[-105.652277,40.259042],[-105.854924,40.483597],[-106.189017,40.998429],[-105.279845,40.998429]]]}},
+{"type":"Feature","id":"08071","properties":{"name":"Las Animas"},"geometry":{"type":"Polygon","coordinates":[[[-104.348765,37.816327],[-104.058488,37.734173],[-103.406732,37.641065],[-103.078115,37.641065],[-103.083592,37.000263],[-104.009195,36.994786],[-105.153876,36.994786],[-105.153876,37.290541],[-104.348765,37.816327]]]}},
+{"type":"Feature","id":"08073","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-103.71344,39.568948],[-103.707963,39.568948],[-103.154792,39.563471],[-103.165746,39.037685],[-103.171223,38.610483],[-103.505317,38.517375],[-104.053011,38.522852],[-104.053011,38.867899],[-103.718917,38.867899],[-103.71344,39.568948]]]}},
+{"type":"Feature","id":"08075","properties":{"name":"Logan"},"geometry":{"type":"Polygon","coordinates":[[[-102.650914,41.003906],[-102.650914,40.751967],[-102.667345,40.439781],[-102.78236,40.439781],[-103.466978,40.434304],[-103.581994,40.521935],[-103.576517,41.003906],[-103.384824,41.003906],[-102.650914,41.003906]]]}},
+{"type":"Feature","id":"08077","properties":{"name":"Mesa"},"geometry":{"type":"Polygon","coordinates":[[[-108.774133,39.366301],[-107.432283,39.366301],[-107.393944,39.256762],[-107.503483,39.218424],[-107.514437,39.212947],[-108.379794,38.67073],[-109.058934,38.500944],[-109.053457,39.366301],[-108.774133,39.366301]]]}},
+{"type":"Feature","id":"08079","properties":{"name":"Mineral"},"geometry":{"type":"Polygon","coordinates":[[[-107.103666,37.95325],[-106.999605,37.958727],[-106.692896,37.832758],[-106.709327,37.405556],[-107.131051,37.421987],[-107.103666,37.95325]]]}},
+{"type":"Feature","id":"08081","properties":{"name":"Moffat"},"geometry":{"type":"Polygon","coordinates":[[[-107.919731,41.003906],[-107.317267,41.003906],[-107.43776,40.220704],[-109.053457,40.220704],[-109.04798,40.653382],[-109.04798,40.998429],[-107.919731,41.003906]]]}},
+{"type":"Feature","id":"08083","properties":{"name":"Montezuma"},"geometry":{"type":"Polygon","coordinates":[[[-107.9745,37.641065],[-108.379794,37.000263],[-109.042503,37.000263],[-109.042503,37.482234],[-107.9745,37.641065]]]}},
+{"type":"Feature","id":"08085","properties":{"name":"Montrose"},"geometry":{"type":"Polygon","coordinates":[[[-108.001885,38.67073],[-107.498006,38.67073],[-107.63493,38.303775],[-107.963546,38.15042],[-109.042503,38.15042],[-109.058934,38.500944],[-108.379794,38.67073],[-108.001885,38.67073]]]}},
+{"type":"Feature","id":"08087","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-104.091349,40.521935],[-103.581994,40.521935],[-103.466978,40.434304],[-103.707963,40.001626],[-103.795594,40.001626],[-104.151596,40.001626],[-104.091349,40.521935]]]}},
+{"type":"Feature","id":"08089","properties":{"name":"Otero"},"geometry":{"type":"Polygon","coordinates":[[[-103.401255,38.265436],[-103.406732,37.641065],[-104.058488,37.734173],[-104.058488,38.144943],[-103.49984,38.265436],[-103.401255,38.265436]]]}},
+{"type":"Feature","id":"08091","properties":{"name":"Ouray"},"geometry":{"type":"Polygon","coordinates":[[[-107.63493,38.303775],[-107.569206,38.144943],[-107.569206,37.964204],[-107.738991,37.903958],[-107.963546,38.15042],[-107.63493,38.303775]]]}},
+{"type":"Feature","id":"08093","properties":{"name":"Park"},"geometry":{"type":"Polygon","coordinates":[[[-105.827539,39.563471],[-105.400338,39.563471],[-105.329138,39.130793],[-105.329138,38.698114],[-105.96994,38.692637],[-106.189017,39.054115],[-106.134248,39.377255],[-105.827539,39.563471]]]}},
+{"type":"Feature","id":"08095","properties":{"name":"Phillips"},"geometry":{"type":"Polygon","coordinates":[[[-102.327774,40.74649],[-102.053927,40.751967],[-102.053927,40.697198],[-102.053927,40.439781],[-102.426359,40.439781],[-102.667345,40.439781],[-102.650914,40.751967],[-102.327774,40.74649]]]}},
+{"type":"Feature","id":"08097","properties":{"name":"Pitkin"},"geometry":{"type":"Polygon","coordinates":[[[-107.04342,39.366301],[-106.424526,39.360824],[-106.57788,39.059592],[-106.599788,38.999346],[-107.393944,39.256762],[-107.432283,39.366301],[-107.11462,39.366301],[-107.04342,39.366301]]]}},
+{"type":"Feature","id":"08099","properties":{"name":"Prowers"},"geometry":{"type":"Polygon","coordinates":[[[-102.212759,38.265436],[-102.042974,38.270913],[-102.042974,38.259959],[-102.042974,37.73965],[-102.042974,37.646542],[-102.749499,37.641065],[-102.744022,38.265436],[-102.212759,38.265436]]]}},
+{"type":"Feature","id":"08101","properties":{"name":"Pueblo"},"geometry":{"type":"Polygon","coordinates":[[[-104.053011,38.522852],[-104.058488,38.144943],[-104.058488,37.734173],[-104.348765,37.816327],[-105.049814,37.914912],[-105.049814,38.259959],[-104.940275,38.517375],[-104.053011,38.522852]]]}},
+{"type":"Feature","id":"08103","properties":{"name":"Rio Blanco"},"geometry":{"type":"Polygon","coordinates":[[[-107.109143,40.226181],[-107.037943,40.089257],[-107.936161,39.694917],[-109.053457,39.662056],[-109.053457,40.220704],[-107.43776,40.220704],[-107.109143,40.226181]]]}},
+{"type":"Feature","id":"08105","properties":{"name":"Rio Grande"},"geometry":{"type":"Polygon","coordinates":[[[-106.692896,37.832758],[-106.04114,37.750604],[-106.04114,37.400079],[-106.523111,37.400079],[-106.676465,37.405556],[-106.709327,37.405556],[-106.692896,37.832758]]]}},
+{"type":"Feature","id":"08107","properties":{"name":"Routt"},"geometry":{"type":"Polygon","coordinates":[[[-107.317267,41.003906],[-106.857204,41.003906],[-106.654557,40.445258],[-106.627173,39.924949],[-107.032466,39.919472],[-107.037943,40.089257],[-107.109143,40.226181],[-107.43776,40.220704],[-107.317267,41.003906]]]}},
+{"type":"Feature","id":"08109","properties":{"name":"Saguache"},"geometry":{"type":"Polygon","coordinates":[[[-106.008278,38.446175],[-105.794678,38.265436],[-105.471538,37.898481],[-105.455107,37.750604],[-105.707047,37.750604],[-106.04114,37.750604],[-106.692896,37.832758],[-106.999605,37.958727],[-106.999605,38.144943],[-106.999605,38.424267],[-106.249264,38.424267],[-106.008278,38.446175]]]}},
+{"type":"Feature","id":"08111","properties":{"name":"San Juan"},"geometry":{"type":"Polygon","coordinates":[[[-107.569206,37.964204],[-107.481575,37.641065],[-107.804715,37.641065],[-107.9745,37.641065],[-107.859484,37.777988],[-107.738991,37.903958],[-107.569206,37.964204]]]}},
+{"type":"Feature","id":"08113","properties":{"name":"San Miguel"},"geometry":{"type":"Polygon","coordinates":[[[-109.042503,38.15042],[-107.963546,38.15042],[-107.738991,37.903958],[-107.859484,37.777988],[-109.042503,37.88205],[-109.042503,38.15042]]]}},
+{"type":"Feature","id":"08115","properties":{"name":"Sedgwick"},"geometry":{"type":"Polygon","coordinates":[[[-102.623529,41.003906],[-102.053927,41.003906],[-102.053927,40.751967],[-102.327774,40.74649],[-102.650914,40.751967],[-102.650914,41.003906],[-102.623529,41.003906]]]}},
+{"type":"Feature","id":"08117","properties":{"name":"Summit"},"geometry":{"type":"Polygon","coordinates":[[[-106.43548,39.924949],[-105.926124,39.700394],[-105.827539,39.563471],[-106.134248,39.377255],[-106.205448,39.377255],[-106.43548,39.924949]]]}},
+{"type":"Feature","id":"08119","properties":{"name":"Teller"},"geometry":{"type":"Polygon","coordinates":[[[-105.329138,39.130793],[-105.329138,39.130793],[-105.033383,39.130793],[-104.940275,38.648822],[-105.329138,38.698114],[-105.329138,39.130793]]]}},
+{"type":"Feature","id":"08121","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-102.78236,40.439781],[-102.804268,39.568948],[-103.154792,39.563471],[-103.707963,39.568948],[-103.707963,39.738733],[-103.707963,40.001626],[-103.466978,40.434304],[-102.78236,40.439781]]]}},
+{"type":"Feature","id":"08123","properties":{"name":"Weld"},"geometry":{"type":"Polygon","coordinates":[[[-103.576517,41.003906],[-103.581994,40.521935],[-104.091349,40.521935],[-104.151596,40.001626],[-105.055291,40.001626],[-105.055291,40.264519],[-104.945752,40.998429],[-104.053011,41.003906],[-103.576517,41.003906]]]}},
+{"type":"Feature","id":"08125","properties":{"name":"Yuma"},"geometry":{"type":"Polygon","coordinates":[[[-102.426359,40.439781],[-102.053927,40.439781],[-102.053927,40.346673],[-102.053927,40.001626],[-102.04845,39.574425],[-102.426359,39.568948],[-102.804268,39.568948],[-102.78236,40.439781],[-102.667345,40.439781],[-102.426359,40.439781]]]}},
+{"type":"Feature","id":"09001","properties":{"name":"Fairfield"},"geometry":{"type":"Polygon","coordinates":[[[-73.519068,41.666616],[-73.310944,41.469446],[-73.108298,41.168214],[-73.655992,40.987475],[-73.546453,41.365384],[-73.530022,41.529692],[-73.519068,41.666616]]]}},
+{"type":"Feature","id":"09003","properties":{"name":"Hartford"},"geometry":{"type":"Polygon","coordinates":[[[-73.009713,42.039048],[-72.511311,42.033571],[-72.412726,41.600893],[-72.467496,41.584462],[-72.544173,41.644708],[-72.752296,41.578985],[-72.949466,41.644708],[-72.982328,41.639231],[-73.009713,42.039048]]]}},
+{"type":"Feature","id":"09005","properties":{"name":"Litchfield"},"geometry":{"type":"Polygon","coordinates":[[[-73.053528,42.039048],[-73.009713,42.039048],[-72.982328,41.639231],[-73.310944,41.469446],[-73.519068,41.666616],[-73.486206,42.050002],[-73.053528,42.039048]]]}},
+{"type":"Feature","id":"09007","properties":{"name":"Middlesex"},"geometry":{"type":"Polygon","coordinates":[[[-72.544173,41.644708],[-72.467496,41.584462],[-72.341526,41.277753],[-72.538696,41.255845],[-72.752296,41.578985],[-72.544173,41.644708]]]}},
+{"type":"Feature","id":"09009","properties":{"name":"New Haven"},"geometry":{"type":"Polygon","coordinates":[[[-72.949466,41.644708],[-72.752296,41.578985],[-72.538696,41.255845],[-73.108298,41.168214],[-73.310944,41.469446],[-72.982328,41.639231],[-72.949466,41.644708]]]}},
+{"type":"Feature","id":"09011","properties":{"name":"New London"},"geometry":{"type":"Polygon","coordinates":[[[-72.237464,41.715908],[-71.788355,41.639231],[-71.788355,41.595416],[-71.859555,41.321569],[-72.341526,41.277753],[-72.467496,41.584462],[-72.412726,41.600893],[-72.237464,41.715908]]]}},
+{"type":"Feature","id":"09013","properties":{"name":"Tolland"},"geometry":{"type":"Polygon","coordinates":[[[-72.133402,42.028094],[-72.100541,42.028094],[-72.237464,41.715908],[-72.412726,41.600893],[-72.511311,42.033571],[-72.133402,42.028094]]]}},
+{"type":"Feature","id":"09015","properties":{"name":"Windham"},"geometry":{"type":"Polygon","coordinates":[[[-71.799309,42.006186],[-71.788355,41.726862],[-71.788355,41.639231],[-72.237464,41.715908],[-72.100541,42.028094],[-71.799309,42.006186]]]}},
+{"type":"Feature","id":"10001","properties":{"name":"Kent"},"geometry":{"type":"Polygon","coordinates":[[[-75.616736,39.311532],[-75.512674,39.366301],[-75.310028,38.944577],[-75.720798,38.829561],[-75.748183,39.141746],[-75.75366,39.245808],[-75.759137,39.295101],[-75.616736,39.311532]]]}},
+{"type":"Feature","id":"10003","properties":{"name":"New Castle"},"geometry":{"type":"Polygon","coordinates":[[[-75.414089,39.804456],[-75.446951,39.771595],[-75.507197,39.683964],[-75.512674,39.366301],[-75.616736,39.311532],[-75.759137,39.295101],[-75.764614,39.377255],[-75.786521,39.722302],[-75.594828,39.837318],[-75.594828,39.837318],[-75.578398,39.837318],[-75.414089,39.804456]]]}},
+{"type":"Feature","id":"10005","properties":{"name":"Sussex"},"geometry":{"type":"Polygon","coordinates":[[[-75.047134,38.451652],[-75.342889,38.451652],[-75.69889,38.561191],[-75.709844,38.637868],[-75.720798,38.829561],[-75.310028,38.944577],[-75.047134,38.451652]]]}},
+{"type":"Feature","id":"11001","properties":{"name":"District of Columbia"},"geometry":{"type":"Polygon","coordinates":[[[-77.035264,38.993869],[-77.002402,38.966484],[-77.040741,38.791222],[-77.046218,38.840515],[-77.117418,38.933623],[-77.035264,38.993869]]]}},
+{"type":"Feature","id":"12001","properties":{"name":"Alachua"},"geometry":{"type":"Polygon","coordinates":[[[-82.506727,29.940487],[-82.419096,29.924056],[-82.052141,29.715932],[-82.057618,29.46947],[-82.408142,29.485901],[-82.654605,29.562578],[-82.660082,29.830948],[-82.528635,29.940487],[-82.506727,29.940487]]]}},
+{"type":"Feature","id":"12003","properties":{"name":"Baker"},"geometry":{"type":"Polygon","coordinates":[[[-82.419096,30.581289],[-82.216449,30.570335],[-82.052141,30.362211],[-82.046664,30.27458],[-82.052141,30.186949],[-82.052141,30.143133],[-82.145249,30.143133],[-82.298603,30.143133],[-82.457435,30.137656],[-82.457435,30.586766],[-82.419096,30.581289]]]}},
+{"type":"Feature","id":"12005","properties":{"name":"Bay"},"geometry":{"type":"Polygon","coordinates":[[[-85.382121,30.564858],[-85.387598,30.20338],[-85.387598,29.924056],[-85.995538,30.269103],[-85.990061,30.389596],[-85.43689,30.570335],[-85.382121,30.564858]]]}},
+{"type":"Feature","id":"12007","properties":{"name":"Bradford"},"geometry":{"type":"Polygon","coordinates":[[[-82.145249,30.143133],[-82.052141,30.143133],[-82.046664,29.715932],[-82.052141,29.715932],[-82.419096,29.924056],[-82.145249,30.143133]]]}},
+{"type":"Feature","id":"12009","properties":{"name":"Brevard"},"geometry":{"type":"Polygon","coordinates":[[[-80.447398,27.859249],[-80.869122,27.820911],[-80.863645,28.346697],[-80.989615,28.615067],[-80.732199,28.790329],[-80.447398,27.859249]]]}},
+{"type":"Feature","id":"12011","properties":{"name":"Broward"},"geometry":{"type":"Polygon","coordinates":[[[-80.250228,26.33666],[-80.074966,26.320229],[-80.118781,25.975182],[-80.874599,25.980659],[-80.880076,26.259983],[-80.880076,26.331183],[-80.250228,26.33666]]]}},
+{"type":"Feature","id":"12013","properties":{"name":"Calhoun"},"geometry":{"type":"Polygon","coordinates":[[[-85.16852,30.608673],[-84.933012,30.608673],[-85.113751,30.197903],[-85.22329,30.20338],[-85.387598,30.20338],[-85.382121,30.564858],[-85.16852,30.608673]]]}},
+{"type":"Feature","id":"12015","properties":{"name":"Charlotte"},"geometry":{"type":"Polygon","coordinates":[[[-82.041187,27.032231],[-81.564693,27.032231],[-81.564693,26.769338],[-82.063095,26.769338],[-82.210972,26.774815],[-82.23288,26.780292],[-82.23288,26.785769],[-82.271219,26.791246],[-82.375281,26.9446],[-82.057618,27.032231],[-82.041187,27.032231]]]}},
+{"type":"Feature","id":"12017","properties":{"name":"Citrus"},"geometry":{"type":"Polygon","coordinates":[[[-82.523158,29.042268],[-82.309557,28.960114],[-82.265742,28.669836],[-82.649128,28.691744],[-82.758666,28.992976],[-82.534112,29.042268],[-82.523158,29.042268]]]}},
+{"type":"Feature","id":"12019","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-81.701617,30.192426],[-81.679709,30.121226],[-81.581124,29.841902],[-82.046664,29.715932],[-82.052141,30.143133],[-82.052141,30.186949],[-81.701617,30.192426]]]}},
+{"type":"Feature","id":"12021","properties":{"name":"Collier"},"geometry":{"type":"Polygon","coordinates":[[[-81.564693,26.511922],[-80.880076,26.259983],[-80.874599,25.980659],[-80.874599,25.805397],[-81.345616,25.805397],[-81.679709,25.843735],[-81.844017,26.331183],[-81.564693,26.511922]]]}},
+{"type":"Feature","id":"12023","properties":{"name":"Columbia"},"geometry":{"type":"Polygon","coordinates":[[[-82.69842,30.597719],[-82.687466,30.597719],[-82.583404,30.592243],[-82.457435,30.586766],[-82.457435,30.137656],[-82.528635,29.940487],[-82.660082,29.830948],[-82.802482,29.93501],[-82.797005,30.334826],[-82.69842,30.597719]]]}},
+{"type":"Feature","id":"12027","properties":{"name":"DeSoto"},"geometry":{"type":"Polygon","coordinates":[[[-81.581124,27.33894],[-81.564693,27.33894],[-81.564693,27.032231],[-82.041187,27.032231],[-82.057618,27.032231],[-82.057618,27.207493],[-82.057618,27.33894],[-81.581124,27.33894]]]}},
+{"type":"Feature","id":"12029","properties":{"name":"Dixie"},"geometry":{"type":"Polygon","coordinates":[[[-82.939406,29.825471],[-82.922975,29.825471],[-82.939406,29.589962],[-83.16396,29.288731],[-83.410422,29.66664],[-83.317314,29.819994],[-82.939406,29.825471]]]}},
+{"type":"Feature","id":"12031","properties":{"name":"Duval"},"geometry":{"type":"Polygon","coordinates":[[[-81.608509,30.586766],[-81.444201,30.510088],[-81.378478,30.252672],[-81.389431,30.252672],[-81.679709,30.121226],[-81.701617,30.192426],[-82.052141,30.186949],[-82.046664,30.27458],[-81.608509,30.586766]]]}},
+{"type":"Feature","id":"12033","properties":{"name":"Escambia"},"geometry":{"type":"Polygon","coordinates":[[[-87.249758,30.997536],[-87.162127,30.997536],[-87.310004,30.734643],[-86.921141,30.373165],[-87.518128,30.280057],[-87.600282,30.997536],[-87.249758,30.997536]]]}},
+{"type":"Feature","id":"12035","properties":{"name":"Flagler"},"geometry":{"type":"Polygon","coordinates":[[[-81.214169,29.672117],[-81.214169,29.672117],[-81.10463,29.425654],[-81.110107,29.425654],[-81.433247,29.39827],[-81.526355,29.622824],[-81.214169,29.672117]]]}},
+{"type":"Feature","id":"12037","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-85.004212,30.011687],[-84.544149,30.011687],[-84.341502,29.962394],[-85.217813,29.694024],[-85.02612,29.973348],[-85.004212,30.011687]]]}},
+{"type":"Feature","id":"12039","properties":{"name":"Gadsden"},"geometry":{"type":"Polygon","coordinates":[[[-84.867289,30.712735],[-84.861812,30.712735],[-84.379841,30.690827],[-84.281256,30.685351],[-84.648211,30.389596],[-84.933012,30.608673],[-84.867289,30.712735]]]}},
+{"type":"Feature","id":"12041","properties":{"name":"Gilchrist"},"geometry":{"type":"Polygon","coordinates":[[[-82.879159,29.885717],[-82.802482,29.93501],[-82.660082,29.830948],[-82.654605,29.562578],[-82.873682,29.589962],[-82.939406,29.589962],[-82.922975,29.825471],[-82.917498,29.825471],[-82.906544,29.825471],[-82.879159,29.885717]]]}},
+{"type":"Feature","id":"12043","properties":{"name":"Glades"},"geometry":{"type":"Polygon","coordinates":[[[-80.945799,27.21297],[-80.885553,26.961031],[-80.96223,26.769338],[-81.564693,26.769338],[-81.564693,27.032231],[-80.945799,27.21297]]]}},
+{"type":"Feature","id":"12045","properties":{"name":"Gulf"},"geometry":{"type":"Polygon","coordinates":[[[-85.22329,30.20338],[-85.113751,30.197903],[-85.02612,29.973348],[-85.217813,29.694024],[-85.387598,29.924056],[-85.387598,30.20338],[-85.22329,30.20338]]]}},
+{"type":"Feature","id":"12047","properties":{"name":"Hamilton"},"geometry":{"type":"Polygon","coordinates":[[[-83.311837,30.636058],[-83.136575,30.625104],[-82.687466,30.597719],[-82.69842,30.597719],[-82.797005,30.334826],[-83.081806,30.438888],[-83.169437,30.384119],[-83.311837,30.636058]]]}},
+{"type":"Feature","id":"12049","properties":{"name":"Hardee"},"geometry":{"type":"Polygon","coordinates":[[[-82.052141,27.645649],[-81.564693,27.645649],[-81.564693,27.33894],[-81.581124,27.33894],[-82.057618,27.33894],[-82.052141,27.645649]]]}},
+{"type":"Feature","id":"12051","properties":{"name":"Hendry"},"geometry":{"type":"Polygon","coordinates":[[[-80.96223,26.769338],[-80.885553,26.961031],[-80.880076,26.331183],[-80.880076,26.259983],[-81.564693,26.511922],[-81.564693,26.769338],[-80.96223,26.769338]]]}},
+{"type":"Feature","id":"12053","properties":{"name":"Hernando"},"geometry":{"type":"Polygon","coordinates":[[[-82.265742,28.669836],[-82.057618,28.478144],[-82.254788,28.478144],[-82.676512,28.434328],[-82.649128,28.691744],[-82.265742,28.669836]]]}},
+{"type":"Feature","id":"12055","properties":{"name":"Highlands"},"geometry":{"type":"Polygon","coordinates":[[[-81.49897,27.645649],[-81.142969,27.645649],[-80.945799,27.21297],[-81.564693,27.032231],[-81.564693,27.33894],[-81.564693,27.645649],[-81.49897,27.645649]]]}},
+{"type":"Feature","id":"12057","properties":{"name":"Hillsborough"},"geometry":{"type":"Polygon","coordinates":[[[-82.649128,28.171435],[-82.106911,28.171435],[-82.052141,27.645649],[-82.28765,27.645649],[-82.55602,27.645649],[-82.649128,27.968788],[-82.649128,28.171435]]]}},
+{"type":"Feature","id":"12059","properties":{"name":"Holmes"},"geometry":{"type":"Polygon","coordinates":[[[-86.033877,30.992059],[-85.497137,30.997536],[-85.601199,30.833228],[-85.842184,30.701781],[-86.033877,30.992059]]]}},
+{"type":"Feature","id":"12061","properties":{"name":"Indian River"},"geometry":{"type":"Polygon","coordinates":[[[-80.321428,27.558018],[-80.677429,27.558018],[-80.792445,27.645649],[-80.874599,27.640172],[-80.869122,27.820911],[-80.447398,27.859249],[-80.321428,27.558018]]]}},
+{"type":"Feature","id":"12063","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-85.486183,30.997536],[-85.004212,31.003013],[-84.867289,30.712735],[-84.933012,30.608673],[-85.16852,30.608673],[-85.382121,30.564858],[-85.43689,30.570335],[-85.601199,30.833228],[-85.497137,30.997536],[-85.486183,30.997536]]]}},
+{"type":"Feature","id":"12065","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-83.744516,30.657966],[-83.613069,30.652489],[-83.821193,30.301965],[-83.990978,30.082887],[-84.078609,30.093841],[-84.073132,30.27458],[-84.007409,30.674397],[-83.744516,30.657966]]]}},
+{"type":"Feature","id":"12067","properties":{"name":"Lafayette"},"geometry":{"type":"Polygon","coordinates":[[[-83.246114,30.258149],[-82.879159,29.885717],[-82.906544,29.825471],[-82.917498,29.825471],[-82.922975,29.825471],[-82.939406,29.825471],[-83.317314,29.819994],[-83.366607,30.258149],[-83.246114,30.258149]]]}},
+{"type":"Feature","id":"12069","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-81.641371,29.277777],[-81.367524,28.87796],[-81.411339,28.784852],[-81.542786,28.784852],[-81.657801,28.346697],[-81.959033,28.346697],[-81.953556,28.960114],[-81.641371,29.277777]]]}},
+{"type":"Feature","id":"12071","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-82.063095,26.769338],[-81.564693,26.769338],[-81.564693,26.511922],[-81.844017,26.331183],[-82.063095,26.769338]]]}},
+{"type":"Feature","id":"12073","properties":{"name":"Leon"},"geometry":{"type":"Polygon","coordinates":[[[-84.084086,30.674397],[-84.007409,30.674397],[-84.073132,30.27458],[-84.303164,30.301965],[-84.713934,30.301965],[-84.648211,30.389596],[-84.281256,30.685351],[-84.084086,30.674397]]]}},
+{"type":"Feature","id":"12075","properties":{"name":"Levy"},"geometry":{"type":"Polygon","coordinates":[[[-82.873682,29.589962],[-82.654605,29.562578],[-82.408142,29.485901],[-82.534112,29.042268],[-82.758666,28.992976],[-83.16396,29.288731],[-82.939406,29.589962],[-82.873682,29.589962]]]}},
+{"type":"Feature","id":"12077","properties":{"name":"Liberty"},"geometry":{"type":"Polygon","coordinates":[[[-84.933012,30.608673],[-84.648211,30.389596],[-84.713934,30.301965],[-84.544149,30.011687],[-85.004212,30.011687],[-85.02612,29.973348],[-85.113751,30.197903],[-84.933012,30.608673]]]}},
+{"type":"Feature","id":"12079","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-83.355653,30.636058],[-83.311837,30.636058],[-83.169437,30.384119],[-83.246114,30.258149],[-83.366607,30.258149],[-83.509007,30.301965],[-83.821193,30.301965],[-83.613069,30.652489],[-83.355653,30.636058]]]}},
+{"type":"Feature","id":"12081","properties":{"name":"Manatee"},"geometry":{"type":"Polygon","coordinates":[[[-82.28765,27.645649],[-82.052141,27.645649],[-82.057618,27.33894],[-82.057618,27.207493],[-82.62722,27.388232],[-82.643651,27.388232],[-82.55602,27.645649],[-82.28765,27.645649]]]}},
+{"type":"Feature","id":"12083","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-81.844017,29.518762],[-81.679709,29.327069],[-81.641371,29.277777],[-81.953556,28.960114],[-82.013803,28.960114],[-82.309557,28.960114],[-82.523158,29.042268],[-82.534112,29.042268],[-82.408142,29.485901],[-82.057618,29.46947],[-81.844017,29.518762]]]}},
+{"type":"Feature","id":"12085","properties":{"name":"Martin"},"geometry":{"type":"Polygon","coordinates":[[[-80.080443,26.971985],[-80.885553,26.961031],[-80.677429,27.207493],[-80.200935,27.262263],[-80.080443,26.971985]]]}},
+{"type":"Feature","id":"12086","properties":{"name":"Miami-Dade"},"geometry":{"type":"Polygon","coordinates":[[[-80.874599,25.980659],[-80.118781,25.975182],[-80.304997,25.383672],[-80.858168,25.175549],[-80.874599,25.805397],[-80.874599,25.980659]]]}},
+{"type":"Feature","id":"12087","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-80.874599,25.805397],[-80.858168,25.175549],[-81.077246,25.120779],[-81.345616,25.805397],[-80.874599,25.805397]]]}},
+{"type":"Feature","id":"12089","properties":{"name":"Nassau"},"geometry":{"type":"Polygon","coordinates":[[[-81.904264,30.816797],[-81.444201,30.707258],[-81.444201,30.510088],[-81.608509,30.586766],[-82.046664,30.27458],[-82.052141,30.362211],[-81.904264,30.816797]]]}},
+{"type":"Feature","id":"12091","properties":{"name":"Okaloosa"},"geometry":{"type":"Polygon","coordinates":[[[-86.685633,30.992059],[-86.389878,30.992059],[-86.395355,30.378642],[-86.800648,30.384119],[-86.784218,30.997536],[-86.685633,30.992059]]]}},
+{"type":"Feature","id":"12093","properties":{"name":"Okeechobee"},"geometry":{"type":"Polygon","coordinates":[[[-80.792445,27.645649],[-80.677429,27.558018],[-80.677429,27.207493],[-80.885553,26.961031],[-80.945799,27.21297],[-81.142969,27.645649],[-80.874599,27.640172],[-80.792445,27.645649]]]}},
+{"type":"Feature","id":"12095","properties":{"name":"Orange"},"geometry":{"type":"Polygon","coordinates":[[[-81.542786,28.784852],[-81.411339,28.784852],[-80.989615,28.615067],[-80.863645,28.346697],[-81.2306,28.346697],[-81.657801,28.346697],[-81.542786,28.784852]]]}},
+{"type":"Feature","id":"12097","properties":{"name":"Osceola"},"geometry":{"type":"Polygon","coordinates":[[[-81.2306,28.346697],[-80.863645,28.346697],[-80.869122,27.820911],[-80.874599,27.640172],[-81.142969,27.645649],[-81.657801,28.346697],[-81.2306,28.346697]]]}},
+{"type":"Feature","id":"12099","properties":{"name":"Palm Beach"},"geometry":{"type":"Polygon","coordinates":[[[-80.885553,26.961031],[-80.080443,26.971985],[-80.074966,26.320229],[-80.250228,26.33666],[-80.880076,26.331183],[-80.885553,26.961031]]]}},
+{"type":"Feature","id":"12101","properties":{"name":"Pasco"},"geometry":{"type":"Polygon","coordinates":[[[-82.254788,28.478144],[-82.057618,28.478144],[-82.057618,28.313835],[-82.106911,28.171435],[-82.649128,28.171435],[-82.802482,28.171435],[-82.676512,28.434328],[-82.254788,28.478144]]]}},
+{"type":"Feature","id":"12103","properties":{"name":"Pinellas"},"geometry":{"type":"Polygon","coordinates":[[[-82.649128,28.171435],[-82.649128,27.968788],[-82.802482,28.171435],[-82.649128,28.171435]]]}},
+{"type":"Feature","id":"12105","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-81.657801,28.346697],[-81.142969,27.645649],[-81.49897,27.645649],[-81.564693,27.645649],[-82.052141,27.645649],[-82.106911,28.171435],[-82.057618,28.313835],[-81.959033,28.346697],[-81.657801,28.346697]]]}},
+{"type":"Feature","id":"12107","properties":{"name":"Putnam"},"geometry":{"type":"Polygon","coordinates":[[[-81.581124,29.841902],[-81.526355,29.622824],[-81.433247,29.39827],[-81.679709,29.327069],[-81.844017,29.518762],[-82.057618,29.46947],[-82.052141,29.715932],[-82.046664,29.715932],[-81.581124,29.841902]]]}},
+{"type":"Feature","id":"12109","properties":{"name":"St. Johns"},"geometry":{"type":"Polygon","coordinates":[[[-81.389431,30.252672],[-81.378478,30.252672],[-81.214169,29.672117],[-81.214169,29.672117],[-81.526355,29.622824],[-81.581124,29.841902],[-81.679709,30.121226],[-81.389431,30.252672]]]}},
+{"type":"Feature","id":"12111","properties":{"name":"St. Lucie"},"geometry":{"type":"Polygon","coordinates":[[[-80.677429,27.558018],[-80.321428,27.558018],[-80.200935,27.262263],[-80.677429,27.207493],[-80.677429,27.558018]]]}},
+{"type":"Feature","id":"12113","properties":{"name":"Santa Rosa"},"geometry":{"type":"Polygon","coordinates":[[[-87.162127,30.997536],[-86.784218,30.997536],[-86.800648,30.384119],[-86.921141,30.373165],[-87.310004,30.734643],[-87.162127,30.997536]]]}},
+{"type":"Feature","id":"12115","properties":{"name":"Sarasota"},"geometry":{"type":"Polygon","coordinates":[[[-82.62722,27.388232],[-82.057618,27.207493],[-82.057618,27.032231],[-82.375281,26.9446],[-82.643651,27.388232],[-82.62722,27.388232]]]}},
+{"type":"Feature","id":"12117","properties":{"name":"Seminole"},"geometry":{"type":"Polygon","coordinates":[[[-81.411339,28.784852],[-81.367524,28.87796],[-80.989615,28.615067],[-81.411339,28.784852]]]}},
+{"type":"Feature","id":"12119","properties":{"name":"Sumter"},"geometry":{"type":"Polygon","coordinates":[[[-82.013803,28.960114],[-81.953556,28.960114],[-81.959033,28.346697],[-82.057618,28.313835],[-82.057618,28.478144],[-82.265742,28.669836],[-82.309557,28.960114],[-82.013803,28.960114]]]}},
+{"type":"Feature","id":"12121","properties":{"name":"Suwannee"},"geometry":{"type":"Polygon","coordinates":[[[-83.081806,30.438888],[-82.797005,30.334826],[-82.802482,29.93501],[-82.879159,29.885717],[-83.246114,30.258149],[-83.169437,30.384119],[-83.081806,30.438888]]]}},
+{"type":"Feature","id":"12123","properties":{"name":"Taylor"},"geometry":{"type":"Polygon","coordinates":[[[-83.509007,30.301965],[-83.366607,30.258149],[-83.317314,29.819994],[-83.410422,29.66664],[-83.990978,30.082887],[-83.821193,30.301965],[-83.509007,30.301965]]]}},
+{"type":"Feature","id":"12125","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-82.298603,30.143133],[-82.145249,30.143133],[-82.419096,29.924056],[-82.506727,29.940487],[-82.528635,29.940487],[-82.457435,30.137656],[-82.298603,30.143133]]]}},
+{"type":"Feature","id":"12127","properties":{"name":"Volusia"},"geometry":{"type":"Polygon","coordinates":[[[-81.110107,29.425654],[-81.10463,29.425654],[-80.732199,28.790329],[-80.989615,28.615067],[-81.367524,28.87796],[-81.641371,29.277777],[-81.679709,29.327069],[-81.433247,29.39827],[-81.110107,29.425654]]]}},
+{"type":"Feature","id":"12129","properties":{"name":"Wakulla"},"geometry":{"type":"Polygon","coordinates":[[[-84.303164,30.301965],[-84.073132,30.27458],[-84.078609,30.093841],[-84.341502,29.962394],[-84.544149,30.011687],[-84.713934,30.301965],[-84.303164,30.301965]]]}},
+{"type":"Feature","id":"12131","properties":{"name":"Walton"},"geometry":{"type":"Polygon","coordinates":[[[-86.389878,30.992059],[-86.187231,30.992059],[-86.033877,30.992059],[-85.842184,30.701781],[-85.990061,30.389596],[-85.995538,30.269103],[-86.395355,30.378642],[-86.389878,30.992059]]]}},
+{"type":"Feature","id":"12133","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-85.601199,30.833228],[-85.43689,30.570335],[-85.990061,30.389596],[-85.842184,30.701781],[-85.601199,30.833228]]]}},
+{"type":"Feature","id":"13001","properties":{"name":"Appling"},"geometry":{"type":"Polygon","coordinates":[[[-82.43005,31.966955],[-82.227403,31.912185],[-82.046664,31.824554],[-82.134295,31.632861],[-82.134295,31.468553],[-82.227403,31.528799],[-82.523158,31.709538],[-82.43005,31.966955]]]}},
+{"type":"Feature","id":"13003","properties":{"name":"Atkinson"},"geometry":{"type":"Polygon","coordinates":[[[-83.142052,31.419261],[-82.62722,31.364491],[-82.671035,31.183752],[-82.972267,31.183752],[-83.032514,31.183752],[-83.048944,31.183752],[-83.142052,31.419261]]]}},
+{"type":"Feature","id":"13005","properties":{"name":"Bacon"},"geometry":{"type":"Polygon","coordinates":[[[-82.523158,31.709538],[-82.227403,31.528799],[-82.419096,31.419261],[-82.473866,31.419261],[-82.599835,31.468553],[-82.62722,31.6712],[-82.523158,31.709538]]]}},
+{"type":"Feature","id":"13007","properties":{"name":"Baker"},"geometry":{"type":"Polygon","coordinates":[[[-84.429133,31.435691],[-84.138855,31.441168],[-84.50581,31.07969],[-84.544149,31.07969],[-84.642734,31.260429],[-84.637257,31.435691],[-84.429133,31.435691]]]}},
+{"type":"Feature","id":"13009","properties":{"name":"Baldwin"},"geometry":{"type":"Polygon","coordinates":[[[-83.273499,33.188312],[-83.054421,33.078773],[-83.076329,32.947327],[-83.355653,32.925419],[-83.426853,33.182835],[-83.273499,33.188312]]]}},
+{"type":"Feature","id":"13011","properties":{"name":"Banks"},"geometry":{"type":"Polygon","coordinates":[[[-83.552823,34.486347],[-83.459715,34.48087],[-83.399469,34.458962],[-83.355653,34.223454],[-83.404945,34.196069],[-83.618546,34.289177],[-83.618546,34.294654],[-83.613069,34.431578],[-83.552823,34.486347]]]}},
+{"type":"Feature","id":"13013","properties":{"name":"Barrow"},"geometry":{"type":"Polygon","coordinates":[[[-83.799285,33.927699],[-83.815716,34.124869],[-83.536392,33.966038],[-83.645931,33.905791],[-83.799285,33.927699]]]}},
+{"type":"Feature","id":"13015","properties":{"name":"Bartow"},"geometry":{"type":"Polygon","coordinates":[[[-84.933012,34.398716],[-84.653688,34.415147],[-84.659165,34.075577],[-84.735842,34.081054],[-84.922058,34.081054],[-85.048028,34.097484],[-85.004212,34.393239],[-84.933012,34.398716]]]}},
+{"type":"Feature","id":"13017","properties":{"name":"Ben Hill"},"geometry":{"type":"Polygon","coordinates":[[[-83.481623,31.846462],[-83.180391,31.846462],[-82.994175,31.780739],[-82.999652,31.6712],[-83.454238,31.758831],[-83.481623,31.846462]]]}},
+{"type":"Feature","id":"13019","properties":{"name":"Berrien"},"geometry":{"type":"Polygon","coordinates":[[[-83.240637,31.47403],[-83.147529,31.47403],[-83.142052,31.419261],[-83.048944,31.183752],[-83.196822,31.024921],[-83.295407,31.024921],[-83.43233,31.34806],[-83.339222,31.47403],[-83.240637,31.47403]]]}},
+{"type":"Feature","id":"13021","properties":{"name":"Bibb"},"geometry":{"type":"Polygon","coordinates":[[[-83.722608,32.952804],[-83.711654,32.952804],[-83.514484,32.843265],[-83.596638,32.662526],[-83.7007,32.689911],[-83.892393,32.848742],[-83.722608,32.952804]]]}},
+{"type":"Feature","id":"13023","properties":{"name":"Bleckley"},"geometry":{"type":"Polygon","coordinates":[[[-83.224206,32.585849],[-83.136575,32.421541],[-83.344699,32.273663],[-83.498053,32.399633],[-83.498053,32.454402],[-83.224206,32.585849]]]}},
+{"type":"Feature","id":"13025","properties":{"name":"Brantley"},"geometry":{"type":"Polygon","coordinates":[[[-82.041187,31.369968],[-82.041187,31.375445],[-81.729002,31.331629],[-81.76734,31.167321],[-81.937125,31.046829],[-81.986418,31.057782],[-82.134295,31.00849],[-82.282173,31.227568],[-82.041187,31.369968]]]}},
+{"type":"Feature","id":"13027","properties":{"name":"Brooks"},"geometry":{"type":"Polygon","coordinates":[[[-83.498053,31.052306],[-83.476146,31.030398],[-83.355653,30.636058],[-83.613069,30.652489],[-83.744516,30.657966],[-83.739039,31.035875],[-83.574731,31.07969],[-83.498053,31.052306]]]}},
+{"type":"Feature","id":"13029","properties":{"name":"Bryan"},"geometry":{"type":"Polygon","coordinates":[[[-81.42777,32.235325],[-81.389431,32.098401],[-81.153923,31.725969],[-81.197738,31.725969],[-81.707094,32.087447],[-81.718048,32.087447],[-81.783771,32.153171],[-81.433247,32.240802],[-81.42777,32.235325]]]}},
+{"type":"Feature","id":"13031","properties":{"name":"Bulloch"},"geometry":{"type":"Polygon","coordinates":[[[-81.827587,32.651572],[-81.548263,32.487264],[-81.433247,32.240802],[-81.783771,32.153171],[-81.969987,32.268186],[-82.030233,32.536556],[-82.002849,32.607757],[-81.838541,32.651572],[-81.827587,32.651572]]]}},
+{"type":"Feature","id":"13033","properties":{"name":"Burke"},"geometry":{"type":"Polygon","coordinates":[[[-82.189065,33.292374],[-81.849494,33.248559],[-81.756386,33.199266],[-81.613986,33.095204],[-81.542786,33.045912],[-81.76734,32.908988],[-81.860448,32.952804],[-82.145249,32.810403],[-82.315034,32.837788],[-82.265742,33.264989],[-82.189065,33.292374]]]}},
+{"type":"Feature","id":"13035","properties":{"name":"Butts"},"geometry":{"type":"Polygon","coordinates":[[[-83.925255,33.451205],[-83.865008,33.369051],[-83.821193,33.182835],[-84.001932,33.204743],[-84.040271,33.204743],[-84.122425,33.204743],[-84.100517,33.297851],[-83.925255,33.451205]]]}},
+{"type":"Feature","id":"13037","properties":{"name":"Calhoun"},"geometry":{"type":"Polygon","coordinates":[[[-84.544149,31.621907],[-84.451041,31.621907],[-84.429133,31.435691],[-84.637257,31.435691],[-84.817996,31.501415],[-84.817996,31.621907],[-84.544149,31.621907]]]}},
+{"type":"Feature","id":"13039","properties":{"name":"Camden"},"geometry":{"type":"Polygon","coordinates":[[[-81.76734,31.167321],[-81.444201,31.013967],[-81.444201,30.707258],[-81.904264,30.816797],[-81.937125,31.046829],[-81.76734,31.167321]]]}},
+{"type":"Feature","id":"13043","properties":{"name":"Candler"},"geometry":{"type":"Polygon","coordinates":[[[-82.030233,32.536556],[-81.969987,32.268186],[-82.024756,32.27914],[-82.23288,32.317479],[-82.030233,32.536556]]]}},
+{"type":"Feature","id":"13045","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-85.037074,33.812683],[-84.90015,33.779822],[-84.807042,33.571698],[-84.850858,33.511452],[-85.015166,33.423821],[-85.29449,33.429298],[-85.305444,33.484067],[-85.338305,33.653852],[-85.037074,33.812683]]]}},
+{"type":"Feature","id":"13047","properties":{"name":"Catoosa"},"geometry":{"type":"Polygon","coordinates":[[[-85.267105,34.984749],[-84.982304,34.990226],[-85.146612,34.765671],[-85.267105,34.984749]]]}},
+{"type":"Feature","id":"13049","properties":{"name":"Charlton"},"geometry":{"type":"Polygon","coordinates":[[[-81.986418,31.057782],[-81.937125,31.046829],[-81.904264,30.816797],[-82.052141,30.362211],[-82.216449,30.570335],[-82.134295,31.00849],[-81.986418,31.057782]]]}},
+{"type":"Feature","id":"13051","properties":{"name":"Chatham"},"geometry":{"type":"Polygon","coordinates":[[[-81.1594,32.229848],[-81.148446,32.224371],[-80.885553,32.032678],[-81.153923,31.725969],[-81.389431,32.098401],[-81.1594,32.229848]]]}},
+{"type":"Feature","id":"13053","properties":{"name":"Chattahoochee"},"geometry":{"type":"Polygon","coordinates":[[[-84.637257,32.536556],[-84.659165,32.235325],[-84.922058,32.229848],[-84.982304,32.372248],[-84.692026,32.520126],[-84.637257,32.536556]]]}},
+{"type":"Feature","id":"13055","properties":{"name":"Chattooga"},"geometry":{"type":"Polygon","coordinates":[[[-85.108274,34.584932],[-85.464275,34.2837],[-85.513567,34.524686],[-85.529998,34.590409],[-85.108274,34.584932]]]}},
+{"type":"Feature","id":"13057","properties":{"name":"Cherokee"},"geometry":{"type":"Polygon","coordinates":[[[-84.582488,34.387762],[-84.259348,34.382285],[-84.259348,34.332993],[-84.259348,34.185115],[-84.407226,34.108438],[-84.418179,34.075577],[-84.615349,34.081054],[-84.659165,34.075577],[-84.653688,34.415147],[-84.582488,34.387762]]]}},
+{"type":"Feature","id":"13059","properties":{"name":"Clarke"},"geometry":{"type":"Polygon","coordinates":[[[-83.36113,34.042715],[-83.257068,33.998899],[-83.273499,33.845545],[-83.530915,33.960561],[-83.536392,33.966038],[-83.36113,34.042715]]]}},
+{"type":"Feature","id":"13061","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-85.124705,31.780739],[-84.960397,31.775262],[-84.817996,31.621907],[-84.817996,31.501415],[-85.048028,31.517845],[-85.124705,31.764308],[-85.141136,31.780739],[-85.124705,31.780739]]]}},
+{"type":"Feature","id":"13063","properties":{"name":"Clayton"},"geometry":{"type":"Polygon","coordinates":[[[-84.352456,33.648375],[-84.281256,33.648375],[-84.352456,33.35262],[-84.368887,33.35262],[-84.385318,33.35262],[-84.451041,33.54979],[-84.456518,33.54979],[-84.352456,33.648375]]]}},
+{"type":"Feature","id":"13065","properties":{"name":"Clinch"},"geometry":{"type":"Polygon","coordinates":[[[-82.972267,31.183752],[-82.671035,31.183752],[-82.419096,30.581289],[-82.457435,30.586766],[-82.583404,30.592243],[-82.972267,30.871567],[-82.972267,31.183752]]]}},
+{"type":"Feature","id":"13067","properties":{"name":"Cobb"},"geometry":{"type":"Polygon","coordinates":[[[-84.615349,34.081054],[-84.418179,34.075577],[-84.577011,33.741483],[-84.724888,33.807207],[-84.735842,34.081054],[-84.659165,34.075577],[-84.615349,34.081054]]]}},
+{"type":"Feature","id":"13069","properties":{"name":"Coffee"},"geometry":{"type":"Polygon","coordinates":[[[-82.994175,31.780739],[-82.835344,31.8136],[-82.62722,31.6712],[-82.599835,31.468553],[-82.62722,31.364491],[-83.142052,31.419261],[-83.147529,31.47403],[-82.999652,31.6712],[-82.994175,31.780739]]]}},
+{"type":"Feature","id":"13071","properties":{"name":"Colquitt"},"geometry":{"type":"Polygon","coordinates":[[[-83.974547,31.337106],[-83.651408,31.331629],[-83.514484,31.326153],[-83.574731,31.07969],[-83.739039,31.035875],[-84.001932,31.07969],[-84.001932,31.337106],[-83.974547,31.337106]]]}},
+{"type":"Feature","id":"13073","properties":{"name":"Columbia"},"geometry":{"type":"Polygon","coordinates":[[[-82.216449,33.686714],[-82.117864,33.599083],[-82.030233,33.544313],[-82.293127,33.35262],[-82.424573,33.648375],[-82.216449,33.686714]]]}},
+{"type":"Feature","id":"13075","properties":{"name":"Cook"},"geometry":{"type":"Polygon","coordinates":[[[-83.43233,31.34806],[-83.295407,31.024921],[-83.383038,31.030398],[-83.476146,31.030398],[-83.498053,31.052306],[-83.574731,31.07969],[-83.514484,31.326153],[-83.43233,31.34806]]]}},
+{"type":"Feature","id":"13077","properties":{"name":"Coweta"},"geometry":{"type":"Polygon","coordinates":[[[-84.681073,33.511452],[-84.609872,33.500498],[-84.494857,33.259513],[-84.500334,33.221174],[-84.861812,33.193789],[-84.938489,33.226651],[-85.015166,33.423821],[-84.850858,33.511452],[-84.681073,33.511452]]]}},
+{"type":"Feature","id":"13079","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-84.122425,32.848742],[-83.892393,32.848742],[-83.7007,32.689911],[-83.7007,32.689911],[-83.766424,32.695388],[-84.001932,32.531079],[-84.204579,32.689911],[-84.122425,32.848742]]]}},
+{"type":"Feature","id":"13081","properties":{"name":"Crisp"},"geometry":{"type":"Polygon","coordinates":[[[-83.963593,32.032678],[-83.607592,32.027201],[-83.613069,31.851939],[-83.804762,31.802646],[-83.941686,31.846462],[-83.925255,31.912185],[-83.963593,32.032678]]]}},
+{"type":"Feature","id":"13083","properties":{"name":"Dade"},"geometry":{"type":"Polygon","coordinates":[[[-85.475229,34.984749],[-85.36569,34.984749],[-85.535475,34.623271],[-85.584768,34.858779],[-85.606675,34.984749],[-85.475229,34.984749]]]}},
+{"type":"Feature","id":"13085","properties":{"name":"Dawson"},"geometry":{"type":"Polygon","coordinates":[[[-84.199102,34.617794],[-84.188148,34.601363],[-83.980024,34.420624],[-83.958116,34.332993],[-84.259348,34.332993],[-84.259348,34.382285],[-84.346979,34.563024],[-84.199102,34.617794]]]}},
+{"type":"Feature","id":"13087","properties":{"name":"Decatur"},"geometry":{"type":"Polygon","coordinates":[[[-84.544149,31.07969],[-84.544149,31.07969],[-84.50581,31.07969],[-84.374364,31.07969],[-84.379841,30.690827],[-84.861812,30.712735],[-84.730365,31.068736],[-84.544149,31.07969]]]}},
+{"type":"Feature","id":"13089","properties":{"name":"DeKalb"},"geometry":{"type":"Polygon","coordinates":[[[-84.275779,33.955084],[-84.02384,33.752437],[-84.182671,33.648375],[-84.226487,33.637421],[-84.281256,33.648375],[-84.352456,33.648375],[-84.275779,33.955084],[-84.275779,33.955084]]]}},
+{"type":"Feature","id":"13091","properties":{"name":"Dodge"},"geometry":{"type":"Polygon","coordinates":[[[-83.136575,32.421541],[-82.884636,32.196986],[-82.928452,32.13674],[-82.950359,32.120309],[-83.207776,31.901231],[-83.339222,32.103878],[-83.344699,32.273663],[-83.136575,32.421541]]]}},
+{"type":"Feature","id":"13093","properties":{"name":"Dooly"},"geometry":{"type":"Polygon","coordinates":[[[-83.848578,32.290094],[-83.613069,32.290094],[-83.607592,32.120309],[-83.607592,32.027201],[-83.963593,32.032678],[-84.029317,32.169601],[-83.848578,32.290094]]]}},
+{"type":"Feature","id":"13095","properties":{"name":"Dougherty"},"geometry":{"type":"Polygon","coordinates":[[[-84.018363,31.649292],[-83.996455,31.441168],[-84.062178,31.441168],[-84.138855,31.441168],[-84.429133,31.435691],[-84.451041,31.621907],[-84.297687,31.621907],[-84.018363,31.649292]]]}},
+{"type":"Feature","id":"13097","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-84.724888,33.807207],[-84.577011,33.741483],[-84.807042,33.571698],[-84.90015,33.779822],[-84.724888,33.807207]]]}},
+{"type":"Feature","id":"13099","properties":{"name":"Early"},"geometry":{"type":"Polygon","coordinates":[[[-85.086366,31.309722],[-85.048028,31.517845],[-84.817996,31.501415],[-84.637257,31.435691],[-84.642734,31.260429],[-84.922058,31.074213],[-85.02612,31.074213],[-85.086366,31.309722]]]}},
+{"type":"Feature","id":"13101","properties":{"name":"Echols"},"geometry":{"type":"Polygon","coordinates":[[[-82.972267,30.871567],[-82.583404,30.592243],[-82.687466,30.597719],[-83.136575,30.625104],[-83.02156,30.849659],[-82.972267,30.871567]]]}},
+{"type":"Feature","id":"13103","properties":{"name":"Effingham"},"geometry":{"type":"Polygon","coordinates":[[[-81.389431,32.596803],[-81.279893,32.558464],[-81.148446,32.224371],[-81.1594,32.229848],[-81.389431,32.098401],[-81.42777,32.235325],[-81.433247,32.240802],[-81.548263,32.487264],[-81.389431,32.596803]]]}},
+{"type":"Feature","id":"13105","properties":{"name":"Elbert"},"geometry":{"type":"Polygon","coordinates":[[[-82.775097,34.289177],[-82.742236,34.207023],[-82.594358,34.01533],[-82.566974,33.955084],[-82.643651,33.982469],[-82.731282,33.982469],[-82.780574,33.971515],[-82.977744,34.042715],[-83.076329,34.228931],[-82.775097,34.289177]]]}},
+{"type":"Feature","id":"13107","properties":{"name":"Emanuel"},"geometry":{"type":"Polygon","coordinates":[[[-82.315034,32.837788],[-82.145249,32.810403],[-82.002849,32.607757],[-82.030233,32.536556],[-82.23288,32.317479],[-82.408142,32.355817],[-82.550543,32.498218],[-82.649128,32.514649],[-82.435527,32.761111],[-82.315034,32.837788]]]}},
+{"type":"Feature","id":"13109","properties":{"name":"Evans"},"geometry":{"type":"Polygon","coordinates":[[[-82.024756,32.27914],[-81.969987,32.268186],[-81.783771,32.153171],[-81.718048,32.087447],[-81.761863,32.049109],[-82.024756,32.27914]]]}},
+{"type":"Feature","id":"13111","properties":{"name":"Fannin"},"geometry":{"type":"Polygon","coordinates":[[[-84.319594,34.990226],[-84.127902,34.990226],[-84.155286,34.650655],[-84.188148,34.601363],[-84.199102,34.617794],[-84.620826,34.853302],[-84.620826,34.990226],[-84.319594,34.990226]]]}},
+{"type":"Feature","id":"13113","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-84.451041,33.54979],[-84.385318,33.35262],[-84.494857,33.259513],[-84.609872,33.500498],[-84.456518,33.54979],[-84.451041,33.54979]]]}},
+{"type":"Feature","id":"13115","properties":{"name":"Floyd"},"geometry":{"type":"Polygon","coordinates":[[[-85.09732,34.584932],[-85.069935,34.584932],[-85.004212,34.393239],[-85.048028,34.097484],[-85.42046,34.081054],[-85.464275,34.2837],[-85.108274,34.584932],[-85.09732,34.584932]]]}},
+{"type":"Feature","id":"13117","properties":{"name":"Forsyth"},"geometry":{"type":"Polygon","coordinates":[[[-84.259348,34.332993],[-83.958116,34.332993],[-84.062178,34.168685],[-84.09504,34.048192],[-84.259348,34.185115],[-84.259348,34.332993]]]}},
+{"type":"Feature","id":"13119","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-83.125621,34.519209],[-83.103714,34.53564],[-83.048944,34.497301],[-83.114668,34.272746],[-83.120145,34.272746],[-83.355653,34.223454],[-83.399469,34.458962],[-83.125621,34.519209]]]}},
+{"type":"Feature","id":"13121","properties":{"name":"Fulton"},"geometry":{"type":"Polygon","coordinates":[[[-84.407226,34.108438],[-84.259348,34.185115],[-84.09504,34.048192],[-84.275779,33.955084],[-84.352456,33.648375],[-84.456518,33.54979],[-84.609872,33.500498],[-84.681073,33.511452],[-84.850858,33.511452],[-84.807042,33.571698],[-84.577011,33.741483],[-84.418179,34.075577],[-84.407226,34.108438]]]}},
+{"type":"Feature","id":"13123","properties":{"name":"Gilmer"},"geometry":{"type":"Polygon","coordinates":[[[-84.620826,34.853302],[-84.199102,34.617794],[-84.346979,34.563024],[-84.653688,34.546593],[-84.653688,34.584932],[-84.620826,34.853302]]]}},
+{"type":"Feature","id":"13125","properties":{"name":"Glascock"},"geometry":{"type":"Polygon","coordinates":[[[-82.687466,33.270466],[-82.43005,33.275943],[-82.660082,33.128066],[-82.747713,33.237605],[-82.75319,33.254036],[-82.687466,33.270466]]]}},
+{"type":"Feature","id":"13127","properties":{"name":"Glynn"},"geometry":{"type":"Polygon","coordinates":[[[-81.279893,31.293291],[-81.268939,31.293291],[-81.444201,31.013967],[-81.76734,31.167321],[-81.729002,31.331629],[-81.62494,31.452122],[-81.279893,31.293291]]]}},
+{"type":"Feature","id":"13129","properties":{"name":"Gordon"},"geometry":{"type":"Polygon","coordinates":[[[-84.916581,34.634225],[-84.653688,34.584932],[-84.653688,34.546593],[-84.653688,34.415147],[-84.933012,34.398716],[-85.004212,34.393239],[-85.069935,34.584932],[-85.048028,34.623271],[-84.916581,34.634225]]]}},
+{"type":"Feature","id":"13131","properties":{"name":"Grady"},"geometry":{"type":"Polygon","coordinates":[[[-84.270302,31.07969],[-84.116948,31.07969],[-84.084086,30.674397],[-84.281256,30.685351],[-84.379841,30.690827],[-84.374364,31.07969],[-84.270302,31.07969]]]}},
+{"type":"Feature","id":"13133","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-83.28993,33.736006],[-83.278976,33.763391],[-82.994175,33.692191],[-83.010606,33.467636],[-83.16396,33.35262],[-83.278976,33.484067],[-83.404945,33.697668],[-83.28993,33.736006]]]}},
+{"type":"Feature","id":"13135","properties":{"name":"Gwinnett"},"geometry":{"type":"Polygon","coordinates":[[[-83.990978,34.1413],[-83.815716,34.124869],[-83.799285,33.927699],[-83.980024,33.785299],[-84.02384,33.752437],[-84.275779,33.955084],[-84.275779,33.955084],[-84.09504,34.048192],[-84.062178,34.168685],[-83.990978,34.1413]]]}},
+{"type":"Feature","id":"13137","properties":{"name":"Habersham"},"geometry":{"type":"Polygon","coordinates":[[[-83.651408,34.820441],[-83.350176,34.716379],[-83.339222,34.688994],[-83.459715,34.48087],[-83.552823,34.486347],[-83.613069,34.431578],[-83.667839,34.502778],[-83.684269,34.798533],[-83.651408,34.820441]]]}},
+{"type":"Feature","id":"13139","properties":{"name":"Hall"},"geometry":{"type":"Polygon","coordinates":[[[-83.788331,34.513732],[-83.667839,34.502778],[-83.613069,34.431578],[-83.618546,34.294654],[-83.815716,34.124869],[-83.990978,34.1413],[-84.062178,34.168685],[-83.958116,34.332993],[-83.980024,34.420624],[-83.843101,34.502778],[-83.788331,34.513732]]]}},
+{"type":"Feature","id":"13141","properties":{"name":"Hancock"},"geometry":{"type":"Polygon","coordinates":[[[-83.010606,33.467636],[-82.851774,33.445728],[-82.75319,33.254036],[-82.747713,33.237605],[-83.054421,33.078773],[-83.273499,33.188312],[-83.16396,33.35262],[-83.010606,33.467636],[-83.010606,33.467636]]]}},
+{"type":"Feature","id":"13143","properties":{"name":"Haralson"},"geometry":{"type":"Polygon","coordinates":[[[-85.310921,33.900315],[-85.048028,33.905791],[-85.037074,33.812683],[-85.338305,33.653852],[-85.387598,33.900315],[-85.310921,33.900315]]]}},
+{"type":"Feature","id":"13145","properties":{"name":"Harris"},"geometry":{"type":"Polygon","coordinates":[[[-84.861812,32.87065],[-84.70298,32.843265],[-84.692026,32.585849],[-85.02612,32.607757],[-85.080889,32.607757],[-85.130182,32.74468],[-85.184951,32.87065],[-84.861812,32.87065],[-84.861812,32.87065]]]}},
+{"type":"Feature","id":"13147","properties":{"name":"Hart"},"geometry":{"type":"Polygon","coordinates":[[[-83.048944,34.497301],[-82.994175,34.48087],[-82.775097,34.289177],[-83.076329,34.228931],[-83.114668,34.272746],[-83.048944,34.497301]]]}},
+{"type":"Feature","id":"13149","properties":{"name":"Heard"},"geometry":{"type":"Polygon","coordinates":[[[-85.015166,33.423821],[-84.938489,33.226651],[-84.938489,33.226651],[-85.234244,33.128066],[-85.29449,33.429298],[-85.015166,33.423821]]]}},
+{"type":"Feature","id":"13151","properties":{"name":"Henry"},"geometry":{"type":"Polygon","coordinates":[[[-84.226487,33.637421],[-84.182671,33.648375],[-84.045747,33.527883],[-83.925255,33.451205],[-84.100517,33.297851],[-84.352456,33.35262],[-84.281256,33.648375],[-84.226487,33.637421]]]}},
+{"type":"Feature","id":"13153","properties":{"name":"Houston"},"geometry":{"type":"Polygon","coordinates":[[[-83.7007,32.689911],[-83.7007,32.689911],[-83.596638,32.662526],[-83.498053,32.454402],[-83.498053,32.399633],[-83.613069,32.290094],[-83.848578,32.290094],[-83.848578,32.465356],[-83.7007,32.689911]]]}},
+{"type":"Feature","id":"13155","properties":{"name":"Irwin"},"geometry":{"type":"Polygon","coordinates":[[[-83.454238,31.758831],[-82.999652,31.6712],[-83.147529,31.47403],[-83.240637,31.47403],[-83.339222,31.47403],[-83.498053,31.594523],[-83.454238,31.758831]]]}},
+{"type":"Feature","id":"13157","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-83.618546,34.289177],[-83.404945,34.196069],[-83.36113,34.042715],[-83.536392,33.966038],[-83.815716,34.124869],[-83.618546,34.294654],[-83.618546,34.289177]]]}},
+{"type":"Feature","id":"13159","properties":{"name":"Jasper"},"geometry":{"type":"Polygon","coordinates":[[[-83.684269,33.527883],[-83.536392,33.434775],[-83.547346,33.171881],[-83.815716,33.133543],[-83.821193,33.182835],[-83.865008,33.369051],[-83.684269,33.527883]]]}},
+{"type":"Feature","id":"13161","properties":{"name":"Jeff Davis"},"geometry":{"type":"Polygon","coordinates":[[[-82.468389,31.966955],[-82.43005,31.966955],[-82.523158,31.709538],[-82.62722,31.6712],[-82.835344,31.8136],[-82.643651,31.917662],[-82.545066,31.961478],[-82.479343,31.972432],[-82.468389,31.966955]]]}},
+{"type":"Feature","id":"13163","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-82.386235,33.314282],[-82.353373,33.314282],[-82.265742,33.264989],[-82.315034,32.837788],[-82.435527,32.761111],[-82.523158,32.821357],[-82.660082,33.128066],[-82.43005,33.275943],[-82.386235,33.314282]]]}},
+{"type":"Feature","id":"13165","properties":{"name":"Jenkins"},"geometry":{"type":"Polygon","coordinates":[[[-81.860448,32.952804],[-81.76734,32.908988],[-81.838541,32.651572],[-82.002849,32.607757],[-82.145249,32.810403],[-81.860448,32.952804]]]}},
+{"type":"Feature","id":"13167","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-82.523158,32.821357],[-82.435527,32.761111],[-82.649128,32.514649],[-82.955836,32.706342],[-82.944882,32.761111],[-82.523158,32.821357]]]}},
+{"type":"Feature","id":"13169","properties":{"name":"Jones"},"geometry":{"type":"Polygon","coordinates":[[[-83.426853,33.182835],[-83.355653,32.925419],[-83.404945,32.898034],[-83.514484,32.843265],[-83.711654,32.952804],[-83.815716,33.133543],[-83.547346,33.171881],[-83.426853,33.182835]]]}},
+{"type":"Feature","id":"13171","properties":{"name":"Lamar"},"geometry":{"type":"Polygon","coordinates":[[[-84.040271,33.204743],[-84.122425,32.930896],[-84.270302,32.991142],[-84.248394,33.188312],[-84.122425,33.204743],[-84.040271,33.204743]]]}},
+{"type":"Feature","id":"13173","properties":{"name":"Lanier"},"geometry":{"type":"Polygon","coordinates":[[[-83.032514,31.183752],[-82.972267,31.183752],[-82.972267,30.871567],[-83.02156,30.849659],[-83.196822,31.024921],[-83.048944,31.183752],[-83.032514,31.183752]]]}},
+{"type":"Feature","id":"13175","properties":{"name":"Laurens"},"geometry":{"type":"Polygon","coordinates":[[[-83.224206,32.585849],[-82.955836,32.706342],[-82.649128,32.514649],[-82.720328,32.312002],[-82.884636,32.196986],[-83.136575,32.421541],[-83.224206,32.585849]]]}},
+{"type":"Feature","id":"13177","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-84.259348,31.917662],[-83.925255,31.912185],[-83.941686,31.846462],[-84.018363,31.649292],[-84.297687,31.621907],[-84.336025,31.873847],[-84.259348,31.917662]]]}},
+{"type":"Feature","id":"13179","properties":{"name":"Liberty"},"geometry":{"type":"Polygon","coordinates":[[[-81.707094,32.087447],[-81.197738,31.725969],[-81.192262,31.567138],[-81.493493,31.698584],[-81.811156,31.999816],[-81.82211,32.016247],[-81.761863,32.049109],[-81.718048,32.087447],[-81.707094,32.087447]]]}},
+{"type":"Feature","id":"13181","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-82.643651,33.982469],[-82.566974,33.955084],[-82.216449,33.686714],[-82.424573,33.648375],[-82.479343,33.637421],[-82.643651,33.982469]]]}},
+{"type":"Feature","id":"13183","properties":{"name":"Long"},"geometry":{"type":"Polygon","coordinates":[[[-81.811156,31.999816],[-81.493493,31.698584],[-81.663278,31.539753],[-81.969987,31.791692],[-81.82211,32.016247],[-81.811156,31.999816]]]}},
+{"type":"Feature","id":"13185","properties":{"name":"Lowndes"},"geometry":{"type":"Polygon","coordinates":[[[-83.383038,31.030398],[-83.295407,31.024921],[-83.196822,31.024921],[-83.02156,30.849659],[-83.136575,30.625104],[-83.311837,30.636058],[-83.355653,30.636058],[-83.476146,31.030398],[-83.383038,31.030398]]]}},
+{"type":"Feature","id":"13187","properties":{"name":"Lumpkin"},"geometry":{"type":"Polygon","coordinates":[[[-83.854055,34.721856],[-83.843101,34.502778],[-83.980024,34.420624],[-84.188148,34.601363],[-84.155286,34.650655],[-83.854055,34.721856]]]}},
+{"type":"Feature","id":"13189","properties":{"name":"McDuffie"},"geometry":{"type":"Polygon","coordinates":[[[-82.424573,33.648375],[-82.293127,33.35262],[-82.353373,33.314282],[-82.386235,33.314282],[-82.649128,33.610037],[-82.479343,33.637421],[-82.424573,33.648375]]]}},
+{"type":"Feature","id":"13191","properties":{"name":"McIntosh"},"geometry":{"type":"Polygon","coordinates":[[[-81.493493,31.698584],[-81.192262,31.567138],[-81.268939,31.293291],[-81.279893,31.293291],[-81.62494,31.452122],[-81.663278,31.539753],[-81.493493,31.698584]]]}},
+{"type":"Feature","id":"13193","properties":{"name":"Macon"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-84.001932,32.531079],[-84.007409,32.520126],[-84.051224,32.520126],[-84.051224,32.520126],[-84.001932,32.531079]]],[[[-84.018363,32.503695],[-83.848578,32.465356],[-83.848578,32.290094],[-84.029317,32.169601],[-84.182671,32.229848],[-84.253871,32.372248],[-84.051224,32.520126],[-84.018363,32.503695]]]]}},
+{"type":"Feature","id":"13195","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-83.120145,34.272746],[-83.114668,34.272746],[-83.076329,34.228931],[-82.977744,34.042715],[-83.098237,34.026284],[-83.257068,33.998899],[-83.36113,34.042715],[-83.404945,34.196069],[-83.355653,34.223454],[-83.120145,34.272746]]]}},
+{"type":"Feature","id":"13197","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-84.637257,32.536556],[-84.445564,32.563941],[-84.390795,32.416064],[-84.429133,32.164124],[-84.429133,32.13674],[-84.648211,32.235325],[-84.659165,32.235325],[-84.637257,32.536556]]]}},
+{"type":"Feature","id":"13199","properties":{"name":"Meriwether"},"geometry":{"type":"Polygon","coordinates":[[[-84.861812,33.193789],[-84.500334,33.221174],[-84.494857,33.182835],[-84.527718,32.969235],[-84.50581,32.881604],[-84.70298,32.843265],[-84.861812,32.87065],[-84.861812,32.87065],[-84.861812,33.193789]]]}},
+{"type":"Feature","id":"13201","properties":{"name":"Miller"},"geometry":{"type":"Polygon","coordinates":[[[-84.642734,31.260429],[-84.544149,31.07969],[-84.544149,31.07969],[-84.730365,31.068736],[-84.922058,31.074213],[-84.642734,31.260429]]]}},
+{"type":"Feature","id":"13205","properties":{"name":"Mitchell"},"geometry":{"type":"Polygon","coordinates":[[[-84.062178,31.441168],[-83.996455,31.441168],[-84.001932,31.337106],[-84.001932,31.07969],[-84.100517,31.07969],[-84.116948,31.07969],[-84.270302,31.07969],[-84.374364,31.07969],[-84.50581,31.07969],[-84.138855,31.441168],[-84.062178,31.441168]]]}},
+{"type":"Feature","id":"13207","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-84.001932,33.204743],[-83.821193,33.182835],[-83.815716,33.133543],[-83.711654,32.952804],[-83.722608,32.952804],[-83.892393,32.848742],[-84.122425,32.848742],[-84.122425,32.930896],[-84.040271,33.204743],[-84.001932,33.204743]]]}},
+{"type":"Feature","id":"13209","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-82.408142,32.355817],[-82.479343,31.972432],[-82.545066,31.961478],[-82.654605,32.295571],[-82.408142,32.355817]]]}},
+{"type":"Feature","id":"13211","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-83.509007,33.812683],[-83.50353,33.81816],[-83.404945,33.697668],[-83.278976,33.484067],[-83.278976,33.484067],[-83.536392,33.434775],[-83.684269,33.527883],[-83.678792,33.599083],[-83.509007,33.812683]]]}},
+{"type":"Feature","id":"13213","properties":{"name":"Murray"},"geometry":{"type":"Polygon","coordinates":[[[-84.620826,34.990226],[-84.620826,34.853302],[-84.653688,34.584932],[-84.916581,34.634225],[-84.812519,34.990226],[-84.774181,34.990226],[-84.620826,34.990226]]]}},
+{"type":"Feature","id":"13215","properties":{"name":"Muscogee"},"geometry":{"type":"Polygon","coordinates":[[[-85.02612,32.607757],[-84.692026,32.585849],[-84.692026,32.520126],[-84.982304,32.372248],[-84.998735,32.509172],[-85.080889,32.607757],[-85.02612,32.607757]]]}},
+{"type":"Feature","id":"13217","properties":{"name":"Newton"},"geometry":{"type":"Polygon","coordinates":[[[-83.914301,33.74696],[-83.678792,33.599083],[-83.684269,33.527883],[-83.865008,33.369051],[-83.925255,33.451205],[-84.045747,33.527883],[-83.914301,33.74696]]]}},
+{"type":"Feature","id":"13219","properties":{"name":"Oconee"},"geometry":{"type":"Polygon","coordinates":[[[-83.530915,33.960561],[-83.273499,33.845545],[-83.278976,33.763391],[-83.28993,33.736006],[-83.404945,33.697668],[-83.50353,33.81816],[-83.645931,33.905791],[-83.536392,33.966038],[-83.530915,33.960561]]]}},
+{"type":"Feature","id":"13221","properties":{"name":"Oglethorpe"},"geometry":{"type":"Polygon","coordinates":[[[-83.098237,34.026284],[-82.977744,34.042715],[-82.780574,33.971515],[-82.950359,33.736006],[-82.994175,33.692191],[-83.278976,33.763391],[-83.273499,33.845545],[-83.257068,33.998899],[-83.098237,34.026284]]]}},
+{"type":"Feature","id":"13223","properties":{"name":"Paulding"},"geometry":{"type":"Polygon","coordinates":[[[-84.922058,34.081054],[-84.735842,34.081054],[-84.724888,33.807207],[-84.90015,33.779822],[-85.037074,33.812683],[-85.048028,33.905791],[-84.922058,34.081054]]]}},
+{"type":"Feature","id":"13225","properties":{"name":"Peach"},"geometry":{"type":"Polygon","coordinates":[[[-83.766424,32.695388],[-83.7007,32.689911],[-83.848578,32.465356],[-84.018363,32.503695],[-84.007409,32.520126],[-84.001932,32.531079],[-83.766424,32.695388]]]}},
+{"type":"Feature","id":"13227","properties":{"name":"Pickens"},"geometry":{"type":"Polygon","coordinates":[[[-84.346979,34.563024],[-84.259348,34.382285],[-84.582488,34.387762],[-84.653688,34.415147],[-84.653688,34.546593],[-84.346979,34.563024]]]}},
+{"type":"Feature","id":"13229","properties":{"name":"Pierce"},"geometry":{"type":"Polygon","coordinates":[[[-82.227403,31.528799],[-82.134295,31.468553],[-82.041187,31.375445],[-82.041187,31.369968],[-82.282173,31.227568],[-82.419096,31.419261],[-82.227403,31.528799]]]}},
+{"type":"Feature","id":"13231","properties":{"name":"Pike"},"geometry":{"type":"Polygon","coordinates":[[[-84.494857,33.182835],[-84.248394,33.188312],[-84.270302,32.991142],[-84.36341,32.991142],[-84.527718,32.969235],[-84.494857,33.182835]]]}},
+{"type":"Feature","id":"13233","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-85.42046,34.081054],[-85.048028,34.097484],[-84.922058,34.081054],[-85.048028,33.905791],[-85.310921,33.900315],[-85.387598,33.900315],[-85.398552,33.966038],[-85.42046,34.081054]]]}},
+{"type":"Feature","id":"13235","properties":{"name":"Pulaski"},"geometry":{"type":"Polygon","coordinates":[[[-83.613069,32.290094],[-83.498053,32.399633],[-83.344699,32.273663],[-83.339222,32.103878],[-83.607592,32.120309],[-83.613069,32.290094]]]}},
+{"type":"Feature","id":"13237","properties":{"name":"Putnam"},"geometry":{"type":"Polygon","coordinates":[[[-83.278976,33.484067],[-83.278976,33.484067],[-83.16396,33.35262],[-83.273499,33.188312],[-83.426853,33.182835],[-83.547346,33.171881],[-83.536392,33.434775],[-83.278976,33.484067]]]}},
+{"type":"Feature","id":"13239","properties":{"name":"Quitman"},"geometry":{"type":"Polygon","coordinates":[[[-85.069935,31.994339],[-84.905627,31.923139],[-84.960397,31.775262],[-85.124705,31.780739],[-85.141136,31.780739],[-85.069935,31.994339]]]}},
+{"type":"Feature","id":"13241","properties":{"name":"Rabun"},"geometry":{"type":"Polygon","coordinates":[[[-83.109191,35.00118],[-83.350176,34.716379],[-83.651408,34.820441],[-83.547346,34.990226],[-83.481623,34.995703],[-83.109191,35.00118]]]}},
+{"type":"Feature","id":"13243","properties":{"name":"Randolph"},"geometry":{"type":"Polygon","coordinates":[[[-84.905627,31.923139],[-84.653688,31.917662],[-84.598918,31.917662],[-84.544149,31.621907],[-84.817996,31.621907],[-84.960397,31.775262],[-84.905627,31.923139]]]}},
+{"type":"Feature","id":"13245","properties":{"name":"Richmond"},"geometry":{"type":"Polygon","coordinates":[[[-82.030233,33.544313],[-82.013803,33.53336],[-81.849494,33.248559],[-82.189065,33.292374],[-82.265742,33.264989],[-82.353373,33.314282],[-82.293127,33.35262],[-82.030233,33.544313]]]}},
+{"type":"Feature","id":"13247","properties":{"name":"Rockdale"},"geometry":{"type":"Polygon","coordinates":[[[-83.980024,33.785299],[-83.914301,33.74696],[-84.045747,33.527883],[-84.182671,33.648375],[-84.02384,33.752437],[-83.980024,33.785299]]]}},
+{"type":"Feature","id":"13249","properties":{"name":"Schley"},"geometry":{"type":"Polygon","coordinates":[[[-84.36341,32.399633],[-84.253871,32.372248],[-84.182671,32.229848],[-84.429133,32.164124],[-84.390795,32.416064],[-84.36341,32.399633]]]}},
+{"type":"Feature","id":"13251","properties":{"name":"Screven"},"geometry":{"type":"Polygon","coordinates":[[[-81.542786,33.045912],[-81.411339,32.74468],[-81.389431,32.596803],[-81.548263,32.487264],[-81.827587,32.651572],[-81.838541,32.651572],[-81.76734,32.908988],[-81.542786,33.045912]]]}},
+{"type":"Feature","id":"13253","properties":{"name":"Seminole"},"geometry":{"type":"Polygon","coordinates":[[[-85.02612,31.074213],[-84.922058,31.074213],[-84.730365,31.068736],[-84.861812,30.712735],[-84.867289,30.712735],[-85.004212,31.003013],[-85.02612,31.074213]]]}},
+{"type":"Feature","id":"13255","properties":{"name":"Spalding"},"geometry":{"type":"Polygon","coordinates":[[[-84.368887,33.35262],[-84.352456,33.35262],[-84.100517,33.297851],[-84.122425,33.204743],[-84.248394,33.188312],[-84.494857,33.182835],[-84.500334,33.221174],[-84.494857,33.259513],[-84.385318,33.35262],[-84.368887,33.35262]]]}},
+{"type":"Feature","id":"13257","properties":{"name":"Stephens"},"geometry":{"type":"Polygon","coordinates":[[[-83.278976,34.645178],[-83.103714,34.53564],[-83.125621,34.519209],[-83.399469,34.458962],[-83.459715,34.48087],[-83.339222,34.688994],[-83.278976,34.645178]]]}},
+{"type":"Feature","id":"13259","properties":{"name":"Stewart"},"geometry":{"type":"Polygon","coordinates":[[[-84.659165,32.235325],[-84.648211,32.235325],[-84.653688,31.917662],[-84.905627,31.923139],[-85.069935,31.994339],[-85.053504,32.06554],[-84.922058,32.229848],[-84.659165,32.235325]]]}},
+{"type":"Feature","id":"13261","properties":{"name":"Sumter"},"geometry":{"type":"Polygon","coordinates":[[[-84.182671,32.229848],[-84.029317,32.169601],[-83.963593,32.032678],[-83.925255,31.912185],[-84.259348,31.917662],[-84.336025,31.873847],[-84.445564,31.966955],[-84.429133,32.13674],[-84.429133,32.164124],[-84.182671,32.229848]]]}},
+{"type":"Feature","id":"13263","properties":{"name":"Talbot"},"geometry":{"type":"Polygon","coordinates":[[[-84.50581,32.881604],[-84.286733,32.750157],[-84.445564,32.563941],[-84.637257,32.536556],[-84.692026,32.520126],[-84.692026,32.585849],[-84.70298,32.843265],[-84.50581,32.881604]]]}},
+{"type":"Feature","id":"13265","properties":{"name":"Taliaferro"},"geometry":{"type":"Polygon","coordinates":[[[-82.950359,33.736006],[-82.681989,33.599083],[-82.851774,33.445728],[-83.010606,33.467636],[-83.010606,33.467636],[-82.994175,33.692191],[-82.950359,33.736006]]]}},
+{"type":"Feature","id":"13267","properties":{"name":"Tattnall"},"geometry":{"type":"Polygon","coordinates":[[[-82.23288,32.317479],[-82.024756,32.27914],[-81.761863,32.049109],[-81.82211,32.016247],[-81.969987,31.791692],[-82.046664,31.824554],[-82.227403,31.912185],[-82.23288,32.317479]]]}},
+{"type":"Feature","id":"13269","properties":{"name":"Taylor"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-84.286733,32.750157],[-84.204579,32.689911],[-84.001932,32.531079],[-84.051224,32.520126],[-84.253871,32.372248],[-84.36341,32.399633],[-84.390795,32.416064],[-84.445564,32.563941],[-84.286733,32.750157]]],[[[-84.051224,32.520126],[-84.007409,32.520126],[-84.018363,32.503695],[-84.051224,32.520126],[-84.051224,32.520126]]]]}},
+{"type":"Feature","id":"13271","properties":{"name":"Telfair"},"geometry":{"type":"Polygon","coordinates":[[[-82.950359,32.120309],[-82.928452,32.13674],[-82.643651,31.917662],[-82.835344,31.8136],[-82.994175,31.780739],[-83.180391,31.846462],[-83.207776,31.901231],[-82.950359,32.120309]]]}},
+{"type":"Feature","id":"13273","properties":{"name":"Terrell"},"geometry":{"type":"Polygon","coordinates":[[[-84.297687,31.621907],[-84.451041,31.621907],[-84.544149,31.621907],[-84.598918,31.917662],[-84.445564,31.966955],[-84.336025,31.873847],[-84.297687,31.621907]]]}},
+{"type":"Feature","id":"13275","properties":{"name":"Thomas"},"geometry":{"type":"Polygon","coordinates":[[[-84.100517,31.07969],[-84.001932,31.07969],[-83.739039,31.035875],[-83.744516,30.657966],[-84.007409,30.674397],[-84.084086,30.674397],[-84.116948,31.07969],[-84.100517,31.07969]]]}},
+{"type":"Feature","id":"13277","properties":{"name":"Tift"},"geometry":{"type":"Polygon","coordinates":[[[-83.645931,31.594523],[-83.498053,31.594523],[-83.339222,31.47403],[-83.43233,31.34806],[-83.514484,31.326153],[-83.651408,31.331629],[-83.651408,31.567138],[-83.645931,31.594523]]]}},
+{"type":"Feature","id":"13279","properties":{"name":"Toombs"},"geometry":{"type":"Polygon","coordinates":[[[-82.408142,32.355817],[-82.23288,32.317479],[-82.227403,31.912185],[-82.43005,31.966955],[-82.468389,31.966955],[-82.479343,31.972432],[-82.408142,32.355817]]]}},
+{"type":"Feature","id":"13281","properties":{"name":"Towns"},"geometry":{"type":"Polygon","coordinates":[[[-83.936209,34.984749],[-83.547346,34.990226],[-83.651408,34.820441],[-83.684269,34.798533],[-83.782854,34.793056],[-83.936209,34.984749]]]}},
+{"type":"Feature","id":"13283","properties":{"name":"Treutlen"},"geometry":{"type":"Polygon","coordinates":[[[-82.550543,32.498218],[-82.408142,32.355817],[-82.654605,32.295571],[-82.720328,32.312002],[-82.649128,32.514649],[-82.550543,32.498218]]]}},
+{"type":"Feature","id":"13285","properties":{"name":"Troup"},"geometry":{"type":"Polygon","coordinates":[[[-84.938489,33.226651],[-84.938489,33.226651],[-84.861812,33.193789],[-84.861812,32.87065],[-85.184951,32.87065],[-85.234244,33.106158],[-85.234244,33.128066],[-84.938489,33.226651]]]}},
+{"type":"Feature","id":"13287","properties":{"name":"Turner"},"geometry":{"type":"Polygon","coordinates":[[[-83.613069,31.851939],[-83.481623,31.846462],[-83.454238,31.758831],[-83.498053,31.594523],[-83.645931,31.594523],[-83.651408,31.567138],[-83.804762,31.802646],[-83.613069,31.851939]]]}},
+{"type":"Feature","id":"13289","properties":{"name":"Twiggs"},"geometry":{"type":"Polygon","coordinates":[[[-83.393992,32.876127],[-83.224206,32.585849],[-83.498053,32.454402],[-83.596638,32.662526],[-83.514484,32.843265],[-83.404945,32.898034],[-83.393992,32.876127]]]}},
+{"type":"Feature","id":"13291","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-84.007409,34.984749],[-83.936209,34.984749],[-83.782854,34.793056],[-83.854055,34.721856],[-84.155286,34.650655],[-84.127902,34.990226],[-84.007409,34.984749]]]}},
+{"type":"Feature","id":"13293","properties":{"name":"Upson"},"geometry":{"type":"Polygon","coordinates":[[[-84.36341,32.991142],[-84.270302,32.991142],[-84.122425,32.930896],[-84.122425,32.848742],[-84.204579,32.689911],[-84.286733,32.750157],[-84.50581,32.881604],[-84.527718,32.969235],[-84.36341,32.991142]]]}},
+{"type":"Feature","id":"13295","properties":{"name":"Walker"},"geometry":{"type":"Polygon","coordinates":[[[-85.272582,34.984749],[-85.267105,34.984749],[-85.146612,34.765671],[-85.048028,34.623271],[-85.069935,34.584932],[-85.09732,34.584932],[-85.108274,34.584932],[-85.529998,34.590409],[-85.535475,34.623271],[-85.36569,34.984749],[-85.272582,34.984749]]]}},
+{"type":"Feature","id":"13297","properties":{"name":"Walton"},"geometry":{"type":"Polygon","coordinates":[[[-83.799285,33.927699],[-83.645931,33.905791],[-83.50353,33.81816],[-83.509007,33.812683],[-83.678792,33.599083],[-83.914301,33.74696],[-83.980024,33.785299],[-83.799285,33.927699]]]}},
+{"type":"Feature","id":"13299","properties":{"name":"Ware"},"geometry":{"type":"Polygon","coordinates":[[[-82.473866,31.419261],[-82.419096,31.419261],[-82.282173,31.227568],[-82.134295,31.00849],[-82.216449,30.570335],[-82.419096,30.581289],[-82.671035,31.183752],[-82.62722,31.364491],[-82.599835,31.468553],[-82.473866,31.419261]]]}},
+{"type":"Feature","id":"13301","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-82.649128,33.610037],[-82.386235,33.314282],[-82.43005,33.275943],[-82.687466,33.270466],[-82.75319,33.254036],[-82.851774,33.445728],[-82.681989,33.599083],[-82.649128,33.610037]]]}},
+{"type":"Feature","id":"13303","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-82.747713,33.237605],[-82.660082,33.128066],[-82.523158,32.821357],[-82.944882,32.761111],[-83.076329,32.947327],[-83.054421,33.078773],[-82.747713,33.237605]]]}},
+{"type":"Feature","id":"13305","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-82.134295,31.632861],[-82.046664,31.824554],[-81.969987,31.791692],[-81.663278,31.539753],[-81.62494,31.452122],[-81.729002,31.331629],[-82.041187,31.375445],[-82.134295,31.468553],[-82.134295,31.632861]]]}},
+{"type":"Feature","id":"13307","properties":{"name":"Webster"},"geometry":{"type":"Polygon","coordinates":[[[-84.648211,32.235325],[-84.429133,32.13674],[-84.445564,31.966955],[-84.598918,31.917662],[-84.653688,31.917662],[-84.648211,32.235325]]]}},
+{"type":"Feature","id":"13309","properties":{"name":"Wheeler"},"geometry":{"type":"Polygon","coordinates":[[[-82.720328,32.312002],[-82.654605,32.295571],[-82.545066,31.961478],[-82.643651,31.917662],[-82.928452,32.13674],[-82.884636,32.196986],[-82.720328,32.312002]]]}},
+{"type":"Feature","id":"13311","properties":{"name":"White"},"geometry":{"type":"Polygon","coordinates":[[[-83.782854,34.793056],[-83.684269,34.798533],[-83.667839,34.502778],[-83.788331,34.513732],[-83.843101,34.502778],[-83.854055,34.721856],[-83.782854,34.793056]]]}},
+{"type":"Feature","id":"13313","properties":{"name":"Whitfield"},"geometry":{"type":"Polygon","coordinates":[[[-84.976827,34.990226],[-84.812519,34.990226],[-84.916581,34.634225],[-85.048028,34.623271],[-85.146612,34.765671],[-84.982304,34.990226],[-84.976827,34.990226]]]}},
+{"type":"Feature","id":"13315","properties":{"name":"Wilcox"},"geometry":{"type":"Polygon","coordinates":[[[-83.607592,32.120309],[-83.339222,32.103878],[-83.207776,31.901231],[-83.180391,31.846462],[-83.481623,31.846462],[-83.613069,31.851939],[-83.607592,32.027201],[-83.607592,32.120309]]]}},
+{"type":"Feature","id":"13317","properties":{"name":"Wilkes"},"geometry":{"type":"Polygon","coordinates":[[[-82.731282,33.982469],[-82.643651,33.982469],[-82.479343,33.637421],[-82.649128,33.610037],[-82.681989,33.599083],[-82.950359,33.736006],[-82.780574,33.971515],[-82.731282,33.982469]]]}},
+{"type":"Feature","id":"13319","properties":{"name":"Wilkinson"},"geometry":{"type":"Polygon","coordinates":[[[-83.076329,32.947327],[-82.944882,32.761111],[-82.955836,32.706342],[-83.224206,32.585849],[-83.393992,32.876127],[-83.404945,32.898034],[-83.355653,32.925419],[-83.076329,32.947327]]]}},
+{"type":"Feature","id":"13321","properties":{"name":"Worth"},"geometry":{"type":"Polygon","coordinates":[[[-83.941686,31.846462],[-83.804762,31.802646],[-83.651408,31.567138],[-83.651408,31.331629],[-83.974547,31.337106],[-84.001932,31.337106],[-83.996455,31.441168],[-84.018363,31.649292],[-83.941686,31.846462]]]}},
+{"type":"Feature","id":"15001","properties":{"name":"Hawaii"},"geometry":{"type":"Polygon","coordinates":[[[-155.634835,18.948267],[-155.881297,19.035898],[-156.062036,19.73147],[-155.87582,20.26821],[-155.284311,20.021748],[-154.807817,19.523346],[-155.634835,18.948267]]]}},
+{"type":"Feature","id":"15003","properties":{"name":"Honolulu"},"geometry":{"type":"Polygon","coordinates":[[[-157.951581,21.697691],[-157.655826,21.303352],[-158.110412,21.303352],[-157.951581,21.697691]]]}},
+{"type":"Feature","id":"15009","properties":{"name":"Maui"},"geometry":{"type":"Polygon","coordinates":[[[-156.587823,21.029505],[-156.00179,20.793996],[-156.379699,20.580396],[-156.587823,21.029505]]]}},
+{"type":"Feature","id":"16001","properties":{"name":"Ada"},"geometry":{"type":"Polygon","coordinates":[[[-116.51305,43.8081],[-116.283018,43.8081],[-115.97631,43.589022],[-116.266588,43.112528],[-116.51305,43.28779],[-116.51305,43.8081]]]}},
+{"type":"Feature","id":"16003","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-116.688312,45.270443],[-116.146095,45.106135],[-116.157049,44.498194],[-116.299449,44.443425],[-116.901913,44.843241],[-116.78142,45.07875],[-116.688312,45.270443]]]}},
+{"type":"Feature","id":"16005","properties":{"name":"Bannock"},"geometry":{"type":"Polygon","coordinates":[[[-112.388914,43.01942],[-112.065774,43.024897],[-111.874081,42.416957],[-112.126021,42.28551],[-112.421776,42.504588],[-112.750392,42.953697],[-112.388914,43.01942]]]}},
+{"type":"Feature","id":"16007","properties":{"name":"Bear Lake"},"geometry":{"type":"Polygon","coordinates":[[[-111.468788,42.592219],[-111.047063,42.515542],[-111.047063,42.000709],[-111.507126,42.000709],[-111.600234,42.416957],[-111.468788,42.592219]]]}},
+{"type":"Feature","id":"16009","properties":{"name":"Benewah"},"geometry":{"type":"Polygon","coordinates":[[[-116.326834,47.411926],[-116.332311,47.023064],[-117.000498,47.132602],[-117.038836,47.127126],[-117.038836,47.258572],[-117.038836,47.368111],[-116.326834,47.411926]]]}},
+{"type":"Feature","id":"16011","properties":{"name":"Bingham"},"geometry":{"type":"Polygon","coordinates":[[[-112.695623,43.621884],[-112.52036,43.627361],[-112.52036,43.424714],[-111.589281,43.282313],[-111.589281,43.01942],[-112.065774,43.024897],[-112.388914,43.01942],[-112.750392,42.953697],[-113.007808,43.112528],[-113.007808,43.282313],[-112.695623,43.621884]]]}},
+{"type":"Feature","id":"16013","properties":{"name":"Blaine"},"geometry":{"type":"Polygon","coordinates":[[[-114.656367,43.917638],[-113.796488,43.567114],[-113.007808,43.282313],[-113.007808,43.112528],[-113.23784,42.625081],[-113.473348,42.668896],[-113.413102,43.200159],[-113.714333,43.200159],[-114.377043,43.200159],[-114.716614,43.813577],[-114.990461,43.857392],[-114.968553,43.939546],[-114.656367,43.917638]]]}},
+{"type":"Feature","id":"16015","properties":{"name":"Boise"},"geometry":{"type":"Polygon","coordinates":[[[-115.680555,44.235301],[-115.297169,44.339363],[-114.990461,43.9505],[-115.1712,44.087424],[-115.97631,43.589022],[-116.283018,43.8081],[-116.211818,44.153147],[-115.680555,44.235301]]]}},
+{"type":"Feature","id":"16017","properties":{"name":"Bonner"},"geometry":{"type":"Polygon","coordinates":[[[-116.836189,48.846885],[-116.786897,48.501838],[-116.04751,48.501838],[-116.04751,48.217037],[-116.04751,47.976051],[-116.310403,48.030821],[-116.321357,47.88842],[-116.567819,47.992482],[-117.044313,47.976051],[-117.044313,48.047251],[-117.033359,48.846885],[-116.836189,48.846885]]]}},
+{"type":"Feature","id":"16019","properties":{"name":"Bonneville"},"geometry":{"type":"Polygon","coordinates":[[[-111.775497,43.627361],[-111.627619,43.627361],[-111.397588,43.621884],[-111.047063,43.501391],[-111.047063,43.315175],[-111.041587,43.01942],[-111.589281,43.01942],[-111.589281,43.282313],[-112.52036,43.424714],[-112.52036,43.627361],[-111.775497,43.627361]]]}},
+{"type":"Feature","id":"16021","properties":{"name":"Boundary"},"geometry":{"type":"Polygon","coordinates":[[[-116.04751,49.000239],[-116.04751,48.501838],[-116.786897,48.501838],[-116.836189,48.846885],[-117.033359,48.846885],[-117.033359,49.000239],[-116.04751,49.000239]]]}},
+{"type":"Feature","id":"16023","properties":{"name":"Butte"},"geometry":{"type":"Polygon","coordinates":[[[-113.002331,44.235301],[-112.996854,44.235301],[-112.695623,43.972408],[-112.695623,43.621884],[-113.007808,43.282313],[-113.796488,43.567114],[-113.374763,43.8081],[-113.319994,44.235301],[-113.002331,44.235301]]]}},
+{"type":"Feature","id":"16025","properties":{"name":"Camas"},"geometry":{"type":"Polygon","coordinates":[[[-114.990461,43.857392],[-114.716614,43.813577],[-114.377043,43.200159],[-114.596121,43.200159],[-114.875445,43.200159],[-115.089045,43.200159],[-114.990461,43.857392]]]}},
+{"type":"Feature","id":"16027","properties":{"name":"Canyon"},"geometry":{"type":"Polygon","coordinates":[[[-116.97859,43.8793],[-116.71022,43.8081],[-116.51305,43.8081],[-116.51305,43.28779],[-116.989544,43.671176],[-117.027882,43.68213],[-116.97859,43.8793]]]}},
+{"type":"Feature","id":"16029","properties":{"name":"Caribou"},"geometry":{"type":"Polygon","coordinates":[[[-112.065774,43.024897],[-111.589281,43.01942],[-111.041587,43.01942],[-111.047063,42.515542],[-111.468788,42.592219],[-111.600234,42.416957],[-111.835743,42.416957],[-111.874081,42.416957],[-112.065774,43.024897]]]}},
+{"type":"Feature","id":"16031","properties":{"name":"Cassia"},"geometry":{"type":"Polygon","coordinates":[[[-113.473348,42.668896],[-113.23784,42.625081],[-113.002331,42.329326],[-113.002331,42.000709],[-114.04295,41.995232],[-114.283935,41.995232],[-113.999134,42.526496],[-113.933411,42.537449],[-113.473348,42.668896]]]}},
+{"type":"Feature","id":"16033","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-111.616665,44.547487],[-112.153405,44.060039],[-112.50393,44.060039],[-112.695623,43.972408],[-112.996854,44.235301],[-112.816115,44.377701],[-111.616665,44.547487]]]}},
+{"type":"Feature","id":"16035","properties":{"name":"Clearwater"},"geometry":{"type":"Polygon","coordinates":[[[-114.963076,46.935433],[-114.672798,46.738263],[-114.596121,46.634201],[-116.168003,46.371308],[-116.31588,46.426077],[-116.37065,46.464416],[-116.458281,46.628724],[-116.332311,46.935433],[-114.963076,46.935433]]]}},
+{"type":"Feature","id":"16037","properties":{"name":"Custer"},"geometry":{"type":"Polygon","coordinates":[[[-115.04523,44.750133],[-114.809722,44.81038],[-114.563259,44.574871],[-114.196304,44.859672],[-113.319994,44.235301],[-113.374763,43.8081],[-113.796488,43.567114],[-114.656367,43.917638],[-114.968553,43.939546],[-114.990461,43.9505],[-115.297169,44.339363],[-115.04523,44.750133]]]}},
+{"type":"Feature","id":"16039","properties":{"name":"Elmore"},"geometry":{"type":"Polygon","coordinates":[[[-114.990461,43.9505],[-114.968553,43.939546],[-114.990461,43.857392],[-115.089045,43.200159],[-115.039753,42.909881],[-115.039753,42.767481],[-116.266588,43.112528],[-115.97631,43.589022],[-115.1712,44.087424],[-114.990461,43.9505]]]}},
+{"type":"Feature","id":"16041","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-111.835743,42.416957],[-111.600234,42.416957],[-111.507126,42.000709],[-112.10959,41.995232],[-112.126021,42.28551],[-111.874081,42.416957],[-111.835743,42.416957]]]}},
+{"type":"Feature","id":"16043","properties":{"name":"Fremont"},"geometry":{"type":"Polygon","coordinates":[[[-111.37568,44.750133],[-111.047063,44.476286],[-111.047063,43.983362],[-111.397588,43.923115],[-111.978143,43.928592],[-112.153405,44.060039],[-111.616665,44.547487],[-111.479742,44.711795],[-111.37568,44.750133]]]}},
+{"type":"Feature","id":"16045","properties":{"name":"Gem"},"geometry":{"type":"Polygon","coordinates":[[[-116.157049,44.498194],[-116.211818,44.153147],[-116.283018,43.8081],[-116.51305,43.8081],[-116.71022,43.8081],[-116.452804,44.153147],[-116.299449,44.443425],[-116.157049,44.498194]]]}},
+{"type":"Feature","id":"16047","properties":{"name":"Gooding"},"geometry":{"type":"Polygon","coordinates":[[[-114.875445,43.200159],[-114.596121,43.200159],[-114.596121,42.849635],[-114.618029,42.646988],[-115.039753,42.909881],[-115.089045,43.200159],[-114.875445,43.200159]]]}},
+{"type":"Feature","id":"16049","properties":{"name":"Idaho"},"geometry":{"type":"Polygon","coordinates":[[[-114.333228,46.661586],[-114.557782,45.566198],[-114.694706,45.199243],[-115.828432,45.193766],[-116.146095,45.106135],[-116.688312,45.270443],[-116.463758,45.61549],[-116.792374,45.856475],[-116.699266,45.998876],[-116.168003,46.371308],[-114.596121,46.634201],[-114.333228,46.661586]]]}},
+{"type":"Feature","id":"16051","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-112.50393,44.060039],[-112.153405,44.060039],[-111.978143,43.928592],[-111.627619,43.627361],[-111.775497,43.627361],[-112.52036,43.627361],[-112.695623,43.621884],[-112.695623,43.972408],[-112.50393,44.060039]]]}},
+{"type":"Feature","id":"16053","properties":{"name":"Jerome"},"geometry":{"type":"Polygon","coordinates":[[[-114.596121,42.849635],[-113.933411,42.767481],[-113.933411,42.537449],[-113.999134,42.526496],[-114.618029,42.646988],[-114.596121,42.849635]]]}},
+{"type":"Feature","id":"16055","properties":{"name":"Kootenai"},"geometry":{"type":"Polygon","coordinates":[[[-116.567819,47.992482],[-116.321357,47.88842],[-116.326834,47.411926],[-117.038836,47.368111],[-117.044313,47.976051],[-116.567819,47.992482]]]}},
+{"type":"Feature","id":"16057","properties":{"name":"Latah"},"geometry":{"type":"Polygon","coordinates":[[[-117.000498,47.132602],[-116.332311,47.023064],[-116.332311,46.935433],[-116.458281,46.628724],[-116.644497,46.61777],[-117.038836,46.541093],[-117.038836,47.127126],[-117.000498,47.132602]]]}},
+{"type":"Feature","id":"16059","properties":{"name":"Lemhi"},"geometry":{"type":"Polygon","coordinates":[[[-113.944365,45.68669],[-113.456917,44.865149],[-112.816115,44.377701],[-112.996854,44.235301],[-113.002331,44.235301],[-113.319994,44.235301],[-114.196304,44.859672],[-114.563259,44.574871],[-114.809722,44.81038],[-114.694706,45.199243],[-114.557782,45.566198],[-113.944365,45.68669]]]}},
+{"type":"Feature","id":"16061","properties":{"name":"Lewis"},"geometry":{"type":"Polygon","coordinates":[[[-116.31588,46.426077],[-116.168003,46.371308],[-116.699266,45.998876],[-116.37065,46.464416],[-116.31588,46.426077]]]}},
+{"type":"Feature","id":"16063","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-114.377043,43.200159],[-113.714333,43.200159],[-113.933411,42.767481],[-114.596121,42.849635],[-114.596121,43.200159],[-114.377043,43.200159]]]}},
+{"type":"Feature","id":"16065","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-111.978143,43.928592],[-111.397588,43.923115],[-111.397588,43.621884],[-111.627619,43.627361],[-111.978143,43.928592]]]}},
+{"type":"Feature","id":"16067","properties":{"name":"Minidoka"},"geometry":{"type":"Polygon","coordinates":[[[-113.714333,43.200159],[-113.413102,43.200159],[-113.473348,42.668896],[-113.933411,42.537449],[-113.933411,42.767481],[-113.714333,43.200159]]]}},
+{"type":"Feature","id":"16069","properties":{"name":"Nez Perce"},"geometry":{"type":"Polygon","coordinates":[[[-116.644497,46.61777],[-116.458281,46.628724],[-116.37065,46.464416],[-116.699266,45.998876],[-116.792374,45.856475],[-116.918344,45.993399],[-117.038836,46.426077],[-117.038836,46.541093],[-116.644497,46.61777]]]}},
+{"type":"Feature","id":"16071","properties":{"name":"Oneida"},"geometry":{"type":"Polygon","coordinates":[[[-112.421776,42.504588],[-112.126021,42.28551],[-112.10959,41.995232],[-112.164359,41.995232],[-113.002331,42.000709],[-113.002331,42.329326],[-112.421776,42.504588]]]}},
+{"type":"Feature","id":"16073","properties":{"name":"Owyhee"},"geometry":{"type":"Polygon","coordinates":[[[-116.989544,43.671176],[-116.51305,43.28779],[-116.266588,43.112528],[-115.039753,42.767481],[-115.039753,41.995232],[-117.016928,42.000709],[-117.027882,42.000709],[-117.027882,43.68213],[-116.989544,43.671176]]]}},
+{"type":"Feature","id":"16075","properties":{"name":"Payette"},"geometry":{"type":"Polygon","coordinates":[[[-116.452804,44.153147],[-116.71022,43.8081],[-116.97859,43.8793],[-116.896436,44.153147],[-116.452804,44.153147]]]}},
+{"type":"Feature","id":"16077","properties":{"name":"Power"},"geometry":{"type":"Polygon","coordinates":[[[-112.421776,42.504588],[-113.002331,42.329326],[-113.23784,42.625081],[-113.007808,43.112528],[-112.750392,42.953697],[-112.421776,42.504588]]]}},
+{"type":"Feature","id":"16079","properties":{"name":"Shoshone"},"geometry":{"type":"Polygon","coordinates":[[[-116.310403,48.030821],[-116.04751,47.976051],[-115.658647,47.466696],[-114.963076,46.935433],[-116.332311,46.935433],[-116.332311,47.023064],[-116.326834,47.411926],[-116.321357,47.88842],[-116.310403,48.030821]]]}},
+{"type":"Feature","id":"16081","properties":{"name":"Teton"},"geometry":{"type":"Polygon","coordinates":[[[-111.047063,43.983362],[-111.047063,43.501391],[-111.397588,43.621884],[-111.397588,43.923115],[-111.047063,43.983362]]]}},
+{"type":"Feature","id":"16083","properties":{"name":"Twin Falls"},"geometry":{"type":"Polygon","coordinates":[[[-115.039753,42.909881],[-114.618029,42.646988],[-113.999134,42.526496],[-114.283935,41.995232],[-115.039753,41.995232],[-115.039753,42.767481],[-115.039753,42.909881]]]}},
+{"type":"Feature","id":"16085","properties":{"name":"Valley"},"geometry":{"type":"Polygon","coordinates":[[[-115.828432,45.193766],[-114.694706,45.199243],[-114.809722,44.81038],[-115.04523,44.750133],[-115.297169,44.339363],[-115.680555,44.235301],[-116.211818,44.153147],[-116.157049,44.498194],[-116.146095,45.106135],[-115.828432,45.193766]]]}},
+{"type":"Feature","id":"16087","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-116.901913,44.843241],[-116.299449,44.443425],[-116.452804,44.153147],[-116.896436,44.153147],[-117.219575,44.301024],[-116.901913,44.843241]]]}},
+{"type":"Feature","id":"17001","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-91.204109,40.198796],[-90.913831,40.193319],[-90.913831,40.105688],[-90.919308,39.842795],[-91.36294,39.760641],[-91.43414,39.946857],[-91.50534,40.198796],[-91.204109,40.198796]]]}},
+{"type":"Feature","id":"17003","properties":{"name":"Alexander"},"geometry":{"type":"Polygon","coordinates":[[[-89.259795,37.334356],[-89.248841,37.334356],[-89.172164,37.065986],[-89.133825,36.983832],[-89.314564,37.011217],[-89.489826,37.252202],[-89.484349,37.334356],[-89.259795,37.334356]]]}},
+{"type":"Feature","id":"17005","properties":{"name":"Bond"},"geometry":{"type":"Polygon","coordinates":[[[-89.248841,39.026731],[-89.254318,38.74193],[-89.593888,38.74193],[-89.599365,38.74193],[-89.637704,38.999346],[-89.248841,39.026731]]]}},
+{"type":"Feature","id":"17007","properties":{"name":"Boone"},"geometry":{"type":"Polygon","coordinates":[[[-88.942132,42.493634],[-88.777824,42.493634],[-88.706624,42.493634],[-88.706624,42.154064],[-88.942132,42.154064],[-88.942132,42.493634]]]}},
+{"type":"Feature","id":"17009","properties":{"name":"Brown"},"geometry":{"type":"Polygon","coordinates":[[[-90.913831,40.105688],[-90.514014,39.985195],[-90.585214,39.875656],[-90.57426,39.837318],[-90.919308,39.842795],[-90.913831,40.105688]]]}},
+{"type":"Feature","id":"17011","properties":{"name":"Bureau"},"geometry":{"type":"Polygon","coordinates":[[[-89.254318,41.584462],[-89.166687,41.584462],[-89.16121,41.310615],[-89.467918,41.146307],[-89.522688,41.146307],[-89.637704,41.146307],[-89.856781,41.233938],[-89.862258,41.584462],[-89.632227,41.584462],[-89.254318,41.584462]]]}},
+{"type":"Feature","id":"17013","properties":{"name":"Calhoun"},"geometry":{"type":"Polygon","coordinates":[[[-90.935738,39.399163],[-90.612599,39.393686],[-90.601645,39.119839],[-90.448291,38.966484],[-90.667368,38.933623],[-90.722138,39.223901],[-90.935738,39.399163]]]}},
+{"type":"Feature","id":"17015","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-89.686996,42.197879],[-89.686996,41.929509],[-89.889643,41.929509],[-90.152536,41.929509],[-90.152536,42.033571],[-90.316844,42.192402],[-89.917028,42.197879],[-89.686996,42.197879]]]}},
+{"type":"Feature","id":"17017","properties":{"name":"Cass"},"geometry":{"type":"Polygon","coordinates":[[[-90.355183,40.122119],[-89.993705,40.105688],[-89.993705,39.903041],[-89.993705,39.87018],[-90.585214,39.875656],[-90.514014,39.985195],[-90.355183,40.122119]]]}},
+{"type":"Feature","id":"17019","properties":{"name":"Champaign"},"geometry":{"type":"Polygon","coordinates":[[[-88.109637,40.401443],[-87.934375,40.401443],[-87.939852,39.881133],[-88.126068,39.881133],[-88.460161,39.881133],[-88.460161,40.28095],[-88.460161,40.401443],[-88.109637,40.401443]]]}},
+{"type":"Feature","id":"17021","properties":{"name":"Christian"},"geometry":{"type":"Polygon","coordinates":[[[-89.254318,39.820887],[-89.215979,39.81541],[-89.024286,39.656579],[-89.139302,39.34987],[-89.533642,39.525132],[-89.254318,39.820887]]]}},
+{"type":"Feature","id":"17023","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-87.76459,39.486794],[-87.529082,39.47584],[-87.605759,39.256762],[-87.644097,39.158177],[-87.786498,39.180085],[-87.950806,39.174608],[-88.005575,39.174608],[-88.011052,39.377255],[-87.96176,39.481317],[-87.76459,39.486794]]]}},
+{"type":"Feature","id":"17025","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-88.613516,38.917192],[-88.361576,38.911715],[-88.257515,38.845992],[-88.252038,38.599529],[-88.586131,38.605006],[-88.701147,38.605006],[-88.69567,38.824084],[-88.69567,38.917192],[-88.613516,38.917192]]]}},
+{"type":"Feature","id":"17027","properties":{"name":"Clinton"},"geometry":{"type":"Polygon","coordinates":[[[-89.593888,38.74193],[-89.254318,38.74193],[-89.139302,38.736453],[-89.144779,38.500944],[-89.320041,38.511898],[-89.703427,38.41879],[-89.708904,38.654299],[-89.599365,38.74193],[-89.593888,38.74193]]]}},
+{"type":"Feature","id":"17029","properties":{"name":"Coles"},"geometry":{"type":"Polygon","coordinates":[[[-88.065822,39.651102],[-87.967237,39.683964],[-87.96176,39.481317],[-88.011052,39.377255],[-88.142499,39.377255],[-88.471115,39.371778],[-88.471115,39.448455],[-88.471115,39.651102],[-88.065822,39.651102]]]}},
+{"type":"Feature","id":"17031","properties":{"name":"Cook"},"geometry":{"type":"Polygon","coordinates":[[[-88.120591,42.154064],[-87.759113,42.154064],[-87.523605,41.710431],[-87.523605,41.469446],[-88.027483,41.683047],[-87.928898,41.995232],[-88.262992,41.984279],[-88.235607,42.154064],[-88.197268,42.154064],[-88.120591,42.154064]]]}},
+{"type":"Feature","id":"17033","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-87.786498,39.180085],[-87.644097,39.158177],[-87.534558,38.900761],[-87.534558,38.851469],[-87.90699,38.851469],[-87.945329,38.851469],[-87.950806,39.174608],[-87.786498,39.180085]]]}},
+{"type":"Feature","id":"17035","properties":{"name":"Cumberland"},"geometry":{"type":"Polygon","coordinates":[[[-88.142499,39.377255],[-88.011052,39.377255],[-88.005575,39.174608],[-88.361576,39.169131],[-88.471115,39.212947],[-88.471115,39.371778],[-88.142499,39.377255]]]}},
+{"type":"Feature","id":"17037","properties":{"name":"DeKalb"},"geometry":{"type":"Polygon","coordinates":[[[-88.586131,42.154064],[-88.602562,41.721385],[-88.602562,41.633754],[-88.618993,41.633754],[-88.936655,41.628277],[-88.942132,41.891171],[-88.942132,42.154064],[-88.706624,42.154064],[-88.586131,42.154064]]]}},
+{"type":"Feature","id":"17039","properties":{"name":"De Witt"},"geometry":{"type":"Polygon","coordinates":[[[-88.920224,40.28095],[-88.575177,40.28095],[-88.744962,40.056395],[-88.805209,40.056395],[-89.144779,40.050919],[-89.150256,40.28095],[-88.920224,40.28095]]]}},
+{"type":"Feature","id":"17041","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-88.126068,39.881133],[-87.939852,39.881133],[-87.967237,39.683964],[-88.065822,39.651102],[-88.471115,39.651102],[-88.471115,39.793502],[-88.460161,39.881133],[-88.126068,39.881133]]]}},
+{"type":"Feature","id":"17043","properties":{"name":"DuPage"},"geometry":{"type":"Polygon","coordinates":[[[-87.928898,41.995232],[-88.027483,41.683047],[-88.03296,41.726862],[-88.262992,41.726862],[-88.262992,41.726862],[-88.262992,41.984279],[-87.928898,41.995232]]]}},
+{"type":"Feature","id":"17045","properties":{"name":"Edgar"},"geometry":{"type":"Polygon","coordinates":[[[-87.534558,39.881133],[-87.534558,39.607286],[-87.529082,39.47584],[-87.76459,39.486794],[-87.96176,39.481317],[-87.967237,39.683964],[-87.939852,39.881133],[-87.534558,39.881133]]]}},
+{"type":"Feature","id":"17047","properties":{"name":"Edwards"},"geometry":{"type":"Polygon","coordinates":[[[-88.005575,38.572145],[-87.956283,38.572145],[-87.989145,38.259959],[-88.005575,38.259959],[-88.153453,38.254482],[-88.147976,38.566668],[-88.005575,38.572145]]]}},
+{"type":"Feature","id":"17049","properties":{"name":"Effingham"},"geometry":{"type":"Polygon","coordinates":[[[-88.580654,39.212947],[-88.471115,39.212947],[-88.361576,39.169131],[-88.361576,38.911715],[-88.613516,38.917192],[-88.69567,38.917192],[-88.805209,39.218424],[-88.580654,39.212947]]]}},
+{"type":"Feature","id":"17051","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-89.139302,39.218424],[-88.805209,39.218424],[-88.69567,38.917192],[-88.69567,38.824084],[-88.777824,38.824084],[-89.139302,38.736453],[-89.254318,38.74193],[-89.248841,39.026731],[-89.139302,39.218424]]]}},
+{"type":"Feature","id":"17053","properties":{"name":"Ford"},"geometry":{"type":"Polygon","coordinates":[[[-88.131545,40.998429],[-87.934375,40.483597],[-87.934375,40.401443],[-88.109637,40.401443],[-88.460161,40.401443],[-88.460161,40.615043],[-88.246561,40.992952],[-88.131545,40.998429],[-88.131545,40.998429]]]}},
+{"type":"Feature","id":"17055","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-88.816163,38.128512],[-88.706624,38.123036],[-88.706624,37.909435],[-88.706624,37.865619],[-88.728531,37.865619],[-89.150256,37.860142],[-89.177641,37.947773],[-89.128348,38.123036],[-88.816163,38.128512]]]}},
+{"type":"Feature","id":"17057","properties":{"name":"Fulton"},"geometry":{"type":"Polygon","coordinates":[[[-90.442814,40.713628],[-89.988228,40.713628],[-89.873212,40.510982],[-89.922504,40.434304],[-90.201828,40.182365],[-90.448291,40.275473],[-90.442814,40.625997],[-90.442814,40.713628]]]}},
+{"type":"Feature","id":"17059","properties":{"name":"Gallatin"},"geometry":{"type":"Polygon","coordinates":[[[-88.137022,37.909435],[-88.054868,37.88205],[-88.027483,37.799896],[-88.131545,37.575342],[-88.378007,37.597249],[-88.37253,37.909435],[-88.37253,37.909435],[-88.137022,37.909435]]]}},
+{"type":"Feature","id":"17061","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-90.579737,39.519655],[-90.300413,39.519655],[-90.152536,39.519655],[-90.147059,39.262239],[-90.601645,39.119839],[-90.612599,39.393686],[-90.579737,39.519655]]]}},
+{"type":"Feature","id":"17063","properties":{"name":"Grundy"},"geometry":{"type":"Polygon","coordinates":[[[-88.279422,41.463969],[-88.252038,41.463969],[-88.246561,41.201076],[-88.252038,41.113445],[-88.410869,41.107968],[-88.586131,41.107968],[-88.597085,41.458492],[-88.279422,41.463969]]]}},
+{"type":"Feature","id":"17065","properties":{"name":"Hamilton"},"geometry":{"type":"Polygon","coordinates":[[[-88.591608,38.254482],[-88.37253,38.254482],[-88.37253,37.909435],[-88.37253,37.909435],[-88.4273,37.909435],[-88.706624,37.909435],[-88.706624,38.123036],[-88.701147,38.254482],[-88.591608,38.254482]]]}},
+{"type":"Feature","id":"17067","properties":{"name":"Hancock"},"geometry":{"type":"Polygon","coordinates":[[[-91.187678,40.636951],[-90.902877,40.636951],[-90.908354,40.286427],[-90.913831,40.193319],[-91.204109,40.198796],[-91.50534,40.198796],[-91.499863,40.248088],[-91.417709,40.379535],[-91.187678,40.636951]]]}},
+{"type":"Feature","id":"17069","properties":{"name":"Hardin"},"geometry":{"type":"Polygon","coordinates":[[[-88.378007,37.597249],[-88.131545,37.575342],[-88.060345,37.504141],[-88.3561,37.405556],[-88.361576,37.405556],[-88.416346,37.421987],[-88.410869,37.597249],[-88.378007,37.597249]]]}},
+{"type":"Feature","id":"17071","properties":{"name":"Henderson"},"geometry":{"type":"Polygon","coordinates":[[[-90.946692,41.069629],[-90.787861,41.069629],[-90.787861,40.636951],[-90.8974,40.636951],[-90.902877,40.636951],[-91.187678,40.636951],[-91.111001,40.697198],[-90.946692,41.069629]]]}},
+{"type":"Feature","id":"17073","properties":{"name":"Henry"},"geometry":{"type":"Polygon","coordinates":[[[-90.179921,41.584462],[-89.862258,41.584462],[-89.856781,41.233938],[-89.982751,41.151784],[-90.207305,41.151784],[-90.437337,41.151784],[-90.43186,41.327046],[-90.185398,41.584462],[-90.179921,41.584462]]]}},
+{"type":"Feature","id":"17075","properties":{"name":"Iroquois"},"geometry":{"type":"Polygon","coordinates":[[[-87.523605,41.009383],[-87.523605,40.735536],[-87.529082,40.489074],[-87.841267,40.489074],[-87.934375,40.483597],[-88.131545,40.998429],[-88.131545,40.998429],[-87.523605,41.009383]]]}},
+{"type":"Feature","id":"17077","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-89.566503,37.95325],[-89.177641,37.947773],[-89.150256,37.860142],[-89.155733,37.602726],[-89.522688,37.569865],[-89.676042,37.805373],[-89.593888,37.95325],[-89.566503,37.95325]]]}},
+{"type":"Feature","id":"17079","properties":{"name":"Jasper"},"geometry":{"type":"Polygon","coordinates":[[[-88.005575,39.174608],[-87.950806,39.174608],[-87.945329,38.851469],[-88.257515,38.845992],[-88.361576,38.911715],[-88.361576,39.169131],[-88.005575,39.174608]]]}},
+{"type":"Feature","id":"17081","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-88.914747,38.479037],[-88.701147,38.47356],[-88.701147,38.254482],[-88.706624,38.123036],[-88.816163,38.128512],[-89.128348,38.123036],[-89.144779,38.210667],[-89.144779,38.47356],[-88.914747,38.479037]]]}},
+{"type":"Feature","id":"17083","properties":{"name":"Jersey"},"geometry":{"type":"Polygon","coordinates":[[[-90.147059,39.262239],[-90.147059,38.999346],[-90.240167,38.999346],[-90.278506,38.922669],[-90.448291,38.966484],[-90.601645,39.119839],[-90.147059,39.262239]]]}},
+{"type":"Feature","id":"17085","properties":{"name":"Jo Daviess"},"geometry":{"type":"Polygon","coordinates":[[[-90.639984,42.510065],[-90.426383,42.504588],[-89.927981,42.504588],[-89.917028,42.197879],[-90.316844,42.192402],[-90.475675,42.384095],[-90.639984,42.510065]]]}},
+{"type":"Feature","id":"17087","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-88.876409,37.597249],[-88.706624,37.597249],[-88.712101,37.334356],[-88.931178,37.301494],[-89.046194,37.328879],[-89.040717,37.597249],[-88.876409,37.597249]]]}},
+{"type":"Feature","id":"17089","properties":{"name":"Kane"},"geometry":{"type":"Polygon","coordinates":[[[-88.454684,42.154064],[-88.235607,42.154064],[-88.262992,41.984279],[-88.262992,41.726862],[-88.602562,41.721385],[-88.586131,42.154064],[-88.454684,42.154064]]]}},
+{"type":"Feature","id":"17091","properties":{"name":"Kankakee"},"geometry":{"type":"Polygon","coordinates":[[[-87.786498,41.294184],[-87.529082,41.299661],[-87.529082,41.168214],[-87.523605,41.009383],[-88.131545,40.998429],[-88.246561,40.992952],[-88.252038,41.113445],[-88.246561,41.201076],[-87.786498,41.294184]]]}},
+{"type":"Feature","id":"17093","properties":{"name":"Kendall"},"geometry":{"type":"Polygon","coordinates":[[[-88.262992,41.726862],[-88.262992,41.726862],[-88.252038,41.463969],[-88.279422,41.463969],[-88.597085,41.458492],[-88.602562,41.633754],[-88.602562,41.721385],[-88.262992,41.726862]]]}},
+{"type":"Feature","id":"17095","properties":{"name":"Knox"},"geometry":{"type":"Polygon","coordinates":[[[-90.207305,41.151784],[-89.982751,41.151784],[-89.988228,40.976521],[-89.988228,40.713628],[-90.442814,40.713628],[-90.437337,41.064153],[-90.437337,41.151784],[-90.207305,41.151784]]]}},
+{"type":"Feature","id":"17097","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-88.202745,42.493634],[-87.802929,42.493634],[-87.759113,42.154064],[-88.120591,42.154064],[-88.197268,42.154064],[-88.202745,42.493634]]]}},
+{"type":"Feature","id":"17099","properties":{"name":"La Salle"},"geometry":{"type":"Polygon","coordinates":[[[-88.618993,41.633754],[-88.602562,41.633754],[-88.597085,41.458492],[-88.586131,41.107968],[-88.931178,40.927229],[-89.046194,40.927229],[-89.16121,41.102491],[-89.16121,41.310615],[-89.166687,41.584462],[-88.936655,41.628277],[-88.618993,41.633754]]]}},
+{"type":"Feature","id":"17101","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-87.534558,38.851469],[-87.649574,38.566668],[-87.912467,38.572145],[-87.90699,38.851469],[-87.534558,38.851469]]]}},
+{"type":"Feature","id":"17103","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-89.544596,41.902124],[-88.942132,41.891171],[-88.936655,41.628277],[-89.166687,41.584462],[-89.254318,41.584462],[-89.632227,41.584462],[-89.632227,41.902124],[-89.544596,41.902124]]]}},
+{"type":"Feature","id":"17105","properties":{"name":"Livingston"},"geometry":{"type":"Polygon","coordinates":[[[-88.410869,41.107968],[-88.252038,41.113445],[-88.246561,40.992952],[-88.460161,40.615043],[-88.712101,40.757444],[-88.931178,40.751967],[-88.931178,40.927229],[-88.586131,41.107968],[-88.410869,41.107968]]]}},
+{"type":"Feature","id":"17107","properties":{"name":"Logan"},"geometry":{"type":"Polygon","coordinates":[[[-89.265272,40.324766],[-89.150256,40.28095],[-89.144779,40.050919],[-89.215979,39.919472],[-89.489826,39.974241],[-89.577457,39.974241],[-89.599365,40.122119],[-89.604842,40.319289],[-89.265272,40.324766]]]}},
+{"type":"Feature","id":"17109","properties":{"name":"McDonough"},"geometry":{"type":"Polygon","coordinates":[[[-90.8974,40.636951],[-90.787861,40.636951],[-90.442814,40.625997],[-90.448291,40.275473],[-90.908354,40.286427],[-90.902877,40.636951],[-90.8974,40.636951]]]}},
+{"type":"Feature","id":"17111","properties":{"name":"McHenry"},"geometry":{"type":"Polygon","coordinates":[[[-88.219176,42.493634],[-88.202745,42.493634],[-88.197268,42.154064],[-88.235607,42.154064],[-88.454684,42.154064],[-88.586131,42.154064],[-88.706624,42.154064],[-88.706624,42.493634],[-88.306807,42.493634],[-88.219176,42.493634]]]}},
+{"type":"Feature","id":"17113","properties":{"name":"McLean"},"geometry":{"type":"Polygon","coordinates":[[[-88.712101,40.757444],[-88.460161,40.615043],[-88.460161,40.401443],[-88.460161,40.28095],[-88.575177,40.28095],[-88.920224,40.28095],[-89.150256,40.28095],[-89.265272,40.324766],[-89.270749,40.593136],[-88.931178,40.751967],[-88.712101,40.757444]]]}},
+{"type":"Feature","id":"17115","properties":{"name":"Macon"},"geometry":{"type":"Polygon","coordinates":[[[-88.805209,40.056395],[-88.744962,40.056395],[-88.744962,39.793502],[-88.761393,39.793502],[-88.810686,39.651102],[-89.024286,39.656579],[-89.215979,39.81541],[-89.215979,39.919472],[-89.144779,40.050919],[-88.805209,40.056395]]]}},
+{"type":"Feature","id":"17117","properties":{"name":"Macoupin"},"geometry":{"type":"Polygon","coordinates":[[[-89.758196,39.525132],[-89.703427,39.525132],[-89.69795,38.999346],[-90.147059,38.999346],[-90.147059,39.262239],[-90.152536,39.519655],[-89.927981,39.519655],[-89.758196,39.525132]]]}},
+{"type":"Feature","id":"17119","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-90.240167,38.999346],[-90.147059,38.999346],[-89.69795,38.999346],[-89.637704,38.999346],[-89.599365,38.74193],[-89.708904,38.654299],[-90.179921,38.659776],[-90.168967,38.774791],[-90.119674,38.807653],[-90.278506,38.922669],[-90.240167,38.999346]]]}},
+{"type":"Feature","id":"17121","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-88.777824,38.824084],[-88.69567,38.824084],[-88.701147,38.605006],[-88.701147,38.47356],[-88.914747,38.479037],[-89.144779,38.47356],[-89.144779,38.500944],[-89.139302,38.736453],[-88.777824,38.824084]]]}},
+{"type":"Feature","id":"17123","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-89.522688,41.146307],[-89.467918,41.146307],[-89.16121,41.102491],[-89.046194,40.927229],[-89.111917,40.927229],[-89.473395,40.921752],[-89.637704,40.976521],[-89.637704,41.146307],[-89.522688,41.146307]]]}},
+{"type":"Feature","id":"17125","properties":{"name":"Mason"},"geometry":{"type":"Polygon","coordinates":[[[-89.89512,40.434304],[-89.604842,40.319289],[-89.599365,40.122119],[-89.670565,40.160457],[-89.993705,40.105688],[-90.355183,40.122119],[-90.201828,40.182365],[-89.922504,40.434304],[-89.89512,40.434304]]]}},
+{"type":"Feature","id":"17127","properties":{"name":"Massac"},"geometry":{"type":"Polygon","coordinates":[[[-88.931178,37.301494],[-88.712101,37.334356],[-88.487546,37.065986],[-88.564223,37.082417],[-88.925701,37.224817],[-88.931178,37.301494]]]}},
+{"type":"Feature","id":"17129","properties":{"name":"Menard"},"geometry":{"type":"Polygon","coordinates":[[[-89.670565,40.160457],[-89.599365,40.122119],[-89.577457,39.974241],[-89.993705,39.903041],[-89.993705,40.105688],[-89.670565,40.160457]]]}},
+{"type":"Feature","id":"17131","properties":{"name":"Mercer"},"geometry":{"type":"Polygon","coordinates":[[[-91.050754,41.332523],[-90.43186,41.327046],[-90.437337,41.151784],[-90.437337,41.064153],[-90.667368,41.069629],[-90.787861,41.069629],[-90.946692,41.069629],[-90.946692,41.075106],[-91.072662,41.332523],[-91.050754,41.332523]]]}},
+{"type":"Feature","id":"17133","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-90.207305,38.47356],[-89.900597,38.22162],[-90.03752,38.22162],[-90.207305,38.090174],[-90.251121,38.128512],[-90.344229,38.385929],[-90.262075,38.522852],[-90.207305,38.47356]]]}},
+{"type":"Feature","id":"17135","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-89.588411,39.525132],[-89.533642,39.525132],[-89.139302,39.34987],[-89.139302,39.218424],[-89.248841,39.026731],[-89.637704,38.999346],[-89.69795,38.999346],[-89.703427,39.525132],[-89.588411,39.525132]]]}},
+{"type":"Feature","id":"17137","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-90.585214,39.875656],[-89.993705,39.87018],[-89.927981,39.519655],[-90.152536,39.519655],[-90.300413,39.519655],[-90.371614,39.667533],[-90.601645,39.788025],[-90.57426,39.837318],[-90.585214,39.875656]]]}},
+{"type":"Feature","id":"17139","properties":{"name":"Moultrie"},"geometry":{"type":"Polygon","coordinates":[[[-88.761393,39.793502],[-88.744962,39.793502],[-88.471115,39.793502],[-88.471115,39.651102],[-88.471115,39.448455],[-88.810686,39.651102],[-88.761393,39.793502]]]}},
+{"type":"Feature","id":"17141","properties":{"name":"Ogle"},"geometry":{"type":"Polygon","coordinates":[[[-89.281702,42.203356],[-88.942132,42.154064],[-88.942132,41.891171],[-89.544596,41.902124],[-89.632227,41.902124],[-89.686996,41.929509],[-89.686996,42.197879],[-89.396718,42.203356],[-89.281702,42.203356]]]}},
+{"type":"Feature","id":"17143","properties":{"name":"Peoria"},"geometry":{"type":"Polygon","coordinates":[[[-89.96632,40.976521],[-89.637704,40.976521],[-89.473395,40.921752],[-89.555549,40.74649],[-89.873212,40.510982],[-89.988228,40.713628],[-89.988228,40.976521],[-89.96632,40.976521]]]}},
+{"type":"Feature","id":"17145","properties":{"name":"Perry"},"geometry":{"type":"Polygon","coordinates":[[[-89.593888,38.22162],[-89.144779,38.210667],[-89.128348,38.123036],[-89.177641,37.947773],[-89.566503,37.95325],[-89.593888,37.95325],[-89.593888,38.22162]]]}},
+{"type":"Feature","id":"17147","properties":{"name":"Piatt"},"geometry":{"type":"Polygon","coordinates":[[[-88.575177,40.28095],[-88.460161,40.28095],[-88.460161,39.881133],[-88.471115,39.793502],[-88.744962,39.793502],[-88.744962,40.056395],[-88.575177,40.28095]]]}},
+{"type":"Feature","id":"17149","properties":{"name":"Pike"},"geometry":{"type":"Polygon","coordinates":[[[-90.919308,39.842795],[-90.57426,39.837318],[-90.601645,39.788025],[-90.579737,39.519655],[-90.612599,39.393686],[-90.935738,39.399163],[-91.176724,39.596333],[-91.30817,39.683964],[-91.36294,39.760641],[-90.919308,39.842795]]]}},
+{"type":"Feature","id":"17151","properties":{"name":"Pope"},"geometry":{"type":"Polygon","coordinates":[[[-88.410869,37.597249],[-88.416346,37.421987],[-88.487546,37.065986],[-88.712101,37.334356],[-88.706624,37.597249],[-88.410869,37.597249]]]}},
+{"type":"Feature","id":"17153","properties":{"name":"Pulaski"},"geometry":{"type":"Polygon","coordinates":[[[-89.046194,37.328879],[-88.931178,37.301494],[-88.925701,37.224817],[-88.936655,37.230294],[-89.172164,37.065986],[-89.248841,37.334356],[-89.046194,37.328879]]]}},
+{"type":"Feature","id":"17155","properties":{"name":"Putnam"},"geometry":{"type":"Polygon","coordinates":[[[-89.16121,41.310615],[-89.16121,41.102491],[-89.467918,41.146307],[-89.16121,41.310615]]]}},
+{"type":"Feature","id":"17157","properties":{"name":"Randolph"},"geometry":{"type":"Polygon","coordinates":[[[-90.03752,38.22162],[-89.900597,38.22162],[-89.703427,38.22162],[-89.593888,38.22162],[-89.593888,37.95325],[-89.676042,37.805373],[-89.938935,37.876573],[-90.207305,38.090174],[-90.03752,38.22162]]]}},
+{"type":"Feature","id":"17159","properties":{"name":"Richland"},"geometry":{"type":"Polygon","coordinates":[[[-87.90699,38.851469],[-87.912467,38.572145],[-87.956283,38.572145],[-88.005575,38.572145],[-88.147976,38.566668],[-88.252038,38.599529],[-88.257515,38.845992],[-87.945329,38.851469],[-87.90699,38.851469]]]}},
+{"type":"Feature","id":"17161","properties":{"name":"Rock Island"},"geometry":{"type":"Polygon","coordinates":[[[-90.240167,41.781632],[-90.185398,41.584462],[-90.43186,41.327046],[-91.050754,41.332523],[-91.072662,41.332523],[-91.072662,41.332523],[-90.787861,41.453015],[-90.316844,41.726862],[-90.240167,41.781632]]]}},
+{"type":"Feature","id":"17163","properties":{"name":"St. Clair"},"geometry":{"type":"Polygon","coordinates":[[[-90.179921,38.659776],[-89.708904,38.654299],[-89.703427,38.41879],[-89.703427,38.22162],[-89.900597,38.22162],[-90.207305,38.47356],[-90.262075,38.522852],[-90.256598,38.533806],[-90.179921,38.659776]]]}},
+{"type":"Feature","id":"17165","properties":{"name":"Saline"},"geometry":{"type":"Polygon","coordinates":[[[-88.4273,37.909435],[-88.37253,37.909435],[-88.378007,37.597249],[-88.410869,37.597249],[-88.706624,37.597249],[-88.706624,37.865619],[-88.706624,37.909435],[-88.4273,37.909435]]]}},
+{"type":"Feature","id":"17167","properties":{"name":"Sangamon"},"geometry":{"type":"Polygon","coordinates":[[[-89.489826,39.974241],[-89.215979,39.919472],[-89.215979,39.81541],[-89.254318,39.820887],[-89.533642,39.525132],[-89.588411,39.525132],[-89.703427,39.525132],[-89.758196,39.525132],[-89.927981,39.519655],[-89.993705,39.87018],[-89.993705,39.903041],[-89.577457,39.974241],[-89.489826,39.974241]]]}},
+{"type":"Feature","id":"17169","properties":{"name":"Schuyler"},"geometry":{"type":"Polygon","coordinates":[[[-90.908354,40.286427],[-90.448291,40.275473],[-90.201828,40.182365],[-90.355183,40.122119],[-90.514014,39.985195],[-90.913831,40.105688],[-90.913831,40.193319],[-90.908354,40.286427]]]}},
+{"type":"Feature","id":"17171","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-90.371614,39.667533],[-90.300413,39.519655],[-90.579737,39.519655],[-90.601645,39.788025],[-90.371614,39.667533]]]}},
+{"type":"Feature","id":"17173","properties":{"name":"Shelby"},"geometry":{"type":"Polygon","coordinates":[[[-89.024286,39.656579],[-88.810686,39.651102],[-88.471115,39.448455],[-88.471115,39.371778],[-88.471115,39.212947],[-88.580654,39.212947],[-88.805209,39.218424],[-89.139302,39.218424],[-89.139302,39.34987],[-89.024286,39.656579]]]}},
+{"type":"Feature","id":"17175","properties":{"name":"Stark"},"geometry":{"type":"Polygon","coordinates":[[[-89.856781,41.233938],[-89.637704,41.146307],[-89.637704,40.976521],[-89.96632,40.976521],[-89.988228,40.976521],[-89.982751,41.151784],[-89.856781,41.233938]]]}},
+{"type":"Feature","id":"17177","properties":{"name":"Stephenson"},"geometry":{"type":"Polygon","coordinates":[[[-89.927981,42.504588],[-89.84035,42.504588],[-89.402195,42.499111],[-89.396718,42.203356],[-89.686996,42.197879],[-89.917028,42.197879],[-89.927981,42.504588]]]}},
+{"type":"Feature","id":"17179","properties":{"name":"Tazewell"},"geometry":{"type":"Polygon","coordinates":[[[-89.50078,40.74649],[-89.270749,40.593136],[-89.265272,40.324766],[-89.604842,40.319289],[-89.89512,40.434304],[-89.922504,40.434304],[-89.873212,40.510982],[-89.555549,40.74649],[-89.50078,40.74649]]]}},
+{"type":"Feature","id":"17181","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-89.155733,37.602726],[-89.040717,37.597249],[-89.046194,37.328879],[-89.248841,37.334356],[-89.259795,37.334356],[-89.484349,37.334356],[-89.522688,37.564388],[-89.522688,37.569865],[-89.155733,37.602726]]]}},
+{"type":"Feature","id":"17183","properties":{"name":"Vermilion"},"geometry":{"type":"Polygon","coordinates":[[[-87.841267,40.489074],[-87.529082,40.489074],[-87.529082,40.47812],[-87.529082,40.149503],[-87.534558,39.881133],[-87.939852,39.881133],[-87.934375,40.401443],[-87.934375,40.483597],[-87.841267,40.489074]]]}},
+{"type":"Feature","id":"17185","properties":{"name":"Wabash"},"geometry":{"type":"Polygon","coordinates":[[[-87.912467,38.572145],[-87.649574,38.566668],[-87.742682,38.413313],[-87.972714,38.232574],[-87.989145,38.259959],[-87.956283,38.572145],[-87.912467,38.572145]]]}},
+{"type":"Feature","id":"17187","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-90.667368,41.069629],[-90.437337,41.064153],[-90.442814,40.713628],[-90.442814,40.625997],[-90.787861,40.636951],[-90.787861,41.069629],[-90.667368,41.069629]]]}},
+{"type":"Feature","id":"17189","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-89.320041,38.511898],[-89.144779,38.500944],[-89.144779,38.47356],[-89.144779,38.210667],[-89.593888,38.22162],[-89.703427,38.22162],[-89.703427,38.41879],[-89.320041,38.511898]]]}},
+{"type":"Feature","id":"17191","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-88.586131,38.605006],[-88.252038,38.599529],[-88.147976,38.566668],[-88.153453,38.254482],[-88.37253,38.254482],[-88.591608,38.254482],[-88.701147,38.254482],[-88.701147,38.47356],[-88.701147,38.605006],[-88.586131,38.605006]]]}},
+{"type":"Feature","id":"17193","properties":{"name":"White"},"geometry":{"type":"Polygon","coordinates":[[[-88.005575,38.259959],[-87.989145,38.259959],[-87.972714,38.232574],[-87.978191,38.232574],[-88.054868,37.88205],[-88.137022,37.909435],[-88.37253,37.909435],[-88.37253,38.254482],[-88.153453,38.254482],[-88.005575,38.259959]]]}},
+{"type":"Feature","id":"17195","properties":{"name":"Whiteside"},"geometry":{"type":"Polygon","coordinates":[[[-89.889643,41.929509],[-89.686996,41.929509],[-89.632227,41.902124],[-89.632227,41.584462],[-89.862258,41.584462],[-90.179921,41.584462],[-90.185398,41.584462],[-90.240167,41.781632],[-90.152536,41.929509],[-89.889643,41.929509]]]}},
+{"type":"Feature","id":"17197","properties":{"name":"Will"},"geometry":{"type":"Polygon","coordinates":[[[-88.03296,41.726862],[-88.027483,41.683047],[-87.523605,41.469446],[-87.529082,41.299661],[-87.786498,41.294184],[-88.246561,41.201076],[-88.252038,41.463969],[-88.262992,41.726862],[-88.03296,41.726862]]]}},
+{"type":"Feature","id":"17199","properties":{"name":"Williamson"},"geometry":{"type":"Polygon","coordinates":[[[-88.728531,37.865619],[-88.706624,37.865619],[-88.706624,37.597249],[-88.876409,37.597249],[-89.040717,37.597249],[-89.155733,37.602726],[-89.150256,37.860142],[-88.728531,37.865619]]]}},
+{"type":"Feature","id":"17201","properties":{"name":"Winnebago"},"geometry":{"type":"Polygon","coordinates":[[[-89.363857,42.499111],[-88.942132,42.493634],[-88.942132,42.154064],[-89.281702,42.203356],[-89.396718,42.203356],[-89.402195,42.499111],[-89.363857,42.499111]]]}},
+{"type":"Feature","id":"17203","properties":{"name":"Woodford"},"geometry":{"type":"Polygon","coordinates":[[[-89.111917,40.927229],[-89.046194,40.927229],[-88.931178,40.927229],[-88.931178,40.751967],[-89.270749,40.593136],[-89.50078,40.74649],[-89.555549,40.74649],[-89.473395,40.921752],[-89.111917,40.927229]]]}},
+{"type":"Feature","id":"18001","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-84.878242,40.921752],[-84.801565,40.921752],[-84.801565,40.730059],[-84.801565,40.571228],[-85.069935,40.565751],[-85.075412,40.916275],[-84.878242,40.921752]]]}},
+{"type":"Feature","id":"18003","properties":{"name":"Allen"},"geometry":{"type":"Polygon","coordinates":[[[-84.845381,41.272276],[-84.801565,41.272276],[-84.801565,41.250368],[-84.801565,40.987475],[-84.801565,40.921752],[-84.878242,40.921752],[-85.075412,40.916275],[-85.108274,40.916275],[-85.338305,40.916275],[-85.332828,41.003906],[-85.305444,41.266799],[-85.190428,41.266799],[-84.845381,41.272276]]]}},
+{"type":"Feature","id":"18005","properties":{"name":"Bartholomew"},"geometry":{"type":"Polygon","coordinates":[[[-85.798368,39.34987],[-85.683353,39.34987],[-85.68883,39.130793],[-85.798368,39.070546],[-86.077692,39.048638],[-86.083169,39.344393],[-85.951723,39.34987],[-85.798368,39.34987]]]}},
+{"type":"Feature","id":"18007","properties":{"name":"Benton"},"geometry":{"type":"Polygon","coordinates":[[[-87.326435,40.735536],[-87.266188,40.735536],[-87.096403,40.735536],[-87.096403,40.560274],[-87.096403,40.47812],[-87.452404,40.47812],[-87.529082,40.47812],[-87.529082,40.489074],[-87.523605,40.735536],[-87.326435,40.735536]]]}},
+{"type":"Feature","id":"18009","properties":{"name":"Blackford"},"geometry":{"type":"Polygon","coordinates":[[[-85.22329,40.565751],[-85.201382,40.565751],[-85.217813,40.379535],[-85.442367,40.379535],[-85.447844,40.565751],[-85.22329,40.565751]]]}},
+{"type":"Feature","id":"18011","properties":{"name":"Boone"},"geometry":{"type":"Polygon","coordinates":[[[-86.242001,40.182365],[-86.242001,39.924949],[-86.324155,39.924949],[-86.433693,39.924949],[-86.696587,39.924949],[-86.696587,40.176888],[-86.242001,40.182365]]]}},
+{"type":"Feature","id":"18013","properties":{"name":"Brown"},"geometry":{"type":"Polygon","coordinates":[[[-86.252954,39.344393],[-86.083169,39.344393],[-86.077692,39.048638],[-86.318678,39.048638],[-86.378924,39.338916],[-86.252954,39.344393]]]}},
+{"type":"Feature","id":"18015","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-86.773264,40.560274],[-86.581571,40.735536],[-86.373447,40.560274],[-86.373447,40.434304],[-86.696587,40.434304],[-86.773264,40.560274]]]}},
+{"type":"Feature","id":"18017","properties":{"name":"Cass"},"geometry":{"type":"Polygon","coordinates":[[[-86.581571,40.910798],[-86.466555,40.910798],[-86.1708,40.910798],[-86.165323,40.560274],[-86.373447,40.560274],[-86.581571,40.735536],[-86.581571,40.910798]]]}},
+{"type":"Feature","id":"18019","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-85.590245,38.605006],[-85.568337,38.605006],[-85.425936,38.588575],[-85.431413,38.522852],[-85.639537,38.380452],[-85.792891,38.287344],[-85.995538,38.41879],[-85.847661,38.561191],[-85.590245,38.605006]]]}},
+{"type":"Feature","id":"18021","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-87.200465,39.607286],[-87.014249,39.607286],[-86.937572,39.47584],[-87.052588,39.169131],[-87.211419,39.169131],[-87.238804,39.169131],[-87.238804,39.256762],[-87.200465,39.607286]]]}},
+{"type":"Feature","id":"18023","properties":{"name":"Clinton"},"geometry":{"type":"Polygon","coordinates":[[[-86.357016,40.434304],[-86.242001,40.374058],[-86.242001,40.215227],[-86.242001,40.182365],[-86.696587,40.176888],[-86.696587,40.215227],[-86.696587,40.434304],[-86.373447,40.434304],[-86.357016,40.434304]]]}},
+{"type":"Feature","id":"18025","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-86.307724,38.424267],[-86.252954,38.424267],[-86.307724,38.166851],[-86.461078,38.117559],[-86.570617,38.265436],[-86.680156,38.265436],[-86.680156,38.396883],[-86.307724,38.424267]]]}},
+{"type":"Feature","id":"18027","properties":{"name":"Daviess"},"geometry":{"type":"Polygon","coordinates":[[[-87.096403,38.906238],[-86.90471,38.906238],[-86.926618,38.506421],[-87.074495,38.517375],[-87.244281,38.54476],[-87.096403,38.906238]]]}},
+{"type":"Feature","id":"18029","properties":{"name":"Dearborn"},"geometry":{"type":"Polygon","coordinates":[[[-85.031597,39.306055],[-84.817996,39.306055],[-84.817996,39.103408],[-84.878242,39.032208],[-84.933012,39.0103],[-85.130182,38.950054],[-85.064458,39.306055],[-85.031597,39.306055]]]}},
+{"type":"Feature","id":"18031","properties":{"name":"Decatur"},"geometry":{"type":"Polygon","coordinates":[[[-85.299967,39.453932],[-85.29449,39.267716],[-85.442367,39.196516],[-85.68883,39.130793],[-85.683353,39.34987],[-85.628583,39.453932],[-85.299967,39.453932]]]}},
+{"type":"Feature","id":"18033","properties":{"name":"DeKalb"},"geometry":{"type":"Polygon","coordinates":[[[-84.916581,41.529692],[-84.807042,41.529692],[-84.801565,41.425631],[-84.801565,41.272276],[-84.845381,41.272276],[-85.190428,41.266799],[-85.195905,41.524216],[-84.916581,41.529692]]]}},
+{"type":"Feature","id":"18035","properties":{"name":"Delaware"},"geometry":{"type":"Polygon","coordinates":[[[-85.513567,40.379535],[-85.442367,40.379535],[-85.217813,40.379535],[-85.217813,40.308335],[-85.212336,40.078303],[-85.327352,40.078303],[-85.573814,40.078303],[-85.579291,40.379535],[-85.513567,40.379535]]]}},
+{"type":"Feature","id":"18037","properties":{"name":"Dubois"},"geometry":{"type":"Polygon","coordinates":[[[-86.680156,38.528329],[-86.680156,38.396883],[-86.680156,38.265436],[-86.789695,38.20519],[-86.866372,38.20519],[-87.019726,38.20519],[-87.074495,38.232574],[-87.074495,38.517375],[-86.926618,38.506421],[-86.680156,38.528329]]]}},
+{"type":"Feature","id":"18039","properties":{"name":"Elkhart"},"geometry":{"type":"Polygon","coordinates":[[[-85.990061,41.759724],[-85.792891,41.759724],[-85.661445,41.759724],[-85.655968,41.524216],[-85.655968,41.436584],[-86.061262,41.436584],[-86.061262,41.4804],[-86.061262,41.759724],[-85.990061,41.759724]]]}},
+{"type":"Feature","id":"18041","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-85.22329,39.788025],[-85.037074,39.716825],[-85.037074,39.525132],[-85.23972,39.525132],[-85.299967,39.525132],[-85.299967,39.788025],[-85.22329,39.788025]]]}},
+{"type":"Feature","id":"18043","properties":{"name":"Floyd"},"geometry":{"type":"Polygon","coordinates":[[[-86.011969,38.41879],[-85.995538,38.41879],[-85.792891,38.287344],[-85.90243,38.177805],[-86.033877,38.41879],[-86.011969,38.41879]]]}},
+{"type":"Feature","id":"18045","properties":{"name":"Fountain"},"geometry":{"type":"Polygon","coordinates":[[[-87.255235,40.297381],[-87.090926,40.368581],[-87.090926,40.215227],[-87.090926,39.952334],[-87.205942,39.952334],[-87.419543,39.952334],[-87.408589,40.127596],[-87.255235,40.297381]]]}},
+{"type":"Feature","id":"18047","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-85.23972,39.525132],[-85.037074,39.525132],[-84.817996,39.519655],[-84.817996,39.306055],[-85.031597,39.306055],[-85.064458,39.306055],[-85.09732,39.311532],[-85.29449,39.267716],[-85.299967,39.453932],[-85.299967,39.525132],[-85.23972,39.525132]]]}},
+{"type":"Feature","id":"18049","properties":{"name":"Fulton"},"geometry":{"type":"Polygon","coordinates":[[[-86.242001,41.173691],[-86.077692,41.173691],[-85.946246,41.042245],[-85.946246,40.998429],[-86.1708,40.910798],[-86.466555,40.910798],[-86.466555,41.173691],[-86.242001,41.173691]]]}},
+{"type":"Feature","id":"18051","properties":{"name":"Gibson"},"geometry":{"type":"Polygon","coordinates":[[[-87.605759,38.446175],[-87.463358,38.533806],[-87.315481,38.243528],[-87.468835,38.166851],[-87.687913,38.166851],[-87.972714,38.232574],[-87.978191,38.232574],[-87.972714,38.232574],[-87.742682,38.413313],[-87.605759,38.446175]]]}},
+{"type":"Feature","id":"18053","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-85.447844,40.653382],[-85.447844,40.565751],[-85.442367,40.379535],[-85.513567,40.379535],[-85.579291,40.379535],[-85.672399,40.379535],[-85.864092,40.379535],[-85.864092,40.40692],[-85.864092,40.565751],[-85.864092,40.653382],[-85.639537,40.653382],[-85.447844,40.653382]]]}},
+{"type":"Feature","id":"18055","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-87.211419,39.169131],[-87.052588,39.169131],[-86.685633,39.163654],[-86.680156,38.993869],[-86.680156,38.906238],[-86.756833,38.906238],[-86.90471,38.906238],[-87.096403,38.906238],[-87.238804,38.906238],[-87.238804,39.169131],[-87.211419,39.169131]]]}},
+{"type":"Feature","id":"18057","properties":{"name":"Hamilton"},"geometry":{"type":"Polygon","coordinates":[[[-85.875046,40.220704],[-85.864092,40.220704],[-85.864092,39.94138],[-85.935292,39.924949],[-86.110554,39.924949],[-86.242001,39.924949],[-86.242001,40.182365],[-86.242001,40.215227],[-85.875046,40.220704]]]}},
+{"type":"Feature","id":"18059","properties":{"name":"Hancock"},"geometry":{"type":"Polygon","coordinates":[[[-85.617629,39.946857],[-85.573814,39.946857],[-85.595722,39.788025],[-85.63406,39.700394],[-85.951723,39.694917],[-85.935292,39.924949],[-85.864092,39.94138],[-85.617629,39.946857]]]}},
+{"type":"Feature","id":"18061","properties":{"name":"Harrison"},"geometry":{"type":"Polygon","coordinates":[[[-86.198185,38.424267],[-86.033877,38.41879],[-85.90243,38.177805],[-85.946246,38.00802],[-86.001015,37.997066],[-86.307724,38.166851],[-86.252954,38.424267],[-86.198185,38.424267]]]}},
+{"type":"Feature","id":"18063","properties":{"name":"Hendricks"},"geometry":{"type":"Polygon","coordinates":[[[-86.433693,39.924949],[-86.324155,39.924949],[-86.324155,39.629194],[-86.658248,39.601809],[-86.696587,39.864703],[-86.696587,39.924949],[-86.433693,39.924949]]]}},
+{"type":"Feature","id":"18065","properties":{"name":"Henry"},"geometry":{"type":"Polygon","coordinates":[[[-85.327352,40.078303],[-85.212336,40.078303],[-85.201382,40.007103],[-85.22329,39.788025],[-85.299967,39.788025],[-85.321875,39.788025],[-85.595722,39.788025],[-85.573814,39.946857],[-85.573814,40.078303],[-85.327352,40.078303]]]}},
+{"type":"Feature","id":"18067","properties":{"name":"Howard"},"geometry":{"type":"Polygon","coordinates":[[[-85.875046,40.565751],[-85.864092,40.565751],[-85.864092,40.40692],[-86.242001,40.374058],[-86.357016,40.434304],[-86.373447,40.434304],[-86.373447,40.560274],[-86.165323,40.560274],[-85.875046,40.565751]]]}},
+{"type":"Feature","id":"18069","properties":{"name":"Huntington"},"geometry":{"type":"Polygon","coordinates":[[[-85.376644,41.003906],[-85.332828,41.003906],[-85.338305,40.916275],[-85.447844,40.653382],[-85.639537,40.653382],[-85.645014,41.003906],[-85.376644,41.003906]]]}},
+{"type":"Feature","id":"18071","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-85.798368,39.070546],[-85.792891,38.807653],[-85.885999,38.736453],[-86.274862,38.763838],[-86.318678,38.988392],[-86.318678,39.048638],[-86.077692,39.048638],[-85.798368,39.070546]]]}},
+{"type":"Feature","id":"18073","properties":{"name":"Jasper"},"geometry":{"type":"Polygon","coordinates":[[[-87.036157,41.255845],[-86.932095,41.239415],[-86.932095,41.173691],[-86.932095,40.910798],[-87.096403,40.735536],[-87.266188,40.735536],[-87.277142,41.21203],[-87.277142,41.217507],[-87.216896,41.239415],[-87.036157,41.255845]]]}},
+{"type":"Feature","id":"18075","properties":{"name":"Jay"},"geometry":{"type":"Polygon","coordinates":[[[-84.801565,40.571228],[-84.801565,40.35215],[-84.801565,40.308335],[-84.807042,40.308335],[-85.217813,40.308335],[-85.217813,40.379535],[-85.201382,40.565751],[-85.069935,40.565751],[-84.801565,40.571228]]]}},
+{"type":"Feature","id":"18077","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-85.299967,38.911715],[-85.201382,38.911715],[-85.201382,38.692637],[-85.332828,38.736453],[-85.425936,38.588575],[-85.568337,38.605006],[-85.683353,38.81313],[-85.442367,38.911715],[-85.299967,38.911715]]]}},
+{"type":"Feature","id":"18079","properties":{"name":"Jennings"},"geometry":{"type":"Polygon","coordinates":[[[-85.442367,39.196516],[-85.442367,38.911715],[-85.683353,38.81313],[-85.792891,38.807653],[-85.798368,39.070546],[-85.68883,39.130793],[-85.442367,39.196516]]]}},
+{"type":"Feature","id":"18081","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-85.97363,39.640148],[-85.951723,39.640148],[-85.951723,39.34987],[-86.083169,39.344393],[-86.252954,39.344393],[-86.247477,39.634671],[-85.97363,39.640148]]]}},
+{"type":"Feature","id":"18083","properties":{"name":"Knox"},"geometry":{"type":"Polygon","coordinates":[[[-87.238804,38.906238],[-87.096403,38.906238],[-87.244281,38.54476],[-87.463358,38.533806],[-87.605759,38.446175],[-87.742682,38.413313],[-87.649574,38.566668],[-87.534558,38.851469],[-87.534558,38.900761],[-87.238804,38.906238]]]}},
+{"type":"Feature","id":"18085","properties":{"name":"Kosciusko"},"geometry":{"type":"Polygon","coordinates":[[[-85.655968,41.436584],[-85.650491,41.294184],[-85.683353,41.047722],[-85.946246,41.042245],[-86.077692,41.173691],[-86.061262,41.436584],[-85.655968,41.436584]]]}},
+{"type":"Feature","id":"18087","properties":{"name":"LaGrange"},"geometry":{"type":"Polygon","coordinates":[[[-85.371167,41.759724],[-85.29449,41.759724],[-85.195905,41.759724],[-85.195905,41.524216],[-85.655968,41.524216],[-85.661445,41.759724],[-85.371167,41.759724]]]}},
+{"type":"Feature","id":"18089","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-87.222373,41.6228],[-87.216896,41.239415],[-87.277142,41.217507],[-87.529082,41.168214],[-87.529082,41.299661],[-87.523605,41.469446],[-87.523605,41.710431],[-87.222373,41.6228]]]}},
+{"type":"Feature","id":"18091","properties":{"name":"LaPorte"},"geometry":{"type":"Polygon","coordinates":[[[-86.822556,41.759724],[-86.521325,41.759724],[-86.526801,41.431108],[-86.932095,41.239415],[-86.932095,41.710431],[-86.822556,41.759724]]]}},
+{"type":"Feature","id":"18093","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-86.680156,38.993869],[-86.318678,38.988392],[-86.274862,38.763838],[-86.307724,38.68716],[-86.685633,38.68716],[-86.680156,38.906238],[-86.680156,38.993869]]]}},
+{"type":"Feature","id":"18095","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-85.672399,40.379535],[-85.579291,40.379535],[-85.573814,40.078303],[-85.573814,39.946857],[-85.617629,39.946857],[-85.864092,39.94138],[-85.864092,40.220704],[-85.864092,40.379535],[-85.672399,40.379535]]]}},
+{"type":"Feature","id":"18097","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-86.110554,39.924949],[-85.935292,39.924949],[-85.951723,39.694917],[-85.951723,39.640148],[-85.97363,39.640148],[-86.247477,39.634671],[-86.324155,39.629194],[-86.324155,39.924949],[-86.242001,39.924949],[-86.110554,39.924949]]]}},
+{"type":"Feature","id":"18099","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-86.247477,41.4804],[-86.061262,41.4804],[-86.061262,41.436584],[-86.077692,41.173691],[-86.242001,41.173691],[-86.466555,41.173691],[-86.466555,41.431108],[-86.247477,41.4804]]]}},
+{"type":"Feature","id":"18101","properties":{"name":"Martin"},"geometry":{"type":"Polygon","coordinates":[[[-86.756833,38.906238],[-86.680156,38.906238],[-86.685633,38.68716],[-86.680156,38.528329],[-86.926618,38.506421],[-86.90471,38.906238],[-86.756833,38.906238]]]}},
+{"type":"Feature","id":"18103","properties":{"name":"Miami"},"geometry":{"type":"Polygon","coordinates":[[[-85.946246,40.998429],[-85.864092,40.653382],[-85.864092,40.565751],[-85.875046,40.565751],[-86.165323,40.560274],[-86.1708,40.910798],[-85.946246,40.998429]]]}},
+{"type":"Feature","id":"18105","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-86.630863,39.34987],[-86.378924,39.338916],[-86.318678,39.048638],[-86.318678,38.988392],[-86.680156,38.993869],[-86.685633,39.163654],[-86.630863,39.34987]]]}},
+{"type":"Feature","id":"18107","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-86.921141,40.215227],[-86.696587,40.215227],[-86.696587,40.176888],[-86.696587,39.924949],[-86.696587,39.864703],[-87.008772,39.864703],[-87.090926,39.952334],[-87.090926,40.215227],[-86.921141,40.215227]]]}},
+{"type":"Feature","id":"18109","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-86.247477,39.634671],[-86.252954,39.344393],[-86.378924,39.338916],[-86.630863,39.34987],[-86.685633,39.470363],[-86.658248,39.601809],[-86.324155,39.629194],[-86.247477,39.634671]]]}},
+{"type":"Feature","id":"18111","properties":{"name":"Newton"},"geometry":{"type":"Polygon","coordinates":[[[-87.277142,41.21203],[-87.266188,40.735536],[-87.326435,40.735536],[-87.523605,40.735536],[-87.523605,41.009383],[-87.529082,41.168214],[-87.277142,41.217507],[-87.277142,41.21203]]]}},
+{"type":"Feature","id":"18113","properties":{"name":"Noble"},"geometry":{"type":"Polygon","coordinates":[[[-85.195905,41.524216],[-85.190428,41.266799],[-85.305444,41.266799],[-85.650491,41.294184],[-85.655968,41.436584],[-85.655968,41.524216],[-85.195905,41.524216]]]}},
+{"type":"Feature","id":"18115","properties":{"name":"Ohio"},"geometry":{"type":"Polygon","coordinates":[[[-84.933012,39.0103],[-84.878242,39.032208],[-84.872765,38.900761],[-85.135659,38.928146],[-85.130182,38.950054],[-84.933012,39.0103]]]}},
+{"type":"Feature","id":"18117","properties":{"name":"Orange"},"geometry":{"type":"Polygon","coordinates":[[[-86.307724,38.68716],[-86.307724,38.424267],[-86.680156,38.396883],[-86.680156,38.528329],[-86.685633,38.68716],[-86.307724,38.68716]]]}},
+{"type":"Feature","id":"18119","properties":{"name":"Owen"},"geometry":{"type":"Polygon","coordinates":[[[-86.937572,39.47584],[-86.685633,39.470363],[-86.630863,39.34987],[-86.685633,39.163654],[-87.052588,39.169131],[-86.937572,39.47584]]]}},
+{"type":"Feature","id":"18121","properties":{"name":"Parke"},"geometry":{"type":"Polygon","coordinates":[[[-87.205942,39.952334],[-87.090926,39.952334],[-87.008772,39.864703],[-87.014249,39.607286],[-87.200465,39.607286],[-87.331912,39.607286],[-87.381204,39.607286],[-87.419543,39.952334],[-87.205942,39.952334]]]}},
+{"type":"Feature","id":"18123","properties":{"name":"Perry"},"geometry":{"type":"Polygon","coordinates":[[[-86.570617,38.265436],[-86.461078,38.117559],[-86.488463,38.046358],[-86.652771,37.843712],[-86.811602,37.997066],[-86.789695,38.20519],[-86.680156,38.265436],[-86.570617,38.265436]]]}},
+{"type":"Feature","id":"18125","properties":{"name":"Pike"},"geometry":{"type":"Polygon","coordinates":[[[-87.074495,38.517375],[-87.074495,38.232574],[-87.310004,38.243528],[-87.315481,38.243528],[-87.463358,38.533806],[-87.244281,38.54476],[-87.074495,38.517375]]]}},
+{"type":"Feature","id":"18127","properties":{"name":"Porter"},"geometry":{"type":"Polygon","coordinates":[[[-86.932095,41.710431],[-86.932095,41.239415],[-87.036157,41.255845],[-87.216896,41.239415],[-87.222373,41.6228],[-86.932095,41.710431]]]}},
+{"type":"Feature","id":"18129","properties":{"name":"Posey"},"geometry":{"type":"Polygon","coordinates":[[[-87.972714,38.232574],[-87.687913,38.166851],[-87.698867,37.898481],[-87.928898,37.903958],[-88.027483,37.799896],[-88.054868,37.88205],[-87.978191,38.232574],[-87.972714,38.232574]]]}},
+{"type":"Feature","id":"18131","properties":{"name":"Pulaski"},"geometry":{"type":"Polygon","coordinates":[[[-86.669202,41.173691],[-86.466555,41.173691],[-86.466555,40.910798],[-86.581571,40.910798],[-86.877326,40.910798],[-86.932095,40.910798],[-86.932095,41.173691],[-86.669202,41.173691]]]}},
+{"type":"Feature","id":"18133","properties":{"name":"Putnam"},"geometry":{"type":"Polygon","coordinates":[[[-87.008772,39.864703],[-86.696587,39.864703],[-86.658248,39.601809],[-86.685633,39.470363],[-86.937572,39.47584],[-87.014249,39.607286],[-87.008772,39.864703]]]}},
+{"type":"Feature","id":"18135","properties":{"name":"Randolph"},"geometry":{"type":"Polygon","coordinates":[[[-84.807042,40.308335],[-84.801565,40.308335],[-84.812519,40.007103],[-84.856335,40.007103],[-85.201382,40.007103],[-85.212336,40.078303],[-85.217813,40.308335],[-84.807042,40.308335]]]}},
+{"type":"Feature","id":"18137","properties":{"name":"Ripley"},"geometry":{"type":"Polygon","coordinates":[[[-85.09732,39.311532],[-85.064458,39.306055],[-85.130182,38.950054],[-85.135659,38.928146],[-85.201382,38.911715],[-85.299967,38.911715],[-85.442367,38.911715],[-85.442367,39.196516],[-85.29449,39.267716],[-85.09732,39.311532]]]}},
+{"type":"Feature","id":"18139","properties":{"name":"Rush"},"geometry":{"type":"Polygon","coordinates":[[[-85.321875,39.788025],[-85.299967,39.788025],[-85.299967,39.525132],[-85.299967,39.453932],[-85.628583,39.453932],[-85.63406,39.700394],[-85.595722,39.788025],[-85.321875,39.788025]]]}},
+{"type":"Feature","id":"18141","properties":{"name":"St. Joseph"},"geometry":{"type":"Polygon","coordinates":[[[-86.061262,41.759724],[-86.061262,41.4804],[-86.247477,41.4804],[-86.466555,41.431108],[-86.526801,41.431108],[-86.521325,41.759724],[-86.22557,41.759724],[-86.061262,41.759724]]]}},
+{"type":"Feature","id":"18143","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-85.683353,38.81313],[-85.568337,38.605006],[-85.590245,38.605006],[-85.847661,38.561191],[-85.885999,38.736453],[-85.792891,38.807653],[-85.683353,38.81313]]]}},
+{"type":"Feature","id":"18145","properties":{"name":"Shelby"},"geometry":{"type":"Polygon","coordinates":[[[-85.63406,39.700394],[-85.628583,39.453932],[-85.683353,39.34987],[-85.798368,39.34987],[-85.951723,39.34987],[-85.951723,39.640148],[-85.951723,39.694917],[-85.63406,39.700394]]]}},
+{"type":"Feature","id":"18147","properties":{"name":"Spencer"},"geometry":{"type":"Polygon","coordinates":[[[-86.866372,38.20519],[-86.789695,38.20519],[-86.811602,37.997066],[-86.981388,37.931343],[-87.266188,37.876573],[-87.019726,38.20519],[-86.866372,38.20519]]]}},
+{"type":"Feature","id":"18149","properties":{"name":"Starke"},"geometry":{"type":"Polygon","coordinates":[[[-86.466555,41.431108],[-86.466555,41.173691],[-86.669202,41.173691],[-86.932095,41.173691],[-86.932095,41.239415],[-86.526801,41.431108],[-86.466555,41.431108]]]}},
+{"type":"Feature","id":"18151","properties":{"name":"Steuben"},"geometry":{"type":"Polygon","coordinates":[[[-84.823473,41.759724],[-84.807042,41.694001],[-84.807042,41.529692],[-84.916581,41.529692],[-85.195905,41.524216],[-85.195905,41.759724],[-84.823473,41.759724]]]}},
+{"type":"Feature","id":"18153","properties":{"name":"Sullivan"},"geometry":{"type":"Polygon","coordinates":[[[-87.578374,39.256762],[-87.238804,39.256762],[-87.238804,39.169131],[-87.238804,38.906238],[-87.534558,38.900761],[-87.644097,39.158177],[-87.605759,39.256762],[-87.578374,39.256762]]]}},
+{"type":"Feature","id":"18155","properties":{"name":"Switzerland"},"geometry":{"type":"Polygon","coordinates":[[[-85.135659,38.928146],[-84.872765,38.900761],[-84.796088,38.856946],[-85.02612,38.763838],[-85.201382,38.692637],[-85.201382,38.911715],[-85.135659,38.928146]]]}},
+{"type":"Feature","id":"18157","properties":{"name":"Tippecanoe"},"geometry":{"type":"Polygon","coordinates":[[[-87.096403,40.560274],[-86.773264,40.560274],[-86.696587,40.434304],[-86.696587,40.215227],[-86.921141,40.215227],[-87.090926,40.215227],[-87.090926,40.368581],[-87.096403,40.47812],[-87.096403,40.560274]]]}},
+{"type":"Feature","id":"18159","properties":{"name":"Tipton"},"geometry":{"type":"Polygon","coordinates":[[[-85.864092,40.40692],[-85.864092,40.379535],[-85.864092,40.220704],[-85.875046,40.220704],[-86.242001,40.215227],[-86.242001,40.374058],[-85.864092,40.40692]]]}},
+{"type":"Feature","id":"18161","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-84.812519,39.727779],[-84.812519,39.568948],[-84.817996,39.519655],[-85.037074,39.525132],[-85.037074,39.716825],[-84.812519,39.727779]]]}},
+{"type":"Feature","id":"18163","properties":{"name":"Vanderburgh"},"geometry":{"type":"Polygon","coordinates":[[[-87.687913,38.166851],[-87.468835,38.166851],[-87.452404,37.942297],[-87.698867,37.898481],[-87.687913,38.166851]]]}},
+{"type":"Feature","id":"18165","properties":{"name":"Vermillion"},"geometry":{"type":"Polygon","coordinates":[[[-87.408589,40.127596],[-87.419543,39.952334],[-87.381204,39.607286],[-87.534558,39.607286],[-87.534558,39.881133],[-87.529082,40.149503],[-87.408589,40.127596]]]}},
+{"type":"Feature","id":"18167","properties":{"name":"Vigo"},"geometry":{"type":"Polygon","coordinates":[[[-87.331912,39.607286],[-87.200465,39.607286],[-87.238804,39.256762],[-87.578374,39.256762],[-87.605759,39.256762],[-87.529082,39.47584],[-87.534558,39.607286],[-87.381204,39.607286],[-87.331912,39.607286]]]}},
+{"type":"Feature","id":"18169","properties":{"name":"Wabash"},"geometry":{"type":"Polygon","coordinates":[[[-85.683353,41.047722],[-85.645014,41.003906],[-85.639537,40.653382],[-85.864092,40.653382],[-85.946246,40.998429],[-85.946246,41.042245],[-85.683353,41.047722]]]}},
+{"type":"Feature","id":"18171","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-87.452404,40.47812],[-87.096403,40.47812],[-87.090926,40.368581],[-87.255235,40.297381],[-87.408589,40.127596],[-87.529082,40.149503],[-87.529082,40.47812],[-87.452404,40.47812]]]}},
+{"type":"Feature","id":"18173","properties":{"name":"Warrick"},"geometry":{"type":"Polygon","coordinates":[[[-87.310004,38.243528],[-87.074495,38.232574],[-87.019726,38.20519],[-87.266188,37.876573],[-87.304527,37.898481],[-87.452404,37.942297],[-87.468835,38.166851],[-87.315481,38.243528],[-87.310004,38.243528]]]}},
+{"type":"Feature","id":"18175","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-86.274862,38.763838],[-85.885999,38.736453],[-85.847661,38.561191],[-85.995538,38.41879],[-86.011969,38.41879],[-86.033877,38.41879],[-86.198185,38.424267],[-86.252954,38.424267],[-86.307724,38.424267],[-86.307724,38.68716],[-86.274862,38.763838]]]}},
+{"type":"Feature","id":"18177","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-84.856335,40.007103],[-84.812519,40.007103],[-84.812519,39.919472],[-84.812519,39.727779],[-85.037074,39.716825],[-85.22329,39.788025],[-85.201382,40.007103],[-84.856335,40.007103]]]}},
+{"type":"Feature","id":"18179","properties":{"name":"Wells"},"geometry":{"type":"Polygon","coordinates":[[[-85.108274,40.916275],[-85.075412,40.916275],[-85.069935,40.565751],[-85.201382,40.565751],[-85.22329,40.565751],[-85.447844,40.565751],[-85.447844,40.653382],[-85.338305,40.916275],[-85.108274,40.916275]]]}},
+{"type":"Feature","id":"18181","properties":{"name":"White"},"geometry":{"type":"Polygon","coordinates":[[[-86.877326,40.910798],[-86.581571,40.910798],[-86.581571,40.735536],[-86.773264,40.560274],[-87.096403,40.560274],[-87.096403,40.735536],[-86.932095,40.910798],[-86.877326,40.910798]]]}},
+{"type":"Feature","id":"18183","properties":{"name":"Whitley"},"geometry":{"type":"Polygon","coordinates":[[[-85.650491,41.294184],[-85.305444,41.266799],[-85.332828,41.003906],[-85.376644,41.003906],[-85.645014,41.003906],[-85.683353,41.047722],[-85.650491,41.294184]]]}},
+{"type":"Feature","id":"19001","properties":{"name":"Adair"},"geometry":{"type":"Polygon","coordinates":[[[-94.660058,41.502308],[-94.24381,41.502308],[-94.24381,41.157261],[-94.468365,41.157261],[-94.698396,41.157261],[-94.698396,41.502308],[-94.660058,41.502308]]]}},
+{"type":"Feature","id":"19003","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-94.813412,41.157261],[-94.698396,41.157261],[-94.468365,41.157261],[-94.468365,40.899844],[-94.857228,40.899844],[-94.928428,40.899844],[-94.928428,41.157261],[-94.813412,41.157261]]]}},
+{"type":"Feature","id":"19005","properties":{"name":"Allamakee"},"geometry":{"type":"Polygon","coordinates":[[[-91.368417,43.501391],[-91.215062,43.501391],[-91.204109,43.424714],[-91.176724,43.079667],[-91.565587,43.079667],[-91.603925,43.079667],[-91.609402,43.501391],[-91.368417,43.501391]]]}},
+{"type":"Feature","id":"19007","properties":{"name":"Appanoose"},"geometry":{"type":"Polygon","coordinates":[[[-92.639067,40.899844],[-92.639067,40.593136],[-92.715744,40.587659],[-92.748606,40.587659],[-93.09913,40.582182],[-93.09913,40.899844],[-92.639067,40.899844]]]}},
+{"type":"Feature","id":"19009","properties":{"name":"Audubon"},"geometry":{"type":"Polygon","coordinates":[[[-95.092736,41.863786],[-94.742212,41.863786],[-94.698396,41.502308],[-95.043444,41.502308],[-95.092736,41.863786]]]}},
+{"type":"Feature","id":"19011","properties":{"name":"Benton"},"geometry":{"type":"Polygon","coordinates":[[[-91.888726,42.296464],[-91.82848,42.296464],[-91.833957,41.863786],[-92.063988,41.863786],[-92.299497,41.863786],[-92.299497,42.296464],[-92.063988,42.296464],[-91.888726,42.296464]]]}},
+{"type":"Feature","id":"19013","properties":{"name":"Black Hawk"},"geometry":{"type":"Polygon","coordinates":[[[-92.469282,42.641511],[-92.080419,42.641511],[-92.063988,42.296464],[-92.299497,42.296464],[-92.535005,42.296464],[-92.551436,42.55388],[-92.556913,42.641511],[-92.469282,42.641511]]]}},
+{"type":"Feature","id":"19015","properties":{"name":"Boone"},"geometry":{"type":"Polygon","coordinates":[[[-93.931625,42.208833],[-93.696116,42.208833],[-93.696116,41.863786],[-93.772794,41.863786],[-93.816609,41.863786],[-94.161656,41.863786],[-94.167133,42.208833],[-93.931625,42.208833]]]}},
+{"type":"Feature","id":"19017","properties":{"name":"Bremer"},"geometry":{"type":"Polygon","coordinates":[[[-92.387128,42.909881],[-92.080419,42.904404],[-92.080419,42.641511],[-92.469282,42.641511],[-92.556913,42.641511],[-92.556913,42.904404],[-92.387128,42.909881]]]}},
+{"type":"Feature","id":"19019","properties":{"name":"Buchanan"},"geometry":{"type":"Polygon","coordinates":[[[-91.905157,42.641511],[-91.609402,42.641511],[-91.598448,42.296464],[-91.713464,42.296464],[-91.82848,42.296464],[-91.888726,42.296464],[-92.063988,42.296464],[-92.080419,42.641511],[-91.905157,42.641511]]]}},
+{"type":"Feature","id":"19021","properties":{"name":"Buena Vista"},"geometry":{"type":"Polygon","coordinates":[[[-95.251567,42.909881],[-94.911997,42.909881],[-94.911997,42.559357],[-95.388491,42.559357],[-95.388491,42.909881],[-95.251567,42.909881]]]}},
+{"type":"Feature","id":"19023","properties":{"name":"Butler"},"geometry":{"type":"Polygon","coordinates":[[[-93.022453,42.909881],[-92.556913,42.904404],[-92.556913,42.641511],[-92.551436,42.55388],[-92.907437,42.55388],[-93.02793,42.55388],[-93.022453,42.909881]]]}},
+{"type":"Feature","id":"19025","properties":{"name":"Calhoun"},"geometry":{"type":"Polygon","coordinates":[[[-94.616242,42.559357],[-94.44098,42.559357],[-94.397165,42.208833],[-94.627196,42.208833],[-94.857228,42.208833],[-94.911997,42.559357],[-94.616242,42.559357]]]}},
+{"type":"Feature","id":"19027","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-95.092736,42.208833],[-94.857228,42.208833],[-94.627196,42.208833],[-94.627196,41.863786],[-94.742212,41.863786],[-95.092736,41.863786],[-95.092736,42.208833]]]}},
+{"type":"Feature","id":"19029","properties":{"name":"Cass"},"geometry":{"type":"Polygon","coordinates":[[[-95.152983,41.507785],[-95.043444,41.502308],[-94.698396,41.502308],[-94.698396,41.157261],[-94.813412,41.157261],[-94.928428,41.157261],[-95.158459,41.157261],[-95.152983,41.507785]]]}},
+{"type":"Feature","id":"19031","properties":{"name":"Cedar"},"geometry":{"type":"Polygon","coordinates":[[[-91.012416,41.94594],[-90.8974,41.94594],[-90.8974,41.770678],[-90.8974,41.595416],[-91.30817,41.595416],[-91.368417,41.600893],[-91.368417,41.858309],[-91.368417,41.94594],[-91.012416,41.94594]]]}},
+{"type":"Feature","id":"19033","properties":{"name":"Cerro Gordo"},"geometry":{"type":"Polygon","coordinates":[[[-93.055314,43.254929],[-93.022453,43.254929],[-93.022453,43.211113],[-93.022453,42.909881],[-93.487993,42.909881],[-93.498947,42.909881],[-93.498947,43.254929],[-93.055314,43.254929]]]}},
+{"type":"Feature","id":"19035","properties":{"name":"Cherokee"},"geometry":{"type":"Polygon","coordinates":[[[-95.415876,42.909881],[-95.388491,42.909881],[-95.388491,42.559357],[-95.465168,42.559357],[-95.739015,42.559357],[-95.859508,42.559357],[-95.859508,42.909881],[-95.415876,42.909881]]]}},
+{"type":"Feature","id":"19037","properties":{"name":"Chickasaw"},"geometry":{"type":"Polygon","coordinates":[[[-92.255681,43.211113],[-92.080419,43.211113],[-92.080419,43.085144],[-92.080419,42.904404],[-92.387128,42.909881],[-92.556913,42.904404],[-92.556913,43.211113],[-92.255681,43.211113]]]}},
+{"type":"Feature","id":"19039","properties":{"name":"Clarke"},"geometry":{"type":"Polygon","coordinates":[[[-93.674209,41.162737],[-93.559193,41.162737],[-93.559193,40.899844],[-93.663255,40.899844],[-94.013779,40.894367],[-94.013779,41.157261],[-93.789224,41.162737],[-93.674209,41.162737]]]}},
+{"type":"Feature","id":"19041","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-95.169413,43.254929],[-94.911997,43.254929],[-94.911997,42.909881],[-95.251567,42.909881],[-95.388491,42.909881],[-95.388491,43.254929],[-95.169413,43.254929]]]}},
+{"type":"Feature","id":"19043","properties":{"name":"Clayton"},"geometry":{"type":"Polygon","coordinates":[[[-91.565587,43.079667],[-91.176724,43.079667],[-91.154816,42.986559],[-90.8974,42.674373],[-90.8974,42.657942],[-91.132908,42.646988],[-91.204109,42.646988],[-91.609402,42.641511],[-91.603925,43.079667],[-91.565587,43.079667]]]}},
+{"type":"Feature","id":"19045","properties":{"name":"Clinton"},"geometry":{"type":"Polygon","coordinates":[[[-90.366137,42.033571],[-90.152536,42.033571],[-90.152536,41.929509],[-90.240167,41.781632],[-90.316844,41.726862],[-90.798815,41.770678],[-90.8974,41.770678],[-90.8974,41.94594],[-90.8974,42.033571],[-90.366137,42.033571]]]}},
+{"type":"Feature","id":"19047","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-95.64043,42.208833],[-95.322768,42.208833],[-95.092736,42.208833],[-95.092736,41.863786],[-95.322768,41.863786],[-95.558276,41.863786],[-95.673292,41.863786],[-95.673292,42.208833],[-95.64043,42.208833]]]}},
+{"type":"Feature","id":"19049","properties":{"name":"Dallas"},"geometry":{"type":"Polygon","coordinates":[[[-93.816609,41.863786],[-93.789224,41.513262],[-93.822086,41.507785],[-94.24381,41.502308],[-94.282149,41.863786],[-94.161656,41.863786],[-93.816609,41.863786]]]}},
+{"type":"Feature","id":"19051","properties":{"name":"Davis"},"geometry":{"type":"Polygon","coordinates":[[[-92.179004,40.899844],[-92.179004,40.598613],[-92.348789,40.598613],[-92.452851,40.593136],[-92.639067,40.593136],[-92.639067,40.899844],[-92.179004,40.899844]]]}},
+{"type":"Feature","id":"19053","properties":{"name":"Decatur"},"geometry":{"type":"Polygon","coordinates":[[[-93.663255,40.899844],[-93.559193,40.899844],[-93.559193,40.582182],[-93.772794,40.576705],[-94.013779,40.571228],[-94.013779,40.894367],[-93.663255,40.899844]]]}},
+{"type":"Feature","id":"19055","properties":{"name":"Delaware"},"geometry":{"type":"Polygon","coordinates":[[[-91.204109,42.646988],[-91.132908,42.646988],[-91.127431,42.296464],[-91.36294,42.296464],[-91.598448,42.296464],[-91.609402,42.641511],[-91.204109,42.646988]]]}},
+{"type":"Feature","id":"19057","properties":{"name":"Des Moines"},"geometry":{"type":"Polygon","coordinates":[[[-91.324601,41.075106],[-90.946692,41.075106],[-90.946692,41.069629],[-91.111001,40.697198],[-91.406755,40.812213],[-91.368417,41.075106],[-91.324601,41.075106]]]}},
+{"type":"Feature","id":"19059","properties":{"name":"Dickinson"},"geometry":{"type":"Polygon","coordinates":[[[-95.092736,43.501391],[-94.917474,43.501391],[-94.911997,43.254929],[-95.169413,43.254929],[-95.388491,43.254929],[-95.388491,43.501391],[-95.092736,43.501391]]]}},
+{"type":"Feature","id":"19061","properties":{"name":"Dubuque"},"geometry":{"type":"Polygon","coordinates":[[[-90.8974,42.657942],[-90.8974,42.674373],[-90.639984,42.510065],[-90.475675,42.384095],[-90.8974,42.296464],[-91.127431,42.296464],[-91.132908,42.646988],[-90.8974,42.657942]]]}},
+{"type":"Feature","id":"19063","properties":{"name":"Emmet"},"geometry":{"type":"Polygon","coordinates":[[[-94.676489,43.501391],[-94.44098,43.501391],[-94.44098,43.254929],[-94.588858,43.254929],[-94.911997,43.254929],[-94.917474,43.501391],[-94.851751,43.501391],[-94.676489,43.501391]]]}},
+{"type":"Feature","id":"19065","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-92.080419,43.085144],[-91.603925,43.079667],[-91.609402,42.641511],[-91.905157,42.641511],[-92.080419,42.641511],[-92.080419,42.904404],[-92.080419,43.085144]]]}},
+{"type":"Feature","id":"19067","properties":{"name":"Floyd"},"geometry":{"type":"Polygon","coordinates":[[[-92.797898,43.211113],[-92.556913,43.211113],[-92.556913,42.904404],[-93.022453,42.909881],[-93.022453,43.211113],[-92.797898,43.211113]]]}},
+{"type":"Feature","id":"19069","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-93.487993,42.909881],[-93.022453,42.909881],[-93.02793,42.55388],[-93.263438,42.559357],[-93.498947,42.559357],[-93.498947,42.909881],[-93.487993,42.909881]]]}},
+{"type":"Feature","id":"19071","properties":{"name":"Fremont"},"geometry":{"type":"Polygon","coordinates":[[[-95.519938,40.899844],[-95.383014,40.899844],[-95.37206,40.582182],[-95.7664,40.587659],[-95.832123,40.784829],[-95.815692,40.899844],[-95.519938,40.899844]]]}},
+{"type":"Feature","id":"19073","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-94.167133,42.208833],[-94.161656,41.863786],[-94.282149,41.863786],[-94.484796,41.863786],[-94.627196,41.863786],[-94.627196,42.208833],[-94.397165,42.208833],[-94.167133,42.208833]]]}},
+{"type":"Feature","id":"19075","properties":{"name":"Grundy"},"geometry":{"type":"Polygon","coordinates":[[[-92.907437,42.55388],[-92.551436,42.55388],[-92.535005,42.296464],[-92.765037,42.208833],[-92.77599,42.208833],[-93.000545,42.208833],[-93.02793,42.55388],[-92.907437,42.55388]]]}},
+{"type":"Feature","id":"19077","properties":{"name":"Guthrie"},"geometry":{"type":"Polygon","coordinates":[[[-94.484796,41.863786],[-94.282149,41.863786],[-94.24381,41.502308],[-94.660058,41.502308],[-94.698396,41.502308],[-94.742212,41.863786],[-94.627196,41.863786],[-94.484796,41.863786]]]}},
+{"type":"Feature","id":"19079","properties":{"name":"Hamilton"},"geometry":{"type":"Polygon","coordinates":[[[-93.893286,42.559357],[-93.498947,42.559357],[-93.460608,42.208833],[-93.696116,42.208833],[-93.931625,42.208833],[-93.969963,42.559357],[-93.893286,42.559357]]]}},
+{"type":"Feature","id":"19081","properties":{"name":"Hancock"},"geometry":{"type":"Polygon","coordinates":[[[-93.570147,43.254929],[-93.498947,43.254929],[-93.498947,42.909881],[-93.526331,42.909881],[-93.969963,42.909881],[-93.969963,43.254929],[-93.570147,43.254929]]]}},
+{"type":"Feature","id":"19083","properties":{"name":"Hardin"},"geometry":{"type":"Polygon","coordinates":[[[-93.263438,42.559357],[-93.02793,42.55388],[-93.000545,42.208833],[-93.230576,42.208833],[-93.362023,42.208833],[-93.460608,42.208833],[-93.498947,42.559357],[-93.263438,42.559357]]]}},
+{"type":"Feature","id":"19085","properties":{"name":"Harrison"},"geometry":{"type":"Polygon","coordinates":[[[-96.122401,41.863786],[-95.673292,41.863786],[-95.558276,41.863786],[-95.49803,41.507785],[-95.848554,41.507785],[-95.996431,41.507785],[-96.122401,41.683047],[-96.138832,41.863786],[-96.122401,41.863786]]]}},
+{"type":"Feature","id":"19087","properties":{"name":"Henry"},"geometry":{"type":"Polygon","coordinates":[[[-91.598448,41.162737],[-91.483432,41.162737],[-91.368417,41.075106],[-91.406755,40.812213],[-91.603925,40.812213],[-91.718941,40.812213],[-91.718941,40.899844],[-91.713464,41.162737],[-91.598448,41.162737]]]}},
+{"type":"Feature","id":"19089","properties":{"name":"Howard"},"geometry":{"type":"Polygon","coordinates":[[[-92.080419,43.501391],[-92.080419,43.211113],[-92.255681,43.211113],[-92.556913,43.211113],[-92.551436,43.501391],[-92.447374,43.501391],[-92.080419,43.501391]]]}},
+{"type":"Feature","id":"19091","properties":{"name":"Humboldt"},"geometry":{"type":"Polygon","coordinates":[[[-94.090456,42.909881],[-93.969963,42.909881],[-93.969963,42.646988],[-94.44098,42.646988],[-94.44098,42.909881],[-94.090456,42.909881]]]}},
+{"type":"Feature","id":"19093","properties":{"name":"Ida"},"geometry":{"type":"Polygon","coordinates":[[[-95.465168,42.559357],[-95.388491,42.559357],[-95.322768,42.208833],[-95.64043,42.208833],[-95.673292,42.208833],[-95.739015,42.559357],[-95.465168,42.559357]]]}},
+{"type":"Feature","id":"19095","properties":{"name":"Iowa"},"geometry":{"type":"Polygon","coordinates":[[[-92.063988,41.863786],[-91.833957,41.863786],[-91.82848,41.513262],[-91.943495,41.513262],[-92.299497,41.507785],[-92.299497,41.863786],[-92.063988,41.863786]]]}},
+{"type":"Feature","id":"19097","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-90.475675,42.384095],[-90.316844,42.192402],[-90.152536,42.033571],[-90.366137,42.033571],[-90.8974,42.033571],[-90.8974,42.296464],[-90.475675,42.384095]]]}},
+{"type":"Feature","id":"19099","properties":{"name":"Jasper"},"geometry":{"type":"Polygon","coordinates":[[[-93.268915,41.863786],[-93.230576,41.863786],[-92.765037,41.863786],[-92.754083,41.507785],[-92.869098,41.507785],[-93.329161,41.507785],[-93.345592,41.863786],[-93.268915,41.863786]]]}},
+{"type":"Feature","id":"19101","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-91.943495,41.162737],[-91.713464,41.162737],[-91.718941,40.899844],[-92.118758,40.899844],[-92.179004,40.899844],[-92.179004,41.162737],[-91.943495,41.162737]]]}},
+{"type":"Feature","id":"19103","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-91.664172,41.863786],[-91.368417,41.858309],[-91.368417,41.600893],[-91.368417,41.425631],[-91.483432,41.425631],[-91.790141,41.513262],[-91.82848,41.513262],[-91.833957,41.863786],[-91.664172,41.863786]]]}},
+{"type":"Feature","id":"19105","properties":{"name":"Jones"},"geometry":{"type":"Polygon","coordinates":[[[-91.36294,42.296464],[-91.127431,42.296464],[-90.8974,42.296464],[-90.8974,42.033571],[-90.8974,41.94594],[-91.012416,41.94594],[-91.368417,41.94594],[-91.36294,42.296464]]]}},
+{"type":"Feature","id":"19107","properties":{"name":"Keokuk"},"geometry":{"type":"Polygon","coordinates":[[[-91.943495,41.513262],[-91.943495,41.162737],[-92.179004,41.162737],[-92.261158,41.162737],[-92.409035,41.162737],[-92.414512,41.507785],[-92.299497,41.507785],[-91.943495,41.513262]]]}},
+{"type":"Feature","id":"19109","properties":{"name":"Kossuth"},"geometry":{"type":"Polygon","coordinates":[[[-94.249287,43.501391],[-93.969963,43.501391],[-93.969963,43.254929],[-93.969963,42.909881],[-94.090456,42.909881],[-94.44098,42.909881],[-94.44098,43.254929],[-94.44098,43.501391],[-94.249287,43.501391]]]}},
+{"type":"Feature","id":"19111","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-91.603925,40.812213],[-91.406755,40.812213],[-91.111001,40.697198],[-91.187678,40.636951],[-91.417709,40.379535],[-91.718941,40.598613],[-91.718941,40.812213],[-91.603925,40.812213]]]}},
+{"type":"Feature","id":"19113","properties":{"name":"Linn"},"geometry":{"type":"Polygon","coordinates":[[[-91.713464,42.296464],[-91.598448,42.296464],[-91.36294,42.296464],[-91.368417,41.94594],[-91.368417,41.858309],[-91.664172,41.863786],[-91.833957,41.863786],[-91.82848,42.296464],[-91.713464,42.296464]]]}},
+{"type":"Feature","id":"19115","properties":{"name":"Louisa"},"geometry":{"type":"Polygon","coordinates":[[[-91.483432,41.425631],[-91.368417,41.425631],[-91.072662,41.332523],[-91.072662,41.332523],[-90.946692,41.075106],[-91.324601,41.075106],[-91.368417,41.075106],[-91.483432,41.162737],[-91.483432,41.425631]]]}},
+{"type":"Feature","id":"19117","properties":{"name":"Lucas"},"geometry":{"type":"Polygon","coordinates":[[[-93.09913,41.162737],[-93.09913,40.899844],[-93.559193,40.899844],[-93.559193,41.162737],[-93.329161,41.162737],[-93.09913,41.162737]]]}},
+{"type":"Feature","id":"19119","properties":{"name":"Lyon"},"geometry":{"type":"Polygon","coordinates":[[[-96.451017,43.501391],[-96.051201,43.501391],[-95.859508,43.501391],[-95.859508,43.254929],[-96.555079,43.260406],[-96.598895,43.501391],[-96.451017,43.501391]]]}},
+{"type":"Feature","id":"19121","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-93.822086,41.507785],[-93.789224,41.513262],[-93.789224,41.162737],[-94.013779,41.157261],[-94.24381,41.157261],[-94.24381,41.502308],[-93.822086,41.507785]]]}},
+{"type":"Feature","id":"19123","properties":{"name":"Mahaska"},"geometry":{"type":"Polygon","coordinates":[[[-92.458328,41.507785],[-92.414512,41.507785],[-92.409035,41.162737],[-92.639067,41.162737],[-92.655498,41.162737],[-92.869098,41.162737],[-92.869098,41.507785],[-92.754083,41.507785],[-92.458328,41.507785]]]}},
+{"type":"Feature","id":"19125","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-92.869098,41.507785],[-92.869098,41.162737],[-93.09913,41.162737],[-93.329161,41.162737],[-93.329161,41.491354],[-93.329161,41.507785],[-92.869098,41.507785]]]}},
+{"type":"Feature","id":"19127","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-92.77599,42.208833],[-92.765037,42.208833],[-92.765037,41.863786],[-93.230576,41.863786],[-93.230576,42.208833],[-93.000545,42.208833],[-92.77599,42.208833]]]}},
+{"type":"Feature","id":"19129","properties":{"name":"Mills"},"geometry":{"type":"Polygon","coordinates":[[[-95.673292,41.157261],[-95.383014,41.157261],[-95.383014,40.899844],[-95.519938,40.899844],[-95.815692,40.899844],[-95.881416,41.053199],[-95.881416,41.157261],[-95.673292,41.157261]]]}},
+{"type":"Feature","id":"19131","properties":{"name":"Mitchell"},"geometry":{"type":"Polygon","coordinates":[[[-92.551436,43.501391],[-92.556913,43.211113],[-92.797898,43.211113],[-93.022453,43.211113],[-93.022453,43.254929],[-93.022453,43.501391],[-92.551436,43.501391]]]}},
+{"type":"Feature","id":"19133","properties":{"name":"Monona"},"geometry":{"type":"Polygon","coordinates":[[[-96.133355,42.21431],[-95.673292,42.208833],[-95.673292,41.863786],[-96.122401,41.863786],[-96.138832,41.863786],[-96.270278,42.044525],[-96.357909,42.21431],[-96.133355,42.21431]]]}},
+{"type":"Feature","id":"19135","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-92.655498,41.162737],[-92.639067,41.162737],[-92.639067,40.899844],[-93.09913,40.899844],[-93.09913,41.162737],[-92.869098,41.162737],[-92.655498,41.162737]]]}},
+{"type":"Feature","id":"19137","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-95.267998,41.157261],[-95.158459,41.157261],[-94.928428,41.157261],[-94.928428,40.899844],[-95.289906,40.899844],[-95.383014,40.899844],[-95.383014,41.157261],[-95.267998,41.157261]]]}},
+{"type":"Feature","id":"19139","properties":{"name":"Muscatine"},"geometry":{"type":"Polygon","coordinates":[[[-91.30817,41.595416],[-90.8974,41.595416],[-90.787861,41.453015],[-91.072662,41.332523],[-91.368417,41.425631],[-91.368417,41.600893],[-91.30817,41.595416]]]}},
+{"type":"Feature","id":"19141","properties":{"name":"O'Brien"},"geometry":{"type":"Polygon","coordinates":[[[-95.574707,43.254929],[-95.388491,43.254929],[-95.388491,42.909881],[-95.415876,42.909881],[-95.859508,42.909881],[-95.859508,43.254929],[-95.574707,43.254929]]]}},
+{"type":"Feature","id":"19143","properties":{"name":"Osceola"},"geometry":{"type":"Polygon","coordinates":[[[-95.454214,43.501391],[-95.388491,43.501391],[-95.388491,43.254929],[-95.574707,43.254929],[-95.859508,43.254929],[-95.859508,43.501391],[-95.454214,43.501391]]]}},
+{"type":"Feature","id":"19145","properties":{"name":"Page"},"geometry":{"type":"Polygon","coordinates":[[[-95.289906,40.899844],[-94.928428,40.899844],[-94.917474,40.576705],[-95.163936,40.576705],[-95.202275,40.576705],[-95.37206,40.582182],[-95.383014,40.899844],[-95.289906,40.899844]]]}},
+{"type":"Feature","id":"19147","properties":{"name":"Palo Alto"},"geometry":{"type":"Polygon","coordinates":[[[-94.588858,43.254929],[-94.44098,43.254929],[-94.44098,42.909881],[-94.911997,42.909881],[-94.911997,43.254929],[-94.588858,43.254929]]]}},
+{"type":"Feature","id":"19149","properties":{"name":"Plymouth"},"geometry":{"type":"Polygon","coordinates":[[[-96.17717,42.909881],[-95.859508,42.909881],[-95.859508,42.559357],[-96.50031,42.559357],[-96.538648,42.909881],[-96.17717,42.909881]]]}},
+{"type":"Feature","id":"19151","properties":{"name":"Pocahontas"},"geometry":{"type":"Polygon","coordinates":[[[-94.44098,42.909881],[-94.44098,42.646988],[-94.44098,42.559357],[-94.616242,42.559357],[-94.911997,42.559357],[-94.911997,42.909881],[-94.44098,42.909881]]]}},
+{"type":"Feature","id":"19153","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-93.772794,41.863786],[-93.696116,41.863786],[-93.345592,41.863786],[-93.329161,41.507785],[-93.329161,41.491354],[-93.70707,41.513262],[-93.789224,41.513262],[-93.816609,41.863786],[-93.772794,41.863786]]]}},
+{"type":"Feature","id":"19155","properties":{"name":"Pottawattamie"},"geometry":{"type":"Polygon","coordinates":[[[-95.848554,41.507785],[-95.49803,41.507785],[-95.152983,41.507785],[-95.158459,41.157261],[-95.267998,41.157261],[-95.383014,41.157261],[-95.673292,41.157261],[-95.881416,41.157261],[-95.925231,41.190122],[-95.936185,41.392769],[-95.996431,41.507785],[-95.848554,41.507785]]]}},
+{"type":"Feature","id":"19157","properties":{"name":"Poweshiek"},"geometry":{"type":"Polygon","coordinates":[[[-92.299497,41.863786],[-92.299497,41.507785],[-92.414512,41.507785],[-92.458328,41.507785],[-92.754083,41.507785],[-92.765037,41.863786],[-92.299497,41.863786]]]}},
+{"type":"Feature","id":"19159","properties":{"name":"Ringgold"},"geometry":{"type":"Polygon","coordinates":[[[-94.358826,40.899844],[-94.013779,40.894367],[-94.013779,40.571228],[-94.232857,40.571228],[-94.287626,40.571228],[-94.473842,40.571228],[-94.468365,40.899844],[-94.358826,40.899844]]]}},
+{"type":"Feature","id":"19161","properties":{"name":"Sac"},"geometry":{"type":"Polygon","coordinates":[[[-95.388491,42.559357],[-94.911997,42.559357],[-94.857228,42.208833],[-95.092736,42.208833],[-95.322768,42.208833],[-95.388491,42.559357]]]}},
+{"type":"Feature","id":"19163","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-90.798815,41.770678],[-90.316844,41.726862],[-90.787861,41.453015],[-90.8974,41.595416],[-90.8974,41.770678],[-90.798815,41.770678]]]}},
+{"type":"Feature","id":"19165","properties":{"name":"Shelby"},"geometry":{"type":"Polygon","coordinates":[[[-95.322768,41.863786],[-95.092736,41.863786],[-95.043444,41.502308],[-95.152983,41.507785],[-95.49803,41.507785],[-95.558276,41.863786],[-95.322768,41.863786]]]}},
+{"type":"Feature","id":"19167","properties":{"name":"Sioux"},"geometry":{"type":"Polygon","coordinates":[[[-96.555079,43.260406],[-95.859508,43.254929],[-95.859508,42.909881],[-96.17717,42.909881],[-96.538648,42.909881],[-96.456494,43.085144],[-96.555079,43.260406]]]}},
+{"type":"Feature","id":"19169","properties":{"name":"Story"},"geometry":{"type":"Polygon","coordinates":[[[-93.362023,42.208833],[-93.230576,42.208833],[-93.230576,41.863786],[-93.268915,41.863786],[-93.345592,41.863786],[-93.696116,41.863786],[-93.696116,42.208833],[-93.460608,42.208833],[-93.362023,42.208833]]]}},
+{"type":"Feature","id":"19171","properties":{"name":"Tama"},"geometry":{"type":"Polygon","coordinates":[[[-92.299497,42.296464],[-92.299497,41.863786],[-92.765037,41.863786],[-92.765037,42.208833],[-92.535005,42.296464],[-92.299497,42.296464]]]}},
+{"type":"Feature","id":"19173","properties":{"name":"Taylor"},"geometry":{"type":"Polygon","coordinates":[[[-94.857228,40.899844],[-94.468365,40.899844],[-94.473842,40.571228],[-94.632673,40.571228],[-94.917474,40.576705],[-94.928428,40.899844],[-94.857228,40.899844]]]}},
+{"type":"Feature","id":"19175","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-94.468365,41.157261],[-94.24381,41.157261],[-94.013779,41.157261],[-94.013779,40.894367],[-94.358826,40.899844],[-94.468365,40.899844],[-94.468365,41.157261]]]}},
+{"type":"Feature","id":"19177","properties":{"name":"Van Buren"},"geometry":{"type":"Polygon","coordinates":[[[-92.118758,40.899844],[-91.718941,40.899844],[-91.718941,40.812213],[-91.718941,40.598613],[-91.833957,40.609566],[-91.943495,40.60409],[-92.179004,40.598613],[-92.179004,40.899844],[-92.118758,40.899844]]]}},
+{"type":"Feature","id":"19179","properties":{"name":"Wapello"},"geometry":{"type":"Polygon","coordinates":[[[-92.261158,41.162737],[-92.179004,41.162737],[-92.179004,40.899844],[-92.639067,40.899844],[-92.639067,41.162737],[-92.409035,41.162737],[-92.261158,41.162737]]]}},
+{"type":"Feature","id":"19181","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-93.70707,41.513262],[-93.329161,41.491354],[-93.329161,41.162737],[-93.559193,41.162737],[-93.674209,41.162737],[-93.789224,41.162737],[-93.789224,41.513262],[-93.70707,41.513262]]]}},
+{"type":"Feature","id":"19183","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-91.790141,41.513262],[-91.483432,41.425631],[-91.483432,41.162737],[-91.598448,41.162737],[-91.713464,41.162737],[-91.943495,41.162737],[-91.943495,41.513262],[-91.82848,41.513262],[-91.790141,41.513262]]]}},
+{"type":"Feature","id":"19185","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-93.09913,40.899844],[-93.09913,40.582182],[-93.372977,40.582182],[-93.526331,40.582182],[-93.559193,40.582182],[-93.559193,40.899844],[-93.09913,40.899844]]]}},
+{"type":"Feature","id":"19187","properties":{"name":"Webster"},"geometry":{"type":"Polygon","coordinates":[[[-94.44098,42.646988],[-93.969963,42.646988],[-93.969963,42.559357],[-93.931625,42.208833],[-94.167133,42.208833],[-94.397165,42.208833],[-94.44098,42.559357],[-94.44098,42.646988]]]}},
+{"type":"Feature","id":"19189","properties":{"name":"Winnebago"},"geometry":{"type":"Polygon","coordinates":[[[-93.646824,43.501391],[-93.498947,43.501391],[-93.498947,43.254929],[-93.570147,43.254929],[-93.969963,43.254929],[-93.969963,43.501391],[-93.646824,43.501391]]]}},
+{"type":"Feature","id":"19191","properties":{"name":"Winneshiek"},"geometry":{"type":"Polygon","coordinates":[[[-91.850387,43.501391],[-91.729895,43.501391],[-91.609402,43.501391],[-91.603925,43.079667],[-92.080419,43.085144],[-92.080419,43.211113],[-92.080419,43.501391],[-91.850387,43.501391]]]}},
+{"type":"Feature","id":"19193","properties":{"name":"Woodbury"},"geometry":{"type":"Polygon","coordinates":[[[-96.50031,42.559357],[-95.859508,42.559357],[-95.739015,42.559357],[-95.673292,42.208833],[-96.133355,42.21431],[-96.357909,42.21431],[-96.357909,42.274556],[-96.44554,42.488157],[-96.50031,42.559357]]]}},
+{"type":"Feature","id":"19195","properties":{"name":"Worth"},"geometry":{"type":"Polygon","coordinates":[[[-93.022453,43.501391],[-93.022453,43.254929],[-93.055314,43.254929],[-93.498947,43.254929],[-93.498947,43.501391],[-93.049837,43.501391],[-93.022453,43.501391]]]}},
+{"type":"Feature","id":"19197","properties":{"name":"Wright"},"geometry":{"type":"Polygon","coordinates":[[[-93.526331,42.909881],[-93.498947,42.909881],[-93.498947,42.559357],[-93.893286,42.559357],[-93.969963,42.559357],[-93.969963,42.646988],[-93.969963,42.909881],[-93.526331,42.909881]]]}},
+{"type":"Feature","id":"20001","properties":{"name":"Allen"},"geometry":{"type":"Polygon","coordinates":[[[-95.465168,38.040881],[-95.076305,38.035405],[-95.087259,37.734173],[-95.399445,37.734173],[-95.525414,37.734173],[-95.519938,38.040881],[-95.465168,38.040881]]]}},
+{"type":"Feature","id":"20003","properties":{"name":"Anderson"},"geometry":{"type":"Polygon","coordinates":[[[-95.235137,38.391406],[-95.065351,38.391406],[-95.076305,38.035405],[-95.465168,38.040881],[-95.519938,38.040881],[-95.508984,38.391406],[-95.235137,38.391406]]]}},
+{"type":"Feature","id":"20005","properties":{"name":"Atchison"},"geometry":{"type":"Polygon","coordinates":[[[-95.393968,39.651102],[-95.339199,39.651102],[-95.054398,39.623717],[-95.10369,39.530609],[-94.966767,39.42107],[-95.065351,39.42107],[-95.180367,39.42107],[-95.465168,39.42107],[-95.56923,39.42107],[-95.563753,39.651102],[-95.393968,39.651102]]]}},
+{"type":"Feature","id":"20007","properties":{"name":"Barber"},"geometry":{"type":"Polygon","coordinates":[[[-98.482962,37.47128],[-98.466531,37.47128],[-98.351516,37.383649],[-98.346039,37.000263],[-98.543209,37.000263],[-99.003272,37.000263],[-99.014225,37.383649],[-99.014225,37.47128],[-98.482962,37.47128]]]}},
+{"type":"Feature","id":"20009","properties":{"name":"Barton"},"geometry":{"type":"Polygon","coordinates":[[[-98.811579,38.698114],[-98.488439,38.698114],[-98.482962,38.522852],[-98.477485,38.259959],[-98.800625,38.259959],[-98.910164,38.259959],[-99.030656,38.34759],[-99.030656,38.698114],[-98.811579,38.698114]]]}},
+{"type":"Feature","id":"20011","properties":{"name":"Bourbon"},"geometry":{"type":"Polygon","coordinates":[[[-94.933905,38.035405],[-94.616242,38.035405],[-94.616242,37.673926],[-94.884612,37.673926],[-95.087259,37.673926],[-95.087259,37.734173],[-95.076305,38.035405],[-94.933905,38.035405]]]}},
+{"type":"Feature","id":"20013","properties":{"name":"Brown"},"geometry":{"type":"Polygon","coordinates":[[[-95.788308,40.001626],[-95.339199,40.001626],[-95.339199,39.651102],[-95.393968,39.651102],[-95.563753,39.651102],[-95.728061,39.651102],[-95.788308,39.651102],[-95.788308,40.001626]]]}},
+{"type":"Feature","id":"20015","properties":{"name":"Butler"},"geometry":{"type":"Polygon","coordinates":[[[-97.113727,38.084697],[-96.83988,38.084697],[-96.522218,38.084697],[-96.527695,37.608203],[-96.527695,37.476757],[-97.080866,37.476757],[-97.152066,37.476757],[-97.152066,37.914912],[-97.152066,38.090174],[-97.113727,38.084697]]]}},
+{"type":"Feature","id":"20017","properties":{"name":"Chase"},"geometry":{"type":"Polygon","coordinates":[[[-96.817972,38.522852],[-96.352432,38.522852],[-96.357909,38.172328],[-96.522218,38.084697],[-96.83988,38.084697],[-96.817972,38.522852]]]}},
+{"type":"Feature","id":"20019","properties":{"name":"Chautauqua"},"geometry":{"type":"Polygon","coordinates":[[[-96.522218,37.301494],[-95.96357,37.301494],[-95.96357,37.000263],[-96.001908,37.000263],[-96.527695,37.000263],[-96.522218,37.301494]]]}},
+{"type":"Feature","id":"20021","properties":{"name":"Cherokee"},"geometry":{"type":"Polygon","coordinates":[[[-94.829843,37.339833],[-94.616242,37.339833],[-94.616242,37.055032],[-94.616242,37.055032],[-94.616242,37.000263],[-94.994151,37.000263],[-95.005105,37.000263],[-95.070828,37.000263],[-95.076305,37.339833],[-94.829843,37.339833]]]}},
+{"type":"Feature","id":"20023","properties":{"name":"Cheyenne"},"geometry":{"type":"Polygon","coordinates":[[[-101.90605,40.001626],[-101.413125,40.001626],[-101.413125,39.568948],[-102.004635,39.568948],[-102.04845,39.568948],[-102.04845,39.574425],[-102.053927,40.001626],[-101.90605,40.001626]]]}},
+{"type":"Feature","id":"20025","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-100.054844,37.47128],[-99.556443,37.465803],[-99.545489,37.383649],[-99.540012,37.000263],[-100.000075,37.000263],[-100.087706,37.000263],[-100.109614,37.476757],[-100.054844,37.47128]]]}},
+{"type":"Feature","id":"20027","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-97.299943,39.568948],[-96.960373,39.568948],[-96.960373,39.218424],[-96.96585,39.130793],[-97.261605,39.130793],[-97.371143,39.130793],[-97.371143,39.306055],[-97.371143,39.568948],[-97.299943,39.568948]]]}},
+{"type":"Feature","id":"20029","properties":{"name":"Cloud"},"geometry":{"type":"Polygon","coordinates":[[[-97.69976,39.656579],[-97.371143,39.656579],[-97.371143,39.568948],[-97.371143,39.306055],[-97.590221,39.306055],[-97.929791,39.306055],[-97.929791,39.568948],[-97.929791,39.656579],[-97.69976,39.656579]]]}},
+{"type":"Feature","id":"20031","properties":{"name":"Coffey"},"geometry":{"type":"Polygon","coordinates":[[[-95.656861,38.435221],[-95.508984,38.435221],[-95.508984,38.391406],[-95.519938,38.040881],[-95.810215,38.040881],[-95.958093,38.040881],[-95.958093,38.172328],[-95.952616,38.435221],[-95.656861,38.435221]]]}},
+{"type":"Feature","id":"20033","properties":{"name":"Comanche"},"geometry":{"type":"Polygon","coordinates":[[[-99.014225,37.383649],[-99.003272,37.000263],[-99.457858,37.000263],[-99.540012,37.000263],[-99.545489,37.383649],[-99.014225,37.383649]]]}},
+{"type":"Feature","id":"20035","properties":{"name":"Cowley"},"geometry":{"type":"Polygon","coordinates":[[[-97.080866,37.476757],[-96.527695,37.476757],[-96.522218,37.301494],[-96.527695,37.000263],[-96.730341,37.000263],[-96.752249,37.000263],[-96.867265,37.000263],[-97.146589,37.000263],[-97.152066,37.476757],[-97.080866,37.476757]]]}},
+{"type":"Feature","id":"20037","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-94.884612,37.673926],[-94.616242,37.673926],[-94.616242,37.652019],[-94.616242,37.361741],[-94.616242,37.339833],[-94.829843,37.339833],[-95.076305,37.339833],[-95.087259,37.383649],[-95.087259,37.673926],[-94.884612,37.673926]]]}},
+{"type":"Feature","id":"20039","properties":{"name":"Decatur"},"geometry":{"type":"Polygon","coordinates":[[[-100.739462,40.001626],[-100.191768,40.001626],[-100.175337,40.001626],[-100.180814,39.568948],[-100.668261,39.568948],[-100.717554,39.568948],[-100.739462,39.568948],[-100.739462,40.001626]]]}},
+{"type":"Feature","id":"20041","properties":{"name":"Dickinson"},"geometry":{"type":"Polygon","coordinates":[[[-97.261605,39.130793],[-96.96585,39.130793],[-96.889173,38.867899],[-96.932988,38.610483],[-97.261605,38.610483],[-97.371143,38.610483],[-97.371143,38.95553],[-97.371143,39.130793],[-97.261605,39.130793]]]}},
+{"type":"Feature","id":"20043","properties":{"name":"Doniphan"},"geometry":{"type":"Polygon","coordinates":[[[-95.339199,40.001626],[-95.306337,40.001626],[-94.994151,39.897564],[-94.879136,39.820887],[-95.054398,39.623717],[-95.339199,39.651102],[-95.339199,40.001626]]]}},
+{"type":"Feature","id":"20045","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-95.49803,39.054115],[-95.185844,39.043162],[-95.054398,38.982915],[-95.054398,38.736453],[-95.49803,38.736453],[-95.503507,38.736453],[-95.49803,38.867899],[-95.49803,39.054115]]]}},
+{"type":"Feature","id":"20047","properties":{"name":"Edwards"},"geometry":{"type":"Polygon","coordinates":[[[-99.348319,38.002543],[-99.019702,38.002543],[-99.014225,37.827281],[-99.014225,37.734173],[-99.56192,37.734173],[-99.567396,37.914912],[-99.567396,38.084697],[-99.348319,38.002543]]]}},
+{"type":"Feature","id":"20049","properties":{"name":"Elk"},"geometry":{"type":"Polygon","coordinates":[[[-96.308617,37.608203],[-95.96357,37.602726],[-95.96357,37.389126],[-95.96357,37.301494],[-96.522218,37.301494],[-96.527695,37.476757],[-96.527695,37.608203],[-96.308617,37.608203]]]}},
+{"type":"Feature","id":"20051","properties":{"name":"Ellis"},"geometry":{"type":"Polygon","coordinates":[[[-99.408565,39.130793],[-99.047087,39.130793],[-99.036133,39.130793],[-99.04161,38.698114],[-99.583827,38.698114],[-99.600258,38.698114],[-99.589304,39.130793],[-99.408565,39.130793]]]}},
+{"type":"Feature","id":"20053","properties":{"name":"Ellsworth"},"geometry":{"type":"Polygon","coordinates":[[[-97.929791,38.873376],[-97.924314,38.610483],[-97.924314,38.522852],[-98.017422,38.522852],[-98.482962,38.522852],[-98.488439,38.698114],[-98.482962,38.873376],[-97.929791,38.873376]]]}},
+{"type":"Feature","id":"20055","properties":{"name":"Finney"},"geometry":{"type":"Polygon","coordinates":[[[-100.881862,38.265436],[-100.684692,38.265436],[-100.246537,38.259959],[-100.224629,38.259959],[-100.224629,38.002543],[-100.651831,37.734173],[-101.089986,37.734173],[-101.10094,38.265436],[-100.881862,38.265436]]]}},
+{"type":"Feature","id":"20057","properties":{"name":"Ford"},"geometry":{"type":"Polygon","coordinates":[[[-99.874105,37.914912],[-99.567396,37.914912],[-99.56192,37.734173],[-99.556443,37.465803],[-100.054844,37.47128],[-100.109614,37.476757],[-100.213675,37.476757],[-100.224629,37.914912],[-99.874105,37.914912]]]}},
+{"type":"Feature","id":"20059","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-95.49803,38.736453],[-95.054398,38.736453],[-95.065351,38.391406],[-95.235137,38.391406],[-95.508984,38.391406],[-95.508984,38.435221],[-95.503507,38.736453],[-95.49803,38.736453]]]}},
+{"type":"Feature","id":"20061","properties":{"name":"Geary"},"geometry":{"type":"Polygon","coordinates":[[[-96.943942,39.218424],[-96.50031,39.043162],[-96.50031,38.867899],[-96.686526,38.867899],[-96.889173,38.867899],[-96.96585,39.130793],[-96.960373,39.218424],[-96.943942,39.218424]]]}},
+{"type":"Feature","id":"20063","properties":{"name":"Gove"},"geometry":{"type":"Polygon","coordinates":[[[-100.739462,39.130793],[-100.723031,39.130793],[-100.164383,39.130793],[-100.147952,39.130793],[-100.153429,38.698114],[-100.246537,38.698114],[-100.58063,38.698114],[-100.690169,38.698114],[-100.816139,38.698114],[-100.810662,39.130793],[-100.739462,39.130793]]]}},
+{"type":"Feature","id":"20065","properties":{"name":"Graham"},"geometry":{"type":"Polygon","coordinates":[[[-99.600258,39.568948],[-99.605735,39.130793],[-100.147952,39.130793],[-100.164383,39.130793],[-100.164383,39.568948],[-99.627643,39.568948],[-99.600258,39.568948]]]}},
+{"type":"Feature","id":"20067","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-101.17214,37.734173],[-101.089986,37.734173],[-101.089986,37.389126],[-101.528141,37.389126],[-101.528141,37.734173],[-101.17214,37.734173]]]}},
+{"type":"Feature","id":"20069","properties":{"name":"Gray"},"geometry":{"type":"Polygon","coordinates":[[[-100.224629,38.002543],[-100.224629,37.914912],[-100.213675,37.476757],[-100.651831,37.476757],[-100.651831,37.734173],[-100.224629,38.002543]]]}},
+{"type":"Feature","id":"20071","properties":{"name":"Greeley"},"geometry":{"type":"Polygon","coordinates":[[[-101.56648,38.698114],[-101.56648,38.265436],[-102.042974,38.259959],[-102.042974,38.270913],[-102.042974,38.61596],[-102.042974,38.698114],[-101.56648,38.698114]]]}},
+{"type":"Feature","id":"20073","properties":{"name":"Greenwood"},"geometry":{"type":"Polygon","coordinates":[[[-96.281232,38.172328],[-95.958093,38.172328],[-95.958093,38.040881],[-95.96357,37.734173],[-95.96357,37.602726],[-96.308617,37.608203],[-96.527695,37.608203],[-96.522218,38.084697],[-96.357909,38.172328],[-96.281232,38.172328]]]}},
+{"type":"Feature","id":"20075","properties":{"name":"Hamilton"},"geometry":{"type":"Polygon","coordinates":[[[-101.56648,38.265436],[-101.544572,38.265436],[-101.528141,37.734173],[-102.042974,37.73965],[-102.042974,38.259959],[-101.56648,38.265436]]]}},
+{"type":"Feature","id":"20077","properties":{"name":"Harper"},"geometry":{"type":"Polygon","coordinates":[[[-97.803822,37.389126],[-97.803822,37.000263],[-98.11053,37.000263],[-98.346039,37.000263],[-98.351516,37.383649],[-97.809299,37.383649],[-97.803822,37.389126]]]}},
+{"type":"Feature","id":"20079","properties":{"name":"Harvey"},"geometry":{"type":"Polygon","coordinates":[[[-97.152066,38.172328],[-97.152066,38.090174],[-97.152066,37.914912],[-97.157543,37.914912],[-97.69976,37.914912],[-97.69976,38.172328],[-97.371143,38.172328],[-97.152066,38.172328]]]}},
+{"type":"Feature","id":"20081","properties":{"name":"Haskell"},"geometry":{"type":"Polygon","coordinates":[[[-100.651831,37.734173],[-100.651831,37.476757],[-100.651831,37.389126],[-100.750416,37.389126],[-101.068078,37.389126],[-101.089986,37.389126],[-101.089986,37.734173],[-100.651831,37.734173]]]}},
+{"type":"Feature","id":"20083","properties":{"name":"Hodgeman"},"geometry":{"type":"Polygon","coordinates":[[[-99.57835,38.259959],[-99.567396,38.084697],[-99.567396,37.914912],[-99.874105,37.914912],[-100.224629,37.914912],[-100.224629,38.002543],[-100.224629,38.259959],[-99.583827,38.259959],[-99.57835,38.259959]]]}},
+{"type":"Feature","id":"20085","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-95.728061,39.651102],[-95.563753,39.651102],[-95.56923,39.42107],[-95.591138,39.218424],[-95.886893,39.218424],[-96.03477,39.218424],[-96.03477,39.563471],[-95.788308,39.651102],[-95.728061,39.651102]]]}},
+{"type":"Feature","id":"20087","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-95.465168,39.42107],[-95.180367,39.42107],[-95.185844,39.043162],[-95.49803,39.054115],[-95.591138,39.218424],[-95.56923,39.42107],[-95.465168,39.42107]]]}},
+{"type":"Feature","id":"20089","properties":{"name":"Jewell"},"geometry":{"type":"Polygon","coordinates":[[[-98.269362,40.001626],[-97.929791,40.001626],[-97.929791,39.656579],[-97.929791,39.568948],[-98.488439,39.568948],[-98.50487,39.568948],[-98.50487,40.001626],[-98.274839,40.001626],[-98.269362,40.001626]]]}},
+{"type":"Feature","id":"20091","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-94.90652,38.988392],[-94.605288,39.043162],[-94.610765,38.845992],[-94.610765,38.736453],[-94.966767,38.736453],[-95.054398,38.736453],[-95.054398,38.982915],[-94.90652,38.988392]]]}},
+{"type":"Feature","id":"20093","properties":{"name":"Kearny"},"geometry":{"type":"Polygon","coordinates":[[[-101.122848,38.265436],[-101.10094,38.265436],[-101.089986,37.734173],[-101.17214,37.734173],[-101.528141,37.734173],[-101.544572,38.265436],[-101.122848,38.265436]]]}},
+{"type":"Feature","id":"20095","properties":{"name":"Kingman"},"geometry":{"type":"Polygon","coordinates":[[[-97.918837,37.734173],[-97.809299,37.734173],[-97.809299,37.476757],[-97.809299,37.383649],[-98.351516,37.383649],[-98.466531,37.47128],[-98.466531,37.734173],[-97.918837,37.734173]]]}},
+{"type":"Feature","id":"20097","properties":{"name":"Kiowa"},"geometry":{"type":"Polygon","coordinates":[[[-99.56192,37.734173],[-99.014225,37.734173],[-99.014225,37.47128],[-99.014225,37.383649],[-99.545489,37.383649],[-99.556443,37.465803],[-99.56192,37.734173]]]}},
+{"type":"Feature","id":"20099","properties":{"name":"Labette"},"geometry":{"type":"Polygon","coordinates":[[[-95.125598,37.383649],[-95.087259,37.383649],[-95.076305,37.339833],[-95.070828,37.000263],[-95.152983,37.000263],[-95.410399,37.000263],[-95.519938,37.000263],[-95.519938,37.383649],[-95.125598,37.383649]]]}},
+{"type":"Feature","id":"20101","properties":{"name":"Lane"},"geometry":{"type":"Polygon","coordinates":[[[-100.58063,38.698114],[-100.246537,38.698114],[-100.246537,38.259959],[-100.684692,38.265436],[-100.690169,38.698114],[-100.58063,38.698114]]]}},
+{"type":"Feature","id":"20103","properties":{"name":"Leavenworth"},"geometry":{"type":"Polygon","coordinates":[[[-95.065351,39.42107],[-94.966767,39.42107],[-94.775074,39.201993],[-94.862705,39.201993],[-94.90652,38.988392],[-95.054398,38.982915],[-95.185844,39.043162],[-95.180367,39.42107],[-95.065351,39.42107]]]}},
+{"type":"Feature","id":"20105","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-98.477485,39.218424],[-97.929791,39.218424],[-97.929791,38.95553],[-97.929791,38.873376],[-98.482962,38.873376],[-98.488439,39.130793],[-98.488439,39.218424],[-98.477485,39.218424]]]}},
+{"type":"Feature","id":"20107","properties":{"name":"Linn"},"geometry":{"type":"Polygon","coordinates":[[[-95.010582,38.391406],[-94.610765,38.391406],[-94.616242,38.062789],[-94.616242,38.035405],[-94.933905,38.035405],[-95.076305,38.035405],[-95.065351,38.391406],[-95.010582,38.391406]]]}},
+{"type":"Feature","id":"20109","properties":{"name":"Logan"},"geometry":{"type":"Polygon","coordinates":[[[-101.391218,39.13627],[-100.810662,39.130793],[-100.816139,38.698114],[-101.128324,38.698114],[-101.259771,38.703591],[-101.484326,38.698114],[-101.478849,39.13627],[-101.391218,39.13627]]]}},
+{"type":"Feature","id":"20111","properties":{"name":"Lyon"},"geometry":{"type":"Polygon","coordinates":[[[-96.336002,38.74193],[-95.947139,38.736453],[-95.952616,38.435221],[-95.958093,38.172328],[-96.281232,38.172328],[-96.357909,38.172328],[-96.352432,38.522852],[-96.352432,38.74193],[-96.336002,38.74193]]]}},
+{"type":"Feature","id":"20113","properties":{"name":"McPherson"},"geometry":{"type":"Polygon","coordinates":[[[-97.924314,38.610483],[-97.371143,38.610483],[-97.371143,38.172328],[-97.69976,38.172328],[-97.924314,38.172328],[-97.924314,38.522852],[-97.924314,38.610483]]]}},
+{"type":"Feature","id":"20115","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-97.261605,38.610483],[-96.932988,38.610483],[-96.817972,38.522852],[-96.83988,38.084697],[-97.113727,38.084697],[-97.152066,38.090174],[-97.152066,38.172328],[-97.371143,38.172328],[-97.371143,38.610483],[-97.261605,38.610483]]]}},
+{"type":"Feature","id":"20117","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-96.692003,40.001626],[-96.461971,40.001626],[-96.237417,40.001626],[-96.237417,39.568948],[-96.582464,39.568948],[-96.582464,39.568948],[-96.692003,39.568948],[-96.807019,39.568948],[-96.807019,40.001626],[-96.692003,40.001626]]]}},
+{"type":"Feature","id":"20119","properties":{"name":"Meade"},"geometry":{"type":"Polygon","coordinates":[[[-100.213675,37.476757],[-100.109614,37.476757],[-100.087706,37.000263],[-100.6354,37.000263],[-100.651831,37.389126],[-100.651831,37.476757],[-100.213675,37.476757]]]}},
+{"type":"Feature","id":"20121","properties":{"name":"Miami"},"geometry":{"type":"Polygon","coordinates":[[[-94.966767,38.736453],[-94.610765,38.736453],[-94.610765,38.479037],[-94.610765,38.391406],[-95.010582,38.391406],[-95.065351,38.391406],[-95.054398,38.736453],[-94.966767,38.736453]]]}},
+{"type":"Feature","id":"20123","properties":{"name":"Mitchell"},"geometry":{"type":"Polygon","coordinates":[[[-98.488439,39.568948],[-97.929791,39.568948],[-97.929791,39.306055],[-97.929791,39.218424],[-98.477485,39.218424],[-98.488439,39.218424],[-98.488439,39.568948]]]}},
+{"type":"Feature","id":"20125","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-95.96357,37.389126],[-95.525414,37.383649],[-95.519938,37.383649],[-95.519938,37.000263],[-95.613046,37.000263],[-95.788308,37.000263],[-95.9088,37.000263],[-95.96357,37.000263],[-95.96357,37.301494],[-95.96357,37.389126]]]}},
+{"type":"Feature","id":"20127","properties":{"name":"Morris"},"geometry":{"type":"Polygon","coordinates":[[[-96.686526,38.867899],[-96.50031,38.867899],[-96.352432,38.74193],[-96.352432,38.522852],[-96.817972,38.522852],[-96.932988,38.610483],[-96.889173,38.867899],[-96.686526,38.867899]]]}},
+{"type":"Feature","id":"20129","properties":{"name":"Morton"},"geometry":{"type":"Polygon","coordinates":[[[-101.884142,37.389126],[-101.555526,37.389126],[-101.555526,36.994786],[-102.026543,36.994786],[-102.042974,36.994786],[-102.042974,37.389126],[-101.884142,37.389126]]]}},
+{"type":"Feature","id":"20131","properties":{"name":"Nemaha"},"geometry":{"type":"Polygon","coordinates":[[[-96.237417,40.001626],[-96.012862,40.001626],[-95.788308,40.001626],[-95.788308,39.651102],[-96.03477,39.563471],[-96.237417,39.568948],[-96.237417,40.001626],[-96.237417,40.001626]]]}},
+{"type":"Feature","id":"20133","properties":{"name":"Neosho"},"geometry":{"type":"Polygon","coordinates":[[[-95.399445,37.734173],[-95.087259,37.734173],[-95.087259,37.673926],[-95.087259,37.383649],[-95.125598,37.383649],[-95.519938,37.383649],[-95.525414,37.383649],[-95.525414,37.734173],[-95.399445,37.734173]]]}},
+{"type":"Feature","id":"20135","properties":{"name":"Ness"},"geometry":{"type":"Polygon","coordinates":[[[-100.246537,38.698114],[-100.153429,38.698114],[-99.600258,38.698114],[-99.583827,38.698114],[-99.583827,38.34759],[-99.583827,38.259959],[-100.224629,38.259959],[-100.246537,38.259959],[-100.246537,38.698114]]]}},
+{"type":"Feature","id":"20137","properties":{"name":"Norton"},"geometry":{"type":"Polygon","coordinates":[[[-99.627643,40.001626],[-99.627643,39.568948],[-100.164383,39.568948],[-100.180814,39.568948],[-100.175337,40.001626],[-99.627643,40.001626],[-99.627643,40.001626]]]}},
+{"type":"Feature","id":"20139","properties":{"name":"Osage"},"geometry":{"type":"Polygon","coordinates":[[[-95.667815,38.867899],[-95.49803,38.867899],[-95.503507,38.736453],[-95.508984,38.435221],[-95.656861,38.435221],[-95.952616,38.435221],[-95.947139,38.736453],[-95.947139,38.867899],[-95.667815,38.867899]]]}},
+{"type":"Feature","id":"20141","properties":{"name":"Osborne"},"geometry":{"type":"Polygon","coordinates":[[[-98.849917,39.568948],[-98.50487,39.568948],[-98.488439,39.568948],[-98.488439,39.218424],[-98.488439,39.130793],[-98.510347,39.130793],[-99.036133,39.130793],[-99.047087,39.130793],[-99.04161,39.568948],[-98.849917,39.568948]]]}},
+{"type":"Feature","id":"20143","properties":{"name":"Ottawa"},"geometry":{"type":"Polygon","coordinates":[[[-97.590221,39.306055],[-97.371143,39.306055],[-97.371143,39.130793],[-97.371143,38.95553],[-97.486159,38.95553],[-97.929791,38.95553],[-97.929791,39.218424],[-97.929791,39.306055],[-97.590221,39.306055]]]}},
+{"type":"Feature","id":"20145","properties":{"name":"Pawnee"},"geometry":{"type":"Polygon","coordinates":[[[-99.359273,38.34759],[-99.030656,38.34759],[-98.910164,38.259959],[-99.019702,38.002543],[-99.348319,38.002543],[-99.567396,38.084697],[-99.57835,38.259959],[-99.583827,38.259959],[-99.583827,38.34759],[-99.359273,38.34759]]]}},
+{"type":"Feature","id":"20147","properties":{"name":"Phillips"},"geometry":{"type":"Polygon","coordinates":[[[-99.123764,40.001626],[-99.068995,40.001626],[-99.063518,39.568948],[-99.600258,39.568948],[-99.627643,39.568948],[-99.627643,40.001626],[-99.178534,40.001626],[-99.123764,40.001626]]]}},
+{"type":"Feature","id":"20149","properties":{"name":"Pottawatomie"},"geometry":{"type":"Polygon","coordinates":[[[-96.582464,39.568948],[-96.237417,39.568948],[-96.03477,39.563471],[-96.03477,39.218424],[-96.040247,39.125316],[-96.390771,39.174608],[-96.582464,39.568948],[-96.582464,39.568948]]]}},
+{"type":"Feature","id":"20151","properties":{"name":"Pratt"},"geometry":{"type":"Polygon","coordinates":[[[-98.904687,37.827281],[-98.472008,37.827281],[-98.466531,37.734173],[-98.466531,37.47128],[-98.482962,37.47128],[-99.014225,37.47128],[-99.014225,37.734173],[-99.014225,37.827281],[-98.904687,37.827281]]]}},
+{"type":"Feature","id":"20153","properties":{"name":"Rawlins"},"geometry":{"type":"Polygon","coordinates":[[[-101.325494,40.001626],[-100.761369,40.001626],[-100.739462,40.001626],[-100.739462,39.568948],[-101.391218,39.568948],[-101.413125,39.568948],[-101.413125,40.001626],[-101.325494,40.001626]]]}},
+{"type":"Feature","id":"20155","properties":{"name":"Reno"},"geometry":{"type":"Polygon","coordinates":[[[-97.929791,38.172328],[-97.924314,38.172328],[-97.69976,38.172328],[-97.69976,37.914912],[-97.809299,37.734173],[-97.918837,37.734173],[-98.466531,37.734173],[-98.472008,37.827281],[-98.472008,38.172328],[-97.929791,38.172328]]]}},
+{"type":"Feature","id":"20157","properties":{"name":"Republic"},"geometry":{"type":"Polygon","coordinates":[[[-97.875022,40.001626],[-97.820252,40.001626],[-97.371143,40.001626],[-97.371143,39.656579],[-97.69976,39.656579],[-97.929791,39.656579],[-97.929791,40.001626],[-97.875022,40.001626]]]}},
+{"type":"Feature","id":"20159","properties":{"name":"Rice"},"geometry":{"type":"Polygon","coordinates":[[[-98.017422,38.522852],[-97.924314,38.522852],[-97.924314,38.172328],[-97.929791,38.172328],[-98.472008,38.172328],[-98.477485,38.259959],[-98.482962,38.522852],[-98.017422,38.522852]]]}},
+{"type":"Feature","id":"20161","properties":{"name":"Riley"},"geometry":{"type":"Polygon","coordinates":[[[-96.692003,39.568948],[-96.582464,39.568948],[-96.390771,39.174608],[-96.50031,39.043162],[-96.943942,39.218424],[-96.960373,39.218424],[-96.960373,39.568948],[-96.807019,39.568948],[-96.692003,39.568948]]]}},
+{"type":"Feature","id":"20163","properties":{"name":"Rooks"},"geometry":{"type":"Polygon","coordinates":[[[-99.063518,39.568948],[-99.04161,39.568948],[-99.047087,39.130793],[-99.408565,39.130793],[-99.589304,39.130793],[-99.605735,39.130793],[-99.600258,39.568948],[-99.063518,39.568948]]]}},
+{"type":"Feature","id":"20165","properties":{"name":"Rush"},"geometry":{"type":"Polygon","coordinates":[[[-99.04161,38.698114],[-99.030656,38.698114],[-99.030656,38.34759],[-99.359273,38.34759],[-99.583827,38.34759],[-99.583827,38.698114],[-99.04161,38.698114]]]}},
+{"type":"Feature","id":"20167","properties":{"name":"Russell"},"geometry":{"type":"Polygon","coordinates":[[[-98.510347,39.130793],[-98.488439,39.130793],[-98.482962,38.873376],[-98.488439,38.698114],[-98.811579,38.698114],[-99.030656,38.698114],[-99.04161,38.698114],[-99.036133,39.130793],[-98.510347,39.130793]]]}},
+{"type":"Feature","id":"20169","properties":{"name":"Saline"},"geometry":{"type":"Polygon","coordinates":[[[-97.486159,38.95553],[-97.371143,38.95553],[-97.371143,38.610483],[-97.924314,38.610483],[-97.929791,38.873376],[-97.929791,38.95553],[-97.486159,38.95553]]]}},
+{"type":"Feature","id":"20171","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-101.128324,38.698114],[-100.816139,38.698114],[-100.690169,38.698114],[-100.684692,38.265436],[-100.881862,38.265436],[-101.10094,38.265436],[-101.122848,38.265436],[-101.128324,38.698114]]]}},
+{"type":"Feature","id":"20173","properties":{"name":"Sedgwick"},"geometry":{"type":"Polygon","coordinates":[[[-97.157543,37.914912],[-97.152066,37.914912],[-97.152066,37.476757],[-97.349236,37.476757],[-97.809299,37.476757],[-97.809299,37.734173],[-97.69976,37.914912],[-97.157543,37.914912]]]}},
+{"type":"Feature","id":"20175","properties":{"name":"Seward"},"geometry":{"type":"Polygon","coordinates":[[[-100.750416,37.389126],[-100.651831,37.389126],[-100.6354,37.000263],[-100.947585,37.000263],[-101.068078,37.000263],[-101.068078,37.389126],[-100.750416,37.389126]]]}},
+{"type":"Feature","id":"20177","properties":{"name":"Shawnee"},"geometry":{"type":"Polygon","coordinates":[[[-95.886893,39.218424],[-95.591138,39.218424],[-95.49803,39.054115],[-95.49803,38.867899],[-95.667815,38.867899],[-95.947139,38.867899],[-96.040247,39.125316],[-96.03477,39.218424],[-95.886893,39.218424]]]}},
+{"type":"Feature","id":"20179","properties":{"name":"Sheridan"},"geometry":{"type":"Polygon","coordinates":[[[-100.668261,39.568948],[-100.180814,39.568948],[-100.164383,39.568948],[-100.164383,39.130793],[-100.723031,39.130793],[-100.717554,39.568948],[-100.668261,39.568948]]]}},
+{"type":"Feature","id":"20181","properties":{"name":"Sherman"},"geometry":{"type":"Polygon","coordinates":[[[-102.004635,39.568948],[-101.413125,39.568948],[-101.391218,39.568948],[-101.391218,39.13627],[-101.478849,39.13627],[-102.04845,39.130793],[-102.04845,39.568948],[-102.004635,39.568948]]]}},
+{"type":"Feature","id":"20183","properties":{"name":"Smith"},"geometry":{"type":"Polygon","coordinates":[[[-98.691086,40.001626],[-98.50487,40.001626],[-98.50487,39.568948],[-98.849917,39.568948],[-99.04161,39.568948],[-99.063518,39.568948],[-99.068995,40.001626],[-98.723948,40.001626],[-98.691086,40.001626]]]}},
+{"type":"Feature","id":"20185","properties":{"name":"Stafford"},"geometry":{"type":"Polygon","coordinates":[[[-98.800625,38.259959],[-98.477485,38.259959],[-98.472008,38.172328],[-98.472008,37.827281],[-98.904687,37.827281],[-99.014225,37.827281],[-99.019702,38.002543],[-98.910164,38.259959],[-98.800625,38.259959]]]}},
+{"type":"Feature","id":"20187","properties":{"name":"Stanton"},"geometry":{"type":"Polygon","coordinates":[[[-102.042974,37.73965],[-101.528141,37.734173],[-101.528141,37.389126],[-101.555526,37.389126],[-101.884142,37.389126],[-102.042974,37.389126],[-102.042974,37.646542],[-102.042974,37.73965]]]}},
+{"type":"Feature","id":"20189","properties":{"name":"Stevens"},"geometry":{"type":"Polygon","coordinates":[[[-101.528141,37.389126],[-101.089986,37.389126],[-101.068078,37.389126],[-101.068078,37.000263],[-101.555526,36.994786],[-101.555526,37.389126],[-101.528141,37.389126]]]}},
+{"type":"Feature","id":"20191","properties":{"name":"Sumner"},"geometry":{"type":"Polygon","coordinates":[[[-97.349236,37.476757],[-97.152066,37.476757],[-97.146589,37.000263],[-97.464251,37.000263],[-97.650467,37.000263],[-97.803822,37.000263],[-97.803822,37.389126],[-97.809299,37.383649],[-97.809299,37.476757],[-97.349236,37.476757]]]}},
+{"type":"Feature","id":"20193","properties":{"name":"Thomas"},"geometry":{"type":"Polygon","coordinates":[[[-101.391218,39.568948],[-100.739462,39.568948],[-100.717554,39.568948],[-100.723031,39.130793],[-100.739462,39.130793],[-100.810662,39.130793],[-101.391218,39.13627],[-101.391218,39.568948]]]}},
+{"type":"Feature","id":"20195","properties":{"name":"Trego"},"geometry":{"type":"Polygon","coordinates":[[[-99.589304,39.130793],[-99.600258,38.698114],[-100.153429,38.698114],[-100.147952,39.130793],[-99.605735,39.130793],[-99.589304,39.130793]]]}},
+{"type":"Feature","id":"20197","properties":{"name":"Wabaunsee"},"geometry":{"type":"Polygon","coordinates":[[[-96.040247,39.125316],[-95.947139,38.867899],[-95.947139,38.736453],[-96.336002,38.74193],[-96.352432,38.74193],[-96.50031,38.867899],[-96.50031,39.043162],[-96.390771,39.174608],[-96.040247,39.125316]]]}},
+{"type":"Feature","id":"20199","properties":{"name":"Wallace"},"geometry":{"type":"Polygon","coordinates":[[[-101.478849,39.13627],[-101.484326,38.698114],[-101.56648,38.698114],[-102.042974,38.698114],[-102.04845,39.048638],[-102.04845,39.130793],[-101.478849,39.13627]]]}},
+{"type":"Feature","id":"20201","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-97.349236,40.001626],[-96.916557,40.001626],[-96.807019,40.001626],[-96.807019,39.568948],[-96.960373,39.568948],[-97.299943,39.568948],[-97.371143,39.568948],[-97.371143,39.656579],[-97.371143,40.001626],[-97.349236,40.001626]]]}},
+{"type":"Feature","id":"20203","properties":{"name":"Wichita"},"geometry":{"type":"Polygon","coordinates":[[[-101.259771,38.703591],[-101.128324,38.698114],[-101.122848,38.265436],[-101.544572,38.265436],[-101.56648,38.265436],[-101.56648,38.698114],[-101.484326,38.698114],[-101.259771,38.703591]]]}},
+{"type":"Feature","id":"20205","properties":{"name":"Wilson"},"geometry":{"type":"Polygon","coordinates":[[[-95.919754,37.734173],[-95.525414,37.734173],[-95.525414,37.383649],[-95.96357,37.389126],[-95.96357,37.602726],[-95.96357,37.734173],[-95.919754,37.734173]]]}},
+{"type":"Feature","id":"20207","properties":{"name":"Woodson"},"geometry":{"type":"Polygon","coordinates":[[[-95.810215,38.040881],[-95.519938,38.040881],[-95.525414,37.734173],[-95.919754,37.734173],[-95.96357,37.734173],[-95.958093,38.040881],[-95.810215,38.040881]]]}},
+{"type":"Feature","id":"20209","properties":{"name":"Wyandotte"},"geometry":{"type":"Polygon","coordinates":[[[-94.862705,39.201993],[-94.775074,39.201993],[-94.599812,39.158177],[-94.605288,39.114362],[-94.605288,39.043162],[-94.90652,38.988392],[-94.862705,39.201993]]]}},
+{"type":"Feature","id":"21001","properties":{"name":"Adair"},"geometry":{"type":"Polygon","coordinates":[[[-85.163043,37.312448],[-85.042551,37.186479],[-85.234244,36.923586],[-85.447844,36.940016],[-85.453321,36.940016],[-85.524521,37.109802],[-85.354736,37.191956],[-85.163043,37.312448]]]}},
+{"type":"Feature","id":"21003","properties":{"name":"Allen"},"geometry":{"type":"Polygon","coordinates":[[[-86.22557,36.912632],[-86.165323,36.934539],[-85.979107,36.720939],[-85.979107,36.627831],[-86.203662,36.638785],[-86.411786,36.649739],[-86.406309,36.775708],[-86.22557,36.912632]]]}},
+{"type":"Feature","id":"21005","properties":{"name":"Anderson"},"geometry":{"type":"Polygon","coordinates":[[[-84.998735,38.128512],[-84.867289,38.117559],[-84.796088,37.969681],[-85.031597,37.893004],[-85.152089,37.898481],[-85.16852,37.969681],[-85.102797,38.035405],[-85.02612,38.128512],[-84.998735,38.128512]]]}},
+{"type":"Feature","id":"21007","properties":{"name":"Ballard"},"geometry":{"type":"Polygon","coordinates":[[[-88.936655,37.230294],[-88.816163,36.956447],[-89.100963,36.945493],[-89.133825,36.983832],[-89.172164,37.065986],[-88.936655,37.230294]]]}},
+{"type":"Feature","id":"21009","properties":{"name":"Barren"},"geometry":{"type":"Polygon","coordinates":[[[-85.743599,37.170048],[-85.738122,36.841432],[-85.979107,36.720939],[-86.165323,36.934539],[-86.116031,37.060509],[-86.055785,37.164571],[-85.743599,37.170048]]]}},
+{"type":"Feature","id":"21011","properties":{"name":"Bath"},"geometry":{"type":"Polygon","coordinates":[[[-83.848578,38.298298],[-83.634977,38.188759],[-83.498053,38.051835],[-83.760947,37.997066],[-83.980024,38.194236],[-83.848578,38.298298]]]}},
+{"type":"Feature","id":"21013","properties":{"name":"Bell"},"geometry":{"type":"Polygon","coordinates":[[[-83.509007,36.940016],[-83.492576,36.896201],[-83.459715,36.666169],[-83.673316,36.600446],[-83.930732,36.589492],[-83.875962,36.688077],[-83.591161,36.956447],[-83.509007,36.940016]]]}},
+{"type":"Feature","id":"21015","properties":{"name":"Boone"},"geometry":{"type":"Polygon","coordinates":[[[-84.620826,39.076023],[-84.615349,38.802176],[-84.659165,38.774791],[-84.779657,38.856946],[-84.796088,38.856946],[-84.872765,38.900761],[-84.878242,39.032208],[-84.817996,39.103408],[-84.620826,39.076023]]]}},
+{"type":"Feature","id":"21017","properties":{"name":"Bourbon"},"geometry":{"type":"Polygon","coordinates":[[[-84.264825,38.325682],[-84.193625,38.369498],[-83.980024,38.194236],[-84.040271,38.144943],[-84.078609,38.117559],[-84.286733,38.068266],[-84.401749,38.20519],[-84.440087,38.281867],[-84.264825,38.325682]]]}},
+{"type":"Feature","id":"21019","properties":{"name":"Boyd"},"geometry":{"type":"Polygon","coordinates":[[[-82.594358,38.424267],[-82.605312,38.249005],[-82.791528,38.243528],[-82.818913,38.374975],[-82.665558,38.506421],[-82.594358,38.424267]]]}},
+{"type":"Feature","id":"21021","properties":{"name":"Boyle"},"geometry":{"type":"Polygon","coordinates":[[[-84.856335,37.695834],[-84.746796,37.712265],[-84.659165,37.635588],[-84.845381,37.547957],[-85.037074,37.54248],[-85.031597,37.630111],[-85.02612,37.679403],[-84.856335,37.695834]]]}},
+{"type":"Feature","id":"21023","properties":{"name":"Bracken"},"geometry":{"type":"Polygon","coordinates":[[[-84.051224,38.769315],[-83.903347,38.769315],[-83.990978,38.594052],[-84.160763,38.555714],[-84.204579,38.583099],[-84.231963,38.829561],[-84.051224,38.769315]]]}},
+{"type":"Feature","id":"21025","properties":{"name":"Breathitt"},"geometry":{"type":"Polygon","coordinates":[[[-83.377561,37.695834],[-83.246114,37.668449],[-82.950359,37.504141],[-83.125621,37.405556],[-83.547346,37.334356],[-83.580208,37.504141],[-83.519961,37.641065],[-83.377561,37.695834]]]}},
+{"type":"Feature","id":"21027","properties":{"name":"Breckinridge"},"geometry":{"type":"Polygon","coordinates":[[[-86.652771,37.843712],[-86.488463,38.046358],[-86.148893,37.799896],[-86.274862,37.591772],[-86.472032,37.602726],[-86.592525,37.564388],[-86.63634,37.662973],[-86.652771,37.843712]]]}},
+{"type":"Feature","id":"21029","properties":{"name":"Bullitt"},"geometry":{"type":"Polygon","coordinates":[[[-85.699783,38.084697],[-85.431413,38.117559],[-85.49166,37.991589],[-85.497137,37.986112],[-85.738122,37.81085],[-85.940769,37.997066],[-85.699783,38.084697]]]}},
+{"type":"Feature","id":"21031","properties":{"name":"Butler"},"geometry":{"type":"Polygon","coordinates":[[[-86.614433,37.394602],[-86.466555,37.323402],[-86.400832,37.170048],[-86.674679,37.000263],[-86.943049,37.071463],[-86.899233,37.213863],[-86.614433,37.394602]]]}},
+{"type":"Feature","id":"21033","properties":{"name":"Caldwell"},"geometry":{"type":"Polygon","coordinates":[[[-87.802929,37.378172],[-87.813882,37.350787],[-87.682436,37.14814],[-87.731728,37.000263],[-87.879606,36.961924],[-88.098683,37.181002],[-87.802929,37.378172]]]}},
+{"type":"Feature","id":"21035","properties":{"name":"Calloway"},"geometry":{"type":"Polygon","coordinates":[[[-88.109637,36.748324],[-88.071299,36.677123],[-88.054868,36.496384],[-88.487546,36.501861],[-88.487546,36.748324],[-88.109637,36.748324]]]}},
+{"type":"Feature","id":"21037","properties":{"name":"Campbell"},"geometry":{"type":"Polygon","coordinates":[[[-84.319594,39.021254],[-84.231963,38.873376],[-84.418179,38.807653],[-84.50581,39.092454],[-84.319594,39.021254]]]}},
+{"type":"Feature","id":"21039","properties":{"name":"Carlisle"},"geometry":{"type":"Polygon","coordinates":[[[-88.810686,36.945493],[-88.810686,36.775708],[-89.122871,36.786662],[-89.100963,36.945493],[-88.816163,36.956447],[-88.810686,36.945493]]]}},
+{"type":"Feature","id":"21041","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-85.02612,38.763838],[-84.933012,38.659776],[-85.075412,38.599529],[-85.16852,38.583099],[-85.332828,38.736453],[-85.201382,38.692637],[-85.02612,38.763838]]]}},
+{"type":"Feature","id":"21043","properties":{"name":"Carter"},"geometry":{"type":"Polygon","coordinates":[[[-83.16396,38.506421],[-82.818913,38.374975],[-82.791528,38.243528],[-82.922975,38.177805],[-83.246114,38.194236],[-83.339222,38.320205],[-83.16396,38.506421]]]}},
+{"type":"Feature","id":"21045","properties":{"name":"Casey"},"geometry":{"type":"Polygon","coordinates":[[[-85.037074,37.54248],[-84.845381,37.547957],[-84.719411,37.235771],[-84.90015,37.115279],[-85.042551,37.186479],[-85.163043,37.312448],[-85.075412,37.411033],[-85.037074,37.54248]]]}},
+{"type":"Feature","id":"21047","properties":{"name":"Christian"},"geometry":{"type":"Polygon","coordinates":[[[-87.682436,37.14814],[-87.331912,37.159094],[-87.260711,37.071463],[-87.260711,37.071463],[-87.337389,36.644262],[-87.63862,36.638785],[-87.69339,36.638785],[-87.731728,37.000263],[-87.682436,37.14814]]]}},
+{"type":"Feature","id":"21049","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-84.078609,38.117559],[-83.96907,37.931343],[-83.990978,37.914912],[-84.001932,37.838235],[-84.078609,37.854665],[-84.270302,37.914912],[-84.336025,37.893004],[-84.286733,38.068266],[-84.078609,38.117559]]]}},
+{"type":"Feature","id":"21051","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-83.574731,37.279587],[-83.525438,37.257679],[-83.509007,37.235771],[-83.509007,36.940016],[-83.591161,36.956447],[-83.788331,37.033124],[-83.870485,37.055032],[-83.941686,37.252202],[-83.782854,37.350787],[-83.574731,37.279587]]]}},
+{"type":"Feature","id":"21053","properties":{"name":"Clinton"},"geometry":{"type":"Polygon","coordinates":[[[-85.217813,36.852385],[-85.064458,36.857862],[-84.976827,36.616877],[-85.278059,36.627831],[-85.29449,36.627831],[-85.217813,36.852385]]]}},
+{"type":"Feature","id":"21055","properties":{"name":"Crittenden"},"geometry":{"type":"Polygon","coordinates":[[[-88.060345,37.504141],[-87.934375,37.482234],[-87.802929,37.378172],[-88.098683,37.181002],[-88.191791,37.14814],[-88.3561,37.405556],[-88.060345,37.504141]]]}},
+{"type":"Feature","id":"21057","properties":{"name":"Cumberland"},"geometry":{"type":"Polygon","coordinates":[[[-85.447844,36.940016],[-85.234244,36.923586],[-85.217813,36.852385],[-85.29449,36.627831],[-85.43689,36.616877],[-85.595722,36.819524],[-85.453321,36.940016],[-85.447844,36.940016]]]}},
+{"type":"Feature","id":"21059","properties":{"name":"Daviess"},"geometry":{"type":"Polygon","coordinates":[[[-87.266188,37.876573],[-86.981388,37.931343],[-86.822556,37.73965],[-87.036157,37.558911],[-87.408589,37.68488],[-87.304527,37.898481],[-87.266188,37.876573]]]}},
+{"type":"Feature","id":"21061","properties":{"name":"Edmonson"},"geometry":{"type":"Polygon","coordinates":[[[-86.466555,37.323402],[-86.159846,37.334356],[-86.055785,37.164571],[-86.116031,37.060509],[-86.400832,37.170048],[-86.466555,37.323402]]]}},
+{"type":"Feature","id":"21063","properties":{"name":"Elliott"},"geometry":{"type":"Polygon","coordinates":[[[-82.922975,38.177805],[-83.02156,38.00802],[-83.262545,38.117559],[-83.246114,38.194236],[-82.922975,38.177805]]]}},
+{"type":"Feature","id":"21065","properties":{"name":"Estill"},"geometry":{"type":"Polygon","coordinates":[[[-84.078609,37.854665],[-84.001932,37.838235],[-83.722608,37.717742],[-83.903347,37.54248],[-83.963593,37.580818],[-84.089563,37.564388],[-84.078609,37.854665]]]}},
+{"type":"Feature","id":"21067","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-84.401749,38.20519],[-84.286733,38.068266],[-84.336025,37.893004],[-84.43461,37.849189],[-84.659165,38.002543],[-84.626303,38.117559],[-84.401749,38.20519]]]}},
+{"type":"Feature","id":"21069","properties":{"name":"Fleming"},"geometry":{"type":"Polygon","coordinates":[[[-83.602115,38.506421],[-83.454238,38.380452],[-83.634977,38.188759],[-83.848578,38.298298],[-83.980024,38.440698],[-83.930732,38.489991],[-83.640454,38.522852],[-83.602115,38.506421]]]}},
+{"type":"Feature","id":"21071","properties":{"name":"Floyd"},"geometry":{"type":"Polygon","coordinates":[[[-82.786051,37.745127],[-82.638174,37.717742],[-82.561497,37.68488],[-82.709374,37.285064],[-82.922975,37.48771],[-82.939406,37.717742],[-82.786051,37.745127]]]}},
+{"type":"Feature","id":"21073","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-84.861812,38.358544],[-84.741319,38.353067],[-84.724888,38.194236],[-84.867289,38.117559],[-84.998735,38.128512],[-85.02612,38.128512],[-84.998735,38.336636],[-84.872765,38.358544],[-84.861812,38.358544]]]}},
+{"type":"Feature","id":"21075","properties":{"name":"Fulton"},"geometry":{"type":"Polygon","coordinates":[[[-89.095486,36.622354],[-88.832593,36.501861],[-89.117394,36.501861],[-89.347426,36.501861],[-89.418626,36.496384],[-89.325518,36.633308],[-89.172164,36.649739],[-89.095486,36.622354]]]}},
+{"type":"Feature","id":"21077","properties":{"name":"Gallatin"},"geometry":{"type":"Polygon","coordinates":[[[-84.779657,38.856946],[-84.659165,38.774791],[-84.785134,38.720022],[-84.817996,38.709068],[-84.933012,38.659776],[-85.02612,38.763838],[-84.796088,38.856946],[-84.779657,38.856946]]]}},
+{"type":"Feature","id":"21079","properties":{"name":"Garrard"},"geometry":{"type":"Polygon","coordinates":[[[-84.648211,37.81085],[-84.527718,37.767034],[-84.346979,37.537003],[-84.445564,37.48771],[-84.659165,37.635588],[-84.746796,37.712265],[-84.713934,37.816327],[-84.648211,37.81085]]]}},
+{"type":"Feature","id":"21081","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-84.615349,38.802176],[-84.533195,38.791222],[-84.478426,38.54476],[-84.555103,38.495467],[-84.582488,38.47356],[-84.785134,38.720022],[-84.659165,38.774791],[-84.615349,38.802176]]]}},
+{"type":"Feature","id":"21083","properties":{"name":"Graves"},"geometry":{"type":"Polygon","coordinates":[[[-88.723055,36.945493],[-88.482069,36.940016],[-88.487546,36.748324],[-88.487546,36.501861],[-88.514931,36.501861],[-88.816163,36.501861],[-88.810686,36.775708],[-88.810686,36.945493],[-88.723055,36.945493]]]}},
+{"type":"Feature","id":"21085","properties":{"name":"Grayson"},"geometry":{"type":"Polygon","coordinates":[[[-86.472032,37.602726],[-86.274862,37.591772],[-86.044831,37.449372],[-86.159846,37.334356],[-86.466555,37.323402],[-86.614433,37.394602],[-86.592525,37.564388],[-86.472032,37.602726]]]}},
+{"type":"Feature","id":"21087","properties":{"name":"Green"},"geometry":{"type":"Polygon","coordinates":[[[-85.590245,37.47128],[-85.584768,37.47128],[-85.354736,37.191956],[-85.524521,37.109802],[-85.68883,37.181002],[-85.655968,37.421987],[-85.590245,37.47128]]]}},
+{"type":"Feature","id":"21089","properties":{"name":"Greenup"},"geometry":{"type":"Polygon","coordinates":[[[-82.813436,38.572145],[-82.665558,38.506421],[-82.818913,38.374975],[-83.16396,38.506421],[-83.032514,38.725499],[-82.813436,38.572145]]]}},
+{"type":"Feature","id":"21091","properties":{"name":"Hancock"},"geometry":{"type":"Polygon","coordinates":[[[-86.811602,37.997066],[-86.652771,37.843712],[-86.63634,37.662973],[-86.822556,37.73965],[-86.981388,37.931343],[-86.811602,37.997066]]]}},
+{"type":"Feature","id":"21093","properties":{"name":"Hardin"},"geometry":{"type":"Polygon","coordinates":[[[-85.946246,38.00802],[-85.940769,37.997066],[-85.738122,37.81085],[-85.677876,37.734173],[-85.891476,37.438418],[-86.017446,37.449372],[-86.044831,37.449372],[-86.274862,37.591772],[-86.148893,37.799896],[-86.001015,37.997066],[-85.946246,38.00802]]]}},
+{"type":"Feature","id":"21095","properties":{"name":"Harlan"},"geometry":{"type":"Polygon","coordinates":[[[-82.912021,37.000263],[-82.868205,36.972878],[-82.879159,36.890724],[-83.459715,36.666169],[-83.492576,36.896201],[-83.180391,37.022171],[-83.120145,37.000263],[-82.912021,37.000263]]]}},
+{"type":"Feature","id":"21097","properties":{"name":"Harrison"},"geometry":{"type":"Polygon","coordinates":[[[-84.401749,38.561191],[-84.204579,38.583099],[-84.160763,38.555714],[-84.100517,38.457129],[-84.193625,38.369498],[-84.264825,38.325682],[-84.440087,38.281867],[-84.555103,38.495467],[-84.478426,38.54476],[-84.401749,38.561191]]]}},
+{"type":"Feature","id":"21099","properties":{"name":"Hart"},"geometry":{"type":"Polygon","coordinates":[[[-86.017446,37.449372],[-85.891476,37.438418],[-85.655968,37.421987],[-85.68883,37.181002],[-85.743599,37.170048],[-86.055785,37.164571],[-86.159846,37.334356],[-86.044831,37.449372],[-86.017446,37.449372]]]}},
+{"type":"Feature","id":"21101","properties":{"name":"Henderson"},"geometry":{"type":"Polygon","coordinates":[[[-87.698867,37.898481],[-87.452404,37.942297],[-87.304527,37.898481],[-87.408589,37.68488],[-87.49622,37.646542],[-87.731728,37.635588],[-87.928898,37.903958],[-87.698867,37.898481]]]}},
+{"type":"Feature","id":"21103","properties":{"name":"Henry"},"geometry":{"type":"Polygon","coordinates":[[[-85.16852,38.583099],[-85.075412,38.599529],[-84.872765,38.358544],[-84.998735,38.336636],[-85.283536,38.358544],[-85.316398,38.489991],[-85.16852,38.583099]]]}},
+{"type":"Feature","id":"21105","properties":{"name":"Hickman"},"geometry":{"type":"Polygon","coordinates":[[[-89.122871,36.786662],[-88.810686,36.775708],[-88.816163,36.501861],[-88.827116,36.501861],[-88.832593,36.501861],[-89.095486,36.622354],[-89.172164,36.649739],[-89.122871,36.786662]]]}},
+{"type":"Feature","id":"21107","properties":{"name":"Hopkins"},"geometry":{"type":"Polygon","coordinates":[[[-87.375727,37.569865],[-87.293573,37.389126],[-87.331912,37.159094],[-87.682436,37.14814],[-87.813882,37.350787],[-87.375727,37.569865]]]}},
+{"type":"Feature","id":"21109","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-83.963593,37.580818],[-83.903347,37.54248],[-83.886916,37.520572],[-83.782854,37.350787],[-83.941686,37.252202],[-84.138855,37.317925],[-84.199102,37.520572],[-84.089563,37.564388],[-83.963593,37.580818]]]}},
+{"type":"Feature","id":"21111","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-85.639537,38.380452],[-85.469752,38.287344],[-85.425936,38.144943],[-85.431413,38.117559],[-85.699783,38.084697],[-85.940769,37.997066],[-85.946246,38.00802],[-85.90243,38.177805],[-85.792891,38.287344],[-85.639537,38.380452]]]}},
+{"type":"Feature","id":"21113","properties":{"name":"Jessamine"},"geometry":{"type":"Polygon","coordinates":[[[-84.659165,38.002543],[-84.43461,37.849189],[-84.527718,37.767034],[-84.648211,37.81085],[-84.713934,37.816327],[-84.708457,37.860142],[-84.659165,38.002543]]]}},
+{"type":"Feature","id":"21115","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-82.851774,37.975158],[-82.610789,37.876573],[-82.638174,37.717742],[-82.786051,37.745127],[-82.939406,37.717742],[-83.005129,37.860142],[-82.988698,37.964204],[-82.851774,37.975158]]]}},
+{"type":"Feature","id":"21117","properties":{"name":"Kenton"},"geometry":{"type":"Polygon","coordinates":[[[-84.50581,39.092454],[-84.418179,38.807653],[-84.533195,38.791222],[-84.615349,38.802176],[-84.620826,39.076023],[-84.50581,39.092454]]]}},
+{"type":"Feature","id":"21119","properties":{"name":"Knott"},"geometry":{"type":"Polygon","coordinates":[[[-82.944882,37.498664],[-82.922975,37.48771],[-82.709374,37.285064],[-82.731282,37.27411],[-82.999652,37.197433],[-83.125621,37.405556],[-82.950359,37.504141],[-82.944882,37.498664]]]}},
+{"type":"Feature","id":"21121","properties":{"name":"Knox"},"geometry":{"type":"Polygon","coordinates":[[[-83.788331,37.033124],[-83.591161,36.956447],[-83.875962,36.688077],[-84.089563,36.956447],[-83.870485,37.055032],[-83.788331,37.033124]]]}},
+{"type":"Feature","id":"21123","properties":{"name":"Larue"},"geometry":{"type":"Polygon","coordinates":[[[-85.677876,37.734173],[-85.519044,37.553434],[-85.464275,37.465803],[-85.584768,37.47128],[-85.590245,37.47128],[-85.655968,37.421987],[-85.891476,37.438418],[-85.677876,37.734173]]]}},
+{"type":"Feature","id":"21125","properties":{"name":"Laurel"},"geometry":{"type":"Polygon","coordinates":[[[-84.138855,37.306971],[-84.138855,37.317925],[-83.941686,37.252202],[-83.870485,37.055032],[-84.089563,36.956447],[-84.122425,36.967401],[-84.297687,36.945493],[-84.357933,36.961924],[-84.286733,37.153617],[-84.138855,37.306971]]]}},
+{"type":"Feature","id":"21127","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-82.791528,38.243528],[-82.605312,38.249005],[-82.495773,37.947773],[-82.610789,37.876573],[-82.851774,37.975158],[-82.988698,37.964204],[-83.02156,38.00802],[-82.922975,38.177805],[-82.791528,38.243528]]]}},
+{"type":"Feature","id":"21129","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-83.706177,37.717742],[-83.519961,37.641065],[-83.580208,37.504141],[-83.651408,37.537003],[-83.886916,37.520572],[-83.903347,37.54248],[-83.722608,37.717742],[-83.706177,37.717742]]]}},
+{"type":"Feature","id":"21131","properties":{"name":"Leslie"},"geometry":{"type":"Polygon","coordinates":[[[-83.509007,37.235771],[-83.180391,37.022171],[-83.492576,36.896201],[-83.509007,36.940016],[-83.509007,37.235771]]]}},
+{"type":"Feature","id":"21133","properties":{"name":"Letcher"},"geometry":{"type":"Polygon","coordinates":[[[-82.731282,37.27411],[-82.566974,37.197433],[-82.868205,36.972878],[-82.912021,37.000263],[-83.120145,37.000263],[-82.999652,37.197433],[-82.731282,37.27411]]]}},
+{"type":"Feature","id":"21135","properties":{"name":"Lewis"},"geometry":{"type":"Polygon","coordinates":[[[-83.268022,38.61596],[-83.032514,38.725499],[-83.16396,38.506421],[-83.339222,38.320205],[-83.410422,38.396883],[-83.454238,38.380452],[-83.602115,38.506421],[-83.640454,38.522852],[-83.645931,38.637868],[-83.268022,38.61596]]]}},
+{"type":"Feature","id":"21137","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-84.659165,37.635588],[-84.445564,37.48771],[-84.500334,37.328879],[-84.670119,37.27411],[-84.719411,37.235771],[-84.845381,37.547957],[-84.659165,37.635588]]]}},
+{"type":"Feature","id":"21139","properties":{"name":"Livingston"},"geometry":{"type":"Polygon","coordinates":[[[-88.361576,37.405556],[-88.3561,37.405556],[-88.191791,37.14814],[-88.241084,36.983832],[-88.432777,37.049555],[-88.482069,37.022171],[-88.564223,37.082417],[-88.487546,37.065986],[-88.416346,37.421987],[-88.361576,37.405556]]]}},
+{"type":"Feature","id":"21141","properties":{"name":"Logan"},"geometry":{"type":"Polygon","coordinates":[[[-86.954003,37.071463],[-86.943049,37.071463],[-86.674679,37.000263],[-86.608956,36.885247],[-86.76231,36.649739],[-87.058065,36.644262],[-87.052588,37.060509],[-86.954003,37.071463]]]}},
+{"type":"Feature","id":"21143","properties":{"name":"Lyon"},"geometry":{"type":"Polygon","coordinates":[[[-88.191791,37.14814],[-88.098683,37.181002],[-87.879606,36.961924],[-88.15893,36.868816],[-88.241084,36.983832],[-88.191791,37.14814]]]}},
+{"type":"Feature","id":"21145","properties":{"name":"McCracken"},"geometry":{"type":"Polygon","coordinates":[[[-88.925701,37.224817],[-88.564223,37.082417],[-88.482069,37.022171],[-88.482069,36.940016],[-88.723055,36.945493],[-88.810686,36.945493],[-88.816163,36.956447],[-88.936655,37.230294],[-88.925701,37.224817]]]}},
+{"type":"Feature","id":"21147","properties":{"name":"McCreary"},"geometry":{"type":"Polygon","coordinates":[[[-84.357933,36.961924],[-84.297687,36.945493],[-84.226487,36.589492],[-84.259348,36.589492],[-84.779657,36.605923],[-84.577011,36.868816],[-84.357933,36.961924]]]}},
+{"type":"Feature","id":"21149","properties":{"name":"McLean"},"geometry":{"type":"Polygon","coordinates":[[[-87.408589,37.68488],[-87.036157,37.558911],[-87.10188,37.41651],[-87.293573,37.389126],[-87.375727,37.569865],[-87.49622,37.646542],[-87.408589,37.68488]]]}},
+{"type":"Feature","id":"21151","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-84.270302,37.914912],[-84.078609,37.854665],[-84.089563,37.564388],[-84.199102,37.520572],[-84.231963,37.520572],[-84.346979,37.537003],[-84.527718,37.767034],[-84.43461,37.849189],[-84.336025,37.893004],[-84.270302,37.914912]]]}},
+{"type":"Feature","id":"21153","properties":{"name":"Magoffin"},"geometry":{"type":"Polygon","coordinates":[[[-83.005129,37.860142],[-82.939406,37.717742],[-82.922975,37.48771],[-82.944882,37.498664],[-82.950359,37.504141],[-83.246114,37.668449],[-83.262545,37.712265],[-83.005129,37.860142]]]}},
+{"type":"Feature","id":"21155","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-85.404029,37.728696],[-85.031597,37.630111],[-85.037074,37.54248],[-85.075412,37.411033],[-85.464275,37.465803],[-85.519044,37.553434],[-85.404029,37.728696]]]}},
+{"type":"Feature","id":"21157","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-88.432777,37.049555],[-88.241084,36.983832],[-88.15893,36.868816],[-88.109637,36.748324],[-88.487546,36.748324],[-88.482069,36.940016],[-88.482069,37.022171],[-88.432777,37.049555]]]}},
+{"type":"Feature","id":"21159","properties":{"name":"Martin"},"geometry":{"type":"Polygon","coordinates":[[[-82.413619,37.854665],[-82.331465,37.73965],[-82.561497,37.68488],[-82.638174,37.717742],[-82.610789,37.876573],[-82.495773,37.947773],[-82.413619,37.854665]]]}},
+{"type":"Feature","id":"21161","properties":{"name":"Mason"},"geometry":{"type":"Polygon","coordinates":[[[-83.848578,38.747407],[-83.706177,38.637868],[-83.645931,38.637868],[-83.640454,38.522852],[-83.930732,38.489991],[-83.96907,38.583099],[-83.990978,38.594052],[-83.903347,38.769315],[-83.848578,38.747407]]]}},
+{"type":"Feature","id":"21163","properties":{"name":"Meade"},"geometry":{"type":"Polygon","coordinates":[[[-86.307724,38.166851],[-86.001015,37.997066],[-86.148893,37.799896],[-86.488463,38.046358],[-86.461078,38.117559],[-86.307724,38.166851]]]}},
+{"type":"Feature","id":"21165","properties":{"name":"Menifee"},"geometry":{"type":"Polygon","coordinates":[[[-83.498053,38.051835],[-83.43233,38.035405],[-83.492576,37.860142],[-83.607592,37.827281],[-83.6295,37.827281],[-83.766424,37.920389],[-83.760947,37.997066],[-83.498053,38.051835]]]}},
+{"type":"Feature","id":"21167","properties":{"name":"Mercer"},"geometry":{"type":"Polygon","coordinates":[[[-84.796088,37.969681],[-84.708457,37.860142],[-84.713934,37.816327],[-84.746796,37.712265],[-84.856335,37.695834],[-85.02612,37.679403],[-85.031597,37.893004],[-84.796088,37.969681]]]}},
+{"type":"Feature","id":"21169","properties":{"name":"Metcalfe"},"geometry":{"type":"Polygon","coordinates":[[[-85.68883,37.181002],[-85.524521,37.109802],[-85.453321,36.940016],[-85.595722,36.819524],[-85.738122,36.841432],[-85.743599,37.170048],[-85.68883,37.181002]]]}},
+{"type":"Feature","id":"21171","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-85.738122,36.841432],[-85.595722,36.819524],[-85.43689,36.616877],[-85.787415,36.622354],[-85.979107,36.627831],[-85.979107,36.720939],[-85.738122,36.841432]]]}},
+{"type":"Feature","id":"21173","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-84.040271,38.144943],[-83.980024,38.194236],[-83.760947,37.997066],[-83.766424,37.920389],[-83.96907,37.931343],[-84.078609,38.117559],[-84.040271,38.144943]]]}},
+{"type":"Feature","id":"21175","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-83.355653,38.068266],[-83.262545,38.117559],[-83.02156,38.00802],[-82.988698,37.964204],[-83.005129,37.860142],[-83.262545,37.712265],[-83.492576,37.860142],[-83.43233,38.035405],[-83.355653,38.068266]]]}},
+{"type":"Feature","id":"21177","properties":{"name":"Muhlenberg"},"geometry":{"type":"Polygon","coordinates":[[[-87.10188,37.41651],[-86.899233,37.213863],[-86.943049,37.071463],[-86.954003,37.071463],[-87.052588,37.060509],[-87.260711,37.071463],[-87.331912,37.159094],[-87.293573,37.389126],[-87.10188,37.41651]]]}},
+{"type":"Feature","id":"21179","properties":{"name":"Nelson"},"geometry":{"type":"Polygon","coordinates":[[[-85.497137,37.986112],[-85.49166,37.991589],[-85.16852,37.969681],[-85.152089,37.898481],[-85.404029,37.728696],[-85.519044,37.553434],[-85.677876,37.734173],[-85.738122,37.81085],[-85.497137,37.986112]]]}},
+{"type":"Feature","id":"21181","properties":{"name":"Nicholas"},"geometry":{"type":"Polygon","coordinates":[[[-84.001932,38.440698],[-83.980024,38.440698],[-83.848578,38.298298],[-83.980024,38.194236],[-84.193625,38.369498],[-84.100517,38.457129],[-84.001932,38.440698]]]}},
+{"type":"Feature","id":"21183","properties":{"name":"Ohio"},"geometry":{"type":"Polygon","coordinates":[[[-86.822556,37.73965],[-86.63634,37.662973],[-86.592525,37.564388],[-86.614433,37.394602],[-86.899233,37.213863],[-87.10188,37.41651],[-87.036157,37.558911],[-86.822556,37.73965]]]}},
+{"type":"Feature","id":"21185","properties":{"name":"Oldham"},"geometry":{"type":"Polygon","coordinates":[[[-85.639537,38.380452],[-85.431413,38.522852],[-85.316398,38.489991],[-85.283536,38.358544],[-85.469752,38.287344],[-85.639537,38.380452]]]}},
+{"type":"Feature","id":"21187","properties":{"name":"Owen"},"geometry":{"type":"Polygon","coordinates":[[[-84.817996,38.709068],[-84.785134,38.720022],[-84.582488,38.47356],[-84.741319,38.353067],[-84.861812,38.358544],[-84.872765,38.358544],[-85.075412,38.599529],[-84.933012,38.659776],[-84.817996,38.709068]]]}},
+{"type":"Feature","id":"21189","properties":{"name":"Owsley"},"geometry":{"type":"Polygon","coordinates":[[[-83.651408,37.537003],[-83.580208,37.504141],[-83.547346,37.334356],[-83.525438,37.257679],[-83.574731,37.279587],[-83.782854,37.350787],[-83.886916,37.520572],[-83.651408,37.537003]]]}},
+{"type":"Feature","id":"21191","properties":{"name":"Pendleton"},"geometry":{"type":"Polygon","coordinates":[[[-84.231963,38.829561],[-84.204579,38.583099],[-84.401749,38.561191],[-84.478426,38.54476],[-84.533195,38.791222],[-84.418179,38.807653],[-84.231963,38.873376],[-84.231963,38.829561]]]}},
+{"type":"Feature","id":"21193","properties":{"name":"Perry"},"geometry":{"type":"Polygon","coordinates":[[[-83.125621,37.405556],[-82.999652,37.197433],[-83.120145,37.000263],[-83.180391,37.022171],[-83.509007,37.235771],[-83.525438,37.257679],[-83.547346,37.334356],[-83.125621,37.405556]]]}},
+{"type":"Feature","id":"21195","properties":{"name":"Pike"},"geometry":{"type":"Polygon","coordinates":[[[-82.145249,37.569865],[-81.969987,37.537003],[-82.315034,37.296018],[-82.55602,37.20291],[-82.566974,37.197433],[-82.731282,37.27411],[-82.709374,37.285064],[-82.561497,37.68488],[-82.331465,37.73965],[-82.145249,37.569865]]]}},
+{"type":"Feature","id":"21197","properties":{"name":"Powell"},"geometry":{"type":"Polygon","coordinates":[[[-83.990978,37.914912],[-83.96907,37.931343],[-83.766424,37.920389],[-83.6295,37.827281],[-83.706177,37.717742],[-83.722608,37.717742],[-84.001932,37.838235],[-83.990978,37.914912]]]}},
+{"type":"Feature","id":"21199","properties":{"name":"Pulaski"},"geometry":{"type":"Polygon","coordinates":[[[-84.670119,37.27411],[-84.500334,37.328879],[-84.286733,37.153617],[-84.357933,36.961924],[-84.577011,36.868816],[-84.807042,36.989309],[-84.834427,36.994786],[-84.90015,37.115279],[-84.719411,37.235771],[-84.670119,37.27411]]]}},
+{"type":"Feature","id":"21201","properties":{"name":"Robertson"},"geometry":{"type":"Polygon","coordinates":[[[-83.96907,38.583099],[-83.930732,38.489991],[-83.980024,38.440698],[-84.001932,38.440698],[-84.100517,38.457129],[-84.160763,38.555714],[-83.990978,38.594052],[-83.96907,38.583099]]]}},
+{"type":"Feature","id":"21203","properties":{"name":"Rockcastle"},"geometry":{"type":"Polygon","coordinates":[[[-84.231963,37.520572],[-84.199102,37.520572],[-84.138855,37.317925],[-84.138855,37.306971],[-84.286733,37.153617],[-84.500334,37.328879],[-84.445564,37.48771],[-84.346979,37.537003],[-84.231963,37.520572]]]}},
+{"type":"Feature","id":"21205","properties":{"name":"Rowan"},"geometry":{"type":"Polygon","coordinates":[[[-83.410422,38.396883],[-83.339222,38.320205],[-83.246114,38.194236],[-83.262545,38.117559],[-83.355653,38.068266],[-83.43233,38.035405],[-83.498053,38.051835],[-83.634977,38.188759],[-83.454238,38.380452],[-83.410422,38.396883]]]}},
+{"type":"Feature","id":"21207","properties":{"name":"Russell"},"geometry":{"type":"Polygon","coordinates":[[[-85.042551,37.186479],[-84.90015,37.115279],[-84.834427,36.994786],[-85.064458,36.857862],[-85.217813,36.852385],[-85.234244,36.923586],[-85.042551,37.186479]]]}},
+{"type":"Feature","id":"21209","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-84.555103,38.495467],[-84.440087,38.281867],[-84.401749,38.20519],[-84.626303,38.117559],[-84.724888,38.194236],[-84.741319,38.353067],[-84.582488,38.47356],[-84.555103,38.495467]]]}},
+{"type":"Feature","id":"21211","properties":{"name":"Shelby"},"geometry":{"type":"Polygon","coordinates":[[[-85.283536,38.358544],[-84.998735,38.336636],[-85.02612,38.128512],[-85.102797,38.035405],[-85.425936,38.144943],[-85.469752,38.287344],[-85.283536,38.358544]]]}},
+{"type":"Feature","id":"21213","properties":{"name":"Simpson"},"geometry":{"type":"Polygon","coordinates":[[[-86.608956,36.885247],[-86.406309,36.775708],[-86.411786,36.649739],[-86.56514,36.633308],[-86.76231,36.649739],[-86.608956,36.885247]]]}},
+{"type":"Feature","id":"21215","properties":{"name":"Spencer"},"geometry":{"type":"Polygon","coordinates":[[[-85.425936,38.144943],[-85.102797,38.035405],[-85.16852,37.969681],[-85.49166,37.991589],[-85.431413,38.117559],[-85.425936,38.144943]]]}},
+{"type":"Feature","id":"21217","properties":{"name":"Taylor"},"geometry":{"type":"Polygon","coordinates":[[[-85.584768,37.47128],[-85.464275,37.465803],[-85.075412,37.411033],[-85.163043,37.312448],[-85.354736,37.191956],[-85.584768,37.47128]]]}},
+{"type":"Feature","id":"21219","properties":{"name":"Todd"},"geometry":{"type":"Polygon","coordinates":[[[-87.260711,37.071463],[-87.260711,37.071463],[-87.052588,37.060509],[-87.058065,36.644262],[-87.112834,36.644262],[-87.337389,36.644262],[-87.260711,37.071463]]]}},
+{"type":"Feature","id":"21221","properties":{"name":"Trigg"},"geometry":{"type":"Polygon","coordinates":[[[-87.731728,37.000263],[-87.69339,36.638785],[-88.071299,36.677123],[-88.109637,36.748324],[-88.15893,36.868816],[-87.879606,36.961924],[-87.731728,37.000263]]]}},
+{"type":"Feature","id":"21223","properties":{"name":"Trimble"},"geometry":{"type":"Polygon","coordinates":[[[-85.425936,38.588575],[-85.332828,38.736453],[-85.16852,38.583099],[-85.316398,38.489991],[-85.431413,38.522852],[-85.425936,38.588575]]]}},
+{"type":"Feature","id":"21225","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-88.027483,37.799896],[-87.928898,37.903958],[-87.731728,37.635588],[-87.934375,37.482234],[-88.060345,37.504141],[-88.131545,37.575342],[-88.027483,37.799896]]]}},
+{"type":"Feature","id":"21227","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-86.400832,37.170048],[-86.116031,37.060509],[-86.165323,36.934539],[-86.22557,36.912632],[-86.406309,36.775708],[-86.608956,36.885247],[-86.674679,37.000263],[-86.400832,37.170048]]]}},
+{"type":"Feature","id":"21229","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-85.152089,37.898481],[-85.031597,37.893004],[-85.02612,37.679403],[-85.031597,37.630111],[-85.404029,37.728696],[-85.152089,37.898481]]]}},
+{"type":"Feature","id":"21231","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-84.807042,36.989309],[-84.577011,36.868816],[-84.779657,36.605923],[-84.785134,36.605923],[-84.976827,36.616877],[-85.064458,36.857862],[-84.834427,36.994786],[-84.807042,36.989309]]]}},
+{"type":"Feature","id":"21233","properties":{"name":"Webster"},"geometry":{"type":"Polygon","coordinates":[[[-87.49622,37.646542],[-87.375727,37.569865],[-87.813882,37.350787],[-87.802929,37.378172],[-87.934375,37.482234],[-87.731728,37.635588],[-87.49622,37.646542]]]}},
+{"type":"Feature","id":"21235","properties":{"name":"Whitley"},"geometry":{"type":"Polygon","coordinates":[[[-84.122425,36.967401],[-84.089563,36.956447],[-83.875962,36.688077],[-83.930732,36.589492],[-83.985501,36.589492],[-84.226487,36.589492],[-84.297687,36.945493],[-84.122425,36.967401]]]}},
+{"type":"Feature","id":"21237","properties":{"name":"Wolfe"},"geometry":{"type":"Polygon","coordinates":[[[-83.607592,37.827281],[-83.492576,37.860142],[-83.262545,37.712265],[-83.246114,37.668449],[-83.377561,37.695834],[-83.519961,37.641065],[-83.706177,37.717742],[-83.6295,37.827281],[-83.607592,37.827281]]]}},
+{"type":"Feature","id":"21239","properties":{"name":"Woodford"},"geometry":{"type":"Polygon","coordinates":[[[-84.867289,38.117559],[-84.724888,38.194236],[-84.626303,38.117559],[-84.659165,38.002543],[-84.708457,37.860142],[-84.796088,37.969681],[-84.867289,38.117559]]]}},
+{"type":"Feature","id":"22001","properties":{"name":"Acadia"},"geometry":{"type":"Polygon","coordinates":[[[-92.63359,30.482704],[-92.49119,30.482704],[-92.140665,30.296488],[-92.283066,30.14861],[-92.628113,30.093841],[-92.63359,30.482704]]]}},
+{"type":"Feature","id":"22003","properties":{"name":"Allen"},"geometry":{"type":"Polygon","coordinates":[[[-92.660975,30.898951],[-92.595251,30.893474],[-92.628113,30.488181],[-92.770513,30.488181],[-93.131992,30.422457],[-92.978637,30.877043],[-92.825283,30.887997],[-92.660975,30.898951]]]}},
+{"type":"Feature","id":"22005","properties":{"name":"Ascension"},"geometry":{"type":"Polygon","coordinates":[[[-90.891923,30.34578],[-90.634507,30.219811],[-90.639984,30.165041],[-90.963123,30.066456],[-91.078139,30.07741],[-91.105524,30.060979],[-91.023369,30.323872],[-90.891923,30.34578]]]}},
+{"type":"Feature","id":"22007","properties":{"name":"Assumption"},"geometry":{"type":"Polygon","coordinates":[[[-91.078139,30.07741],[-90.963123,30.066456],[-90.886446,29.907625],[-91.006939,29.715932],[-91.083616,29.628301],[-91.100047,29.699501],[-91.253401,29.973348],[-91.226016,30.022641],[-91.105524,30.060979],[-91.078139,30.07741]]]}},
+{"type":"Feature","id":"22009","properties":{"name":"Avoyelles"},"geometry":{"type":"Polygon","coordinates":[[[-92.085896,31.337106],[-92.009219,31.326153],[-91.833957,31.265906],[-91.724418,31.046829],[-91.751803,31.019444],[-91.762756,31.00849],[-91.817526,30.849659],[-92.085896,30.849659],[-92.211866,30.849659],[-92.283066,30.964674],[-92.085896,31.337106]]]}},
+{"type":"Feature","id":"22011","properties":{"name":"Beauregard"},"geometry":{"type":"Polygon","coordinates":[[[-93.011499,30.877043],[-92.978637,30.877043],[-93.131992,30.422457],[-93.131992,30.40055],[-93.460608,30.488181],[-93.739932,30.40055],[-93.559193,30.86609],[-93.011499,30.877043]]]}},
+{"type":"Feature","id":"22013","properties":{"name":"Bienville"},"geometry":{"type":"Polygon","coordinates":[[[-92.912914,32.585849],[-92.880052,32.585849],[-92.77599,32.454402],[-92.814329,32.147694],[-92.940299,32.147694],[-93.131992,32.147694],[-93.186761,32.147694],[-93.427746,32.235325],[-93.372977,32.410587],[-93.181284,32.585849],[-92.912914,32.585849]]]}},
+{"type":"Feature","id":"22015","properties":{"name":"Bossier"},"geometry":{"type":"Polygon","coordinates":[[[-93.805655,33.018527],[-93.520854,33.018527],[-93.372977,32.410587],[-93.427746,32.235325],[-93.471562,32.235325],[-93.816609,33.018527],[-93.805655,33.018527]]]}},
+{"type":"Feature","id":"22017","properties":{"name":"Caddo"},"geometry":{"type":"Polygon","coordinates":[[[-93.816609,33.018527],[-93.471562,32.235325],[-93.613962,32.235325],[-93.750886,32.339387],[-94.041164,32.196986],[-94.041164,32.394156],[-94.041164,32.695388],[-94.041164,32.881604],[-94.041164,33.018527],[-93.816609,33.018527]]]}},
+{"type":"Feature","id":"22019","properties":{"name":"Calcasieu"},"geometry":{"type":"Polygon","coordinates":[[[-93.460608,30.488181],[-93.131992,30.40055],[-92.995068,30.039072],[-93.372977,30.050025],[-93.723501,30.050025],[-93.70707,30.247195],[-93.739932,30.40055],[-93.460608,30.488181]]]}},
+{"type":"Feature","id":"22021","properties":{"name":"Caldwell"},"geometry":{"type":"Polygon","coordinates":[[[-92.16805,32.27914],[-92.036603,32.27914],[-91.894203,32.153171],[-91.888726,31.972432],[-92.003742,31.928616],[-92.184481,31.928616],[-92.31045,31.928616],[-92.31045,32.147694],[-92.31045,32.27914],[-92.16805,32.27914]]]}},
+{"type":"Feature","id":"22023","properties":{"name":"Cameron"},"geometry":{"type":"Polygon","coordinates":[[[-93.372977,30.050025],[-92.995068,30.039072],[-92.737652,30.039072],[-92.617159,29.579009],[-93.2251,29.776178],[-93.838517,29.688547],[-93.854948,29.863809],[-93.723501,30.050025],[-93.372977,30.050025]]]}},
+{"type":"Feature","id":"22025","properties":{"name":"Catahoula"},"geometry":{"type":"Polygon","coordinates":[[[-91.647741,31.972432],[-91.57654,31.8848],[-91.543679,31.753354],[-91.833957,31.265906],[-92.009219,31.326153],[-92.003742,31.928616],[-91.888726,31.972432],[-91.647741,31.972432]]]}},
+{"type":"Feature","id":"22027","properties":{"name":"Claiborne"},"geometry":{"type":"Polygon","coordinates":[[[-93.236053,33.018527],[-92.989591,33.018527],[-92.726698,33.01305],[-92.726698,32.761111],[-92.880052,32.585849],[-92.912914,32.585849],[-93.181284,32.585849],[-93.236053,33.018527]]]}},
+{"type":"Feature","id":"22029","properties":{"name":"Concordia"},"geometry":{"type":"Polygon","coordinates":[[[-91.428663,31.753354],[-91.379371,31.731446],[-91.587494,31.189229],[-91.636787,30.997536],[-91.664172,30.970151],[-91.658695,30.992059],[-91.724418,31.046829],[-91.833957,31.265906],[-91.543679,31.753354],[-91.428663,31.753354]]]}},
+{"type":"Feature","id":"22031","properties":{"name":"De Soto"},"geometry":{"type":"Polygon","coordinates":[[[-93.750886,32.339387],[-93.613962,32.235325],[-93.356546,31.934093],[-93.4387,31.846462],[-93.619439,31.846462],[-93.882332,31.846462],[-94.013779,31.977908],[-94.041164,32.196986],[-93.750886,32.339387]]]}},
+{"type":"Feature","id":"22033","properties":{"name":"East Baton Rouge"},"geometry":{"type":"Polygon","coordinates":[[[-90.864538,30.718212],[-90.848107,30.718212],[-90.908354,30.647012],[-90.891923,30.34578],[-91.023369,30.323872],[-91.143862,30.323872],[-91.297217,30.647012],[-90.864538,30.718212]]]}},
+{"type":"Feature","id":"22035","properties":{"name":"East Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-91.16577,33.002096],[-91.045277,32.574895],[-91.067185,32.563941],[-91.368417,32.536556],[-91.456048,32.536556],[-91.445094,32.580372],[-91.264355,33.007573],[-91.16577,33.002096]]]}},
+{"type":"Feature","id":"22037","properties":{"name":"East Feliciana"},"geometry":{"type":"Polygon","coordinates":[[[-91.061708,30.997536],[-90.8262,30.997536],[-90.848107,30.718212],[-90.864538,30.718212],[-91.297217,30.647012],[-91.302693,30.652489],[-91.176724,30.997536],[-91.061708,30.997536]]]}},
+{"type":"Feature","id":"22039","properties":{"name":"Evangeline"},"geometry":{"type":"Polygon","coordinates":[[[-92.387128,31.003013],[-92.283066,30.964674],[-92.211866,30.849659],[-92.49119,30.482704],[-92.63359,30.482704],[-92.628113,30.488181],[-92.595251,30.893474],[-92.387128,31.003013]]]}},
+{"type":"Feature","id":"22041","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-91.57654,32.40511],[-91.477956,32.40511],[-91.494386,32.202463],[-91.57654,31.8848],[-91.647741,31.972432],[-91.888726,31.972432],[-91.894203,32.153171],[-91.57654,32.40511]]]}},
+{"type":"Feature","id":"22043","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-92.36522,31.797169],[-92.195435,31.479507],[-92.721221,31.517845],[-92.97316,31.709538],[-92.36522,31.797169]]]}},
+{"type":"Feature","id":"22045","properties":{"name":"Iberia"},"geometry":{"type":"Polygon","coordinates":[[[-91.724418,30.121226],[-91.368417,30.060979],[-91.226016,30.022641],[-91.253401,29.973348],[-91.472479,29.956917],[-91.532725,29.951441],[-91.877772,29.721409],[-91.97088,29.803563],[-91.965403,30.033595],[-91.948972,30.071933],[-91.724418,30.121226]]]}},
+{"type":"Feature","id":"22047","properties":{"name":"Iberville"},"geometry":{"type":"Polygon","coordinates":[[[-91.521771,30.499135],[-91.483432,30.499135],[-91.143862,30.323872],[-91.023369,30.323872],[-91.105524,30.060979],[-91.226016,30.022641],[-91.368417,30.060979],[-91.70251,30.499135],[-91.521771,30.499135]]]}},
+{"type":"Feature","id":"22049","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-92.578821,32.498218],[-92.414512,32.498218],[-92.31045,32.27914],[-92.31045,32.147694],[-92.814329,32.147694],[-92.77599,32.454402],[-92.578821,32.498218]]]}},
+{"type":"Feature","id":"22051","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-90.278506,30.230764],[-90.245644,30.225288],[-90.103244,30.192426],[-90.010136,29.896671],[-89.977274,29.447562],[-90.032043,29.431131],[-90.229213,29.694024],[-90.278506,30.230764]]]}},
+{"type":"Feature","id":"22053","properties":{"name":"Jefferson Davis"},"geometry":{"type":"Polygon","coordinates":[[[-92.770513,30.488181],[-92.628113,30.488181],[-92.63359,30.482704],[-92.628113,30.093841],[-92.737652,30.039072],[-92.995068,30.039072],[-93.131992,30.40055],[-93.131992,30.422457],[-92.770513,30.488181]]]}},
+{"type":"Feature","id":"22055","properties":{"name":"Lafayette"},"geometry":{"type":"Polygon","coordinates":[[[-92.053034,30.378642],[-91.987311,30.367688],[-91.948972,30.071933],[-91.965403,30.033595],[-92.250204,30.143133],[-92.283066,30.14861],[-92.140665,30.296488],[-92.053034,30.378642]]]}},
+{"type":"Feature","id":"22057","properties":{"name":"Lafourche"},"geometry":{"type":"Polygon","coordinates":[[[-90.727615,29.913102],[-90.656414,29.891194],[-90.541399,29.891194],[-90.229213,29.694024],[-90.032043,29.431131],[-90.064905,29.212054],[-90.086813,29.162761],[-90.409952,29.195623],[-90.815246,29.776178],[-91.006939,29.715932],[-90.886446,29.907625],[-90.727615,29.913102]]]}},
+{"type":"Feature","id":"22059","properties":{"name":"La Salle"},"geometry":{"type":"Polygon","coordinates":[[[-92.184481,31.928616],[-92.003742,31.928616],[-92.009219,31.326153],[-92.085896,31.337106],[-92.195435,31.479507],[-92.36522,31.797169],[-92.31045,31.928616],[-92.184481,31.928616]]]}},
+{"type":"Feature","id":"22061","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-92.726698,32.761111],[-92.414512,32.580372],[-92.414512,32.498218],[-92.578821,32.498218],[-92.77599,32.454402],[-92.880052,32.585849],[-92.726698,32.761111]]]}},
+{"type":"Feature","id":"22063","properties":{"name":"Livingston"},"geometry":{"type":"Polygon","coordinates":[[[-90.744046,30.652489],[-90.568783,30.652489],[-90.398998,30.285534],[-90.634507,30.219811],[-90.891923,30.34578],[-90.908354,30.647012],[-90.744046,30.652489]]]}},
+{"type":"Feature","id":"22065","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-91.368417,32.536556],[-91.067185,32.563941],[-91.121954,32.213417],[-91.494386,32.202463],[-91.477956,32.40511],[-91.456048,32.536556],[-91.368417,32.536556]]]}},
+{"type":"Feature","id":"22067","properties":{"name":"Morehouse"},"geometry":{"type":"Polygon","coordinates":[[[-92.069465,33.007573],[-91.461525,33.007573],[-91.43414,33.007573],[-91.636787,32.668003],[-91.910634,32.503695],[-91.998265,32.706342],[-92.063988,32.722772],[-92.069465,33.007573]]]}},
+{"type":"Feature","id":"22069","properties":{"name":"Natchitoches"},"geometry":{"type":"Polygon","coordinates":[[[-93.131992,32.147694],[-92.940299,32.147694],[-92.97316,31.709538],[-92.721221,31.517845],[-92.984114,31.34806],[-93.236053,31.364491],[-93.4387,31.846462],[-93.356546,31.934093],[-93.186761,32.147694],[-93.131992,32.147694]]]}},
+{"type":"Feature","id":"22071","properties":{"name":"Orleans"},"geometry":{"type":"Polygon","coordinates":[[[-89.900597,30.192426],[-89.62675,30.14861],[-89.856781,30.00621],[-89.862258,30.000733],[-89.911551,29.869286],[-89.988228,29.907625],[-90.010136,29.896671],[-90.103244,30.192426],[-89.900597,30.192426]]]}},
+{"type":"Feature","id":"22073","properties":{"name":"Ouachita"},"geometry":{"type":"Polygon","coordinates":[[[-91.998265,32.706342],[-91.910634,32.503695],[-92.036603,32.27914],[-92.16805,32.27914],[-92.31045,32.27914],[-92.414512,32.498218],[-92.414512,32.580372],[-92.063988,32.722772],[-91.998265,32.706342]]]}},
+{"type":"Feature","id":"22075","properties":{"name":"Plaquemines"},"geometry":{"type":"Polygon","coordinates":[[[-89.988228,29.907625],[-89.911551,29.869286],[-89.484349,29.622824],[-89.002379,29.179192],[-89.16121,29.009407],[-89.977274,29.447562],[-90.010136,29.896671],[-89.988228,29.907625]]]}},
+{"type":"Feature","id":"22077","properties":{"name":"Pointe Coupee"},"geometry":{"type":"Polygon","coordinates":[[[-91.762756,31.00849],[-91.751803,31.019444],[-91.658695,30.992059],[-91.664172,30.970151],[-91.330078,30.657966],[-91.483432,30.499135],[-91.521771,30.499135],[-91.70251,30.499135],[-91.75728,30.499135],[-91.817526,30.849659],[-91.762756,31.00849]]]}},
+{"type":"Feature","id":"22079","properties":{"name":"Rapides"},"geometry":{"type":"Polygon","coordinates":[[[-92.721221,31.517845],[-92.195435,31.479507],[-92.085896,31.337106],[-92.283066,30.964674],[-92.387128,31.003013],[-92.595251,30.893474],[-92.660975,30.898951],[-92.825283,30.887997],[-92.984114,31.34806],[-92.721221,31.517845]]]}},
+{"type":"Feature","id":"22081","properties":{"name":"Red River"},"geometry":{"type":"Polygon","coordinates":[[[-93.471562,32.235325],[-93.427746,32.235325],[-93.186761,32.147694],[-93.356546,31.934093],[-93.613962,32.235325],[-93.471562,32.235325]]]}},
+{"type":"Feature","id":"22083","properties":{"name":"Richland"},"geometry":{"type":"Polygon","coordinates":[[[-91.598448,32.668003],[-91.445094,32.580372],[-91.456048,32.536556],[-91.477956,32.40511],[-91.57654,32.40511],[-91.894203,32.153171],[-92.036603,32.27914],[-91.910634,32.503695],[-91.636787,32.668003],[-91.598448,32.668003]]]}},
+{"type":"Feature","id":"22085","properties":{"name":"Sabine"},"geometry":{"type":"Polygon","coordinates":[[[-93.619439,31.846462],[-93.4387,31.846462],[-93.236053,31.364491],[-93.553716,31.183752],[-93.603008,31.178275],[-93.83304,31.583569],[-93.882332,31.846462],[-93.619439,31.846462]]]}},
+{"type":"Feature","id":"22087","properties":{"name":"St. Bernard"},"geometry":{"type":"Polygon","coordinates":[[[-89.862258,30.000733],[-89.856781,30.00621],[-89.369334,29.913102],[-89.484349,29.622824],[-89.911551,29.869286],[-89.862258,30.000733]]]}},
+{"type":"Feature","id":"22089","properties":{"name":"St. Charles"},"geometry":{"type":"Polygon","coordinates":[[[-90.420906,30.060979],[-90.278506,30.230764],[-90.229213,29.694024],[-90.541399,29.891194],[-90.420906,30.060979]]]}},
+{"type":"Feature","id":"22091","properties":{"name":"St. Helena"},"geometry":{"type":"Polygon","coordinates":[[[-90.568783,30.997536],[-90.568783,30.652489],[-90.744046,30.652489],[-90.908354,30.647012],[-90.848107,30.718212],[-90.8262,30.997536],[-90.568783,30.997536]]]}},
+{"type":"Feature","id":"22093","properties":{"name":"St. James"},"geometry":{"type":"Polygon","coordinates":[[[-90.639984,30.165041],[-90.656414,29.891194],[-90.727615,29.913102],[-90.886446,29.907625],[-90.963123,30.066456],[-90.639984,30.165041]]]}},
+{"type":"Feature","id":"22095","properties":{"name":"St. John the Baptist"},"geometry":{"type":"Polygon","coordinates":[[[-90.398998,30.285534],[-90.278506,30.230764],[-90.420906,30.060979],[-90.541399,29.891194],[-90.656414,29.891194],[-90.639984,30.165041],[-90.634507,30.219811],[-90.398998,30.285534]]]}},
+{"type":"Feature","id":"22097","properties":{"name":"St. Landry"},"geometry":{"type":"Polygon","coordinates":[[[-92.085896,30.849659],[-91.817526,30.849659],[-91.75728,30.499135],[-91.987311,30.367688],[-92.053034,30.378642],[-92.140665,30.296488],[-92.49119,30.482704],[-92.211866,30.849659],[-92.085896,30.849659]]]}},
+{"type":"Feature","id":"22099","properties":{"name":"St. Martin"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-91.75728,30.499135],[-91.70251,30.499135],[-91.368417,30.060979],[-91.724418,30.121226],[-91.948972,30.071933],[-91.987311,30.367688],[-91.75728,30.499135]]],[[[-91.472479,29.956917],[-91.253401,29.973348],[-91.100047,29.699501],[-91.472479,29.956917]]]]}},
+{"type":"Feature","id":"22101","properties":{"name":"St. Mary"},"geometry":{"type":"Polygon","coordinates":[[[-91.532725,29.951441],[-91.472479,29.956917],[-91.100047,29.699501],[-91.083616,29.628301],[-91.275309,29.474947],[-91.877772,29.721409],[-91.532725,29.951441]]]}},
+{"type":"Feature","id":"22103","properties":{"name":"St. Tammany"},"geometry":{"type":"Polygon","coordinates":[[[-90.256598,30.712735],[-89.84035,30.663443],[-89.686996,30.460796],[-89.522688,30.181472],[-89.62675,30.14861],[-89.900597,30.192426],[-90.103244,30.192426],[-90.245644,30.225288],[-90.256598,30.712735]]]}},
+{"type":"Feature","id":"22105","properties":{"name":"Tangipahoa"},"geometry":{"type":"Polygon","coordinates":[[[-90.371614,30.997536],[-90.349706,31.003013],[-90.256598,30.712735],[-90.245644,30.225288],[-90.278506,30.230764],[-90.398998,30.285534],[-90.568783,30.652489],[-90.568783,30.997536],[-90.546876,30.997536],[-90.371614,30.997536]]]}},
+{"type":"Feature","id":"22107","properties":{"name":"Tensas"},"geometry":{"type":"Polygon","coordinates":[[[-91.494386,32.202463],[-91.121954,32.213417],[-91.050754,32.125786],[-91.028846,32.120309],[-91.028846,32.114832],[-91.247924,31.86837],[-91.346509,31.753354],[-91.379371,31.731446],[-91.428663,31.753354],[-91.543679,31.753354],[-91.57654,31.8848],[-91.494386,32.202463]]]}},
+{"type":"Feature","id":"22109","properties":{"name":"Terrebonne"},"geometry":{"type":"Polygon","coordinates":[[[-90.815246,29.776178],[-90.409952,29.195623],[-90.837154,29.036791],[-91.275309,29.474947],[-91.083616,29.628301],[-91.006939,29.715932],[-90.815246,29.776178]]]}},
+{"type":"Feature","id":"22111","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-92.710267,33.01305],[-92.069465,33.007573],[-92.063988,32.722772],[-92.414512,32.580372],[-92.726698,32.761111],[-92.726698,33.01305],[-92.710267,33.01305]]]}},
+{"type":"Feature","id":"22113","properties":{"name":"Vermilion"},"geometry":{"type":"Polygon","coordinates":[[[-92.250204,30.143133],[-91.965403,30.033595],[-91.97088,29.803563],[-91.998265,29.61187],[-92.04208,29.579009],[-92.617159,29.579009],[-92.737652,30.039072],[-92.628113,30.093841],[-92.283066,30.14861],[-92.250204,30.143133]]]}},
+{"type":"Feature","id":"22115","properties":{"name":"Vernon"},"geometry":{"type":"Polygon","coordinates":[[[-93.236053,31.364491],[-92.984114,31.34806],[-92.825283,30.887997],[-92.978637,30.877043],[-93.011499,30.877043],[-93.559193,30.86609],[-93.553716,31.183752],[-93.236053,31.364491]]]}},
+{"type":"Feature","id":"22117","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-89.834873,31.003013],[-89.730812,31.003013],[-89.84035,30.663443],[-90.256598,30.712735],[-90.349706,31.003013],[-90.262075,31.003013],[-89.834873,31.003013]]]}},
+{"type":"Feature","id":"22119","properties":{"name":"Webster"},"geometry":{"type":"Polygon","coordinates":[[[-93.49347,33.018527],[-93.487993,33.018527],[-93.236053,33.018527],[-93.181284,32.585849],[-93.372977,32.410587],[-93.520854,33.018527],[-93.49347,33.018527]]]}},
+{"type":"Feature","id":"22121","properties":{"name":"West Baton Rouge"},"geometry":{"type":"Polygon","coordinates":[[[-91.330078,30.657966],[-91.302693,30.652489],[-91.297217,30.647012],[-91.143862,30.323872],[-91.483432,30.499135],[-91.330078,30.657966]]]}},
+{"type":"Feature","id":"22123","properties":{"name":"West Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-91.30817,33.007573],[-91.264355,33.007573],[-91.445094,32.580372],[-91.598448,32.668003],[-91.636787,32.668003],[-91.43414,33.007573],[-91.30817,33.007573]]]}},
+{"type":"Feature","id":"22125","properties":{"name":"West Feliciana"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-91.724418,31.046829],[-91.658695,30.992059],[-91.751803,31.019444],[-91.724418,31.046829]]],[[[-91.636787,30.997536],[-91.176724,30.997536],[-91.302693,30.652489],[-91.330078,30.657966],[-91.664172,30.970151],[-91.636787,30.997536]]]]}},
+{"type":"Feature","id":"22127","properties":{"name":"Winn"},"geometry":{"type":"Polygon","coordinates":[[[-92.940299,32.147694],[-92.814329,32.147694],[-92.31045,32.147694],[-92.31045,31.928616],[-92.36522,31.797169],[-92.97316,31.709538],[-92.940299,32.147694]]]}},
+{"type":"Feature","id":"23001","properties":{"name":"Androscoggin"},"geometry":{"type":"Polygon","coordinates":[[[-70.172658,44.481763],[-70.128842,44.48724],[-70.002872,44.125762],[-70.035734,43.977885],[-70.479366,44.032654],[-70.238381,44.459856],[-70.172658,44.481763]]]}},
+{"type":"Feature","id":"23003","properties":{"name":"Aroostook"},"geometry":{"type":"Polygon","coordinates":[[[-67.806619,45.681213],[-68.047605,45.637398],[-68.43099,45.577151],[-68.513145,46.382262],[-68.819853,46.393216],[-68.819853,46.573955],[-69.723548,46.573955],[-70.02478,46.573955],[-69.225147,47.461219],[-68.902007,47.176418],[-68.233821,47.357157],[-67.790188,47.066879],[-67.806619,45.681213]]]}},
+{"type":"Feature","id":"23005","properties":{"name":"Cumberland"},"geometry":{"type":"Polygon","coordinates":[[[-70.676536,44.142193],[-70.479366,44.032654],[-70.035734,43.977885],[-69.887857,43.775238],[-70.353397,43.534253],[-70.780598,43.813577],[-70.676536,44.142193]]]}},
+{"type":"Feature","id":"23007","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-70.550566,45.670259],[-70.41912,45.144473],[-69.931672,44.61321],[-70.128842,44.48724],[-70.172658,44.481763],[-70.238381,44.459856],[-70.769644,44.733703],[-70.835367,45.27592],[-70.550566,45.670259]]]}},
+{"type":"Feature","id":"23009","properties":{"name":"Hancock"},"geometry":{"type":"Polygon","coordinates":[[[-68.058559,45.254012],[-67.954497,44.41604],[-68.797945,44.470809],[-68.814376,44.68441],[-68.058559,45.254012]]]}},
+{"type":"Feature","id":"23011","properties":{"name":"Kennebec"},"geometry":{"type":"Polygon","coordinates":[[[-69.581148,44.706318],[-69.471609,44.695364],[-69.504471,44.34484],[-69.75641,44.136716],[-70.002872,44.125762],[-70.128842,44.48724],[-69.931672,44.61321],[-69.581148,44.706318]]]}},
+{"type":"Feature","id":"23013","properties":{"name":"Knox"},"geometry":{"type":"Polygon","coordinates":[[[-69.411363,44.328409],[-69.027977,44.251732],[-69.373024,43.966931],[-69.411363,44.328409]]]}},
+{"type":"Feature","id":"23015","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-69.411363,44.328409],[-69.373024,43.966931],[-69.696164,43.82453],[-69.75641,44.136716],[-69.504471,44.34484],[-69.411363,44.328409]]]}},
+{"type":"Feature","id":"23017","properties":{"name":"Oxford"},"geometry":{"type":"Polygon","coordinates":[[[-70.835367,45.27592],[-70.769644,44.733703],[-70.238381,44.459856],[-70.479366,44.032654],[-70.676536,44.142193],[-70.780598,43.813577],[-70.988722,43.791669],[-71.010629,44.284593],[-71.08183,45.303304],[-70.835367,45.27592]]]}},
+{"type":"Feature","id":"23019","properties":{"name":"Penobscot"},"geometry":{"type":"Polygon","coordinates":[[[-68.513145,46.382262],[-68.43099,45.577151],[-68.047605,45.637398],[-68.058559,45.254012],[-68.814376,44.68441],[-69.268962,44.722749],[-69.356593,45.073273],[-68.776038,45.243058],[-68.819853,46.393216],[-68.513145,46.382262]]]}},
+{"type":"Feature","id":"23021","properties":{"name":"Piscataquis"},"geometry":{"type":"Polygon","coordinates":[[[-68.819853,46.393216],[-68.776038,45.243058],[-69.356593,45.073273],[-69.619487,45.013027],[-69.822133,45.74146],[-69.723548,46.573955],[-68.819853,46.573955],[-68.819853,46.393216]]]}},
+{"type":"Feature","id":"23023","properties":{"name":"Sagadahoc"},"geometry":{"type":"Polygon","coordinates":[[[-69.75641,44.136716],[-69.696164,43.82453],[-69.887857,43.775238],[-70.035734,43.977885],[-70.002872,44.125762],[-69.75641,44.136716]]]}},
+{"type":"Feature","id":"23025","properties":{"name":"Somerset"},"geometry":{"type":"Polygon","coordinates":[[[-69.723548,46.573955],[-69.822133,45.74146],[-69.619487,45.013027],[-69.356593,45.073273],[-69.268962,44.722749],[-69.471609,44.695364],[-69.581148,44.706318],[-69.931672,44.61321],[-70.41912,45.144473],[-70.550566,45.670259],[-70.02478,46.573955],[-69.723548,46.573955]]]}},
+{"type":"Feature","id":"23027","properties":{"name":"Waldo"},"geometry":{"type":"Polygon","coordinates":[[[-69.471609,44.695364],[-69.268962,44.722749],[-68.814376,44.68441],[-68.797945,44.470809],[-69.027977,44.251732],[-69.411363,44.328409],[-69.504471,44.34484],[-69.471609,44.695364]]]}},
+{"type":"Feature","id":"23029","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-67.954497,44.41604],[-68.058559,45.254012],[-68.047605,45.637398],[-67.806619,45.681213],[-66.979601,44.804903],[-67.954497,44.41604]]]}},
+{"type":"Feature","id":"23031","properties":{"name":"York"},"geometry":{"type":"Polygon","coordinates":[[[-70.780598,43.813577],[-70.353397,43.534253],[-70.703921,43.057759],[-70.818936,43.123482],[-70.961337,43.53973],[-70.988722,43.791669],[-70.780598,43.813577]]]}},
+{"type":"Feature","id":"24001","properties":{"name":"Allegany"},"geometry":{"type":"Polygon","coordinates":[[[-78.809792,39.722302],[-78.382591,39.722302],[-78.344253,39.722302],[-78.333299,39.634671],[-78.470222,39.514178],[-78.656438,39.536086],[-78.738592,39.623717],[-79.067209,39.47584],[-78.930285,39.722302],[-78.809792,39.722302]]]}},
+{"type":"Feature","id":"24003","properties":{"name":"Anne Arundel"},"geometry":{"type":"Polygon","coordinates":[[[-76.619016,39.234854],[-76.531385,39.20747],[-76.531385,38.714545],[-76.635447,38.769315],[-76.68474,38.747407],[-76.838094,39.103408],[-76.695693,39.212947],[-76.619016,39.234854],[-76.619016,39.234854]]]}},
+{"type":"Feature","id":"24005","properties":{"name":"Baltimore"},"geometry":{"type":"Polygon","coordinates":[[[-76.70117,39.722302],[-76.569724,39.722302],[-76.328738,39.355347],[-76.525908,39.218424],[-76.651878,39.371778],[-76.619016,39.234854],[-76.695693,39.212947],[-76.881909,39.34987],[-76.788801,39.722302],[-76.70117,39.722302]]]}},
+{"type":"Feature","id":"24009","properties":{"name":"Calvert"},"geometry":{"type":"Polygon","coordinates":[[[-76.635447,38.769315],[-76.531385,38.714545],[-76.405416,38.320205],[-76.673786,38.500944],[-76.673786,38.533806],[-76.68474,38.747407],[-76.635447,38.769315]]]}},
+{"type":"Feature","id":"24011","properties":{"name":"Caroline"},"geometry":{"type":"Polygon","coordinates":[[[-75.748183,39.141746],[-75.748183,39.141746],[-75.720798,38.829561],[-75.709844,38.637868],[-75.841291,38.703591],[-75.945353,38.676207],[-75.95083,38.917192],[-75.748183,39.141746]]]}},
+{"type":"Feature","id":"24013","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-76.788801,39.722302],[-76.881909,39.34987],[-77.079079,39.366301],[-77.16671,39.355347],[-77.216003,39.722302],[-76.996925,39.722302],[-76.788801,39.722302]]]}},
+{"type":"Feature","id":"24015","properties":{"name":"Cecil"},"geometry":{"type":"Polygon","coordinates":[[[-75.808429,39.722302],[-75.786521,39.722302],[-75.764614,39.377255],[-76.000122,39.377255],[-76.076799,39.541563],[-76.235631,39.722302],[-76.137046,39.722302],[-75.808429,39.722302]]]}},
+{"type":"Feature","id":"24017","properties":{"name":"Charles"},"geometry":{"type":"Polygon","coordinates":[[[-77.046218,38.61596],[-76.673786,38.533806],[-76.673786,38.500944],[-76.706647,38.506421],[-76.832617,38.298298],[-77.128372,38.632391],[-77.084556,38.709068],[-77.046218,38.61596]]]}},
+{"type":"Feature","id":"24019","properties":{"name":"Dorchester"},"geometry":{"type":"Polygon","coordinates":[[[-75.841291,38.703591],[-75.709844,38.637868],[-75.69889,38.561191],[-75.813906,38.489991],[-75.923445,38.265436],[-76.153476,38.632391],[-75.945353,38.676207],[-75.841291,38.703591]]]}},
+{"type":"Feature","id":"24021","properties":{"name":"Frederick"},"geometry":{"type":"Polygon","coordinates":[[[-77.467942,39.722302],[-77.456988,39.722302],[-77.216003,39.722302],[-77.16671,39.355347],[-77.16671,39.355347],[-77.243388,39.317009],[-77.456988,39.218424],[-77.676066,39.322485],[-77.467942,39.722302]]]}},
+{"type":"Feature","id":"24023","properties":{"name":"Garrett"},"geometry":{"type":"Polygon","coordinates":[[[-78.930285,39.722302],[-79.067209,39.47584],[-79.275332,39.327962],[-79.488933,39.20747],[-79.477979,39.722302],[-79.390348,39.722302],[-78.930285,39.722302]]]}},
+{"type":"Feature","id":"24025","properties":{"name":"Harford"},"geometry":{"type":"Polygon","coordinates":[[[-76.241107,39.722302],[-76.235631,39.722302],[-76.076799,39.541563],[-76.328738,39.355347],[-76.569724,39.722302],[-76.241107,39.722302]]]}},
+{"type":"Feature","id":"24027","properties":{"name":"Howard"},"geometry":{"type":"Polygon","coordinates":[[[-77.079079,39.366301],[-76.881909,39.34987],[-76.695693,39.212947],[-76.838094,39.103408],[-76.887386,39.130793],[-77.16671,39.355347],[-77.16671,39.355347],[-77.079079,39.366301]]]}},
+{"type":"Feature","id":"24029","properties":{"name":"Kent"},"geometry":{"type":"Polygon","coordinates":[[[-76.000122,39.377255],[-75.764614,39.377255],[-75.759137,39.295101],[-75.75366,39.245808],[-75.846768,39.256762],[-76.158953,39.092454],[-76.000122,39.377255]]]}},
+{"type":"Feature","id":"24031","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-77.243388,39.317009],[-77.16671,39.355347],[-76.887386,39.130793],[-77.002402,38.966484],[-77.035264,38.993869],[-77.117418,38.933623],[-77.331019,39.059592],[-77.456988,39.218424],[-77.243388,39.317009]]]}},
+{"type":"Feature","id":"24033","properties":{"name":"Prince George's"},"geometry":{"type":"Polygon","coordinates":[[[-76.887386,39.130793],[-76.838094,39.103408],[-76.68474,38.747407],[-76.673786,38.533806],[-77.046218,38.61596],[-77.084556,38.709068],[-77.040741,38.785745],[-77.040741,38.791222],[-77.002402,38.966484],[-76.887386,39.130793]]]}},
+{"type":"Feature","id":"24035","properties":{"name":"Queen Anne's"},"geometry":{"type":"Polygon","coordinates":[[[-75.846768,39.256762],[-75.75366,39.245808],[-75.748183,39.141746],[-75.748183,39.141746],[-75.95083,38.917192],[-76.071322,38.9391],[-76.197292,38.851469],[-76.158953,39.092454],[-75.846768,39.256762]]]}},
+{"type":"Feature","id":"24037","properties":{"name":"St. Mary's"},"geometry":{"type":"Polygon","coordinates":[[[-76.706647,38.506421],[-76.673786,38.500944],[-76.405416,38.320205],[-76.832617,38.298298],[-76.706647,38.506421]]]}},
+{"type":"Feature","id":"24039","properties":{"name":"Somerset"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-75.62769,38.281867],[-75.611259,38.27639],[-75.622213,37.991589],[-75.671506,37.95325],[-75.863199,38.238051],[-75.62769,38.281867]]],[[[-75.994645,37.95325],[-76.016553,37.95325],[-76.043938,37.95325],[-75.994645,37.95325]]]]}},
+{"type":"Feature","id":"24041","properties":{"name":"Talbot"},"geometry":{"type":"Polygon","coordinates":[[[-76.071322,38.9391],[-75.95083,38.917192],[-75.945353,38.676207],[-76.153476,38.632391],[-76.197292,38.851469],[-76.071322,38.9391]]]}},
+{"type":"Feature","id":"24043","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-78.284006,39.722302],[-78.09779,39.722302],[-77.467942,39.722302],[-77.676066,39.322485],[-77.719881,39.322485],[-77.823943,39.492271],[-78.021113,39.61824],[-78.185421,39.694917],[-78.333299,39.634671],[-78.344253,39.722302],[-78.284006,39.722302]]]}},
+{"type":"Feature","id":"24045","properties":{"name":"Wicomico"},"geometry":{"type":"Polygon","coordinates":[[[-75.813906,38.489991],[-75.69889,38.561191],[-75.342889,38.451652],[-75.611259,38.27639],[-75.62769,38.281867],[-75.863199,38.238051],[-75.923445,38.265436],[-75.813906,38.489991]]]}},
+{"type":"Feature","id":"24047","properties":{"name":"Worcester"},"geometry":{"type":"Polygon","coordinates":[[[-75.342889,38.451652],[-75.047134,38.451652],[-75.244304,38.029928],[-75.397659,38.013497],[-75.622213,37.991589],[-75.611259,38.27639],[-75.342889,38.451652]]]}},
+{"type":"Feature","id":"24510","properties":{"name":"Baltimore"},"geometry":{"type":"Polygon","coordinates":[[[-76.651878,39.371778],[-76.525908,39.218424],[-76.531385,39.20747],[-76.619016,39.234854],[-76.619016,39.234854],[-76.651878,39.371778]]]}},
+{"type":"Feature","id":"25001","properties":{"name":"Barnstable"},"geometry":{"type":"Polygon","coordinates":[[[-70.671059,41.513262],[-70.692967,41.524216],[-70.643674,41.715908],[-70.539613,41.809016],[-69.926195,41.694001],[-70.671059,41.513262]]]}},
+{"type":"Feature","id":"25003","properties":{"name":"Berkshire"},"geometry":{"type":"Polygon","coordinates":[[[-73.267129,42.745573],[-73.020667,42.740096],[-72.976851,42.55388],[-72.998759,42.312895],[-73.053528,42.039048],[-73.486206,42.050002],[-73.49716,42.050002],[-73.35476,42.510065],[-73.267129,42.745573]]]}},
+{"type":"Feature","id":"25005","properties":{"name":"Bristol"},"geometry":{"type":"Polygon","coordinates":[[[-71.08183,42.093817],[-71.08183,42.093817],[-70.840844,41.628277],[-71.120168,41.496831],[-71.196845,41.67757],[-71.22423,41.710431],[-71.317338,41.776155],[-71.383061,41.984279],[-71.08183,42.093817]]]}},
+{"type":"Feature","id":"25009","properties":{"name":"Essex"},"geometry":{"type":"Polygon","coordinates":[[[-70.917521,42.887974],[-70.818936,42.871543],[-70.961337,42.444341],[-71.02706,42.444341],[-71.257092,42.734619],[-71.246138,42.740096],[-70.917521,42.887974]]]}},
+{"type":"Feature","id":"25011","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-73.020667,42.740096],[-72.927559,42.740096],[-72.456542,42.729142],[-72.28128,42.723665],[-72.314141,42.345757],[-72.976851,42.55388],[-73.020667,42.740096]]]}},
+{"type":"Feature","id":"25013","properties":{"name":"Hampden"},"geometry":{"type":"Polygon","coordinates":[[[-72.998759,42.312895],[-72.221033,42.247172],[-72.133402,42.028094],[-72.511311,42.033571],[-73.009713,42.039048],[-73.053528,42.039048],[-72.998759,42.312895],[-72.998759,42.312895]]]}},
+{"type":"Feature","id":"25015","properties":{"name":"Hampshire"},"geometry":{"type":"Polygon","coordinates":[[[-72.976851,42.55388],[-72.314141,42.345757],[-72.221033,42.247172],[-72.998759,42.312895],[-72.998759,42.312895],[-72.976851,42.55388]]]}},
+{"type":"Feature","id":"25017","properties":{"name":"Middlesex"},"geometry":{"type":"Polygon","coordinates":[[[-71.257092,42.734619],[-71.02706,42.444341],[-71.158507,42.329326],[-71.163984,42.301941],[-71.191368,42.280033],[-71.262569,42.329326],[-71.476169,42.154064],[-71.897894,42.712712],[-71.257092,42.734619]]]}},
+{"type":"Feature","id":"25021","properties":{"name":"Norfolk"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-71.109214,42.351234],[-71.163984,42.301941],[-71.158507,42.329326],[-71.109214,42.351234]]],[[[-71.262569,42.329326],[-71.191368,42.280033],[-71.005152,42.307418],[-70.906568,42.269079],[-70.901091,42.269079],[-71.08183,42.093817],[-71.08183,42.093817],[-71.383061,41.984279],[-71.498077,42.01714],[-71.476169,42.154064],[-71.262569,42.329326]]]]}},
+{"type":"Feature","id":"25023","properties":{"name":"Plymouth"},"geometry":{"type":"Polygon","coordinates":[[[-70.901091,42.269079],[-70.906568,42.269079],[-70.824413,42.263602],[-70.780598,42.252649],[-70.539613,41.809016],[-70.643674,41.715908],[-70.840844,41.628277],[-71.08183,42.093817],[-70.901091,42.269079]]]}},
+{"type":"Feature","id":"25025","properties":{"name":"Suffolk"},"geometry":{"type":"Polygon","coordinates":[[[-71.02706,42.444341],[-70.961337,42.444341],[-71.005152,42.307418],[-71.191368,42.280033],[-71.163984,42.301941],[-71.109214,42.351234],[-71.158507,42.329326],[-71.02706,42.444341]]]}},
+{"type":"Feature","id":"25027","properties":{"name":"Worcester"},"geometry":{"type":"Polygon","coordinates":[[[-72.28128,42.723665],[-71.930755,42.712712],[-71.897894,42.712712],[-71.476169,42.154064],[-71.498077,42.01714],[-71.799309,42.006186],[-72.100541,42.028094],[-72.133402,42.028094],[-72.221033,42.247172],[-72.314141,42.345757],[-72.28128,42.723665]]]}},
+{"type":"Feature","id":"26001","properties":{"name":"Alcona"},"geometry":{"type":"Polygon","coordinates":[[[-83.547346,44.859672],[-83.322791,44.859672],[-83.317314,44.509148],[-83.886916,44.509148],[-83.886916,44.854195],[-83.547346,44.859672]]]}},
+{"type":"Feature","id":"26003","properties":{"name":"Alger"},"geometry":{"type":"Polygon","coordinates":[[[-85.864092,46.68897],[-85.864092,46.502754],[-86.001015,46.502754],[-86.614433,46.157707],[-87.118311,46.157707],[-87.118311,46.497277],[-86.696587,46.437031],[-85.864092,46.68897]]]}},
+{"type":"Feature","id":"26005","properties":{"name":"Allegan"},"geometry":{"type":"Polygon","coordinates":[[[-86.044831,42.767481],[-85.781938,42.767481],[-85.546429,42.767481],[-85.540952,42.422434],[-85.765507,42.422434],[-85.776461,42.422434],[-86.274862,42.416957],[-86.209139,42.767481],[-86.044831,42.767481]]]}},
+{"type":"Feature","id":"26007","properties":{"name":"Alpena"},"geometry":{"type":"Polygon","coordinates":[[[-83.4871,45.204719],[-83.388515,45.204719],[-83.322791,44.859672],[-83.547346,44.859672],[-83.886916,44.854195],[-83.881439,45.204719],[-83.4871,45.204719]]]}},
+{"type":"Feature","id":"26009","properties":{"name":"Antrim"},"geometry":{"type":"Polygon","coordinates":[[[-85.321875,45.204719],[-84.856335,45.117088],[-84.845381,44.859672],[-85.250674,44.859672],[-85.332828,44.81038],[-85.42046,44.859672],[-85.442367,44.859672],[-85.387598,45.210196],[-85.321875,45.204719]]]}},
+{"type":"Feature","id":"26011","properties":{"name":"Arenac"},"geometry":{"type":"Polygon","coordinates":[[[-83.569254,44.164101],[-83.563777,44.164101],[-83.908824,43.912162],[-84.105994,43.999793],[-84.16624,43.994316],[-84.16624,44.164101],[-83.886916,44.164101],[-83.569254,44.164101]]]}},
+{"type":"Feature","id":"26013","properties":{"name":"Baraga"},"geometry":{"type":"Polygon","coordinates":[[[-88.043914,46.913525],[-88.115114,46.4206],[-88.679239,46.4206],[-88.449208,46.94091],[-88.043914,46.913525]]]}},
+{"type":"Feature","id":"26015","properties":{"name":"Barry"},"geometry":{"type":"Polygon","coordinates":[[[-85.130182,42.772958],[-85.075412,42.772958],[-85.069935,42.422434],[-85.299967,42.416957],[-85.540952,42.422434],[-85.546429,42.767481],[-85.310921,42.767481],[-85.130182,42.772958]]]}},
+{"type":"Feature","id":"26017","properties":{"name":"Bay"},"geometry":{"type":"Polygon","coordinates":[[[-84.105994,43.999793],[-83.908824,43.912162],[-83.7007,43.594499],[-83.7007,43.479483],[-84.138855,43.567114],[-84.16624,43.567114],[-84.16624,43.82453],[-84.16624,43.994316],[-84.105994,43.999793]]]}},
+{"type":"Feature","id":"26019","properties":{"name":"Benzie"},"geometry":{"type":"Polygon","coordinates":[[[-86.039354,44.777518],[-85.814799,44.772041],[-85.814799,44.514625],[-86.181754,44.520102],[-86.231047,44.520102],[-86.072215,44.777518],[-86.039354,44.777518]]]}},
+{"type":"Feature","id":"26021","properties":{"name":"Berrien"},"geometry":{"type":"Polygon","coordinates":[[[-86.302247,42.241695],[-86.22557,42.07191],[-86.22557,41.759724],[-86.521325,41.759724],[-86.822556,41.759724],[-86.362493,42.241695],[-86.302247,42.241695]]]}},
+{"type":"Feature","id":"26023","properties":{"name":"Branch"},"geometry":{"type":"Polygon","coordinates":[[[-85.053504,42.07191],[-84.82895,42.07191],[-84.823473,41.759724],[-85.195905,41.759724],[-85.29449,41.759724],[-85.29449,42.07191],[-85.053504,42.07191]]]}},
+{"type":"Feature","id":"26025","properties":{"name":"Calhoun"},"geometry":{"type":"Polygon","coordinates":[[[-84.883719,42.422434],[-84.719411,42.422434],[-84.708457,42.07191],[-84.82895,42.07191],[-85.053504,42.07191],[-85.29449,42.07191],[-85.299967,42.416957],[-85.069935,42.422434],[-84.883719,42.422434]]]}},
+{"type":"Feature","id":"26027","properties":{"name":"Cass"},"geometry":{"type":"Polygon","coordinates":[[[-86.22557,42.07191],[-85.765507,42.07191],[-85.792891,41.759724],[-85.990061,41.759724],[-86.061262,41.759724],[-86.22557,41.759724],[-86.22557,42.07191]]]}},
+{"type":"Feature","id":"26029","properties":{"name":"Charlevoix"},"geometry":{"type":"Polygon","coordinates":[[[-85.09732,45.363551],[-84.730365,45.286874],[-84.735842,45.204719],[-84.856335,45.117088],[-85.321875,45.204719],[-85.387598,45.210196],[-85.09732,45.369028],[-85.09732,45.363551]]]}},
+{"type":"Feature","id":"26031","properties":{"name":"Cheboygan"},"geometry":{"type":"Polygon","coordinates":[[[-84.730365,45.779798],[-84.730365,45.785275],[-84.204579,45.626444],[-84.248394,45.199243],[-84.368887,45.199243],[-84.735842,45.204719],[-84.730365,45.286874],[-84.730365,45.779798]]]}},
+{"type":"Feature","id":"26033","properties":{"name":"Chippewa"},"geometry":{"type":"Polygon","coordinates":[[[-84.116948,45.976968],[-85.23972,46.245338],[-85.23972,46.754694],[-85.015166,46.480847],[-84.127902,46.530139],[-84.116948,45.976968]]]}},
+{"type":"Feature","id":"26035","properties":{"name":"Clare"},"geometry":{"type":"Polygon","coordinates":[[[-85.086366,44.164101],[-84.850858,44.158624],[-84.609872,44.158624],[-84.604395,43.813577],[-84.752273,43.813577],[-85.086366,43.813577],[-85.086366,44.164101]]]}},
+{"type":"Feature","id":"26037","properties":{"name":"Clinton"},"geometry":{"type":"Polygon","coordinates":[[[-84.719411,43.118005],[-84.368887,43.118005],[-84.36341,42.778435],[-84.604395,42.767481],[-84.834427,42.772958],[-84.834427,43.118005],[-84.719411,43.118005]]]}},
+{"type":"Feature","id":"26039","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-84.774181,44.859672],[-84.374364,44.854195],[-84.368887,44.509148],[-84.735842,44.509148],[-84.850858,44.509148],[-84.845381,44.859672],[-84.774181,44.859672]]]}},
+{"type":"Feature","id":"26041","properties":{"name":"Delta"},"geometry":{"type":"Polygon","coordinates":[[[-87.118311,46.157707],[-86.614433,46.157707],[-86.461078,45.75789],[-86.784218,45.861952],[-87.266188,45.549767],[-87.37025,45.987922],[-87.118311,46.157707]]]}},
+{"type":"Feature","id":"26043","properties":{"name":"Dickinson"},"geometry":{"type":"Polygon","coordinates":[[[-87.802929,46.245338],[-87.616713,45.987922],[-87.846744,45.725029],[-88.060345,45.779798],[-88.115114,45.922199],[-88.115114,46.245338],[-87.802929,46.245338]]]}},
+{"type":"Feature","id":"26045","properties":{"name":"Eaton"},"geometry":{"type":"Polygon","coordinates":[[[-84.834427,42.772958],[-84.604395,42.767481],[-84.598918,42.422434],[-84.719411,42.422434],[-84.883719,42.422434],[-85.069935,42.422434],[-85.075412,42.772958],[-84.834427,42.772958]]]}},
+{"type":"Feature","id":"26047","properties":{"name":"Emmet"},"geometry":{"type":"Polygon","coordinates":[[[-84.730365,45.785275],[-84.730365,45.779798],[-84.730365,45.286874],[-85.09732,45.363551],[-85.09732,45.369028],[-84.730365,45.785275]]]}},
+{"type":"Feature","id":"26049","properties":{"name":"Genesee"},"geometry":{"type":"Polygon","coordinates":[[[-83.465192,43.222067],[-83.459715,43.222067],[-83.454238,42.882497],[-83.684269,42.783912],[-83.925255,42.778435],[-83.930732,43.134436],[-83.695223,43.222067],[-83.465192,43.222067]]]}},
+{"type":"Feature","id":"26051","properties":{"name":"Gladwin"},"geometry":{"type":"Polygon","coordinates":[[[-84.248394,44.164101],[-84.16624,44.164101],[-84.16624,43.994316],[-84.16624,43.82453],[-84.368887,43.830007],[-84.604395,43.813577],[-84.609872,44.158624],[-84.368887,44.158624],[-84.248394,44.164101]]]}},
+{"type":"Feature","id":"26053","properties":{"name":"Gogebic"},"geometry":{"type":"Polygon","coordinates":[[[-89.889643,46.765647],[-89.741765,46.502754],[-88.991425,46.332969],[-88.991425,46.097461],[-89.927981,46.300108],[-90.415429,46.568478],[-89.889643,46.765647]]]}},
+{"type":"Feature","id":"26055","properties":{"name":"Grand Traverse"},"geometry":{"type":"Polygon","coordinates":[[[-85.42046,44.859672],[-85.332828,44.81038],[-85.332828,44.514625],[-85.694307,44.514625],[-85.814799,44.514625],[-85.814799,44.772041],[-85.639537,44.777518],[-85.442367,44.859672],[-85.42046,44.859672]]]}},
+{"type":"Feature","id":"26057","properties":{"name":"Gratiot"},"geometry":{"type":"Polygon","coordinates":[[[-84.774181,43.468529],[-84.609872,43.468529],[-84.368887,43.468529],[-84.368887,43.128959],[-84.368887,43.118005],[-84.719411,43.118005],[-84.834427,43.118005],[-84.845381,43.468529],[-84.774181,43.468529]]]}},
+{"type":"Feature","id":"26059","properties":{"name":"Hillsdale"},"geometry":{"type":"Polygon","coordinates":[[[-84.36341,42.07191],[-84.357933,41.704955],[-84.401749,41.704955],[-84.807042,41.694001],[-84.823473,41.759724],[-84.82895,42.07191],[-84.708457,42.07191],[-84.36341,42.07191]]]}},
+{"type":"Feature","id":"26061","properties":{"name":"Houghton"},"geometry":{"type":"Polygon","coordinates":[[[-88.383484,47.285957],[-88.23013,47.198326],[-88.449208,46.94091],[-88.679239,46.4206],[-88.712101,46.4206],[-88.991425,46.4206],[-88.931178,47.034018],[-88.514931,47.285957],[-88.383484,47.285957]]]}},
+{"type":"Feature","id":"26063","properties":{"name":"Huron"},"geometry":{"type":"Polygon","coordinates":[[[-82.605312,43.693084],[-82.69842,43.687607],[-83.120145,43.676653],[-83.465192,43.725946],[-83.465192,43.731422],[-82.917498,44.070993],[-82.605312,43.693084]]]}},
+{"type":"Feature","id":"26065","properties":{"name":"Ingham"},"geometry":{"type":"Polygon","coordinates":[[[-84.270302,42.778435],[-84.160763,42.778435],[-84.138855,42.422434],[-84.598918,42.422434],[-84.604395,42.767481],[-84.36341,42.778435],[-84.270302,42.778435]]]}},
+{"type":"Feature","id":"26067","properties":{"name":"Ionia"},"geometry":{"type":"Polygon","coordinates":[[[-85.075412,43.118005],[-84.834427,43.118005],[-84.834427,42.772958],[-85.075412,42.772958],[-85.130182,42.772958],[-85.310921,42.767481],[-85.310921,43.118005],[-85.075412,43.118005]]]}},
+{"type":"Feature","id":"26069","properties":{"name":"Iosco"},"geometry":{"type":"Polygon","coordinates":[[[-83.563777,44.164101],[-83.569254,44.164101],[-83.886916,44.164101],[-83.886916,44.509148],[-83.317314,44.509148],[-83.563777,44.164101]]]}},
+{"type":"Feature","id":"26071","properties":{"name":"Iron"},"geometry":{"type":"Polygon","coordinates":[[[-88.712101,46.4206],[-88.679239,46.4206],[-88.115114,46.4206],[-88.115114,46.245338],[-88.115114,45.922199],[-88.493023,45.993399],[-88.684716,46.015307],[-88.931178,46.075553],[-88.991425,46.097461],[-88.991425,46.332969],[-88.991425,46.4206],[-88.712101,46.4206]]]}},
+{"type":"Feature","id":"26073","properties":{"name":"Isabella"},"geometry":{"type":"Polygon","coordinates":[[[-84.752273,43.813577],[-84.604395,43.813577],[-84.609872,43.468529],[-84.774181,43.468529],[-84.845381,43.468529],[-85.086366,43.468529],[-85.086366,43.813577],[-84.752273,43.813577]]]}},
+{"type":"Feature","id":"26075","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-84.598918,42.422434],[-84.138855,42.422434],[-84.133379,42.422434],[-84.133379,42.07191],[-84.36341,42.07191],[-84.708457,42.07191],[-84.719411,42.422434],[-84.598918,42.422434]]]}},
+{"type":"Feature","id":"26077","properties":{"name":"Kalamazoo"},"geometry":{"type":"Polygon","coordinates":[[[-85.540952,42.422434],[-85.299967,42.416957],[-85.29449,42.07191],[-85.299967,42.07191],[-85.765507,42.07191],[-85.765507,42.422434],[-85.540952,42.422434]]]}},
+{"type":"Feature","id":"26079","properties":{"name":"Kalkaska"},"geometry":{"type":"Polygon","coordinates":[[[-85.250674,44.859672],[-84.845381,44.859672],[-84.850858,44.509148],[-85.332828,44.514625],[-85.332828,44.81038],[-85.250674,44.859672]]]}},
+{"type":"Feature","id":"26081","properties":{"name":"Kent"},"geometry":{"type":"Polygon","coordinates":[[[-85.524521,43.293267],[-85.310921,43.118005],[-85.310921,42.767481],[-85.546429,42.767481],[-85.781938,42.767481],[-85.792891,43.205636],[-85.792891,43.293267],[-85.56286,43.293267],[-85.524521,43.293267]]]}},
+{"type":"Feature","id":"26083","properties":{"name":"Keweenaw"},"geometry":{"type":"Polygon","coordinates":[[[-88.23013,47.198326],[-88.383484,47.285957],[-88.514931,47.285957],[-88.23013,47.198326]]]}},
+{"type":"Feature","id":"26085","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-86.044831,44.169578],[-85.820276,44.164101],[-85.56286,44.164101],[-85.56286,43.813577],[-85.63406,43.813577],[-86.039354,43.813577],[-86.044831,44.169578]]]}},
+{"type":"Feature","id":"26087","properties":{"name":"Lapeer"},"geometry":{"type":"Polygon","coordinates":[[[-83.191345,43.326129],[-83.120145,43.326129],[-82.994175,43.156344],[-82.983221,42.893451],[-83.098237,42.887974],[-83.454238,42.882497],[-83.459715,43.222067],[-83.191345,43.326129]]]}},
+{"type":"Feature","id":"26089","properties":{"name":"Leelanau"},"geometry":{"type":"Polygon","coordinates":[[[-85.639537,44.777518],[-85.814799,44.772041],[-86.039354,44.777518],[-86.072215,44.777518],[-85.617629,45.188289],[-85.639537,44.777518]]]}},
+{"type":"Feature","id":"26091","properties":{"name":"Lenawee"},"geometry":{"type":"Polygon","coordinates":[[[-83.7719,42.082863],[-83.760947,41.721385],[-83.881439,41.721385],[-83.89787,41.721385],[-84.357933,41.704955],[-84.36341,42.07191],[-84.133379,42.07191],[-83.7719,42.082863]]]}},
+{"type":"Feature","id":"26093","properties":{"name":"Livingston"},"geometry":{"type":"Polygon","coordinates":[[[-83.684269,42.783912],[-83.662362,42.433388],[-84.133379,42.422434],[-84.138855,42.422434],[-84.160763,42.778435],[-83.925255,42.778435],[-83.684269,42.783912]]]}},
+{"type":"Feature","id":"26095","properties":{"name":"Luce"},"geometry":{"type":"Polygon","coordinates":[[[-85.23972,46.754694],[-85.23972,46.245338],[-85.36569,46.245338],[-85.864092,46.245338],[-85.864092,46.502754],[-85.864092,46.68897],[-85.23972,46.754694]]]}},
+{"type":"Feature","id":"26097","properties":{"name":"Mackinac"},"geometry":{"type":"Polygon","coordinates":[[[-85.36569,46.245338],[-85.23972,46.245338],[-84.116948,45.976968],[-84.70298,45.850998],[-85.513567,46.097461],[-85.864092,45.966014],[-85.864092,46.245338],[-85.36569,46.245338]]]}},
+{"type":"Feature","id":"26099","properties":{"name":"Macomb"},"geometry":{"type":"Polygon","coordinates":[[[-82.742236,42.898928],[-82.703897,42.685327],[-82.868205,42.449818],[-82.879159,42.449818],[-83.081806,42.449818],[-83.098237,42.887974],[-82.983221,42.893451],[-82.742236,42.898928]]]}},
+{"type":"Feature","id":"26101","properties":{"name":"Manistee"},"geometry":{"type":"Polygon","coordinates":[[[-86.181754,44.520102],[-85.814799,44.514625],[-85.820276,44.164101],[-86.044831,44.169578],[-86.384401,44.180532],[-86.231047,44.520102],[-86.181754,44.520102]]]}},
+{"type":"Feature","id":"26103","properties":{"name":"Marquette"},"geometry":{"type":"Polygon","coordinates":[[[-87.118311,46.497277],[-87.118311,46.157707],[-87.37025,45.987922],[-87.616713,45.987922],[-87.802929,46.245338],[-88.115114,46.245338],[-88.115114,46.4206],[-88.043914,46.913525],[-87.118311,46.497277]]]}},
+{"type":"Feature","id":"26105","properties":{"name":"Mason"},"geometry":{"type":"Polygon","coordinates":[[[-86.384401,44.180532],[-86.044831,44.169578],[-86.039354,43.813577],[-86.433693,43.819054],[-86.384401,44.180532]]]}},
+{"type":"Feature","id":"26107","properties":{"name":"Mecosta"},"geometry":{"type":"Polygon","coordinates":[[[-85.540952,43.813577],[-85.086366,43.813577],[-85.086366,43.468529],[-85.551906,43.468529],[-85.56286,43.468529],[-85.56286,43.813577],[-85.540952,43.813577]]]}},
+{"type":"Feature","id":"26109","properties":{"name":"Menominee"},"geometry":{"type":"Polygon","coordinates":[[[-87.616713,45.987922],[-87.37025,45.987922],[-87.266188,45.549767],[-87.589328,45.095181],[-87.846744,45.725029],[-87.616713,45.987922]]]}},
+{"type":"Feature","id":"26111","properties":{"name":"Midland"},"geometry":{"type":"Polygon","coordinates":[[[-84.368887,43.830007],[-84.16624,43.82453],[-84.16624,43.567114],[-84.368887,43.468529],[-84.609872,43.468529],[-84.604395,43.813577],[-84.368887,43.830007]]]}},
+{"type":"Feature","id":"26113","properties":{"name":"Missaukee"},"geometry":{"type":"Polygon","coordinates":[[[-85.332828,44.514625],[-84.850858,44.509148],[-84.850858,44.158624],[-85.086366,44.164101],[-85.332828,44.164101],[-85.332828,44.514625]]]}},
+{"type":"Feature","id":"26115","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-83.421376,42.093817],[-83.185868,42.033571],[-83.454238,41.732339],[-83.760947,41.721385],[-83.7719,42.082863],[-83.541869,42.082863],[-83.421376,42.093817]]]}},
+{"type":"Feature","id":"26117","properties":{"name":"Montcalm"},"geometry":{"type":"Polygon","coordinates":[[[-85.551906,43.468529],[-85.086366,43.468529],[-84.845381,43.468529],[-84.834427,43.118005],[-85.075412,43.118005],[-85.310921,43.118005],[-85.524521,43.293267],[-85.56286,43.293267],[-85.56286,43.468529],[-85.551906,43.468529]]]}},
+{"type":"Feature","id":"26119","properties":{"name":"Montmorency"},"geometry":{"type":"Polygon","coordinates":[[[-84.199102,45.199243],[-83.881439,45.204719],[-83.886916,44.854195],[-83.952639,44.854195],[-84.374364,44.854195],[-84.368887,45.199243],[-84.248394,45.199243],[-84.199102,45.199243]]]}},
+{"type":"Feature","id":"26121","properties":{"name":"Muskegon"},"geometry":{"type":"Polygon","coordinates":[[[-86.411786,43.474006],[-86.039354,43.468529],[-85.792891,43.293267],[-85.792891,43.205636],[-86.269385,43.118005],[-86.461078,43.474006],[-86.411786,43.474006]]]}},
+{"type":"Feature","id":"26123","properties":{"name":"Newaygo"},"geometry":{"type":"Polygon","coordinates":[[[-85.63406,43.813577],[-85.56286,43.813577],[-85.56286,43.468529],[-85.56286,43.293267],[-85.792891,43.293267],[-86.039354,43.468529],[-86.039354,43.813577],[-85.63406,43.813577]]]}},
+{"type":"Feature","id":"26125","properties":{"name":"Oakland"},"geometry":{"type":"Polygon","coordinates":[[[-83.098237,42.887974],[-83.081806,42.449818],[-83.552823,42.433388],[-83.662362,42.433388],[-83.684269,42.783912],[-83.454238,42.882497],[-83.098237,42.887974]]]}},
+{"type":"Feature","id":"26127","properties":{"name":"Oceana"},"geometry":{"type":"Polygon","coordinates":[[[-86.433693,43.819054],[-86.039354,43.813577],[-86.039354,43.468529],[-86.411786,43.474006],[-86.461078,43.474006],[-86.433693,43.819054]]]}},
+{"type":"Feature","id":"26129","properties":{"name":"Ogemaw"},"geometry":{"type":"Polygon","coordinates":[[[-83.925255,44.509148],[-83.886916,44.509148],[-83.886916,44.164101],[-84.16624,44.164101],[-84.248394,44.164101],[-84.368887,44.158624],[-84.368887,44.509148],[-83.925255,44.509148]]]}},
+{"type":"Feature","id":"26131","properties":{"name":"Ontonagon"},"geometry":{"type":"Polygon","coordinates":[[[-88.931178,47.034018],[-88.991425,46.4206],[-88.991425,46.332969],[-89.741765,46.502754],[-89.889643,46.765647],[-88.931178,47.034018]]]}},
+{"type":"Feature","id":"26133","properties":{"name":"Osceola"},"geometry":{"type":"Polygon","coordinates":[[[-85.486183,44.164101],[-85.332828,44.164101],[-85.086366,44.164101],[-85.086366,43.813577],[-85.540952,43.813577],[-85.56286,43.813577],[-85.56286,44.164101],[-85.486183,44.164101]]]}},
+{"type":"Feature","id":"26135","properties":{"name":"Oscoda"},"geometry":{"type":"Polygon","coordinates":[[[-83.952639,44.854195],[-83.886916,44.854195],[-83.886916,44.509148],[-83.925255,44.509148],[-84.368887,44.509148],[-84.374364,44.854195],[-83.952639,44.854195]]]}},
+{"type":"Feature","id":"26137","properties":{"name":"Otsego"},"geometry":{"type":"Polygon","coordinates":[[[-84.735842,45.204719],[-84.368887,45.199243],[-84.374364,44.854195],[-84.774181,44.859672],[-84.845381,44.859672],[-84.856335,45.117088],[-84.735842,45.204719]]]}},
+{"type":"Feature","id":"26139","properties":{"name":"Ottawa"},"geometry":{"type":"Polygon","coordinates":[[[-85.792891,43.205636],[-85.781938,42.767481],[-86.044831,42.767481],[-86.209139,42.767481],[-86.269385,43.118005],[-85.792891,43.205636]]]}},
+{"type":"Feature","id":"26141","properties":{"name":"Presque Isle"},"geometry":{"type":"Polygon","coordinates":[[[-83.388515,45.204719],[-83.4871,45.204719],[-83.881439,45.204719],[-84.199102,45.199243],[-84.248394,45.199243],[-84.204579,45.626444],[-83.388515,45.204719]]]}},
+{"type":"Feature","id":"26143","properties":{"name":"Roscommon"},"geometry":{"type":"Polygon","coordinates":[[[-84.735842,44.509148],[-84.368887,44.509148],[-84.368887,44.158624],[-84.609872,44.158624],[-84.850858,44.158624],[-84.850858,44.509148],[-84.735842,44.509148]]]}},
+{"type":"Feature","id":"26145","properties":{"name":"Saginaw"},"geometry":{"type":"Polygon","coordinates":[[[-84.138855,43.567114],[-83.7007,43.479483],[-83.695223,43.222067],[-83.930732,43.134436],[-83.941686,43.134436],[-84.368887,43.128959],[-84.368887,43.468529],[-84.16624,43.567114],[-84.138855,43.567114]]]}},
+{"type":"Feature","id":"26147","properties":{"name":"St. Clair"},"geometry":{"type":"Polygon","coordinates":[[[-82.566974,43.167298],[-82.50125,43.167298],[-82.703897,42.685327],[-82.742236,42.898928],[-82.983221,42.893451],[-82.994175,43.156344],[-82.566974,43.167298]]]}},
+{"type":"Feature","id":"26149","properties":{"name":"St. Joseph"},"geometry":{"type":"Polygon","coordinates":[[[-85.299967,42.07191],[-85.29449,42.07191],[-85.29449,41.759724],[-85.371167,41.759724],[-85.661445,41.759724],[-85.792891,41.759724],[-85.765507,42.07191],[-85.299967,42.07191]]]}},
+{"type":"Feature","id":"26151","properties":{"name":"Sanilac"},"geometry":{"type":"Polygon","coordinates":[[[-82.69842,43.687607],[-82.605312,43.693084],[-82.50125,43.167298],[-82.566974,43.167298],[-82.994175,43.156344],[-83.120145,43.326129],[-83.120145,43.676653],[-82.69842,43.687607]]]}},
+{"type":"Feature","id":"26153","properties":{"name":"Schoolcraft"},"geometry":{"type":"Polygon","coordinates":[[[-86.001015,46.502754],[-85.864092,46.502754],[-85.864092,46.245338],[-85.864092,45.966014],[-86.461078,45.75789],[-86.614433,46.157707],[-86.001015,46.502754]]]}},
+{"type":"Feature","id":"26155","properties":{"name":"Shiawassee"},"geometry":{"type":"Polygon","coordinates":[[[-83.941686,43.134436],[-83.930732,43.134436],[-83.925255,42.778435],[-84.160763,42.778435],[-84.270302,42.778435],[-84.36341,42.778435],[-84.368887,43.118005],[-84.368887,43.128959],[-83.941686,43.134436]]]}},
+{"type":"Feature","id":"26157","properties":{"name":"Tuscola"},"geometry":{"type":"Polygon","coordinates":[[[-83.465192,43.725946],[-83.120145,43.676653],[-83.120145,43.326129],[-83.191345,43.326129],[-83.459715,43.222067],[-83.465192,43.222067],[-83.695223,43.222067],[-83.7007,43.479483],[-83.7007,43.594499],[-83.465192,43.731422],[-83.465192,43.725946]]]}},
+{"type":"Feature","id":"26159","properties":{"name":"Van Buren"},"geometry":{"type":"Polygon","coordinates":[[[-85.776461,42.422434],[-85.765507,42.422434],[-85.765507,42.07191],[-86.22557,42.07191],[-86.302247,42.241695],[-86.362493,42.241695],[-86.274862,42.416957],[-85.776461,42.422434]]]}},
+{"type":"Feature","id":"26161","properties":{"name":"Washtenaw"},"geometry":{"type":"Polygon","coordinates":[[[-83.552823,42.433388],[-83.541869,42.082863],[-83.7719,42.082863],[-84.133379,42.07191],[-84.133379,42.422434],[-83.662362,42.433388],[-83.552823,42.433388]]]}},
+{"type":"Feature","id":"26163","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-82.879159,42.449818],[-82.868205,42.449818],[-83.185868,42.033571],[-83.421376,42.093817],[-83.541869,42.082863],[-83.552823,42.433388],[-83.081806,42.449818],[-82.879159,42.449818]]]}},
+{"type":"Feature","id":"26165","properties":{"name":"Wexford"},"geometry":{"type":"Polygon","coordinates":[[[-85.694307,44.514625],[-85.332828,44.514625],[-85.332828,44.164101],[-85.486183,44.164101],[-85.56286,44.164101],[-85.820276,44.164101],[-85.814799,44.514625],[-85.694307,44.514625]]]}},
+{"type":"Feature","id":"27001","properties":{"name":"Aitkin"},"geometry":{"type":"Polygon","coordinates":[[[-93.712547,47.028541],[-93.055314,47.028541],[-93.060791,46.765647],[-93.055314,46.4206],[-93.055314,46.157707],[-93.307254,46.157707],[-93.433223,46.15223],[-93.553716,46.245338],[-93.794701,46.245338],[-93.778271,46.803986],[-93.772794,47.028541],[-93.712547,47.028541]]]}},
+{"type":"Feature","id":"27003","properties":{"name":"Anoka"},"geometry":{"type":"Polygon","coordinates":[[[-93.159376,45.412843],[-93.016976,45.412843],[-93.016976,45.297827],[-93.022453,45.122565],[-93.230576,45.122565],[-93.2251,45.034934],[-93.5099,45.243058],[-93.5099,45.412843],[-93.159376,45.412843]]]}},
+{"type":"Feature","id":"27005","properties":{"name":"Becker"},"geometry":{"type":"Polygon","coordinates":[[[-95.169413,47.15451],[-95.163936,46.803986],[-95.163936,46.716355],[-96.17717,46.716355],[-96.193601,47.149033],[-96.067632,47.149033],[-95.552799,47.149033],[-95.169413,47.15451]]]}},
+{"type":"Feature","id":"27007","properties":{"name":"Beltrami"},"geometry":{"type":"Polygon","coordinates":[[[-95.344675,48.540176],[-94.430026,48.364914],[-94.419073,47.844605],[-94.413596,47.444788],[-94.671012,47.411926],[-95.185844,47.411926],[-95.22966,48.019867],[-95.580184,48.019867],[-95.591138,48.173221],[-95.602092,48.540176],[-95.344675,48.540176]]]}},
+{"type":"Feature","id":"27009","properties":{"name":"Benton"},"geometry":{"type":"Polygon","coordinates":[[[-94.008302,45.823614],[-93.76184,45.823614],[-93.76184,45.560721],[-94.150702,45.560721],[-94.271195,45.774321],[-94.008302,45.823614]]]}},
+{"type":"Feature","id":"27011","properties":{"name":"Big Stone"},"geometry":{"type":"Polygon","coordinates":[[[-96.828926,45.588105],[-96.253848,45.588105],[-96.116924,45.412843],[-96.10597,45.177335],[-96.368863,45.259489],[-96.451017,45.270443],[-96.451017,45.297827],[-96.456494,45.303304],[-96.472925,45.325212],[-96.834403,45.588105],[-96.828926,45.588105]]]}},
+{"type":"Feature","id":"27013","properties":{"name":"Blue Earth"},"geometry":{"type":"Polygon","coordinates":[[[-94.331441,44.251732],[-94.013779,44.240778],[-93.767317,44.196962],[-93.767317,43.846438],[-93.893286,43.846438],[-94.249287,43.846438],[-94.36978,43.846438],[-94.36978,44.109331],[-94.36978,44.262686],[-94.331441,44.251732]]]}},
+{"type":"Feature","id":"27015","properties":{"name":"Brown"},"geometry":{"type":"Polygon","coordinates":[[[-94.851751,44.498194],[-94.780551,44.454379],[-94.36978,44.262686],[-94.36978,44.109331],[-94.490273,44.109331],[-94.857228,44.109331],[-95.109167,44.196962],[-94.868182,44.498194],[-94.851751,44.498194]]]}},
+{"type":"Feature","id":"27017","properties":{"name":"Carlton"},"geometry":{"type":"Polygon","coordinates":[[[-92.49119,46.765647],[-92.29402,46.661586],[-92.29402,46.415123],[-92.962206,46.4206],[-93.055314,46.4206],[-93.060791,46.765647],[-92.49119,46.765647]]]}},
+{"type":"Feature","id":"27019","properties":{"name":"Carver"},"geometry":{"type":"Polygon","coordinates":[[[-94.013779,44.980165],[-93.767317,44.980165],[-93.520854,44.804903],[-93.767317,44.640595],[-94.008302,44.717272],[-94.013779,44.980165]]]}},
+{"type":"Feature","id":"27021","properties":{"name":"Cass"},"geometry":{"type":"Polygon","coordinates":[[[-94.052118,47.428357],[-93.772794,47.028541],[-93.778271,46.803986],[-94.282149,46.803986],[-94.342395,46.2782],[-94.654581,46.3494],[-94.731258,46.371308],[-94.786028,46.803986],[-94.671012,47.411926],[-94.413596,47.444788],[-94.052118,47.428357]]]}},
+{"type":"Feature","id":"27023","properties":{"name":"Chippewa"},"geometry":{"type":"Polygon","coordinates":[[[-95.574707,45.14995],[-95.246091,45.14995],[-95.246091,44.892534],[-95.481599,44.75561],[-95.733538,44.930872],[-95.739015,44.936349],[-96.03477,45.14995],[-95.574707,45.14995]]]}},
+{"type":"Feature","id":"27025","properties":{"name":"Chisago"},"geometry":{"type":"Polygon","coordinates":[[[-93.066268,45.730506],[-92.841714,45.730506],[-92.885529,45.642875],[-92.743129,45.297827],[-93.016976,45.297827],[-93.016976,45.412843],[-93.142945,45.730506],[-93.066268,45.730506]]]}},
+{"type":"Feature","id":"27027","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-96.582464,47.149033],[-96.193601,47.149033],[-96.17717,46.716355],[-96.281232,46.628724],[-96.790588,46.628724],[-96.790588,46.628724],[-96.828926,47.149033],[-96.582464,47.149033]]]}},
+{"type":"Feature","id":"27029","properties":{"name":"Clearwater"},"geometry":{"type":"Polygon","coordinates":[[[-95.580184,48.019867],[-95.22966,48.019867],[-95.185844,47.411926],[-95.169413,47.15451],[-95.552799,47.149033],[-95.552799,47.499557],[-95.580184,47.932236],[-95.580184,48.019867]]]}},
+{"type":"Feature","id":"27031","properties":{"name":"Cook"},"geometry":{"type":"Polygon","coordinates":[[[-91.023369,47.466696],[-91.034323,48.189652],[-89.582934,47.997959],[-91.023369,47.466696]]]}},
+{"type":"Feature","id":"27033","properties":{"name":"Cottonwood"},"geometry":{"type":"Polygon","coordinates":[[[-95.459691,44.196962],[-95.109167,44.196962],[-94.857228,44.109331],[-94.857228,43.846438],[-95.114644,43.846438],[-95.454214,43.846438],[-95.465168,43.846438],[-95.459691,44.196962]]]}},
+{"type":"Feature","id":"27035","properties":{"name":"Crow Wing"},"geometry":{"type":"Polygon","coordinates":[[[-94.282149,46.803986],[-93.778271,46.803986],[-93.794701,46.245338],[-93.811132,46.157707],[-94.342395,46.2782],[-94.282149,46.803986]]]}},
+{"type":"Feature","id":"27037","properties":{"name":"Dakota"},"geometry":{"type":"Polygon","coordinates":[[[-93.088176,44.919919],[-93.016976,44.892534],[-92.803375,44.744656],[-92.732175,44.711795],[-93.038884,44.470809],[-93.279869,44.54201],[-93.329161,44.788472],[-93.175807,44.887057],[-93.088176,44.919919]]]}},
+{"type":"Feature","id":"27039","properties":{"name":"Dodge"},"geometry":{"type":"Polygon","coordinates":[[[-92.918391,44.196962],[-92.677405,44.196962],[-92.688359,43.846438],[-92.880052,43.846438],[-93.04436,43.846438],[-93.04436,44.196962],[-93.038884,44.196962],[-92.918391,44.196962]]]}},
+{"type":"Feature","id":"27041","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-95.393968,46.108415],[-95.147506,46.108415],[-95.142029,45.774321],[-95.142029,45.75789],[-95.42683,45.75789],[-95.760923,45.75789],[-95.771877,46.108415],[-95.393968,46.108415]]]}},
+{"type":"Feature","id":"27043","properties":{"name":"Faribault"},"geometry":{"type":"Polygon","coordinates":[[[-93.893286,43.846438],[-93.767317,43.846438],[-93.646824,43.846438],[-93.646824,43.501391],[-93.969963,43.501391],[-94.249287,43.501391],[-94.249287,43.846438],[-93.893286,43.846438]]]}},
+{"type":"Feature","id":"27045","properties":{"name":"Fillmore"},"geometry":{"type":"Polygon","coordinates":[[[-92.381651,43.846438],[-92.080419,43.846438],[-91.729895,43.846438],[-91.729895,43.501391],[-91.850387,43.501391],[-92.080419,43.501391],[-92.447374,43.501391],[-92.447374,43.835484],[-92.381651,43.846438]]]}},
+{"type":"Feature","id":"27047","properties":{"name":"Freeborn"},"geometry":{"type":"Polygon","coordinates":[[[-93.164853,43.846438],[-93.049837,43.846438],[-93.049837,43.501391],[-93.498947,43.501391],[-93.646824,43.501391],[-93.646824,43.846438],[-93.405839,43.846438],[-93.164853,43.846438]]]}},
+{"type":"Feature","id":"27049","properties":{"name":"Goodhue"},"geometry":{"type":"Polygon","coordinates":[[[-92.732175,44.711795],[-92.315927,44.54201],[-92.244727,44.454379],[-92.430943,44.454379],[-92.551436,44.196962],[-92.666452,44.196962],[-92.677405,44.196962],[-92.918391,44.196962],[-93.038884,44.196962],[-93.038884,44.470809],[-92.732175,44.711795]]]}},
+{"type":"Feature","id":"27051","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-96.264801,46.108415],[-95.771877,46.108415],[-95.760923,45.75789],[-96.253848,45.75789],[-96.264801,46.020784],[-96.264801,46.108415]]]}},
+{"type":"Feature","id":"27053","properties":{"name":"Hennepin"},"geometry":{"type":"Polygon","coordinates":[[[-93.520854,45.248535],[-93.5099,45.243058],[-93.2251,45.034934],[-93.175807,44.887057],[-93.329161,44.788472],[-93.433223,44.81038],[-93.520854,44.804903],[-93.767317,44.980165],[-93.520854,45.248535]]]}},
+{"type":"Feature","id":"27055","properties":{"name":"Houston"},"geometry":{"type":"Polygon","coordinates":[[[-91.373894,43.846438],[-91.286263,43.846438],[-91.258878,43.725946],[-91.215062,43.501391],[-91.368417,43.501391],[-91.609402,43.501391],[-91.729895,43.501391],[-91.729895,43.846438],[-91.373894,43.846438]]]}},
+{"type":"Feature","id":"27057","properties":{"name":"Hubbard"},"geometry":{"type":"Polygon","coordinates":[[[-95.185844,47.411926],[-94.671012,47.411926],[-94.786028,46.803986],[-95.037967,46.803986],[-95.163936,46.803986],[-95.169413,47.15451],[-95.185844,47.411926]]]}},
+{"type":"Feature","id":"27059","properties":{"name":"Isanti"},"geometry":{"type":"Polygon","coordinates":[[[-93.498947,45.735983],[-93.142945,45.730506],[-93.016976,45.412843],[-93.159376,45.412843],[-93.5099,45.412843],[-93.5099,45.560721],[-93.515377,45.735983],[-93.498947,45.735983]]]}},
+{"type":"Feature","id":"27061","properties":{"name":"Itasca"},"geometry":{"type":"Polygon","coordinates":[[[-93.597531,47.899374],[-93.082699,47.893897],[-93.055314,47.028541],[-93.712547,47.028541],[-93.772794,47.028541],[-94.052118,47.428357],[-94.413596,47.444788],[-94.419073,47.844605],[-93.597531,47.899374]]]}},
+{"type":"Feature","id":"27063","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-95.114644,43.846438],[-94.857228,43.846438],[-94.851751,43.846438],[-94.851751,43.501391],[-94.917474,43.501391],[-95.092736,43.501391],[-95.388491,43.501391],[-95.454214,43.501391],[-95.454214,43.846438],[-95.114644,43.846438]]]}},
+{"type":"Feature","id":"27065","properties":{"name":"Kanabec"},"geometry":{"type":"Polygon","coordinates":[[[-93.307254,46.157707],[-93.055314,46.157707],[-93.142945,45.730506],[-93.498947,45.735983],[-93.515377,45.735983],[-93.433223,46.15223],[-93.307254,46.157707]]]}},
+{"type":"Feature","id":"27067","properties":{"name":"Kandiyohi"},"geometry":{"type":"Polygon","coordinates":[[[-94.884612,45.412843],[-94.76412,45.325212],[-94.758643,44.892534],[-95.246091,44.892534],[-95.246091,45.14995],[-95.257044,45.412843],[-95.131075,45.412843],[-94.884612,45.412843]]]}},
+{"type":"Feature","id":"27069","properties":{"name":"Kittson"},"geometry":{"type":"Polygon","coordinates":[[[-96.407202,49.000239],[-96.385294,48.545653],[-97.16302,48.545653],[-97.228743,49.000239],[-96.407202,49.000239]]]}},
+{"type":"Feature","id":"27071","properties":{"name":"Koochiching"},"geometry":{"type":"Polygon","coordinates":[[[-93.088176,48.627807],[-93.088176,48.55113],[-93.082699,47.893897],[-93.597531,47.899374],[-94.419073,47.844605],[-94.430026,48.364914],[-94.430026,48.699007],[-93.794701,48.518268],[-93.088176,48.627807]]]}},
+{"type":"Feature","id":"27073","properties":{"name":"Lac qui Parle"},"geometry":{"type":"Polygon","coordinates":[[[-96.368863,45.259489],[-96.10597,45.177335],[-96.03477,45.14995],[-95.739015,44.936349],[-96.451017,44.804903],[-96.451017,44.980165],[-96.451017,45.270443],[-96.368863,45.259489]]]}},
+{"type":"Feature","id":"27075","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-91.801095,47.866512],[-91.795618,48.200606],[-91.034323,48.189652],[-91.023369,47.466696],[-91.795618,46.94091],[-91.801095,47.866512]]]}},
+{"type":"Feature","id":"27077","properties":{"name":"Lake of the Woods"},"geometry":{"type":"Polygon","coordinates":[[[-94.430026,48.699007],[-94.430026,48.364914],[-95.344675,48.540176],[-95.322768,49.000239],[-94.824366,49.295994],[-94.430026,48.699007]]]}},
+{"type":"Feature","id":"27079","properties":{"name":"Le Sueur"},"geometry":{"type":"Polygon","coordinates":[[[-93.701593,44.54201],[-93.526331,44.54201],[-93.526331,44.196962],[-93.679686,44.196962],[-93.767317,44.196962],[-94.013779,44.240778],[-93.931625,44.454379],[-93.909717,44.54201],[-93.701593,44.54201]]]}},
+{"type":"Feature","id":"27081","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-96.44554,44.629641],[-96.095016,44.629641],[-96.078585,44.196962],[-96.242894,44.196962],[-96.451017,44.196962],[-96.451017,44.54201],[-96.451017,44.629641],[-96.44554,44.629641]]]}},
+{"type":"Feature","id":"27083","properties":{"name":"Lyon"},"geometry":{"type":"Polygon","coordinates":[[[-95.936185,44.629641],[-95.596615,44.54201],[-95.591138,44.196962],[-96.012862,44.196962],[-96.062155,44.196962],[-96.078585,44.196962],[-96.095016,44.629641],[-95.936185,44.629641]]]}},
+{"type":"Feature","id":"27085","properties":{"name":"McLeod"},"geometry":{"type":"Polygon","coordinates":[[[-94.254764,44.980165],[-94.013779,44.980165],[-94.008302,44.717272],[-94.134272,44.717272],[-94.49575,44.717272],[-94.49575,44.892534],[-94.501227,44.892534],[-94.254764,44.980165]]]}},
+{"type":"Feature","id":"27087","properties":{"name":"Mahnomen"},"geometry":{"type":"Polygon","coordinates":[[[-95.552799,47.149033],[-96.067632,47.149033],[-96.067632,47.499557],[-95.552799,47.499557],[-95.552799,47.149033]]]}},
+{"type":"Feature","id":"27089","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-96.259324,48.545653],[-95.602092,48.540176],[-95.591138,48.173221],[-96.50031,48.173221],[-97.020619,48.173221],[-97.146589,48.173221],[-97.141112,48.195129],[-97.16302,48.540176],[-97.16302,48.545653],[-96.385294,48.545653],[-96.259324,48.545653]]]}},
+{"type":"Feature","id":"27091","properties":{"name":"Martin"},"geometry":{"type":"Polygon","coordinates":[[[-94.616242,43.846438],[-94.36978,43.846438],[-94.249287,43.846438],[-94.249287,43.501391],[-94.44098,43.501391],[-94.676489,43.501391],[-94.851751,43.501391],[-94.851751,43.846438],[-94.616242,43.846438]]]}},
+{"type":"Feature","id":"27093","properties":{"name":"Meeker"},"geometry":{"type":"Polygon","coordinates":[[[-94.534088,45.325212],[-94.260241,45.281397],[-94.254764,44.980165],[-94.501227,44.892534],[-94.758643,44.892534],[-94.76412,45.325212],[-94.534088,45.325212]]]}},
+{"type":"Feature","id":"27095","properties":{"name":"Mille Lacs"},"geometry":{"type":"Polygon","coordinates":[[[-93.553716,46.245338],[-93.433223,46.15223],[-93.515377,45.735983],[-93.5099,45.560721],[-93.652301,45.560721],[-93.76184,45.560721],[-93.76184,45.823614],[-93.811132,46.157707],[-93.794701,46.245338],[-93.553716,46.245338]]]}},
+{"type":"Feature","id":"27097","properties":{"name":"Morrison"},"geometry":{"type":"Polygon","coordinates":[[[-94.654581,46.3494],[-94.342395,46.2782],[-93.811132,46.157707],[-93.76184,45.823614],[-94.008302,45.823614],[-94.271195,45.774321],[-94.451934,45.774321],[-94.643627,45.774321],[-94.654581,46.3494]]]}},
+{"type":"Feature","id":"27099","properties":{"name":"Mower"},"geometry":{"type":"Polygon","coordinates":[[[-92.880052,43.846438],[-92.688359,43.846438],[-92.447374,43.835484],[-92.447374,43.501391],[-92.551436,43.501391],[-93.022453,43.501391],[-93.049837,43.501391],[-93.049837,43.846438],[-93.04436,43.846438],[-92.880052,43.846438]]]}},
+{"type":"Feature","id":"27101","properties":{"name":"Murray"},"geometry":{"type":"Polygon","coordinates":[[[-96.012862,44.196962],[-95.591138,44.196962],[-95.459691,44.196962],[-95.465168,43.846438],[-96.051201,43.846438],[-96.062155,43.846438],[-96.062155,44.196962],[-96.012862,44.196962]]]}},
+{"type":"Feature","id":"27103","properties":{"name":"Nicollet"},"geometry":{"type":"Polygon","coordinates":[[[-94.112364,44.454379],[-93.931625,44.454379],[-94.013779,44.240778],[-94.331441,44.251732],[-94.36978,44.262686],[-94.780551,44.454379],[-94.621719,44.454379],[-94.112364,44.454379]]]}},
+{"type":"Feature","id":"27105","properties":{"name":"Nobles"},"geometry":{"type":"Polygon","coordinates":[[[-96.051201,43.846438],[-95.465168,43.846438],[-95.454214,43.846438],[-95.454214,43.501391],[-95.859508,43.501391],[-96.051201,43.501391],[-96.051201,43.846438]]]}},
+{"type":"Feature","id":"27107","properties":{"name":"Norman"},"geometry":{"type":"Polygon","coordinates":[[[-96.23194,47.499557],[-96.067632,47.499557],[-96.067632,47.149033],[-96.193601,47.149033],[-96.582464,47.149033],[-96.828926,47.149033],[-96.834403,47.236664],[-96.850834,47.499557],[-96.23194,47.499557]]]}},
+{"type":"Feature","id":"27109","properties":{"name":"Olmsted"},"geometry":{"type":"Polygon","coordinates":[[[-92.666452,44.196962],[-92.551436,44.196962],[-92.080419,44.109331],[-92.080419,43.846438],[-92.381651,43.846438],[-92.447374,43.835484],[-92.688359,43.846438],[-92.677405,44.196962],[-92.666452,44.196962]]]}},
+{"type":"Feature","id":"27111","properties":{"name":"Otter Tail"},"geometry":{"type":"Polygon","coordinates":[[[-96.17717,46.716355],[-95.163936,46.716355],[-95.152983,46.371308],[-95.147506,46.108415],[-95.393968,46.108415],[-95.771877,46.108415],[-96.264801,46.108415],[-96.281232,46.628724],[-96.17717,46.716355]]]}},
+{"type":"Feature","id":"27113","properties":{"name":"Pennington"},"geometry":{"type":"Polygon","coordinates":[[[-96.50031,48.173221],[-95.591138,48.173221],[-95.580184,48.019867],[-95.580184,47.932236],[-95.71163,47.937713],[-95.8376,47.965097],[-96.483879,47.965097],[-96.50031,48.173221]]]}},
+{"type":"Feature","id":"27115","properties":{"name":"Pine"},"geometry":{"type":"Polygon","coordinates":[[[-92.962206,46.4206],[-92.29402,46.415123],[-92.29402,46.157707],[-92.841714,45.730506],[-93.066268,45.730506],[-93.142945,45.730506],[-93.055314,46.157707],[-93.055314,46.4206],[-92.962206,46.4206]]]}},
+{"type":"Feature","id":"27117","properties":{"name":"Pipestone"},"geometry":{"type":"Polygon","coordinates":[[[-96.242894,44.196962],[-96.078585,44.196962],[-96.062155,44.196962],[-96.062155,43.846438],[-96.451017,43.851915],[-96.451017,44.196962],[-96.242894,44.196962]]]}},
+{"type":"Feature","id":"27119","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-97.020619,48.173221],[-96.50031,48.173221],[-96.483879,47.965097],[-96.352432,47.762451],[-95.71163,47.937713],[-95.580184,47.932236],[-95.552799,47.499557],[-96.067632,47.499557],[-96.23194,47.499557],[-96.850834,47.499557],[-96.889173,47.67482],[-97.146589,48.173221],[-97.020619,48.173221]]]}},
+{"type":"Feature","id":"27121","properties":{"name":"Pope"},"geometry":{"type":"Polygon","coordinates":[[[-95.42683,45.75789],[-95.142029,45.75789],[-95.131075,45.412843],[-95.257044,45.412843],[-95.749969,45.412843],[-95.760923,45.75789],[-95.42683,45.75789]]]}},
+{"type":"Feature","id":"27123","properties":{"name":"Ramsey"},"geometry":{"type":"Polygon","coordinates":[[[-93.230576,45.122565],[-93.022453,45.122565],[-93.016976,44.892534],[-93.088176,44.919919],[-93.175807,44.887057],[-93.2251,45.034934],[-93.230576,45.122565]]]}},
+{"type":"Feature","id":"27125","properties":{"name":"Red Lake"},"geometry":{"type":"Polygon","coordinates":[[[-95.8376,47.965097],[-95.71163,47.937713],[-96.352432,47.762451],[-96.483879,47.965097],[-95.8376,47.965097]]]}},
+{"type":"Feature","id":"27127","properties":{"name":"Redwood"},"geometry":{"type":"Polygon","coordinates":[[[-95.295383,44.662502],[-94.868182,44.498194],[-95.109167,44.196962],[-95.459691,44.196962],[-95.591138,44.196962],[-95.596615,44.54201],[-95.361106,44.700841],[-95.295383,44.662502]]]}},
+{"type":"Feature","id":"27129","properties":{"name":"Renville"},"geometry":{"type":"Polygon","coordinates":[[[-94.49575,44.892534],[-94.49575,44.717272],[-94.621719,44.454379],[-94.780551,44.454379],[-94.851751,44.498194],[-94.868182,44.498194],[-95.295383,44.662502],[-95.361106,44.700841],[-95.481599,44.75561],[-95.246091,44.892534],[-94.758643,44.892534],[-94.501227,44.892534],[-94.49575,44.892534]]]}},
+{"type":"Feature","id":"27131","properties":{"name":"Rice"},"geometry":{"type":"Polygon","coordinates":[[[-93.301777,44.54201],[-93.279869,44.54201],[-93.038884,44.470809],[-93.038884,44.196962],[-93.04436,44.196962],[-93.164853,44.196962],[-93.405839,44.196962],[-93.526331,44.196962],[-93.526331,44.54201],[-93.301777,44.54201]]]}},
+{"type":"Feature","id":"27133","properties":{"name":"Rock"},"geometry":{"type":"Polygon","coordinates":[[[-96.451017,43.851915],[-96.062155,43.846438],[-96.051201,43.846438],[-96.051201,43.501391],[-96.451017,43.501391],[-96.451017,43.851915]]]}},
+{"type":"Feature","id":"27135","properties":{"name":"Roseau"},"geometry":{"type":"Polygon","coordinates":[[[-95.322768,49.000239],[-95.344675,48.540176],[-95.602092,48.540176],[-96.259324,48.545653],[-96.385294,48.545653],[-96.407202,49.000239],[-95.322768,49.000239]]]}},
+{"type":"Feature","id":"27137","properties":{"name":"St. Louis"},"geometry":{"type":"Polygon","coordinates":[[[-93.088176,48.55113],[-93.088176,48.627807],[-92.370697,48.222514],[-91.795618,48.200606],[-91.801095,47.866512],[-91.795618,46.94091],[-92.014696,46.705401],[-92.29402,46.661586],[-92.49119,46.765647],[-93.060791,46.765647],[-93.055314,47.028541],[-93.082699,47.893897],[-93.088176,48.55113]]]}},
+{"type":"Feature","id":"27139","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-93.433223,44.81038],[-93.329161,44.788472],[-93.279869,44.54201],[-93.301777,44.54201],[-93.526331,44.54201],[-93.701593,44.54201],[-93.909717,44.54201],[-93.767317,44.640595],[-93.520854,44.804903],[-93.433223,44.81038]]]}},
+{"type":"Feature","id":"27141","properties":{"name":"Sherburne"},"geometry":{"type":"Polygon","coordinates":[[[-93.652301,45.560721],[-93.5099,45.560721],[-93.5099,45.412843],[-93.5099,45.243058],[-93.520854,45.248535],[-94.046641,45.423797],[-94.150702,45.560721],[-93.76184,45.560721],[-93.652301,45.560721]]]}},
+{"type":"Feature","id":"27143","properties":{"name":"Sibley"},"geometry":{"type":"Polygon","coordinates":[[[-94.134272,44.717272],[-94.008302,44.717272],[-93.767317,44.640595],[-93.909717,44.54201],[-93.931625,44.454379],[-94.112364,44.454379],[-94.621719,44.454379],[-94.49575,44.717272],[-94.134272,44.717272]]]}},
+{"type":"Feature","id":"27145","properties":{"name":"Stearns"},"geometry":{"type":"Polygon","coordinates":[[[-94.451934,45.774321],[-94.271195,45.774321],[-94.150702,45.560721],[-94.046641,45.423797],[-94.052118,45.423797],[-94.260241,45.281397],[-94.534088,45.325212],[-94.76412,45.325212],[-94.884612,45.412843],[-95.131075,45.412843],[-95.142029,45.75789],[-95.142029,45.774321],[-94.643627,45.774321],[-94.451934,45.774321]]]}},
+{"type":"Feature","id":"27147","properties":{"name":"Steele"},"geometry":{"type":"Polygon","coordinates":[[[-93.164853,44.196962],[-93.04436,44.196962],[-93.04436,43.846438],[-93.049837,43.846438],[-93.164853,43.846438],[-93.405839,43.846438],[-93.405839,44.196962],[-93.164853,44.196962]]]}},
+{"type":"Feature","id":"27149","properties":{"name":"Stevens"},"geometry":{"type":"Polygon","coordinates":[[[-96.253848,45.75789],[-95.760923,45.75789],[-95.749969,45.412843],[-95.974524,45.412843],[-96.116924,45.412843],[-96.253848,45.588105],[-96.253848,45.75789]]]}},
+{"type":"Feature","id":"27151","properties":{"name":"Swift"},"geometry":{"type":"Polygon","coordinates":[[[-95.974524,45.412843],[-95.749969,45.412843],[-95.257044,45.412843],[-95.246091,45.14995],[-95.574707,45.14995],[-96.03477,45.14995],[-96.10597,45.177335],[-96.116924,45.412843],[-95.974524,45.412843]]]}},
+{"type":"Feature","id":"27153","properties":{"name":"Todd"},"geometry":{"type":"Polygon","coordinates":[[[-95.152983,46.371308],[-94.731258,46.371308],[-94.654581,46.3494],[-94.643627,45.774321],[-95.142029,45.774321],[-95.147506,46.108415],[-95.152983,46.371308]]]}},
+{"type":"Feature","id":"27155","properties":{"name":"Traverse"},"geometry":{"type":"Polygon","coordinates":[[[-96.390771,46.020784],[-96.264801,46.020784],[-96.253848,45.75789],[-96.253848,45.588105],[-96.828926,45.588105],[-96.834403,45.588105],[-96.560556,45.933153],[-96.576987,46.020784],[-96.390771,46.020784]]]}},
+{"type":"Feature","id":"27157","properties":{"name":"Wabasha"},"geometry":{"type":"Polygon","coordinates":[[[-92.430943,44.454379],[-92.244727,44.454379],[-92.085896,44.405086],[-91.855864,44.191485],[-92.069465,44.191485],[-92.080419,44.109331],[-92.551436,44.196962],[-92.430943,44.454379]]]}},
+{"type":"Feature","id":"27159","properties":{"name":"Wadena"},"geometry":{"type":"Polygon","coordinates":[[[-95.037967,46.803986],[-94.786028,46.803986],[-94.731258,46.371308],[-95.152983,46.371308],[-95.163936,46.716355],[-95.163936,46.803986],[-95.037967,46.803986]]]}},
+{"type":"Feature","id":"27161","properties":{"name":"Waseca"},"geometry":{"type":"Polygon","coordinates":[[[-93.679686,44.196962],[-93.526331,44.196962],[-93.405839,44.196962],[-93.405839,43.846438],[-93.646824,43.846438],[-93.767317,43.846438],[-93.767317,44.196962],[-93.679686,44.196962]]]}},
+{"type":"Feature","id":"27163","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-93.016976,45.297827],[-92.743129,45.297827],[-92.75956,45.210196],[-92.770513,44.859672],[-92.803375,44.744656],[-93.016976,44.892534],[-93.022453,45.122565],[-93.016976,45.297827]]]}},
+{"type":"Feature","id":"27165","properties":{"name":"Watonwan"},"geometry":{"type":"Polygon","coordinates":[[[-94.490273,44.109331],[-94.36978,44.109331],[-94.36978,43.846438],[-94.616242,43.846438],[-94.851751,43.846438],[-94.857228,43.846438],[-94.857228,44.109331],[-94.490273,44.109331]]]}},
+{"type":"Feature","id":"27167","properties":{"name":"Wilkin"},"geometry":{"type":"Polygon","coordinates":[[[-96.281232,46.628724],[-96.264801,46.108415],[-96.264801,46.020784],[-96.390771,46.020784],[-96.576987,46.020784],[-96.790588,46.628724],[-96.281232,46.628724]]]}},
+{"type":"Feature","id":"27169","properties":{"name":"Winona"},"geometry":{"type":"Polygon","coordinates":[[[-92.069465,44.191485],[-91.855864,44.191485],[-91.56011,44.027177],[-91.423186,43.983362],[-91.286263,43.846438],[-91.373894,43.846438],[-91.729895,43.846438],[-92.080419,43.846438],[-92.080419,44.109331],[-92.069465,44.191485]]]}},
+{"type":"Feature","id":"27171","properties":{"name":"Wright"},"geometry":{"type":"Polygon","coordinates":[[[-94.052118,45.423797],[-94.046641,45.423797],[-93.520854,45.248535],[-93.767317,44.980165],[-94.013779,44.980165],[-94.254764,44.980165],[-94.260241,45.281397],[-94.052118,45.423797]]]}},
+{"type":"Feature","id":"27173","properties":{"name":"Yellow Medicine"},"geometry":{"type":"Polygon","coordinates":[[[-95.733538,44.930872],[-95.481599,44.75561],[-95.361106,44.700841],[-95.596615,44.54201],[-95.936185,44.629641],[-96.095016,44.629641],[-96.44554,44.629641],[-96.451017,44.629641],[-96.451017,44.804903],[-95.739015,44.936349],[-95.733538,44.930872]]]}},
+{"type":"Feature","id":"28001","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-91.319124,31.758831],[-91.154816,31.610953],[-91.160293,31.34806],[-91.264355,31.369968],[-91.587494,31.189229],[-91.379371,31.731446],[-91.346509,31.753354],[-91.319124,31.758831]]]}},
+{"type":"Feature","id":"28003","properties":{"name":"Alcorn"},"geometry":{"type":"Polygon","coordinates":[[[-88.471115,34.995703],[-88.378007,34.995703],[-88.361576,34.995703],[-88.367053,34.754717],[-88.717578,34.754717],[-88.821639,34.995703],[-88.788778,34.995703],[-88.471115,34.995703]]]}},
+{"type":"Feature","id":"28005","properties":{"name":"Amite"},"geometry":{"type":"Polygon","coordinates":[[[-90.722138,31.34806],[-90.634507,31.34806],[-90.546876,31.34806],[-90.546876,30.997536],[-90.568783,30.997536],[-90.8262,30.997536],[-91.061708,30.997536],[-91.09457,31.320676],[-90.722138,31.34806]]]}},
+{"type":"Feature","id":"28007","properties":{"name":"Attala"},"geometry":{"type":"Polygon","coordinates":[[[-89.396718,33.286897],[-89.320041,33.106158],[-89.320041,32.930896],[-89.473395,32.930896],[-89.730812,32.887081],[-89.96632,32.881604],[-89.747242,33.215697],[-89.643181,33.286897],[-89.451488,33.286897],[-89.396718,33.286897]]]}},
+{"type":"Feature","id":"28009","properties":{"name":"Benton"},"geometry":{"type":"Polygon","coordinates":[[[-89.199548,34.995703],[-89.018809,34.995703],[-89.09001,34.595886],[-89.243364,34.584932],[-89.352903,34.995703],[-89.199548,34.995703]]]}},
+{"type":"Feature","id":"28011","properties":{"name":"Bolivar"},"geometry":{"type":"Polygon","coordinates":[[[-90.738569,34.119392],[-90.656414,33.987946],[-90.765953,33.527883],[-91.001462,33.527883],[-91.215062,33.527883],[-91.231493,33.560744],[-90.952169,34.119392],[-90.957646,34.119392],[-90.738569,34.119392]]]}},
+{"type":"Feature","id":"28013","properties":{"name":"Calhoun"},"geometry":{"type":"Polygon","coordinates":[[[-89.511734,34.163208],[-89.243364,34.163208],[-89.139302,34.075577],[-89.194071,33.736006],[-89.506257,33.719575],[-89.506257,33.867453],[-89.511734,34.163208]]]}},
+{"type":"Feature","id":"28015","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-90.114197,33.67576],[-89.785581,33.67576],[-89.643181,33.286897],[-89.747242,33.215697],[-90.174444,33.330713],[-90.130628,33.67576],[-90.114197,33.67576]]]}},
+{"type":"Feature","id":"28017","properties":{"name":"Chickasaw"},"geometry":{"type":"Polygon","coordinates":[[[-88.827116,34.075577],[-88.717578,34.075577],[-88.717578,33.812683],[-88.887363,33.812683],[-89.03524,33.741483],[-89.117394,33.741483],[-89.194071,33.736006],[-89.139302,34.075577],[-88.827116,34.075577]]]}},
+{"type":"Feature","id":"28019","properties":{"name":"Choctaw"},"geometry":{"type":"Polygon","coordinates":[[[-89.139302,33.53336],[-89.09001,33.53336],[-89.09001,33.286897],[-89.320041,33.106158],[-89.396718,33.286897],[-89.451488,33.286897],[-89.380287,33.462159],[-89.139302,33.53336]]]}},
+{"type":"Feature","id":"28021","properties":{"name":"Claiborne"},"geometry":{"type":"Polygon","coordinates":[[[-90.727615,32.224371],[-90.716661,32.049109],[-90.738569,31.786216],[-91.247924,31.86837],[-91.028846,32.114832],[-90.727615,32.224371]]]}},
+{"type":"Feature","id":"28023","properties":{"name":"Clarke"},"geometry":{"type":"Polygon","coordinates":[[[-88.914747,32.224371],[-88.432777,32.229848],[-88.471115,31.895754],[-88.909271,31.824554],[-88.914747,32.224371]]]}},
+{"type":"Feature","id":"28025","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-88.887363,33.812683],[-88.717578,33.812683],[-88.514931,33.648375],[-88.673762,33.505975],[-89.018809,33.560744],[-89.03524,33.741483],[-88.887363,33.812683]]]}},
+{"type":"Feature","id":"28027","properties":{"name":"Coahoma"},"geometry":{"type":"Polygon","coordinates":[[[-90.568783,34.524686],[-90.398998,34.426101],[-90.448291,34.075577],[-90.448291,33.987946],[-90.656414,33.987946],[-90.738569,34.119392],[-90.957646,34.119392],[-90.568783,34.524686]]]}},
+{"type":"Feature","id":"28029","properties":{"name":"Copiah"},"geometry":{"type":"Polygon","coordinates":[[[-90.716661,32.049109],[-90.229213,32.049109],[-90.125151,31.753354],[-90.245644,31.715015],[-90.311367,31.698584],[-90.738569,31.698584],[-90.738569,31.786216],[-90.716661,32.049109]]]}},
+{"type":"Feature","id":"28031","properties":{"name":"Covington"},"geometry":{"type":"Polygon","coordinates":[[[-89.402195,31.797169],[-89.396718,31.435691],[-89.42958,31.435691],[-89.451488,31.435691],[-89.588411,31.435691],[-89.752719,31.775262],[-89.654134,31.780739],[-89.402195,31.797169]]]}},
+{"type":"Feature","id":"28033","properties":{"name":"DeSoto"},"geometry":{"type":"Polygon","coordinates":[[[-89.829396,34.995703],[-89.725335,34.995703],[-89.725335,34.771148],[-89.845827,34.771148],[-90.201828,34.721856],[-90.267552,34.858779],[-90.30589,34.858779],[-90.311367,34.995703],[-89.829396,34.995703]]]}},
+{"type":"Feature","id":"28035","properties":{"name":"Forrest"},"geometry":{"type":"Polygon","coordinates":[[[-89.42958,31.435691],[-89.396718,31.435691],[-89.144779,31.435691],[-89.139302,30.909905],[-89.341949,30.909905],[-89.347426,31.00849],[-89.451488,31.435691],[-89.42958,31.435691]]]}},
+{"type":"Feature","id":"28037","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-91.154816,31.610953],[-90.738569,31.610953],[-90.634507,31.34806],[-90.722138,31.34806],[-91.09457,31.320676],[-91.160293,31.34806],[-91.154816,31.610953]]]}},
+{"type":"Feature","id":"28039","properties":{"name":"George"},"geometry":{"type":"Polygon","coordinates":[[[-88.679239,30.997536],[-88.4273,30.997536],[-88.410869,30.734643],[-88.865455,30.734643],[-88.881886,30.734643],[-88.887363,30.909905],[-88.832593,30.997536],[-88.679239,30.997536]]]}},
+{"type":"Feature","id":"28041","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-88.460161,31.435691],[-88.449208,31.435691],[-88.432777,31.112552],[-88.4273,30.997536],[-88.679239,30.997536],[-88.832593,30.997536],[-88.843547,31.435691],[-88.460161,31.435691]]]}},
+{"type":"Feature","id":"28043","properties":{"name":"Grenada"},"geometry":{"type":"Polygon","coordinates":[[[-89.927981,33.900315],[-89.506257,33.867453],[-89.506257,33.719575],[-89.506257,33.67576],[-89.785581,33.67576],[-90.114197,33.67576],[-90.130628,33.67576],[-90.136105,33.719575],[-89.927981,33.900315]]]}},
+{"type":"Feature","id":"28045","properties":{"name":"Hancock"},"geometry":{"type":"Polygon","coordinates":[[[-89.495303,30.647012],[-89.341949,30.647012],[-89.341949,30.373165],[-89.522688,30.181472],[-89.686996,30.460796],[-89.495303,30.647012]]]}},
+{"type":"Feature","id":"28047","properties":{"name":"Harrison"},"geometry":{"type":"Polygon","coordinates":[[[-88.881886,30.679874],[-88.843547,30.406027],[-89.341949,30.373165],[-89.341949,30.647012],[-88.881886,30.679874]]]}},
+{"type":"Feature","id":"28049","properties":{"name":"Hinds"},"geometry":{"type":"Polygon","coordinates":[[[-90.486629,32.542033],[-90.448291,32.574895],[-90.064905,32.399633],[-90.229213,32.049109],[-90.716661,32.049109],[-90.727615,32.224371],[-90.552353,32.509172],[-90.486629,32.542033]]]}},
+{"type":"Feature","id":"28051","properties":{"name":"Holmes"},"geometry":{"type":"Polygon","coordinates":[[[-90.174444,33.330713],[-89.747242,33.215697],[-89.96632,32.881604],[-90.366137,33.01305],[-90.333275,33.303328],[-90.174444,33.330713]]]}},
+{"type":"Feature","id":"28053","properties":{"name":"Humphreys"},"geometry":{"type":"Polygon","coordinates":[[[-90.453768,33.330713],[-90.333275,33.303328],[-90.366137,33.01305],[-90.656414,32.919942],[-90.70023,33.095204],[-90.716661,33.270466],[-90.453768,33.330713]]]}},
+{"type":"Feature","id":"28055","properties":{"name":"Issaquena"},"geometry":{"type":"Polygon","coordinates":[[[-90.913831,33.007573],[-90.722138,32.662526],[-90.722138,32.61871],[-91.045277,32.574895],[-91.16577,33.002096],[-91.16577,33.01305],[-90.913831,33.007573]]]}},
+{"type":"Feature","id":"28057","properties":{"name":"Itawamba"},"geometry":{"type":"Polygon","coordinates":[[[-88.493023,34.464439],[-88.328715,34.464439],[-88.15893,34.464439],[-88.175361,34.322039],[-88.202745,34.08653],[-88.542316,34.08653],[-88.542316,34.464439],[-88.493023,34.464439]]]}},
+{"type":"Feature","id":"28059","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-88.865455,30.734643],[-88.410869,30.734643],[-88.394438,30.367688],[-88.843547,30.406027],[-88.881886,30.679874],[-88.881886,30.734643],[-88.865455,30.734643]]]}},
+{"type":"Feature","id":"28061","properties":{"name":"Jasper"},"geometry":{"type":"Polygon","coordinates":[[[-89.018809,32.224371],[-88.914747,32.224371],[-88.909271,31.824554],[-88.942132,31.824554],[-89.314564,31.802646],[-89.320041,32.224371],[-89.018809,32.224371]]]}},
+{"type":"Feature","id":"28063","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-91.247924,31.86837],[-90.738569,31.786216],[-90.738569,31.698584],[-90.738569,31.610953],[-91.154816,31.610953],[-91.319124,31.758831],[-91.346509,31.753354],[-91.247924,31.86837]]]}},
+{"type":"Feature","id":"28065","properties":{"name":"Jefferson Davis"},"geometry":{"type":"Polygon","coordinates":[[[-89.977274,31.764308],[-89.752719,31.775262],[-89.588411,31.435691],[-89.654134,31.435691],[-89.659611,31.435691],[-89.960843,31.391876],[-89.977274,31.753354],[-89.977274,31.764308]]]}},
+{"type":"Feature","id":"28067","properties":{"name":"Jones"},"geometry":{"type":"Polygon","coordinates":[[[-88.942132,31.824554],[-88.942132,31.435691],[-89.144779,31.435691],[-89.396718,31.435691],[-89.402195,31.797169],[-89.314564,31.802646],[-88.942132,31.824554]]]}},
+{"type":"Feature","id":"28069","properties":{"name":"Kemper"},"geometry":{"type":"Polygon","coordinates":[[[-88.345146,32.930896],[-88.388961,32.580372],[-88.651854,32.574895],[-88.914747,32.574895],[-88.914747,32.925419],[-88.810686,32.925419],[-88.345146,32.930896]]]}},
+{"type":"Feature","id":"28071","properties":{"name":"Lafayette"},"geometry":{"type":"Polygon","coordinates":[[[-89.62675,34.557547],[-89.248841,34.497301],[-89.248841,34.376808],[-89.243364,34.163208],[-89.511734,34.163208],[-89.719858,34.190592],[-89.719858,34.55207],[-89.670565,34.55207],[-89.62675,34.557547]]]}},
+{"type":"Feature","id":"28073","properties":{"name":"Lamar"},"geometry":{"type":"Polygon","coordinates":[[[-89.451488,31.435691],[-89.347426,31.00849],[-89.599365,31.003013],[-89.654134,31.003013],[-89.654134,31.435691],[-89.588411,31.435691],[-89.451488,31.435691]]]}},
+{"type":"Feature","id":"28075","properties":{"name":"Lauderdale"},"geometry":{"type":"Polygon","coordinates":[[[-88.651854,32.574895],[-88.388961,32.580372],[-88.421823,32.306525],[-88.432777,32.229848],[-88.914747,32.224371],[-88.914747,32.574895],[-88.651854,32.574895]]]}},
+{"type":"Feature","id":"28077","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-89.977274,31.753354],[-89.960843,31.391876],[-90.042997,31.337106],[-90.190875,31.34806],[-90.245644,31.34806],[-90.245644,31.715015],[-90.125151,31.753354],[-89.977274,31.764308],[-89.977274,31.753354]]]}},
+{"type":"Feature","id":"28079","properties":{"name":"Leake"},"geometry":{"type":"Polygon","coordinates":[[[-89.473395,32.930896],[-89.320041,32.930896],[-89.320041,32.574895],[-89.320041,32.574895],[-89.730812,32.635141],[-89.730812,32.887081],[-89.473395,32.930896]]]}},
+{"type":"Feature","id":"28081","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-88.635423,34.508255],[-88.542316,34.464439],[-88.542316,34.08653],[-88.706624,34.092007],[-88.717578,34.075577],[-88.827116,34.075577],[-88.827116,34.365854],[-88.734008,34.508255],[-88.635423,34.508255]]]}},
+{"type":"Feature","id":"28083","properties":{"name":"Leflore"},"geometry":{"type":"Polygon","coordinates":[[[-90.453768,33.812683],[-90.136105,33.719575],[-90.130628,33.67576],[-90.174444,33.330713],[-90.333275,33.303328],[-90.453768,33.330713],[-90.453768,33.812683]]]}},
+{"type":"Feature","id":"28085","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-90.311367,31.698584],[-90.245644,31.715015],[-90.245644,31.34806],[-90.262075,31.34806],[-90.355183,31.34806],[-90.546876,31.34806],[-90.634507,31.34806],[-90.738569,31.610953],[-90.738569,31.698584],[-90.311367,31.698584]]]}},
+{"type":"Feature","id":"28087","properties":{"name":"Lowndes"},"geometry":{"type":"Polygon","coordinates":[[[-88.246561,33.74696],[-88.273945,33.53336],[-88.306807,33.286897],[-88.668285,33.286897],[-88.673762,33.505975],[-88.514931,33.648375],[-88.246561,33.74696]]]}},
+{"type":"Feature","id":"28089","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-89.96632,32.881604],[-89.730812,32.887081],[-89.730812,32.635141],[-89.785581,32.585849],[-90.03752,32.448925],[-90.064905,32.399633],[-90.448291,32.574895],[-89.96632,32.881604]]]}},
+{"type":"Feature","id":"28091","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-89.659611,31.435691],[-89.654134,31.435691],[-89.654134,31.003013],[-89.730812,31.003013],[-89.834873,31.003013],[-90.042997,31.337106],[-89.960843,31.391876],[-89.659611,31.435691]]]}},
+{"type":"Feature","id":"28093","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-89.643181,34.995703],[-89.352903,34.995703],[-89.243364,34.584932],[-89.248841,34.497301],[-89.62675,34.557547],[-89.670565,34.55207],[-89.725335,34.771148],[-89.725335,34.995703],[-89.643181,34.995703]]]}},
+{"type":"Feature","id":"28095","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-88.706624,34.092007],[-88.542316,34.08653],[-88.202745,34.08653],[-88.208222,34.059146],[-88.246561,33.74696],[-88.514931,33.648375],[-88.717578,33.812683],[-88.717578,34.075577],[-88.706624,34.092007]]]}},
+{"type":"Feature","id":"28097","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-89.506257,33.67576],[-89.380287,33.462159],[-89.451488,33.286897],[-89.643181,33.286897],[-89.785581,33.67576],[-89.506257,33.67576]]]}},
+{"type":"Feature","id":"28099","properties":{"name":"Neshoba"},"geometry":{"type":"Polygon","coordinates":[[[-89.155733,32.930896],[-88.914747,32.925419],[-88.914747,32.574895],[-89.133825,32.574895],[-89.320041,32.574895],[-89.320041,32.930896],[-89.155733,32.930896]]]}},
+{"type":"Feature","id":"28101","properties":{"name":"Newton"},"geometry":{"type":"Polygon","coordinates":[[[-89.133825,32.574895],[-88.914747,32.574895],[-88.914747,32.224371],[-89.018809,32.224371],[-89.320041,32.224371],[-89.320041,32.574895],[-89.320041,32.574895],[-89.133825,32.574895]]]}},
+{"type":"Feature","id":"28103","properties":{"name":"Noxubee"},"geometry":{"type":"Polygon","coordinates":[[[-88.668285,33.286897],[-88.306807,33.286897],[-88.339669,32.991142],[-88.345146,32.930896],[-88.810686,32.925419],[-88.810686,33.286897],[-88.668285,33.286897]]]}},
+{"type":"Feature","id":"28105","properties":{"name":"Oktibbeha"},"geometry":{"type":"Polygon","coordinates":[[[-89.051671,33.560744],[-89.018809,33.560744],[-88.673762,33.505975],[-88.668285,33.286897],[-88.810686,33.286897],[-89.09001,33.286897],[-89.09001,33.53336],[-89.051671,33.560744]]]}},
+{"type":"Feature","id":"28107","properties":{"name":"Panola"},"geometry":{"type":"Polygon","coordinates":[[[-90.097767,34.55207],[-89.719858,34.55207],[-89.719858,34.190592],[-89.933458,34.163208],[-90.136105,34.157731],[-90.196352,34.508255],[-90.196352,34.55207],[-90.097767,34.55207]]]}},
+{"type":"Feature","id":"28109","properties":{"name":"Pearl River"},"geometry":{"type":"Polygon","coordinates":[[[-89.599365,31.003013],[-89.347426,31.00849],[-89.341949,30.909905],[-89.341949,30.647012],[-89.495303,30.647012],[-89.686996,30.460796],[-89.84035,30.663443],[-89.730812,31.003013],[-89.654134,31.003013],[-89.599365,31.003013]]]}},
+{"type":"Feature","id":"28111","properties":{"name":"Perry"},"geometry":{"type":"Polygon","coordinates":[[[-89.144779,31.435691],[-88.942132,31.435691],[-88.843547,31.435691],[-88.832593,30.997536],[-88.887363,30.909905],[-88.996902,30.909905],[-89.139302,30.909905],[-89.144779,31.435691]]]}},
+{"type":"Feature","id":"28113","properties":{"name":"Pike"},"geometry":{"type":"Polygon","coordinates":[[[-90.355183,31.34806],[-90.262075,31.34806],[-90.262075,31.003013],[-90.349706,31.003013],[-90.371614,30.997536],[-90.546876,30.997536],[-90.546876,31.34806],[-90.355183,31.34806]]]}},
+{"type":"Feature","id":"28115","properties":{"name":"Pontotoc"},"geometry":{"type":"Polygon","coordinates":[[[-89.09001,34.382285],[-88.827116,34.365854],[-88.827116,34.075577],[-89.139302,34.075577],[-89.243364,34.163208],[-89.248841,34.376808],[-89.09001,34.382285]]]}},
+{"type":"Feature","id":"28117","properties":{"name":"Prentiss"},"geometry":{"type":"Polygon","coordinates":[[[-88.717578,34.754717],[-88.367053,34.754717],[-88.328715,34.464439],[-88.493023,34.464439],[-88.542316,34.464439],[-88.635423,34.508255],[-88.734008,34.508255],[-88.734008,34.595886],[-88.717578,34.754717]]]}},
+{"type":"Feature","id":"28119","properties":{"name":"Quitman"},"geometry":{"type":"Polygon","coordinates":[[[-90.196352,34.508255],[-90.136105,34.157731],[-90.448291,34.075577],[-90.398998,34.426101],[-90.196352,34.508255]]]}},
+{"type":"Feature","id":"28121","properties":{"name":"Rankin"},"geometry":{"type":"Polygon","coordinates":[[[-90.03752,32.448925],[-89.785581,32.585849],[-89.730812,32.224371],[-89.730812,32.049109],[-90.190875,32.049109],[-90.229213,32.049109],[-90.064905,32.399633],[-90.03752,32.448925]]]}},
+{"type":"Feature","id":"28123","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-89.730812,32.635141],[-89.320041,32.574895],[-89.320041,32.224371],[-89.456965,32.224371],[-89.730812,32.224371],[-89.785581,32.585849],[-89.730812,32.635141]]]}},
+{"type":"Feature","id":"28125","properties":{"name":"Sharkey"},"geometry":{"type":"Polygon","coordinates":[[[-90.913831,33.095204],[-90.70023,33.095204],[-90.656414,32.919942],[-90.722138,32.662526],[-90.913831,33.007573],[-90.913831,33.095204]]]}},
+{"type":"Feature","id":"28127","properties":{"name":"Simpson"},"geometry":{"type":"Polygon","coordinates":[[[-90.190875,32.049109],[-89.730812,32.049109],[-89.654134,31.780739],[-89.752719,31.775262],[-89.977274,31.764308],[-90.125151,31.753354],[-90.229213,32.049109],[-90.190875,32.049109]]]}},
+{"type":"Feature","id":"28129","properties":{"name":"Smith"},"geometry":{"type":"Polygon","coordinates":[[[-89.456965,32.224371],[-89.320041,32.224371],[-89.314564,31.802646],[-89.402195,31.797169],[-89.654134,31.780739],[-89.730812,32.049109],[-89.730812,32.224371],[-89.456965,32.224371]]]}},
+{"type":"Feature","id":"28131","properties":{"name":"Stone"},"geometry":{"type":"Polygon","coordinates":[[[-88.996902,30.909905],[-88.887363,30.909905],[-88.881886,30.734643],[-88.881886,30.679874],[-89.341949,30.647012],[-89.341949,30.909905],[-89.139302,30.909905],[-88.996902,30.909905]]]}},
+{"type":"Feature","id":"28133","properties":{"name":"Sunflower"},"geometry":{"type":"Polygon","coordinates":[[[-90.448291,33.987946],[-90.453768,33.812683],[-90.453768,33.330713],[-90.716661,33.270466],[-90.765953,33.527883],[-90.656414,33.987946],[-90.448291,33.987946]]]}},
+{"type":"Feature","id":"28135","properties":{"name":"Tallahatchie"},"geometry":{"type":"Polygon","coordinates":[[[-89.933458,34.163208],[-89.927981,33.900315],[-90.136105,33.719575],[-90.453768,33.812683],[-90.448291,33.987946],[-90.448291,34.075577],[-90.136105,34.157731],[-89.933458,34.163208]]]}},
+{"type":"Feature","id":"28137","properties":{"name":"Tate"},"geometry":{"type":"Polygon","coordinates":[[[-89.845827,34.771148],[-89.725335,34.771148],[-89.670565,34.55207],[-89.719858,34.55207],[-90.097767,34.55207],[-90.196352,34.55207],[-90.201828,34.721856],[-89.845827,34.771148]]]}},
+{"type":"Feature","id":"28139","properties":{"name":"Tippah"},"geometry":{"type":"Polygon","coordinates":[[[-89.018809,34.995703],[-88.821639,34.995703],[-88.717578,34.754717],[-88.734008,34.595886],[-89.09001,34.595886],[-89.018809,34.995703]]]}},
+{"type":"Feature","id":"28141","properties":{"name":"Tishomingo"},"geometry":{"type":"Polygon","coordinates":[[[-88.252038,34.995703],[-88.202745,34.995703],[-88.098683,34.891641],[-88.142499,34.579455],[-88.15893,34.464439],[-88.328715,34.464439],[-88.367053,34.754717],[-88.361576,34.995703],[-88.252038,34.995703]]]}},
+{"type":"Feature","id":"28143","properties":{"name":"Tunica"},"geometry":{"type":"Polygon","coordinates":[[[-90.267552,34.858779],[-90.201828,34.721856],[-90.196352,34.55207],[-90.196352,34.508255],[-90.398998,34.426101],[-90.568783,34.524686],[-90.585214,34.639701],[-90.409952,34.831394],[-90.30589,34.858779],[-90.267552,34.858779]]]}},
+{"type":"Feature","id":"28145","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-89.09001,34.595886],[-88.734008,34.595886],[-88.734008,34.508255],[-88.827116,34.365854],[-89.09001,34.382285],[-89.248841,34.376808],[-89.248841,34.497301],[-89.243364,34.584932],[-89.09001,34.595886]]]}},
+{"type":"Feature","id":"28147","properties":{"name":"Walthall"},"geometry":{"type":"Polygon","coordinates":[[[-90.190875,31.34806],[-90.042997,31.337106],[-89.834873,31.003013],[-90.262075,31.003013],[-90.262075,31.34806],[-90.245644,31.34806],[-90.190875,31.34806]]]}},
+{"type":"Feature","id":"28149","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-91.045277,32.574895],[-90.722138,32.61871],[-90.552353,32.509172],[-90.727615,32.224371],[-91.028846,32.114832],[-91.028846,32.120309],[-91.050754,32.125786],[-91.121954,32.213417],[-91.067185,32.563941],[-91.045277,32.574895]]]}},
+{"type":"Feature","id":"28151","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-91.001462,33.527883],[-90.765953,33.527883],[-90.716661,33.270466],[-90.70023,33.095204],[-90.913831,33.095204],[-90.913831,33.007573],[-91.16577,33.01305],[-91.215062,33.527883],[-91.001462,33.527883]]]}},
+{"type":"Feature","id":"28153","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-88.471115,31.895754],[-88.465638,31.698584],[-88.449208,31.435691],[-88.460161,31.435691],[-88.843547,31.435691],[-88.942132,31.435691],[-88.942132,31.824554],[-88.909271,31.824554],[-88.471115,31.895754]]]}},
+{"type":"Feature","id":"28155","properties":{"name":"Webster"},"geometry":{"type":"Polygon","coordinates":[[[-89.117394,33.741483],[-89.03524,33.741483],[-89.018809,33.560744],[-89.051671,33.560744],[-89.09001,33.53336],[-89.139302,33.53336],[-89.380287,33.462159],[-89.506257,33.67576],[-89.506257,33.719575],[-89.194071,33.736006],[-89.117394,33.741483]]]}},
+{"type":"Feature","id":"28157","properties":{"name":"Wilkinson"},"geometry":{"type":"Polygon","coordinates":[[[-91.264355,31.369968],[-91.160293,31.34806],[-91.09457,31.320676],[-91.061708,30.997536],[-91.176724,30.997536],[-91.636787,30.997536],[-91.587494,31.189229],[-91.264355,31.369968]]]}},
+{"type":"Feature","id":"28159","properties":{"name":"Winston"},"geometry":{"type":"Polygon","coordinates":[[[-89.09001,33.286897],[-88.810686,33.286897],[-88.810686,32.925419],[-88.914747,32.925419],[-89.155733,32.930896],[-89.320041,32.930896],[-89.320041,33.106158],[-89.09001,33.286897]]]}},
+{"type":"Feature","id":"28161","properties":{"name":"Yalobusha"},"geometry":{"type":"Polygon","coordinates":[[[-89.511734,34.163208],[-89.506257,33.867453],[-89.927981,33.900315],[-89.933458,34.163208],[-89.719858,34.190592],[-89.511734,34.163208]]]}},
+{"type":"Feature","id":"28163","properties":{"name":"Yazoo"},"geometry":{"type":"Polygon","coordinates":[[[-90.366137,33.01305],[-89.96632,32.881604],[-90.448291,32.574895],[-90.486629,32.542033],[-90.552353,32.509172],[-90.722138,32.61871],[-90.722138,32.662526],[-90.656414,32.919942],[-90.366137,33.01305]]]}},
+{"type":"Feature","id":"29001","properties":{"name":"Adair"},"geometry":{"type":"Polygon","coordinates":[[[-92.348789,40.346673],[-92.348789,40.302858],[-92.343312,40.039965],[-92.677405,40.039965],[-92.847191,40.039965],[-92.858145,40.039965],[-92.858145,40.341196],[-92.682882,40.341196],[-92.348789,40.346673]]]}},
+{"type":"Feature","id":"29003","properties":{"name":"Andrew"},"geometry":{"type":"Polygon","coordinates":[[[-95.043444,40.127596],[-94.605288,40.127596],[-94.605288,40.039965],[-94.605288,39.820887],[-94.769597,39.820887],[-94.879136,39.820887],[-94.994151,39.897564],[-95.043444,40.127596]]]}},
+{"type":"Feature","id":"29005","properties":{"name":"Atchison"},"geometry":{"type":"Polygon","coordinates":[[[-95.7664,40.587659],[-95.37206,40.582182],[-95.202275,40.576705],[-95.180367,40.264519],[-95.503507,40.264519],[-95.552799,40.264519],[-95.71163,40.521935],[-95.7664,40.587659]]]}},
+{"type":"Feature","id":"29007","properties":{"name":"Audrain"},"geometry":{"type":"Polygon","coordinates":[[[-92.31045,39.34987],[-91.718941,39.338916],[-91.439617,39.317009],[-91.406755,39.141746],[-91.625833,39.147223],[-91.63131,39.059592],[-92.107804,39.065069],[-92.315927,39.245808],[-92.31045,39.34987]]]}},
+{"type":"Feature","id":"29009","properties":{"name":"Barry"},"geometry":{"type":"Polygon","coordinates":[[[-94.008302,36.929063],[-93.608485,36.923586],[-93.586578,36.496384],[-93.728978,36.496384],[-93.865902,36.496384],[-94.079502,36.496384],[-94.068548,36.748324],[-94.063071,36.929063],[-94.008302,36.929063]]]}},
+{"type":"Feature","id":"29011","properties":{"name":"Barton"},"geometry":{"type":"Polygon","coordinates":[[[-94.490273,37.652019],[-94.074025,37.641065],[-94.074025,37.580818],[-94.079502,37.350787],[-94.577904,37.361741],[-94.616242,37.361741],[-94.616242,37.652019],[-94.490273,37.652019]]]}},
+{"type":"Feature","id":"29013","properties":{"name":"Bates"},"geometry":{"type":"Polygon","coordinates":[[[-94.610765,38.479037],[-94.063071,38.446175],[-94.052118,38.216144],[-94.057594,38.035405],[-94.501227,38.057312],[-94.616242,38.062789],[-94.610765,38.391406],[-94.610765,38.479037],[-94.610765,38.479037]]]}},
+{"type":"Feature","id":"29015","properties":{"name":"Benton"},"geometry":{"type":"Polygon","coordinates":[[[-93.159376,38.533806],[-93.066268,38.528329],[-93.077222,38.259959],[-93.066268,38.062789],[-93.411315,38.068266],[-93.504423,38.073743],[-93.520854,38.20519],[-93.515377,38.511898],[-93.159376,38.533806]]]}},
+{"type":"Feature","id":"29017","properties":{"name":"Bollinger"},"geometry":{"type":"Polygon","coordinates":[[[-89.862258,37.597249],[-89.867735,37.126232],[-90.10872,37.038601],[-90.218259,37.312448],[-90.147059,37.597249],[-89.862258,37.597249]]]}},
+{"type":"Feature","id":"29019","properties":{"name":"Boone"},"geometry":{"type":"Polygon","coordinates":[[[-92.430943,39.251285],[-92.315927,39.245808],[-92.107804,39.065069],[-92.222819,38.643345],[-92.392605,38.736453],[-92.463805,38.862422],[-92.496666,38.922669],[-92.556913,38.971961],[-92.430943,39.251285]]]}},
+{"type":"Feature","id":"29021","properties":{"name":"Buchanan"},"geometry":{"type":"Polygon","coordinates":[[[-94.769597,39.820887],[-94.605288,39.820887],[-94.599812,39.749687],[-94.599812,39.530609],[-95.10369,39.530609],[-95.054398,39.623717],[-94.879136,39.820887],[-94.769597,39.820887]]]}},
+{"type":"Feature","id":"29023","properties":{"name":"Butler"},"geometry":{"type":"Polygon","coordinates":[[[-90.568783,36.929063],[-90.256598,36.923586],[-90.147059,36.633308],[-90.218259,36.496384],[-90.57426,36.496384],[-90.661891,36.814047],[-90.678322,36.929063],[-90.568783,36.929063]]]}},
+{"type":"Feature","id":"29025","properties":{"name":"Caldwell"},"geometry":{"type":"Polygon","coordinates":[[[-93.871378,39.788025],[-93.756363,39.782548],[-93.756363,39.612763],[-93.76184,39.525132],[-94.10141,39.525132],[-94.210949,39.525132],[-94.205472,39.74421],[-94.205472,39.788025],[-93.871378,39.788025]]]}},
+{"type":"Feature","id":"29027","properties":{"name":"Callaway"},"geometry":{"type":"Polygon","coordinates":[[[-92.107804,39.065069],[-91.63131,39.059592],[-91.647741,38.703591],[-92.009219,38.572145],[-92.222819,38.643345],[-92.107804,39.065069]]]}},
+{"type":"Feature","id":"29029","properties":{"name":"Camden"},"geometry":{"type":"Polygon","coordinates":[[[-93.077222,38.259959],[-92.693836,38.22162],[-92.403558,38.018974],[-92.409035,37.860142],[-92.852668,37.893004],[-93.071745,37.903958],[-93.066268,38.062789],[-93.077222,38.259959]]]}},
+{"type":"Feature","id":"29031","properties":{"name":"Cape Girardeau"},"geometry":{"type":"Polygon","coordinates":[[[-89.796535,37.602726],[-89.522688,37.564388],[-89.484349,37.334356],[-89.489826,37.252202],[-89.763673,37.126232],[-89.867735,37.126232],[-89.867735,37.126232],[-89.862258,37.597249],[-89.796535,37.602726]]]}},
+{"type":"Feature","id":"29033","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-93.422269,39.612763],[-93.279869,39.61824],[-93.104607,39.382732],[-93.274392,39.317009],[-93.477039,39.295101],[-93.597531,39.240331],[-93.756363,39.20747],[-93.76184,39.525132],[-93.756363,39.612763],[-93.422269,39.612763]]]}},
+{"type":"Feature","id":"29035","properties":{"name":"Carter"},"geometry":{"type":"Polygon","coordinates":[[[-91.220539,37.038601],[-91.017893,37.093371],[-90.776907,37.049555],[-90.678322,36.929063],[-90.661891,36.814047],[-90.935738,36.814047],[-91.116477,36.825001],[-91.220539,36.885247],[-91.220539,37.038601]]]}},
+{"type":"Feature","id":"29037","properties":{"name":"Cass"},"geometry":{"type":"Polygon","coordinates":[[[-94.583381,38.845992],[-94.117841,38.835038],[-94.063071,38.566668],[-94.063071,38.446175],[-94.610765,38.479037],[-94.610765,38.479037],[-94.610765,38.736453],[-94.610765,38.845992],[-94.583381,38.845992]]]}},
+{"type":"Feature","id":"29039","properties":{"name":"Cedar"},"geometry":{"type":"Polygon","coordinates":[[[-94.063071,37.898481],[-93.630393,37.827281],[-93.613962,37.575342],[-94.074025,37.580818],[-94.074025,37.641065],[-94.063071,37.898481]]]}},
+{"type":"Feature","id":"29041","properties":{"name":"Chariton"},"geometry":{"type":"Polygon","coordinates":[[[-93.04436,39.705871],[-92.858145,39.700394],[-92.693836,39.612763],[-92.70479,39.322485],[-92.847191,39.223901],[-93.104607,39.382732],[-93.279869,39.61824],[-93.268915,39.705871],[-93.04436,39.705871]]]}},
+{"type":"Feature","id":"29043","properties":{"name":"Christian"},"geometry":{"type":"Polygon","coordinates":[[[-93.482516,37.098848],[-93.066268,37.087894],[-92.90196,37.071463],[-92.907437,36.80857],[-93.301777,36.819524],[-93.592055,36.994786],[-93.608485,36.994786],[-93.608485,37.098848],[-93.482516,37.098848]]]}},
+{"type":"Feature","id":"29045","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-91.833957,40.609566],[-91.718941,40.598613],[-91.417709,40.379535],[-91.499863,40.248088],[-91.948972,40.259042],[-91.948972,40.302858],[-91.943495,40.60409],[-91.833957,40.609566]]]}},
+{"type":"Feature","id":"29047","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-94.56695,39.453932],[-94.210949,39.453932],[-94.210949,39.20747],[-94.419073,39.147223],[-94.605288,39.114362],[-94.599812,39.158177],[-94.599812,39.453932],[-94.56695,39.453932]]]}},
+{"type":"Feature","id":"29049","properties":{"name":"Clinton"},"geometry":{"type":"Polygon","coordinates":[[[-94.506704,39.749687],[-94.205472,39.74421],[-94.210949,39.525132],[-94.210949,39.453932],[-94.56695,39.453932],[-94.599812,39.453932],[-94.599812,39.530609],[-94.599812,39.749687],[-94.506704,39.749687]]]}},
+{"type":"Feature","id":"29051","properties":{"name":"Cole"},"geometry":{"type":"Polygon","coordinates":[[[-92.392605,38.736453],[-92.222819,38.643345],[-92.009219,38.572145],[-92.195435,38.336636],[-92.496666,38.429744],[-92.392605,38.736453]]]}},
+{"type":"Feature","id":"29053","properties":{"name":"Cooper"},"geometry":{"type":"Polygon","coordinates":[[[-92.918391,39.032208],[-92.556913,38.971961],[-92.496666,38.922669],[-92.841714,38.681683],[-93.060791,38.692637],[-93.049837,38.928146],[-92.934822,39.065069],[-92.918391,39.032208]]]}},
+{"type":"Feature","id":"29055","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-91.532725,38.210667],[-91.368417,38.210667],[-91.09457,38.20519],[-91.100047,37.73965],[-91.154816,37.695834],[-91.527248,37.788942],[-91.532725,38.15042],[-91.532725,38.210667]]]}},
+{"type":"Feature","id":"29057","properties":{"name":"Dade"},"geometry":{"type":"Polygon","coordinates":[[[-94.074025,37.580818],[-93.613962,37.575342],[-93.619439,37.427464],[-93.619439,37.427464],[-93.624916,37.279587],[-94.008302,37.290541],[-94.052118,37.290541],[-94.079502,37.350787],[-94.074025,37.580818]]]}},
+{"type":"Feature","id":"29059","properties":{"name":"Dallas"},"geometry":{"type":"Polygon","coordinates":[[[-93.126515,37.903958],[-93.071745,37.903958],[-92.852668,37.893004],[-92.852668,37.482234],[-93.071745,37.48771],[-93.071745,37.41651],[-93.181284,37.41651],[-93.186761,37.805373],[-93.126515,37.903958]]]}},
+{"type":"Feature","id":"29061","properties":{"name":"Daviess"},"geometry":{"type":"Polygon","coordinates":[[[-94.216426,40.13855],[-93.76184,40.133073],[-93.76184,39.957811],[-93.756363,39.782548],[-93.871378,39.788025],[-94.205472,39.788025],[-94.216426,40.034488],[-94.216426,40.13855]]]}},
+{"type":"Feature","id":"29063","properties":{"name":"DeKalb"},"geometry":{"type":"Polygon","coordinates":[[[-94.577904,40.039965],[-94.216426,40.034488],[-94.205472,39.788025],[-94.205472,39.74421],[-94.506704,39.749687],[-94.599812,39.749687],[-94.605288,39.820887],[-94.605288,40.039965],[-94.577904,40.039965]]]}},
+{"type":"Feature","id":"29065","properties":{"name":"Dent"},"geometry":{"type":"Polygon","coordinates":[[[-91.806572,37.597249],[-91.527248,37.788942],[-91.154816,37.695834],[-91.154816,37.586295],[-91.209585,37.41651],[-91.554633,37.421987],[-91.647741,37.421987],[-91.806572,37.597249]]]}},
+{"type":"Feature","id":"29067","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-92.688359,37.065986],[-92.250204,37.060509],[-92.091373,37.055032],[-92.113281,36.792139],[-92.529528,36.803093],[-92.765037,36.80857],[-92.907437,36.80857],[-92.90196,37.071463],[-92.688359,37.065986]]]}},
+{"type":"Feature","id":"29069","properties":{"name":"Dunklin"},"geometry":{"type":"Polygon","coordinates":[[[-90.048474,36.627831],[-89.960843,36.627831],[-89.960843,36.386845],[-89.960843,35.997983],[-90.289459,35.997983],[-90.377091,35.997983],[-90.190875,36.200629],[-90.218259,36.496384],[-90.147059,36.633308],[-90.048474,36.627831]]]}},
+{"type":"Feature","id":"29071","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-90.963123,38.550237],[-90.733092,38.637868],[-90.738569,38.47356],[-90.782384,38.20519],[-91.09457,38.20519],[-91.368417,38.210667],[-91.368417,38.698114],[-90.963123,38.550237]]]}},
+{"type":"Feature","id":"29073","properties":{"name":"Gasconade"},"geometry":{"type":"Polygon","coordinates":[[[-91.417709,38.709068],[-91.368417,38.698114],[-91.368417,38.210667],[-91.532725,38.210667],[-91.532725,38.15042],[-91.63131,38.155897],[-91.642264,38.287344],[-91.642264,38.703591],[-91.417709,38.709068]]]}},
+{"type":"Feature","id":"29075","properties":{"name":"Gentry"},"geometry":{"type":"Polygon","coordinates":[[[-94.325965,40.385012],[-94.216426,40.385012],[-94.216426,40.13855],[-94.216426,40.034488],[-94.577904,40.039965],[-94.605288,40.039965],[-94.605288,40.127596],[-94.599812,40.385012],[-94.325965,40.385012]]]}},
+{"type":"Feature","id":"29077","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-93.619439,37.427464],[-93.619439,37.427464],[-93.181284,37.41651],[-93.071745,37.41651],[-93.066268,37.087894],[-93.482516,37.098848],[-93.608485,37.098848],[-93.624916,37.279587],[-93.619439,37.427464]]]}},
+{"type":"Feature","id":"29079","properties":{"name":"Grundy"},"geometry":{"type":"Polygon","coordinates":[[[-93.3675,40.264519],[-93.362023,40.034488],[-93.362023,39.968764],[-93.76184,39.957811],[-93.76184,40.133073],[-93.76184,40.264519],[-93.3675,40.264519]]]}},
+{"type":"Feature","id":"29081","properties":{"name":"Harrison"},"geometry":{"type":"Polygon","coordinates":[[[-93.772794,40.576705],[-93.76184,40.264519],[-93.76184,40.133073],[-94.216426,40.13855],[-94.216426,40.385012],[-94.232857,40.571228],[-94.013779,40.571228],[-93.772794,40.576705]]]}},
+{"type":"Feature","id":"29083","properties":{"name":"Henry"},"geometry":{"type":"Polygon","coordinates":[[[-93.794701,38.561191],[-93.5099,38.555714],[-93.515377,38.511898],[-93.520854,38.20519],[-93.772794,38.20519],[-94.052118,38.216144],[-94.063071,38.446175],[-94.063071,38.566668],[-93.794701,38.561191]]]}},
+{"type":"Feature","id":"29085","properties":{"name":"Hickory"},"geometry":{"type":"Polygon","coordinates":[[[-93.411315,38.068266],[-93.066268,38.062789],[-93.071745,37.903958],[-93.126515,37.903958],[-93.186761,37.805373],[-93.575624,37.827281],[-93.504423,38.073743],[-93.411315,38.068266]]]}},
+{"type":"Feature","id":"29087","properties":{"name":"Holt"},"geometry":{"type":"Polygon","coordinates":[[[-95.503507,40.264519],[-95.180367,40.264519],[-95.043444,40.127596],[-94.994151,39.897564],[-95.306337,40.001626],[-95.552799,40.264519],[-95.552799,40.264519],[-95.503507,40.264519]]]}},
+{"type":"Feature","id":"29089","properties":{"name":"Howard"},"geometry":{"type":"Polygon","coordinates":[[[-92.847191,39.223901],[-92.70479,39.322485],[-92.430943,39.251285],[-92.556913,38.971961],[-92.918391,39.032208],[-92.934822,39.065069],[-92.847191,39.223901]]]}},
+{"type":"Feature","id":"29091","properties":{"name":"Howell"},"geometry":{"type":"Polygon","coordinates":[[[-92.074942,37.055032],[-91.653218,37.049555],[-91.658695,36.890724],[-91.669648,36.501861],[-92.118758,36.496384],[-92.113281,36.792139],[-92.091373,37.055032],[-92.074942,37.055032]]]}},
+{"type":"Feature","id":"29093","properties":{"name":"Iron"},"geometry":{"type":"Polygon","coordinates":[[[-90.645461,37.734173],[-90.535922,37.641065],[-90.552353,37.317925],[-90.733092,37.268633],[-90.77143,37.476757],[-91.154816,37.586295],[-91.154816,37.695834],[-91.100047,37.73965],[-90.645461,37.734173]]]}},
+{"type":"Feature","id":"29095","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-94.419073,39.147223],[-94.210949,39.20747],[-94.106887,39.141746],[-94.112364,38.917192],[-94.117841,38.835038],[-94.583381,38.845992],[-94.610765,38.845992],[-94.605288,39.043162],[-94.605288,39.114362],[-94.419073,39.147223]]]}},
+{"type":"Feature","id":"29097","properties":{"name":"Jasper"},"geometry":{"type":"Polygon","coordinates":[[[-94.577904,37.361741],[-94.079502,37.350787],[-94.052118,37.290541],[-94.057594,37.049555],[-94.616242,37.055032],[-94.616242,37.339833],[-94.616242,37.361741],[-94.577904,37.361741]]]}},
+{"type":"Feature","id":"29099","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-90.464722,38.500944],[-90.344229,38.385929],[-90.251121,38.128512],[-90.415429,38.040881],[-90.639984,38.07922],[-90.782384,38.20519],[-90.738569,38.47356],[-90.464722,38.500944]]]}},
+{"type":"Feature","id":"29101","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-93.800178,38.9391],[-93.498947,38.928146],[-93.5099,38.555714],[-93.794701,38.561191],[-94.063071,38.566668],[-94.117841,38.835038],[-94.112364,38.917192],[-93.800178,38.9391]]]}},
+{"type":"Feature","id":"29103","properties":{"name":"Knox"},"geometry":{"type":"Polygon","coordinates":[[[-92.140665,40.302858],[-91.948972,40.302858],[-91.948972,40.259042],[-91.954449,39.946857],[-91.998265,39.952334],[-92.288543,39.952334],[-92.343312,40.039965],[-92.348789,40.302858],[-92.140665,40.302858]]]}},
+{"type":"Feature","id":"29105","properties":{"name":"Laclede"},"geometry":{"type":"Polygon","coordinates":[[[-92.852668,37.893004],[-92.409035,37.860142],[-92.250204,37.602726],[-92.250204,37.47128],[-92.688359,37.482234],[-92.852668,37.482234],[-92.852668,37.893004]]]}},
+{"type":"Feature","id":"29107","properties":{"name":"Lafayette"},"geometry":{"type":"Polygon","coordinates":[[[-93.597531,39.240331],[-93.477039,39.295101],[-93.498947,38.944577],[-93.498947,38.928146],[-93.800178,38.9391],[-94.112364,38.917192],[-94.106887,39.141746],[-93.756363,39.20747],[-93.597531,39.240331]]]}},
+{"type":"Feature","id":"29109","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-94.008302,37.290541],[-93.624916,37.279587],[-93.608485,37.098848],[-93.608485,36.994786],[-93.608485,36.923586],[-94.008302,36.929063],[-94.063071,36.929063],[-94.057594,37.049555],[-94.052118,37.290541],[-94.008302,37.290541]]]}},
+{"type":"Feature","id":"29111","properties":{"name":"Lewis"},"geometry":{"type":"Polygon","coordinates":[[[-91.948972,40.259042],[-91.499863,40.248088],[-91.50534,40.198796],[-91.43414,39.946857],[-91.784664,39.946857],[-91.839434,39.946857],[-91.954449,39.946857],[-91.948972,40.259042]]]}},
+{"type":"Feature","id":"29113","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-91.149339,39.229378],[-90.722138,39.223901],[-90.667368,38.933623],[-90.957646,38.873376],[-91.111001,38.895284],[-91.264355,38.993869],[-91.258878,39.141746],[-91.149339,39.229378]]]}},
+{"type":"Feature","id":"29115","properties":{"name":"Linn"},"geometry":{"type":"Polygon","coordinates":[[[-92.858145,40.039965],[-92.847191,40.039965],[-92.858145,39.700394],[-93.04436,39.705871],[-93.268915,39.705871],[-93.362023,39.968764],[-93.362023,40.034488],[-92.858145,40.039965]]]}},
+{"type":"Feature","id":"29117","properties":{"name":"Livingston"},"geometry":{"type":"Polygon","coordinates":[[[-93.362023,39.968764],[-93.268915,39.705871],[-93.279869,39.61824],[-93.422269,39.612763],[-93.756363,39.612763],[-93.756363,39.782548],[-93.76184,39.957811],[-93.362023,39.968764]]]}},
+{"type":"Feature","id":"29119","properties":{"name":"McDonald"},"geometry":{"type":"Polygon","coordinates":[[[-94.539565,36.764754],[-94.068548,36.748324],[-94.079502,36.496384],[-94.473842,36.501861],[-94.616242,36.501861],[-94.616242,36.666169],[-94.616242,36.764754],[-94.539565,36.764754]]]}},
+{"type":"Feature","id":"29121","properties":{"name":"Macon"},"geometry":{"type":"Polygon","coordinates":[[[-92.677405,40.039965],[-92.343312,40.039965],[-92.288543,39.952334],[-92.299497,39.607286],[-92.299497,39.607286],[-92.693836,39.612763],[-92.858145,39.700394],[-92.847191,40.039965],[-92.677405,40.039965]]]}},
+{"type":"Feature","id":"29123","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-90.535922,37.641065],[-90.147059,37.641065],[-90.147059,37.597249],[-90.218259,37.312448],[-90.552353,37.317925],[-90.535922,37.641065]]]}},
+{"type":"Feature","id":"29125","properties":{"name":"Maries"},"geometry":{"type":"Polygon","coordinates":[[[-91.954449,38.287344],[-91.642264,38.287344],[-91.63131,38.155897],[-92.020173,38.00802],[-92.184481,38.018974],[-92.195435,38.292821],[-91.954449,38.287344]]]}},
+{"type":"Feature","id":"29127","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-91.784664,39.946857],[-91.43414,39.946857],[-91.36294,39.760641],[-91.30817,39.683964],[-91.686079,39.683964],[-91.713464,39.656579],[-91.844911,39.656579],[-91.839434,39.946857],[-91.784664,39.946857]]]}},
+{"type":"Feature","id":"29129","properties":{"name":"Mercer"},"geometry":{"type":"Polygon","coordinates":[[[-93.526331,40.582182],[-93.372977,40.582182],[-93.3675,40.385012],[-93.3675,40.264519],[-93.76184,40.264519],[-93.772794,40.576705],[-93.559193,40.582182],[-93.526331,40.582182]]]}},
+{"type":"Feature","id":"29131","properties":{"name":"Miller"},"geometry":{"type":"Polygon","coordinates":[[[-92.611682,38.429744],[-92.496666,38.429744],[-92.195435,38.336636],[-92.195435,38.292821],[-92.184481,38.018974],[-92.359743,38.018974],[-92.403558,38.018974],[-92.693836,38.22162],[-92.622636,38.429744],[-92.611682,38.429744]]]}},
+{"type":"Feature","id":"29133","properties":{"name":"Mississippi"},"geometry":{"type":"Polygon","coordinates":[[[-89.314564,37.011217],[-89.133825,36.983832],[-89.100963,36.945493],[-89.122871,36.786662],[-89.172164,36.649739],[-89.325518,36.633308],[-89.517211,36.868816],[-89.314564,37.011217]]]}},
+{"type":"Feature","id":"29135","properties":{"name":"Moniteau"},"geometry":{"type":"Polygon","coordinates":[[[-92.463805,38.862422],[-92.392605,38.736453],[-92.496666,38.429744],[-92.611682,38.429744],[-92.622636,38.429744],[-92.841714,38.681683],[-92.496666,38.922669],[-92.463805,38.862422]]]}},
+{"type":"Feature","id":"29137","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-92.299497,39.607286],[-91.844911,39.656579],[-91.713464,39.656579],[-91.718941,39.338916],[-92.31045,39.34987],[-92.299497,39.607286],[-92.299497,39.607286]]]}},
+{"type":"Feature","id":"29139","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-91.625833,39.147223],[-91.406755,39.141746],[-91.258878,39.141746],[-91.264355,38.993869],[-91.417709,38.709068],[-91.642264,38.703591],[-91.647741,38.703591],[-91.63131,39.059592],[-91.625833,39.147223]]]}},
+{"type":"Feature","id":"29141","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-93.060791,38.692637],[-92.841714,38.681683],[-92.622636,38.429744],[-92.693836,38.22162],[-93.077222,38.259959],[-93.066268,38.528329],[-93.060791,38.692637]]]}},
+{"type":"Feature","id":"29143","properties":{"name":"New Madrid"},"geometry":{"type":"Polygon","coordinates":[[[-89.528165,36.868816],[-89.517211,36.868816],[-89.325518,36.633308],[-89.418626,36.496384],[-89.484349,36.496384],[-89.539119,36.496384],[-89.544596,36.337553],[-89.714381,36.425184],[-89.960843,36.386845],[-89.960843,36.627831],[-89.692473,36.857862],[-89.528165,36.868816]]]}},
+{"type":"Feature","id":"29145","properties":{"name":"Newton"},"geometry":{"type":"Polygon","coordinates":[[[-94.616242,37.055032],[-94.616242,37.055032],[-94.057594,37.049555],[-94.063071,36.929063],[-94.068548,36.748324],[-94.539565,36.764754],[-94.616242,36.764754],[-94.616242,37.000263],[-94.616242,37.055032]]]}},
+{"type":"Feature","id":"29147","properties":{"name":"Nodaway"},"geometry":{"type":"Polygon","coordinates":[[[-95.163936,40.576705],[-94.917474,40.576705],[-94.632673,40.571228],[-94.599812,40.385012],[-94.605288,40.127596],[-95.043444,40.127596],[-95.180367,40.264519],[-95.202275,40.576705],[-95.163936,40.576705]]]}},
+{"type":"Feature","id":"29149","properties":{"name":"Oregon"},"geometry":{"type":"Polygon","coordinates":[[[-91.658695,36.890724],[-91.220539,36.885247],[-91.116477,36.825001],[-91.127431,36.496384],[-91.406755,36.496384],[-91.450571,36.496384],[-91.450571,36.496384],[-91.669648,36.501861],[-91.658695,36.890724]]]}},
+{"type":"Feature","id":"29151","properties":{"name":"Osage"},"geometry":{"type":"Polygon","coordinates":[[[-91.647741,38.703591],[-91.642264,38.703591],[-91.642264,38.287344],[-91.954449,38.287344],[-92.195435,38.292821],[-92.195435,38.336636],[-92.009219,38.572145],[-91.647741,38.703591]]]}},
+{"type":"Feature","id":"29153","properties":{"name":"Ozark"},"geometry":{"type":"Polygon","coordinates":[[[-92.529528,36.803093],[-92.113281,36.792139],[-92.118758,36.496384],[-92.151619,36.496384],[-92.529528,36.496384],[-92.770513,36.496384],[-92.765037,36.80857],[-92.529528,36.803093]]]}},
+{"type":"Feature","id":"29155","properties":{"name":"Pemiscot"},"geometry":{"type":"Polygon","coordinates":[[[-89.714381,36.425184],[-89.544596,36.337553],[-89.62675,36.184199],[-89.730812,35.997983],[-89.960843,35.997983],[-89.960843,36.386845],[-89.714381,36.425184]]]}},
+{"type":"Feature","id":"29157","properties":{"name":"Perry"},"geometry":{"type":"Polygon","coordinates":[[[-89.938935,37.876573],[-89.676042,37.805373],[-89.522688,37.569865],[-89.522688,37.564388],[-89.796535,37.602726],[-89.862258,37.597249],[-90.147059,37.597249],[-90.147059,37.641065],[-90.10872,37.673926],[-89.938935,37.876573]]]}},
+{"type":"Feature","id":"29159","properties":{"name":"Pettis"},"geometry":{"type":"Polygon","coordinates":[[[-93.498947,38.944577],[-93.049837,38.928146],[-93.060791,38.692637],[-93.066268,38.528329],[-93.159376,38.533806],[-93.515377,38.511898],[-93.5099,38.555714],[-93.498947,38.928146],[-93.498947,38.944577]]]}},
+{"type":"Feature","id":"29161","properties":{"name":"Phelps"},"geometry":{"type":"Polygon","coordinates":[[[-91.63131,38.155897],[-91.532725,38.15042],[-91.527248,37.788942],[-91.806572,37.597249],[-92.031127,37.602726],[-92.020173,38.00802],[-91.63131,38.155897]]]}},
+{"type":"Feature","id":"29163","properties":{"name":"Pike"},"geometry":{"type":"Polygon","coordinates":[[[-91.198632,39.596333],[-91.176724,39.596333],[-90.935738,39.399163],[-90.722138,39.223901],[-91.149339,39.229378],[-91.258878,39.141746],[-91.406755,39.141746],[-91.439617,39.317009],[-91.198632,39.596333]]]}},
+{"type":"Feature","id":"29165","properties":{"name":"Platte"},"geometry":{"type":"Polygon","coordinates":[[[-95.10369,39.530609],[-94.599812,39.530609],[-94.599812,39.453932],[-94.599812,39.158177],[-94.775074,39.201993],[-94.966767,39.42107],[-95.10369,39.530609]]]}},
+{"type":"Feature","id":"29167","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-93.630393,37.827281],[-93.575624,37.827281],[-93.186761,37.805373],[-93.181284,37.41651],[-93.619439,37.427464],[-93.613962,37.575342],[-93.630393,37.827281]]]}},
+{"type":"Feature","id":"29169","properties":{"name":"Pulaski"},"geometry":{"type":"Polygon","coordinates":[[[-92.359743,38.018974],[-92.184481,38.018974],[-92.020173,38.00802],[-92.031127,37.602726],[-92.250204,37.602726],[-92.409035,37.860142],[-92.403558,38.018974],[-92.359743,38.018974]]]}},
+{"type":"Feature","id":"29171","properties":{"name":"Putnam"},"geometry":{"type":"Polygon","coordinates":[[[-92.748606,40.587659],[-92.715744,40.587659],[-92.682882,40.341196],[-92.858145,40.341196],[-93.186761,40.385012],[-93.3675,40.385012],[-93.372977,40.582182],[-93.09913,40.582182],[-92.748606,40.587659]]]}},
+{"type":"Feature","id":"29173","properties":{"name":"Ralls"},"geometry":{"type":"Polygon","coordinates":[[[-91.686079,39.683964],[-91.30817,39.683964],[-91.176724,39.596333],[-91.198632,39.596333],[-91.439617,39.317009],[-91.718941,39.338916],[-91.713464,39.656579],[-91.686079,39.683964]]]}},
+{"type":"Feature","id":"29175","properties":{"name":"Randolph"},"geometry":{"type":"Polygon","coordinates":[[[-92.693836,39.612763],[-92.299497,39.607286],[-92.31045,39.34987],[-92.315927,39.245808],[-92.430943,39.251285],[-92.70479,39.322485],[-92.693836,39.612763]]]}},
+{"type":"Feature","id":"29177","properties":{"name":"Ray"},"geometry":{"type":"Polygon","coordinates":[[[-94.10141,39.525132],[-93.76184,39.525132],[-93.756363,39.20747],[-94.106887,39.141746],[-94.210949,39.20747],[-94.210949,39.453932],[-94.210949,39.525132],[-94.10141,39.525132]]]}},
+{"type":"Feature","id":"29179","properties":{"name":"Reynolds"},"geometry":{"type":"Polygon","coordinates":[[[-90.77143,37.476757],[-90.733092,37.268633],[-90.776907,37.049555],[-91.017893,37.093371],[-91.209585,37.41651],[-91.154816,37.586295],[-90.77143,37.476757]]]}},
+{"type":"Feature","id":"29181","properties":{"name":"Ripley"},"geometry":{"type":"Polygon","coordinates":[[[-90.935738,36.814047],[-90.661891,36.814047],[-90.57426,36.496384],[-90.782384,36.496384],[-90.848107,36.496384],[-91.127431,36.496384],[-91.116477,36.825001],[-90.935738,36.814047]]]}},
+{"type":"Feature","id":"29183","properties":{"name":"St. Charles"},"geometry":{"type":"Polygon","coordinates":[[[-90.448291,38.966484],[-90.278506,38.922669],[-90.119674,38.807653],[-90.283983,38.878853],[-90.733092,38.637868],[-90.963123,38.550237],[-90.957646,38.873376],[-90.667368,38.933623],[-90.448291,38.966484]]]}},
+{"type":"Feature","id":"29185","properties":{"name":"St. Clair"},"geometry":{"type":"Polygon","coordinates":[[[-93.772794,38.20519],[-93.520854,38.20519],[-93.504423,38.073743],[-93.575624,37.827281],[-93.630393,37.827281],[-94.063071,37.898481],[-94.057594,38.035405],[-94.052118,38.216144],[-93.772794,38.20519]]]}},
+{"type":"Feature","id":"29186","properties":{"name":"Ste. Genevieve"},"geometry":{"type":"Polygon","coordinates":[[[-90.251121,38.128512],[-90.207305,38.090174],[-89.938935,37.876573],[-90.10872,37.673926],[-90.415429,38.040881],[-90.251121,38.128512]]]}},
+{"type":"Feature","id":"29187","properties":{"name":"St. Francois"},"geometry":{"type":"Polygon","coordinates":[[[-90.639984,38.07922],[-90.415429,38.040881],[-90.10872,37.673926],[-90.147059,37.641065],[-90.535922,37.641065],[-90.645461,37.734173],[-90.639984,38.07922]]]}},
+{"type":"Feature","id":"29189","properties":{"name":"St. Louis"},"geometry":{"type":"Polygon","coordinates":[[[-90.283983,38.878853],[-90.119674,38.807653],[-90.168967,38.774791],[-90.256598,38.533806],[-90.262075,38.522852],[-90.344229,38.385929],[-90.464722,38.500944],[-90.738569,38.47356],[-90.733092,38.637868],[-90.283983,38.878853]]]}},
+{"type":"Feature","id":"29195","properties":{"name":"Saline"},"geometry":{"type":"Polygon","coordinates":[[[-93.274392,39.317009],[-93.104607,39.382732],[-92.847191,39.223901],[-92.934822,39.065069],[-93.049837,38.928146],[-93.498947,38.944577],[-93.477039,39.295101],[-93.274392,39.317009]]]}},
+{"type":"Feature","id":"29197","properties":{"name":"Schuyler"},"geometry":{"type":"Polygon","coordinates":[[[-92.452851,40.593136],[-92.348789,40.598613],[-92.348789,40.346673],[-92.682882,40.341196],[-92.715744,40.587659],[-92.639067,40.593136],[-92.452851,40.593136]]]}},
+{"type":"Feature","id":"29199","properties":{"name":"Scotland"},"geometry":{"type":"Polygon","coordinates":[[[-91.943495,40.60409],[-91.948972,40.302858],[-92.140665,40.302858],[-92.348789,40.302858],[-92.348789,40.346673],[-92.348789,40.598613],[-92.179004,40.598613],[-91.943495,40.60409]]]}},
+{"type":"Feature","id":"29201","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-89.489826,37.252202],[-89.314564,37.011217],[-89.517211,36.868816],[-89.528165,36.868816],[-89.692473,36.857862],[-89.763673,37.126232],[-89.489826,37.252202]]]}},
+{"type":"Feature","id":"29203","properties":{"name":"Shannon"},"geometry":{"type":"Polygon","coordinates":[[[-91.554633,37.421987],[-91.209585,37.41651],[-91.017893,37.093371],[-91.220539,37.038601],[-91.220539,36.885247],[-91.658695,36.890724],[-91.653218,37.049555],[-91.647741,37.421987],[-91.554633,37.421987]]]}},
+{"type":"Feature","id":"29205","properties":{"name":"Shelby"},"geometry":{"type":"Polygon","coordinates":[[[-91.998265,39.952334],[-91.954449,39.946857],[-91.839434,39.946857],[-91.844911,39.656579],[-92.299497,39.607286],[-92.288543,39.952334],[-91.998265,39.952334]]]}},
+{"type":"Feature","id":"29207","properties":{"name":"Stoddard"},"geometry":{"type":"Polygon","coordinates":[[[-89.867735,37.126232],[-89.763673,37.126232],[-89.692473,36.857862],[-89.960843,36.627831],[-90.048474,36.627831],[-90.147059,36.633308],[-90.256598,36.923586],[-90.10872,37.038601],[-89.867735,37.126232],[-89.867735,37.126232]]]}},
+{"type":"Feature","id":"29209","properties":{"name":"Stone"},"geometry":{"type":"Polygon","coordinates":[[[-93.592055,36.994786],[-93.301777,36.819524],[-93.312731,36.496384],[-93.586578,36.496384],[-93.608485,36.923586],[-93.608485,36.994786],[-93.592055,36.994786]]]}},
+{"type":"Feature","id":"29211","properties":{"name":"Sullivan"},"geometry":{"type":"Polygon","coordinates":[[[-93.186761,40.385012],[-92.858145,40.341196],[-92.858145,40.039965],[-93.362023,40.034488],[-93.3675,40.264519],[-93.3675,40.385012],[-93.186761,40.385012]]]}},
+{"type":"Feature","id":"29213","properties":{"name":"Taney"},"geometry":{"type":"Polygon","coordinates":[[[-93.301777,36.819524],[-92.907437,36.80857],[-92.765037,36.80857],[-92.770513,36.496384],[-92.852668,36.496384],[-93.066268,36.496384],[-93.2963,36.496384],[-93.312731,36.496384],[-93.301777,36.819524]]]}},
+{"type":"Feature","id":"29215","properties":{"name":"Texas"},"geometry":{"type":"Polygon","coordinates":[[[-92.250204,37.602726],[-92.031127,37.602726],[-91.806572,37.597249],[-91.647741,37.421987],[-91.653218,37.049555],[-92.074942,37.055032],[-92.091373,37.055032],[-92.250204,37.060509],[-92.250204,37.47128],[-92.250204,37.602726]]]}},
+{"type":"Feature","id":"29217","properties":{"name":"Vernon"},"geometry":{"type":"Polygon","coordinates":[[[-94.501227,38.057312],[-94.057594,38.035405],[-94.063071,37.898481],[-94.074025,37.641065],[-94.490273,37.652019],[-94.616242,37.652019],[-94.616242,37.673926],[-94.616242,38.035405],[-94.616242,38.062789],[-94.501227,38.057312]]]}},
+{"type":"Feature","id":"29219","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-91.111001,38.895284],[-90.957646,38.873376],[-90.963123,38.550237],[-91.368417,38.698114],[-91.417709,38.709068],[-91.264355,38.993869],[-91.111001,38.895284]]]}},
+{"type":"Feature","id":"29221","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-91.09457,38.20519],[-90.782384,38.20519],[-90.639984,38.07922],[-90.645461,37.734173],[-91.100047,37.73965],[-91.09457,38.20519]]]}},
+{"type":"Feature","id":"29223","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-90.552353,37.317925],[-90.218259,37.312448],[-90.10872,37.038601],[-90.256598,36.923586],[-90.568783,36.929063],[-90.678322,36.929063],[-90.776907,37.049555],[-90.733092,37.268633],[-90.552353,37.317925]]]}},
+{"type":"Feature","id":"29225","properties":{"name":"Webster"},"geometry":{"type":"Polygon","coordinates":[[[-93.071745,37.48771],[-92.852668,37.482234],[-92.688359,37.482234],[-92.688359,37.065986],[-92.90196,37.071463],[-93.066268,37.087894],[-93.071745,37.41651],[-93.071745,37.48771]]]}},
+{"type":"Feature","id":"29227","properties":{"name":"Worth"},"geometry":{"type":"Polygon","coordinates":[[[-94.287626,40.571228],[-94.232857,40.571228],[-94.216426,40.385012],[-94.325965,40.385012],[-94.599812,40.385012],[-94.632673,40.571228],[-94.473842,40.571228],[-94.287626,40.571228]]]}},
+{"type":"Feature","id":"29229","properties":{"name":"Wright"},"geometry":{"type":"Polygon","coordinates":[[[-92.688359,37.482234],[-92.250204,37.47128],[-92.250204,37.060509],[-92.688359,37.065986],[-92.688359,37.482234]]]}},
+{"type":"Feature","id":"29510","properties":{"name":"St. Louis"},"geometry":{"type":"Polygon","coordinates":[[[-90.168967,38.774791],[-90.179921,38.659776],[-90.256598,38.533806],[-90.168967,38.774791]]]}},
+{"type":"Feature","id":"30001","properties":{"name":"Beaverhead"},"geometry":{"type":"Polygon","coordinates":[[[-113.517164,45.938629],[-113.084485,45.861952],[-112.684669,45.626444],[-112.169836,44.826811],[-111.479742,44.711795],[-111.616665,44.547487],[-112.816115,44.377701],[-113.456917,44.865149],[-113.944365,45.68669],[-113.517164,45.938629]]]}},
+{"type":"Feature","id":"30003","properties":{"name":"Big Horn"},"geometry":{"type":"Polygon","coordinates":[[[-107.426806,45.976968],[-106.939358,45.867429],[-106.769573,45.177335],[-106.282125,45.177335],[-106.265695,44.991119],[-107.914254,45.002073],[-108.248347,45.002073],[-108.642687,45.462136],[-108.067608,45.516905],[-108.0457,45.900291],[-107.50896,46.042691],[-107.426806,45.976968]]]}},
+{"type":"Feature","id":"30005","properties":{"name":"Blaine"},"geometry":{"type":"Polygon","coordinates":[[[-108.237393,49.000239],[-108.434563,47.976051],[-108.889149,47.735066],[-109.540905,47.740543],[-109.535428,48.134883],[-109.491612,49.000239],[-108.237393,49.000239]]]}},
+{"type":"Feature","id":"30007","properties":{"name":"Broadwater"},"geometry":{"type":"Polygon","coordinates":[[[-111.638573,46.716355],[-111.496173,46.760171],[-111.063494,46.190569],[-111.660481,45.834568],[-111.78645,46.568478],[-111.638573,46.716355]]]}},
+{"type":"Feature","id":"30009","properties":{"name":"Carbon"},"geometry":{"type":"Polygon","coordinates":[[[-108.806995,45.626444],[-108.642687,45.462136],[-108.248347,45.002073],[-108.620779,45.002073],[-109.798321,45.002073],[-109.798321,45.166381],[-108.845333,45.610013],[-108.806995,45.626444]]]}},
+{"type":"Feature","id":"30011","properties":{"name":"Carter"},"geometry":{"type":"Polygon","coordinates":[[[-104.885506,46.135799],[-104.042057,45.88386],[-104.042057,45.210196],[-104.058488,44.996596],[-105.03886,45.002073],[-104.98409,45.785275],[-104.885506,46.135799]]]}},
+{"type":"Feature","id":"30013","properties":{"name":"Cascade"},"geometry":{"type":"Polygon","coordinates":[[[-111.419495,47.696727],[-111.408542,47.696727],[-110.64177,47.417403],[-110.652724,46.825894],[-111.079925,47.088787],[-111.660481,46.913525],[-112.049344,47.515988],[-111.419495,47.696727]]]}},
+{"type":"Feature","id":"30015","properties":{"name":"Chouteau"},"geometry":{"type":"Polygon","coordinates":[[[-110.389831,48.304668],[-109.535428,48.134883],[-109.540905,47.740543],[-110.214569,47.417403],[-110.504846,47.417403],[-110.64177,47.417403],[-111.408542,47.696727],[-111.408542,47.987005],[-111.408542,48.129406],[-110.756786,48.217037],[-110.389831,48.304668]]]}},
+{"type":"Feature","id":"30017","properties":{"name":"Custer"},"geometry":{"type":"Polygon","coordinates":[[[-106.084956,46.858755],[-105.44963,46.568478],[-104.732151,46.612293],[-104.885506,46.135799],[-104.98409,45.785275],[-106.128771,45.790752],[-106.194494,45.790752],[-106.084956,46.847802],[-106.084956,46.858755]]]}},
+{"type":"Feature","id":"30019","properties":{"name":"Daniels"},"geometry":{"type":"Polygon","coordinates":[[[-105.055291,49.000239],[-104.973137,48.562084],[-105.756339,48.562084],[-105.805632,48.562084],[-106.11234,49.000239],[-105.055291,49.000239]]]}},
+{"type":"Feature","id":"30021","properties":{"name":"Dawson"},"geometry":{"type":"Polygon","coordinates":[[[-105.022429,47.702204],[-104.419966,47.357157],[-104.606182,46.858755],[-105.405815,47.181895],[-105.23603,47.789835],[-105.022429,47.702204]]]}},
+{"type":"Feature","id":"30023","properties":{"name":"Deer Lodge"},"geometry":{"type":"Polygon","coordinates":[[[-112.887315,46.267246],[-112.558699,46.267246],[-112.57513,46.179615],[-113.084485,45.861952],[-113.517164,45.938629],[-113.517164,45.938629],[-113.035193,46.267246],[-112.887315,46.267246]]]}},
+{"type":"Feature","id":"30025","properties":{"name":"Fallon"},"geometry":{"type":"Polygon","coordinates":[[[-104.732151,46.612293],[-104.606182,46.683493],[-104.047534,46.639678],[-104.047534,46.541093],[-104.047534,46.2782],[-104.047534,45.944106],[-104.042057,45.88386],[-104.885506,46.135799],[-104.732151,46.612293]]]}},
+{"type":"Feature","id":"30027","properties":{"name":"Fergus"},"geometry":{"type":"Polygon","coordinates":[[[-110.214569,47.417403],[-109.540905,47.740543],[-108.889149,47.735066],[-108.31407,47.581712],[-108.719364,47.269526],[-108.631733,46.749217],[-109.009642,46.749217],[-109.387551,46.694447],[-109.743552,46.694447],[-109.754506,47.187372],[-110.214569,47.417403]]]}},
+{"type":"Feature","id":"30029","properties":{"name":"Flathead"},"geometry":{"type":"Polygon","coordinates":[[[-114.070335,49.000239],[-113.347378,48.310145],[-113.018762,48.134883],[-112.9859,47.954144],[-113.144732,47.598142],[-113.467871,47.598142],[-113.632179,47.598142],[-114.010088,48.052728],[-114.601598,47.789835],[-115.012368,48.019867],[-114.727567,49.000239],[-114.070335,49.000239]]]}},
+{"type":"Feature","id":"30031","properties":{"name":"Gallatin"},"geometry":{"type":"Polygon","coordinates":[[[-111.063494,46.190569],[-110.78417,46.190569],[-111.041587,45.002073],[-111.058017,44.667979],[-111.047063,44.476286],[-111.37568,44.750133],[-111.353772,45.642875],[-111.802881,45.796229],[-111.660481,45.834568],[-111.063494,46.190569]]]}},
+{"type":"Feature","id":"30033","properties":{"name":"Garfield"},"geometry":{"type":"Polygon","coordinates":[[[-106.490249,47.95962],[-106.419049,47.95962],[-106.084956,47.181895],[-106.084956,46.858755],[-106.084956,46.847802],[-107.459668,46.858755],[-107.892346,46.853278],[-107.908777,47.450265],[-107.415852,47.69125],[-106.490249,47.95962]]]}},
+{"type":"Feature","id":"30035","properties":{"name":"Glacier"},"geometry":{"type":"Polygon","coordinates":[[[-112.191744,49.000239],[-112.186267,48.47993],[-112.57513,48.485407],[-113.347378,48.310145],[-114.070335,49.000239],[-112.191744,49.000239]]]}},
+{"type":"Feature","id":"30037","properties":{"name":"Golden Valley"},"geometry":{"type":"Polygon","coordinates":[[[-109.387551,46.694447],[-109.009642,46.749217],[-108.77961,46.130322],[-108.922011,46.130322],[-109.17395,46.130322],[-109.414935,46.042691],[-109.655921,46.217953],[-109.387551,46.694447]]]}},
+{"type":"Feature","id":"30039","properties":{"name":"Granite"},"geometry":{"type":"Polygon","coordinates":[[[-113.303563,46.831371],[-113.035193,46.267246],[-113.517164,45.938629],[-113.801964,46.037214],[-113.829349,46.661586],[-113.303563,46.831371]]]}},
+{"type":"Feature","id":"30041","properties":{"name":"Hill"},"geometry":{"type":"Polygon","coordinates":[[[-109.491612,49.000239],[-109.535428,48.134883],[-110.389831,48.304668],[-110.756786,48.217037],[-110.745832,49.000239],[-109.491612,49.000239]]]}},
+{"type":"Feature","id":"30043","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-111.967189,46.568478],[-111.78645,46.568478],[-111.660481,45.834568],[-111.802881,45.796229],[-111.967189,45.850998],[-112.191744,45.746937],[-112.57513,46.179615],[-112.558699,46.267246],[-112.312237,46.4206],[-111.967189,46.568478]]]}},
+{"type":"Feature","id":"30045","properties":{"name":"Judith Basin"},"geometry":{"type":"Polygon","coordinates":[[[-110.504846,47.417403],[-110.214569,47.417403],[-109.754506,47.187372],[-109.743552,46.694447],[-110.148845,46.716355],[-110.274815,46.710878],[-110.652724,46.825894],[-110.64177,47.417403],[-110.504846,47.417403]]]}},
+{"type":"Feature","id":"30047","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-114.010088,48.052728],[-113.632179,47.598142],[-113.91698,47.499557],[-114.18535,47.138079],[-114.601598,47.789835],[-114.010088,48.052728]]]}},
+{"type":"Feature","id":"30049","properties":{"name":"Lewis and Clark"},"geometry":{"type":"Polygon","coordinates":[[[-112.9859,47.954144],[-112.816115,47.609096],[-112.049344,47.515988],[-111.660481,46.913525],[-111.496173,46.760171],[-111.638573,46.716355],[-111.78645,46.568478],[-111.967189,46.568478],[-112.312237,46.4206],[-112.794207,46.831371],[-113.144732,47.598142],[-112.9859,47.954144]]]}},
+{"type":"Feature","id":"30051","properties":{"name":"Liberty"},"geometry":{"type":"Polygon","coordinates":[[[-110.745832,49.000239],[-110.756786,48.217037],[-111.408542,48.129406],[-111.408542,48.217037],[-111.271618,48.994762],[-110.745832,49.000239]]]}},
+{"type":"Feature","id":"30053","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-114.727567,49.000239],[-115.012368,48.019867],[-115.521724,47.910328],[-115.844863,48.21156],[-116.04751,48.217037],[-116.04751,48.501838],[-116.04751,49.000239],[-114.727567,49.000239]]]}},
+{"type":"Feature","id":"30055","properties":{"name":"McCone"},"geometry":{"type":"Polygon","coordinates":[[[-105.192214,48.063682],[-105.23603,47.789835],[-105.405815,47.181895],[-105.789201,47.181895],[-106.084956,47.181895],[-106.419049,47.95962],[-105.84397,48.008913],[-105.192214,48.063682]]]}},
+{"type":"Feature","id":"30057","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-111.967189,45.850998],[-111.802881,45.796229],[-111.353772,45.642875],[-111.37568,44.750133],[-111.479742,44.711795],[-112.169836,44.826811],[-112.684669,45.626444],[-112.191744,45.746937],[-111.967189,45.850998]]]}},
+{"type":"Feature","id":"30059","properties":{"name":"Meagher"},"geometry":{"type":"Polygon","coordinates":[[[-111.079925,47.088787],[-110.652724,46.825894],[-110.274815,46.710878],[-110.280292,46.217953],[-110.280292,46.185092],[-110.78417,46.190569],[-111.063494,46.190569],[-111.496173,46.760171],[-111.660481,46.913525],[-111.079925,47.088787]]]}},
+{"type":"Feature","id":"30061","properties":{"name":"Mineral"},"geometry":{"type":"Polygon","coordinates":[[[-115.499816,47.488604],[-114.798768,47.269526],[-114.672798,46.738263],[-114.963076,46.935433],[-115.658647,47.466696],[-115.499816,47.488604]]]}},
+{"type":"Feature","id":"30063","properties":{"name":"Missoula"},"geometry":{"type":"Polygon","coordinates":[[[-113.91698,47.499557],[-113.632179,47.598142],[-113.467871,47.598142],[-113.303563,46.831371],[-113.829349,46.661586],[-113.851257,46.661586],[-114.333228,46.661586],[-114.596121,46.634201],[-114.672798,46.738263],[-114.798768,47.269526],[-114.18535,47.138079],[-113.91698,47.499557]]]}},
+{"type":"Feature","id":"30065","properties":{"name":"Musselshell"},"geometry":{"type":"Polygon","coordinates":[[[-107.837576,46.754694],[-107.826623,46.754694],[-107.782807,46.497277],[-108.77961,46.130322],[-109.009642,46.749217],[-108.631733,46.749217],[-107.837576,46.754694]]]}},
+{"type":"Feature","id":"30067","properties":{"name":"Park"},"geometry":{"type":"Polygon","coordinates":[[[-110.78417,46.190569],[-110.280292,46.185092],[-110.230999,45.171858],[-110.061214,45.171858],[-109.798321,45.166381],[-109.798321,45.002073],[-111.041587,45.002073],[-110.78417,46.190569]]]}},
+{"type":"Feature","id":"30069","properties":{"name":"Petroleum"},"geometry":{"type":"Polygon","coordinates":[[[-108.105947,47.592665],[-107.908777,47.450265],[-107.892346,46.853278],[-107.826623,46.754694],[-107.837576,46.754694],[-108.631733,46.749217],[-108.719364,47.269526],[-108.31407,47.581712],[-108.105947,47.592665]]]}},
+{"type":"Feature","id":"30071","properties":{"name":"Phillips"},"geometry":{"type":"Polygon","coordinates":[[[-107.180344,49.000239],[-107.415852,47.69125],[-107.908777,47.450265],[-108.105947,47.592665],[-108.31407,47.581712],[-108.889149,47.735066],[-108.434563,47.976051],[-108.237393,49.000239],[-107.180344,49.000239]]]}},
+{"type":"Feature","id":"30073","properties":{"name":"Pondera"},"geometry":{"type":"Polygon","coordinates":[[[-112.57513,48.485407],[-112.186267,48.47993],[-111.408542,48.217037],[-111.408542,48.129406],[-111.408542,47.987005],[-112.898269,48.134883],[-113.018762,48.134883],[-113.347378,48.310145],[-112.57513,48.485407]]]}},
+{"type":"Feature","id":"30075","properties":{"name":"Powder River"},"geometry":{"type":"Polygon","coordinates":[[[-106.128771,45.790752],[-104.98409,45.785275],[-105.03886,45.002073],[-105.088152,45.002073],[-106.024709,44.991119],[-106.265695,44.991119],[-106.282125,45.177335],[-106.194494,45.790752],[-106.128771,45.790752]]]}},
+{"type":"Feature","id":"30077","properties":{"name":"Powell"},"geometry":{"type":"Polygon","coordinates":[[[-113.467871,47.598142],[-113.144732,47.598142],[-112.794207,46.831371],[-112.312237,46.4206],[-112.558699,46.267246],[-112.887315,46.267246],[-113.035193,46.267246],[-113.303563,46.831371],[-113.467871,47.598142]]]}},
+{"type":"Feature","id":"30079","properties":{"name":"Prairie"},"geometry":{"type":"Polygon","coordinates":[[[-105.789201,47.181895],[-105.405815,47.181895],[-104.606182,46.858755],[-104.606182,46.683493],[-104.732151,46.612293],[-105.44963,46.568478],[-106.084956,46.858755],[-106.084956,47.181895],[-105.789201,47.181895]]]}},
+{"type":"Feature","id":"30081","properties":{"name":"Ravalli"},"geometry":{"type":"Polygon","coordinates":[[[-113.851257,46.661586],[-113.829349,46.661586],[-113.801964,46.037214],[-113.517164,45.938629],[-113.517164,45.938629],[-113.944365,45.68669],[-114.557782,45.566198],[-114.333228,46.661586],[-113.851257,46.661586]]]}},
+{"type":"Feature","id":"30083","properties":{"name":"Richland"},"geometry":{"type":"Polygon","coordinates":[[[-104.567843,48.118452],[-104.042057,47.997959],[-104.047534,47.395496],[-104.419966,47.357157],[-105.022429,47.702204],[-105.23603,47.789835],[-105.192214,48.063682],[-104.567843,48.118452]]]}},
+{"type":"Feature","id":"30085","properties":{"name":"Roosevelt"},"geometry":{"type":"Polygon","coordinates":[[[-105.756339,48.562084],[-104.973137,48.562084],[-104.047534,48.386822],[-104.042057,47.997959],[-104.567843,48.118452],[-105.192214,48.063682],[-105.84397,48.008913],[-105.805632,48.562084],[-105.756339,48.562084]]]}},
+{"type":"Feature","id":"30087","properties":{"name":"Rosebud"},"geometry":{"type":"Polygon","coordinates":[[[-107.459668,46.858755],[-106.084956,46.847802],[-106.194494,45.790752],[-106.282125,45.177335],[-106.769573,45.177335],[-106.939358,45.867429],[-107.026989,46.393216],[-107.738991,46.480847],[-107.782807,46.497277],[-107.826623,46.754694],[-107.892346,46.853278],[-107.459668,46.858755]]]}},
+{"type":"Feature","id":"30089","properties":{"name":"Sanders"},"geometry":{"type":"Polygon","coordinates":[[[-115.844863,48.21156],[-115.521724,47.910328],[-115.012368,48.019867],[-114.601598,47.789835],[-114.18535,47.138079],[-114.798768,47.269526],[-115.499816,47.488604],[-115.658647,47.466696],[-116.04751,47.976051],[-116.04751,48.217037],[-115.844863,48.21156]]]}},
+{"type":"Feature","id":"30091","properties":{"name":"Sheridan"},"geometry":{"type":"Polygon","coordinates":[[[-104.047534,49.000239],[-104.047534,48.633284],[-104.047534,48.386822],[-104.973137,48.562084],[-105.055291,49.000239],[-104.047534,49.000239]]]}},
+{"type":"Feature","id":"30093","properties":{"name":"Silver Bow"},"geometry":{"type":"Polygon","coordinates":[[[-112.57513,46.179615],[-112.191744,45.746937],[-112.684669,45.626444],[-113.084485,45.861952],[-112.57513,46.179615]]]}},
+{"type":"Feature","id":"30095","properties":{"name":"Stillwater"},"geometry":{"type":"Polygon","coordinates":[[[-109.17395,46.130322],[-108.922011,46.130322],[-108.845333,45.610013],[-109.798321,45.166381],[-110.061214,45.171858],[-109.562813,45.610013],[-109.414935,46.042691],[-109.17395,46.130322]]]}},
+{"type":"Feature","id":"30097","properties":{"name":"Sweet Grass"},"geometry":{"type":"Polygon","coordinates":[[[-110.006445,46.217953],[-109.655921,46.217953],[-109.414935,46.042691],[-109.562813,45.610013],[-110.061214,45.171858],[-110.230999,45.171858],[-110.280292,46.185092],[-110.280292,46.217953],[-110.006445,46.217953]]]}},
+{"type":"Feature","id":"30099","properties":{"name":"Teton"},"geometry":{"type":"Polygon","coordinates":[[[-112.898269,48.134883],[-111.408542,47.987005],[-111.408542,47.696727],[-111.419495,47.696727],[-112.049344,47.515988],[-112.816115,47.609096],[-112.9859,47.954144],[-113.018762,48.134883],[-112.898269,48.134883]]]}},
+{"type":"Feature","id":"30101","properties":{"name":"Toole"},"geometry":{"type":"Polygon","coordinates":[[[-111.271618,48.994762],[-111.408542,48.217037],[-112.186267,48.47993],[-112.191744,49.000239],[-111.271618,48.994762]]]}},
+{"type":"Feature","id":"30103","properties":{"name":"Treasure"},"geometry":{"type":"Polygon","coordinates":[[[-107.738991,46.480847],[-107.026989,46.393216],[-106.939358,45.867429],[-107.426806,45.976968],[-107.50896,46.042691],[-107.738991,46.480847]]]}},
+{"type":"Feature","id":"30105","properties":{"name":"Valley"},"geometry":{"type":"Polygon","coordinates":[[[-106.11234,49.000239],[-105.805632,48.562084],[-105.84397,48.008913],[-106.419049,47.95962],[-106.490249,47.95962],[-107.415852,47.69125],[-107.180344,49.000239],[-106.11234,49.000239]]]}},
+{"type":"Feature","id":"30107","properties":{"name":"Wheatland"},"geometry":{"type":"Polygon","coordinates":[[[-110.148845,46.716355],[-109.743552,46.694447],[-109.387551,46.694447],[-109.655921,46.217953],[-110.006445,46.217953],[-110.280292,46.217953],[-110.274815,46.710878],[-110.148845,46.716355]]]}},
+{"type":"Feature","id":"30109","properties":{"name":"Wibaux"},"geometry":{"type":"Polygon","coordinates":[[[-104.047534,47.395496],[-104.047534,47.329772],[-104.047534,46.639678],[-104.606182,46.683493],[-104.606182,46.858755],[-104.419966,47.357157],[-104.047534,47.395496]]]}},
+{"type":"Feature","id":"30111","properties":{"name":"Yellowstone"},"geometry":{"type":"Polygon","coordinates":[[[-107.782807,46.497277],[-107.738991,46.480847],[-107.50896,46.042691],[-108.0457,45.900291],[-108.067608,45.516905],[-108.642687,45.462136],[-108.806995,45.626444],[-108.845333,45.610013],[-108.922011,46.130322],[-108.77961,46.130322],[-107.782807,46.497277]]]}},
+{"type":"Feature","id":"31001","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-98.723948,40.697198],[-98.280315,40.697198],[-98.280315,40.697198],[-98.280315,40.35215],[-98.291269,40.35215],[-98.723948,40.35215],[-98.723948,40.691721],[-98.723948,40.697198]]]}},
+{"type":"Feature","id":"31003","properties":{"name":"Antelope"},"geometry":{"type":"Polygon","coordinates":[[[-97.836683,42.438865],[-97.836683,42.08834],[-97.831206,41.918555],[-97.91336,41.918555],[-98.296746,41.913078],[-98.302223,42.08834],[-98.302223,42.438865],[-97.836683,42.438865]]]}},
+{"type":"Feature","id":"31005","properties":{"name":"Arthur"},"geometry":{"type":"Polygon","coordinates":[[[-101.424079,41.743293],[-101.407648,41.743293],[-101.407648,41.392769],[-101.982727,41.392769],[-101.988204,41.743293],[-101.424079,41.743293]]]}},
+{"type":"Feature","id":"31007","properties":{"name":"Banner"},"geometry":{"type":"Polygon","coordinates":[[[-104.053011,41.699478],[-103.368393,41.699478],[-103.368393,41.436584],[-103.379347,41.392769],[-104.053011,41.392769],[-104.053011,41.562554],[-104.053011,41.699478]]]}},
+{"type":"Feature","id":"31009","properties":{"name":"Blaine"},"geometry":{"type":"Polygon","coordinates":[[[-100.268445,42.08834],[-100.16986,42.08834],[-99.687889,42.08834],[-99.687889,41.737816],[-100.252014,41.737816],[-100.262968,41.737816],[-100.268445,42.08834]]]}},
+{"type":"Feature","id":"31011","properties":{"name":"Boone"},"geometry":{"type":"Polygon","coordinates":[[[-97.91336,41.918555],[-97.831206,41.918555],[-97.831206,41.743293],[-97.831206,41.524216],[-98.291269,41.4804],[-98.296746,41.743293],[-98.296746,41.913078],[-97.91336,41.918555]]]}},
+{"type":"Feature","id":"31013","properties":{"name":"Box Butte"},"geometry":{"type":"Polygon","coordinates":[[[-102.771407,42.438865],[-102.700206,42.006186],[-103.362916,42.000709],[-103.401255,42.006186],[-103.44507,42.438865],[-102.771407,42.438865]]]}},
+{"type":"Feature","id":"31015","properties":{"name":"Boyd"},"geometry":{"type":"Polygon","coordinates":[[[-98.499393,42.997512],[-98.3077,42.882497],[-98.3077,42.762004],[-98.997795,42.887974],[-99.255211,42.80582],[-99.255211,42.997512],[-98.499393,42.997512]]]}},
+{"type":"Feature","id":"31017","properties":{"name":"Brown"},"geometry":{"type":"Polygon","coordinates":[[[-100.175337,42.833204],[-99.676935,42.729142],[-99.660504,42.08834],[-99.687889,42.08834],[-100.16986,42.08834],[-100.197245,42.844158],[-100.175337,42.833204]]]}},
+{"type":"Feature","id":"31019","properties":{"name":"Buffalo"},"geometry":{"type":"Polygon","coordinates":[[[-99.052564,41.047722],[-98.745855,41.047722],[-98.723948,41.047722],[-98.723948,40.697198],[-98.723948,40.691721],[-98.953979,40.653382],[-99.178534,40.658859],[-99.419519,40.669813],[-99.424996,41.047722],[-99.205918,41.047722],[-99.052564,41.047722]]]}},
+{"type":"Feature","id":"31021","properties":{"name":"Burt"},"geometry":{"type":"Polygon","coordinates":[[[-96.270278,42.044525],[-96.138832,41.863786],[-96.122401,41.683047],[-96.407202,41.683047],[-96.44554,41.683047],[-96.555079,41.743293],[-96.555079,42.01714],[-96.270278,42.044525]]]}},
+{"type":"Feature","id":"31023","properties":{"name":"Butler"},"geometry":{"type":"Polygon","coordinates":[[[-96.905603,41.453015],[-96.905603,41.453015],[-96.91108,41.047722],[-96.91108,41.047722],[-97.349236,41.047722],[-97.365666,41.047722],[-97.365666,41.392769],[-97.256128,41.376338],[-96.905603,41.453015]]]}},
+{"type":"Feature","id":"31025","properties":{"name":"Cass"},"geometry":{"type":"Polygon","coordinates":[[[-96.040247,41.064153],[-95.881416,41.053199],[-95.815692,40.899844],[-95.832123,40.784829],[-95.892369,40.784829],[-96.461971,40.784829],[-96.461971,41.01486],[-96.319571,41.047722],[-96.040247,41.064153]]]}},
+{"type":"Feature","id":"31027","properties":{"name":"Cedar"},"geometry":{"type":"Polygon","coordinates":[[[-97.486159,42.849635],[-97.16302,42.800343],[-97.015142,42.762004],[-97.015142,42.351234],[-97.365666,42.351234],[-97.365666,42.438865],[-97.486159,42.438865],[-97.486159,42.849635]]]}},
+{"type":"Feature","id":"31029","properties":{"name":"Chase"},"geometry":{"type":"Polygon","coordinates":[[[-101.571957,40.697198],[-101.347402,40.697198],[-101.341925,40.35215],[-102.053927,40.346673],[-102.053927,40.439781],[-102.053927,40.697198],[-101.571957,40.697198]]]}},
+{"type":"Feature","id":"31031","properties":{"name":"Cherry"},"geometry":{"type":"Polygon","coordinates":[[[-102.081312,42.997512],[-102.081312,42.997512],[-101.226909,42.997512],[-100.197245,42.997512],[-100.197245,42.844158],[-100.16986,42.08834],[-100.268445,42.08834],[-100.843524,42.08834],[-101.424079,42.093817],[-102.004635,42.093817],[-102.081312,42.997512]]]}},
+{"type":"Feature","id":"31033","properties":{"name":"Cheyenne"},"geometry":{"type":"Polygon","coordinates":[[[-102.754976,41.436584],[-102.634483,41.436584],[-102.612575,41.222984],[-102.623529,41.003906],[-102.650914,41.003906],[-103.384824,41.003906],[-103.379347,41.392769],[-103.368393,41.436584],[-102.754976,41.436584]]]}},
+{"type":"Feature","id":"31035","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-97.825729,40.697198],[-97.825729,40.35215],[-98.011945,40.35215],[-98.274839,40.35215],[-98.280315,40.35215],[-98.280315,40.697198],[-97.825729,40.697198],[-97.825729,40.697198]]]}},
+{"type":"Feature","id":"31037","properties":{"name":"Colfax"},"geometry":{"type":"Polygon","coordinates":[[[-97.250651,41.743293],[-97.020619,41.743293],[-96.905603,41.743293],[-96.905603,41.453015],[-97.256128,41.376338],[-97.250651,41.743293],[-97.250651,41.743293]]]}},
+{"type":"Feature","id":"31039","properties":{"name":"Cuming"},"geometry":{"type":"Polygon","coordinates":[[[-96.89465,42.08834],[-96.823449,42.08834],[-96.555079,42.01714],[-96.555079,41.743293],[-96.905603,41.743293],[-97.020619,41.743293],[-97.020619,42.08834],[-96.89465,42.08834]]]}},
+{"type":"Feature","id":"31041","properties":{"name":"Custer"},"geometry":{"type":"Polygon","coordinates":[[[-99.222349,41.743293],[-99.211395,41.743293],[-99.205918,41.392769],[-99.205918,41.047722],[-99.424996,41.047722],[-99.994598,41.047722],[-100.224629,41.047722],[-100.252014,41.392769],[-100.252014,41.737816],[-99.687889,41.737816],[-99.222349,41.743293]]]}},
+{"type":"Feature","id":"31043","properties":{"name":"Dakota"},"geometry":{"type":"Polygon","coordinates":[[[-96.724864,42.395049],[-96.631756,42.526496],[-96.44554,42.488157],[-96.357909,42.274556],[-96.724864,42.280033],[-96.724864,42.395049]]]}},
+{"type":"Feature","id":"31045","properties":{"name":"Dawes"},"geometry":{"type":"Polygon","coordinates":[[[-103.324578,43.002989],[-103.001438,43.002989],[-102.793314,42.997512],[-102.771407,42.438865],[-103.44507,42.438865],[-103.505317,43.002989],[-103.324578,43.002989]]]}},
+{"type":"Feature","id":"31047","properties":{"name":"Dawson"},"geometry":{"type":"Polygon","coordinates":[[[-99.994598,41.047722],[-99.424996,41.047722],[-99.419519,40.669813],[-99.644074,40.686244],[-99.983644,40.697198],[-100.224629,40.702674],[-100.224629,41.047722],[-99.994598,41.047722]]]}},
+{"type":"Feature","id":"31049","properties":{"name":"Deuel"},"geometry":{"type":"Polygon","coordinates":[[[-102.119651,41.222984],[-102.053927,41.222984],[-102.053927,41.003906],[-102.053927,41.003906],[-102.623529,41.003906],[-102.612575,41.222984],[-102.119651,41.222984]]]}},
+{"type":"Feature","id":"31051","properties":{"name":"Dixon"},"geometry":{"type":"Polygon","coordinates":[[[-97.015142,42.762004],[-96.807019,42.701758],[-96.631756,42.526496],[-96.724864,42.395049],[-96.724864,42.280033],[-96.823449,42.263602],[-97.015142,42.351234],[-97.015142,42.762004]]]}},
+{"type":"Feature","id":"31053","properties":{"name":"Dodge"},"geometry":{"type":"Polygon","coordinates":[[[-96.905603,41.743293],[-96.555079,41.743293],[-96.44554,41.683047],[-96.330525,41.392769],[-96.461971,41.392769],[-96.472925,41.392769],[-96.905603,41.453015],[-96.905603,41.453015],[-96.905603,41.743293]]]}},
+{"type":"Feature","id":"31055","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-96.461971,41.392769],[-96.330525,41.392769],[-95.936185,41.392769],[-95.925231,41.190122],[-95.936185,41.190122],[-96.325048,41.190122],[-96.472925,41.392769],[-96.461971,41.392769]]]}},
+{"type":"Feature","id":"31057","properties":{"name":"Dundy"},"geometry":{"type":"Polygon","coordinates":[[[-101.325494,40.35215],[-101.325494,40.35215],[-101.325494,40.001626],[-101.413125,40.001626],[-101.90605,40.001626],[-102.053927,40.001626],[-102.053927,40.346673],[-101.341925,40.35215],[-101.325494,40.35215]]]}},
+{"type":"Feature","id":"31059","properties":{"name":"Fillmore"},"geometry":{"type":"Polygon","coordinates":[[[-97.798345,40.697198],[-97.365666,40.697198],[-97.365666,40.35215],[-97.50259,40.35215],[-97.820252,40.35215],[-97.825729,40.35215],[-97.825729,40.697198],[-97.798345,40.697198]]]}},
+{"type":"Feature","id":"31061","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-99.11281,40.35215],[-98.729425,40.35215],[-98.723948,40.001626],[-99.068995,40.001626],[-99.123764,40.001626],[-99.178534,40.001626],[-99.178534,40.35215],[-99.11281,40.35215]]]}},
+{"type":"Feature","id":"31063","properties":{"name":"Frontier"},"geometry":{"type":"Polygon","coordinates":[[[-100.449184,40.702674],[-100.224629,40.702674],[-99.983644,40.697198],[-100.093183,40.35215],[-100.197245,40.35215],[-100.383461,40.35215],[-100.755893,40.35215],[-100.7778,40.35215],[-100.7778,40.702674],[-100.449184,40.702674]]]}},
+{"type":"Feature","id":"31065","properties":{"name":"Furnas"},"geometry":{"type":"Polygon","coordinates":[[[-99.989121,40.35215],[-99.644074,40.35215],[-99.63312,40.35215],[-99.627643,40.001626],[-100.175337,40.001626],[-100.191768,40.001626],[-100.197245,40.35215],[-100.093183,40.35215],[-99.989121,40.35215]]]}},
+{"type":"Feature","id":"31067","properties":{"name":"Gage"},"geometry":{"type":"Polygon","coordinates":[[[-96.478402,40.521935],[-96.461971,40.521935],[-96.461971,40.264519],[-96.461971,40.001626],[-96.692003,40.001626],[-96.807019,40.001626],[-96.916557,40.001626],[-96.916557,40.35215],[-96.91108,40.521935],[-96.478402,40.521935]]]}},
+{"type":"Feature","id":"31069","properties":{"name":"Garden"},"geometry":{"type":"Polygon","coordinates":[[[-102.240143,42.006186],[-102.064881,42.011663],[-101.988204,41.743293],[-101.982727,41.392769],[-102.053927,41.222984],[-102.119651,41.222984],[-102.612575,41.222984],[-102.634483,41.436584],[-102.678299,42.006186],[-102.240143,42.006186]]]}},
+{"type":"Feature","id":"31071","properties":{"name":"Garfield"},"geometry":{"type":"Polygon","coordinates":[[[-98.762286,42.08834],[-98.756809,41.737816],[-99.074472,41.737816],[-99.211395,41.743293],[-99.222349,41.743293],[-99.222349,42.08834],[-98.762286,42.08834]]]}},
+{"type":"Feature","id":"31073","properties":{"name":"Gosper"},"geometry":{"type":"Polygon","coordinates":[[[-99.983644,40.697198],[-99.644074,40.686244],[-99.644074,40.35215],[-99.989121,40.35215],[-100.093183,40.35215],[-99.983644,40.697198]]]}},
+{"type":"Feature","id":"31075","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-102.004635,42.093817],[-101.424079,42.093817],[-101.424079,41.743293],[-101.988204,41.743293],[-102.064881,42.011663],[-102.004635,42.093817]]]}},
+{"type":"Feature","id":"31077","properties":{"name":"Greeley"},"geometry":{"type":"Polygon","coordinates":[[[-98.521301,41.743293],[-98.296746,41.743293],[-98.291269,41.4804],[-98.291269,41.392769],[-98.521301,41.392769],[-98.745855,41.392769],[-98.751332,41.392769],[-98.751332,41.737816],[-98.521301,41.743293]]]}},
+{"type":"Feature","id":"31079","properties":{"name":"Hall"},"geometry":{"type":"Polygon","coordinates":[[[-98.70204,41.047722],[-98.285792,41.047722],[-98.280315,40.87246],[-98.280315,40.697198],[-98.723948,40.697198],[-98.723948,41.047722],[-98.70204,41.047722]]]}},
+{"type":"Feature","id":"31081","properties":{"name":"Hamilton"},"geometry":{"type":"Polygon","coordinates":[[[-97.825729,41.047722],[-97.825729,40.697198],[-98.280315,40.697198],[-98.280315,40.697198],[-98.280315,40.87246],[-97.825729,41.173691],[-97.825729,41.047722]]]}},
+{"type":"Feature","id":"31083","properties":{"name":"Harlan"},"geometry":{"type":"Polygon","coordinates":[[[-99.63312,40.35215],[-99.178534,40.35215],[-99.178534,40.001626],[-99.627643,40.001626],[-99.627643,40.001626],[-99.63312,40.35215]]]}},
+{"type":"Feature","id":"31085","properties":{"name":"Hayes"},"geometry":{"type":"Polygon","coordinates":[[[-100.7778,40.702674],[-100.7778,40.35215],[-101.111894,40.35215],[-101.325494,40.35215],[-101.325494,40.35215],[-101.341925,40.35215],[-101.347402,40.697198],[-101.248817,40.697198],[-100.7778,40.702674]]]}},
+{"type":"Feature","id":"31087","properties":{"name":"Hitchcock"},"geometry":{"type":"Polygon","coordinates":[[[-101.111894,40.35215],[-100.7778,40.35215],[-100.755893,40.35215],[-100.761369,40.001626],[-101.325494,40.001626],[-101.325494,40.35215],[-101.111894,40.35215]]]}},
+{"type":"Feature","id":"31089","properties":{"name":"Holt"},"geometry":{"type":"Polygon","coordinates":[[[-98.997795,42.887974],[-98.3077,42.762004],[-98.302223,42.438865],[-98.302223,42.08834],[-98.762286,42.08834],[-99.222349,42.08834],[-99.233303,42.08834],[-99.255211,42.80582],[-98.997795,42.887974]]]}},
+{"type":"Feature","id":"31091","properties":{"name":"Hooker"},"geometry":{"type":"Polygon","coordinates":[[[-101.424079,42.093817],[-100.843524,42.08834],[-100.843524,41.737816],[-101.407648,41.743293],[-101.424079,41.743293],[-101.424079,42.093817]]]}},
+{"type":"Feature","id":"31093","properties":{"name":"Howard"},"geometry":{"type":"Polygon","coordinates":[[[-98.521301,41.392769],[-98.291269,41.392769],[-98.285792,41.392769],[-98.285792,41.047722],[-98.70204,41.047722],[-98.723948,41.047722],[-98.745855,41.047722],[-98.745855,41.392769],[-98.521301,41.392769]]]}},
+{"type":"Feature","id":"31095","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-97.365666,40.35215],[-96.916557,40.35215],[-96.916557,40.001626],[-97.349236,40.001626],[-97.371143,40.001626],[-97.365666,40.35215]]]}},
+{"type":"Feature","id":"31097","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-96.067632,40.521935],[-96.067632,40.264519],[-96.325048,40.264519],[-96.461971,40.264519],[-96.461971,40.521935],[-96.067632,40.521935]]]}},
+{"type":"Feature","id":"31099","properties":{"name":"Kearney"},"geometry":{"type":"Polygon","coordinates":[[[-98.953979,40.653382],[-98.723948,40.691721],[-98.723948,40.35215],[-98.729425,40.35215],[-99.11281,40.35215],[-99.178534,40.35215],[-99.178534,40.658859],[-98.953979,40.653382]]]}},
+{"type":"Feature","id":"31101","properties":{"name":"Keith"},"geometry":{"type":"Polygon","coordinates":[[[-101.363833,41.392769],[-101.270725,41.392769],[-101.248817,41.003906],[-101.878665,41.003906],[-102.053927,41.003906],[-102.053927,41.222984],[-101.982727,41.392769],[-101.407648,41.392769],[-101.363833,41.392769]]]}},
+{"type":"Feature","id":"31103","properties":{"name":"Keya Paha"},"geometry":{"type":"Polygon","coordinates":[[[-100.126044,42.997512],[-99.534535,42.997512],[-99.255211,42.997512],[-99.255211,42.80582],[-99.676935,42.729142],[-100.175337,42.833204],[-100.197245,42.844158],[-100.197245,42.997512],[-100.126044,42.997512]]]}},
+{"type":"Feature","id":"31105","properties":{"name":"Kimball"},"geometry":{"type":"Polygon","coordinates":[[[-103.379347,41.392769],[-103.384824,41.003906],[-103.576517,41.003906],[-104.053011,41.003906],[-104.053011,41.392769],[-103.379347,41.392769]]]}},
+{"type":"Feature","id":"31107","properties":{"name":"Knox"},"geometry":{"type":"Polygon","coordinates":[[[-98.3077,42.882497],[-98.154346,42.838681],[-97.634037,42.849635],[-97.486159,42.849635],[-97.486159,42.438865],[-97.836683,42.438865],[-98.302223,42.438865],[-98.3077,42.762004],[-98.3077,42.882497]]]}},
+{"type":"Feature","id":"31109","properties":{"name":"Lancaster"},"geometry":{"type":"Polygon","coordinates":[[[-96.91108,41.047722],[-96.461971,41.01486],[-96.461971,40.784829],[-96.461971,40.521935],[-96.478402,40.521935],[-96.91108,40.521935],[-96.91108,40.697198],[-96.91108,41.047722],[-96.91108,41.047722]]]}},
+{"type":"Feature","id":"31111","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-101.270725,41.392769],[-100.712077,41.392769],[-100.252014,41.392769],[-100.224629,41.047722],[-100.224629,40.702674],[-100.449184,40.702674],[-100.7778,40.702674],[-101.248817,40.697198],[-101.248817,41.003906],[-101.270725,41.392769]]]}},
+{"type":"Feature","id":"31113","properties":{"name":"Logan"},"geometry":{"type":"Polygon","coordinates":[[[-100.712077,41.737816],[-100.262968,41.737816],[-100.252014,41.737816],[-100.252014,41.392769],[-100.712077,41.392769],[-100.712077,41.737816]]]}},
+{"type":"Feature","id":"31115","properties":{"name":"Loup"},"geometry":{"type":"Polygon","coordinates":[[[-99.222349,42.08834],[-99.222349,41.743293],[-99.687889,41.737816],[-99.687889,42.08834],[-99.660504,42.08834],[-99.233303,42.08834],[-99.222349,42.08834]]]}},
+{"type":"Feature","id":"31117","properties":{"name":"McPherson"},"geometry":{"type":"Polygon","coordinates":[[[-101.407648,41.743293],[-100.843524,41.737816],[-100.712077,41.737816],[-100.712077,41.392769],[-101.270725,41.392769],[-101.363833,41.392769],[-101.407648,41.392769],[-101.407648,41.743293]]]}},
+{"type":"Feature","id":"31119","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-97.425913,42.08834],[-97.365666,42.08834],[-97.365666,41.743293],[-97.425913,41.743293],[-97.831206,41.743293],[-97.831206,41.918555],[-97.836683,42.08834],[-97.425913,42.08834]]]}},
+{"type":"Feature","id":"31121","properties":{"name":"Merrick"},"geometry":{"type":"Polygon","coordinates":[[[-97.705237,41.392769],[-97.601175,41.332523],[-97.825729,41.173691],[-98.280315,40.87246],[-98.285792,41.047722],[-98.285792,41.392769],[-97.705237,41.392769]]]}},
+{"type":"Feature","id":"31123","properties":{"name":"Morrill"},"geometry":{"type":"Polygon","coordinates":[[[-102.700206,42.006186],[-102.678299,42.006186],[-102.634483,41.436584],[-102.754976,41.436584],[-103.368393,41.436584],[-103.368393,41.699478],[-103.362916,42.000709],[-102.700206,42.006186]]]}},
+{"type":"Feature","id":"31125","properties":{"name":"Nance"},"geometry":{"type":"Polygon","coordinates":[[[-97.716191,41.524216],[-97.705237,41.392769],[-98.285792,41.392769],[-98.291269,41.392769],[-98.291269,41.4804],[-97.831206,41.524216],[-97.716191,41.524216]]]}},
+{"type":"Feature","id":"31127","properties":{"name":"Nemaha"},"geometry":{"type":"Polygon","coordinates":[[[-96.023816,40.521935],[-95.71163,40.521935],[-95.552799,40.264519],[-95.552799,40.264519],[-95.673292,40.264519],[-96.012862,40.259042],[-96.067632,40.264519],[-96.067632,40.521935],[-96.023816,40.521935]]]}},
+{"type":"Feature","id":"31129","properties":{"name":"Nuckolls"},"geometry":{"type":"Polygon","coordinates":[[[-98.011945,40.35215],[-97.825729,40.35215],[-97.820252,40.35215],[-97.820252,40.001626],[-97.875022,40.001626],[-97.929791,40.001626],[-98.269362,40.001626],[-98.274839,40.001626],[-98.274839,40.35215],[-98.011945,40.35215]]]}},
+{"type":"Feature","id":"31131","properties":{"name":"Otoe"},"geometry":{"type":"Polygon","coordinates":[[[-95.892369,40.784829],[-95.832123,40.784829],[-95.7664,40.587659],[-95.71163,40.521935],[-96.023816,40.521935],[-96.067632,40.521935],[-96.461971,40.521935],[-96.461971,40.784829],[-95.892369,40.784829]]]}},
+{"type":"Feature","id":"31133","properties":{"name":"Pawnee"},"geometry":{"type":"Polygon","coordinates":[[[-96.325048,40.264519],[-96.067632,40.264519],[-96.012862,40.259042],[-96.012862,40.001626],[-96.237417,40.001626],[-96.237417,40.001626],[-96.461971,40.001626],[-96.461971,40.264519],[-96.325048,40.264519]]]}},
+{"type":"Feature","id":"31135","properties":{"name":"Perkins"},"geometry":{"type":"Polygon","coordinates":[[[-101.878665,41.003906],[-101.248817,41.003906],[-101.248817,40.697198],[-101.347402,40.697198],[-101.571957,40.697198],[-102.053927,40.697198],[-102.053927,40.751967],[-102.053927,41.003906],[-102.053927,41.003906],[-101.878665,41.003906]]]}},
+{"type":"Feature","id":"31137","properties":{"name":"Phelps"},"geometry":{"type":"Polygon","coordinates":[[[-99.644074,40.686244],[-99.419519,40.669813],[-99.178534,40.658859],[-99.178534,40.35215],[-99.63312,40.35215],[-99.644074,40.35215],[-99.644074,40.686244]]]}},
+{"type":"Feature","id":"31139","properties":{"name":"Pierce"},"geometry":{"type":"Polygon","coordinates":[[[-97.365666,42.438865],[-97.365666,42.351234],[-97.365666,42.08834],[-97.425913,42.08834],[-97.836683,42.08834],[-97.836683,42.438865],[-97.486159,42.438865],[-97.365666,42.438865]]]}},
+{"type":"Feature","id":"31141","properties":{"name":"Platte"},"geometry":{"type":"Polygon","coordinates":[[[-97.425913,41.743293],[-97.365666,41.743293],[-97.250651,41.743293],[-97.256128,41.376338],[-97.365666,41.392769],[-97.601175,41.332523],[-97.705237,41.392769],[-97.716191,41.524216],[-97.831206,41.524216],[-97.831206,41.743293],[-97.425913,41.743293]]]}},
+{"type":"Feature","id":"31143","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-97.365666,41.392769],[-97.365666,41.047722],[-97.825729,41.047722],[-97.825729,41.173691],[-97.601175,41.332523],[-97.365666,41.392769]]]}},
+{"type":"Feature","id":"31145","properties":{"name":"Red Willow"},"geometry":{"type":"Polygon","coordinates":[[[-100.383461,40.35215],[-100.197245,40.35215],[-100.191768,40.001626],[-100.739462,40.001626],[-100.761369,40.001626],[-100.755893,40.35215],[-100.383461,40.35215]]]}},
+{"type":"Feature","id":"31147","properties":{"name":"Richardson"},"geometry":{"type":"Polygon","coordinates":[[[-95.673292,40.264519],[-95.552799,40.264519],[-95.306337,40.001626],[-95.339199,40.001626],[-95.788308,40.001626],[-96.012862,40.001626],[-96.012862,40.259042],[-95.673292,40.264519]]]}},
+{"type":"Feature","id":"31149","properties":{"name":"Rock"},"geometry":{"type":"Polygon","coordinates":[[[-99.255211,42.80582],[-99.233303,42.08834],[-99.660504,42.08834],[-99.676935,42.729142],[-99.255211,42.80582]]]}},
+{"type":"Feature","id":"31151","properties":{"name":"Saline"},"geometry":{"type":"Polygon","coordinates":[[[-97.365666,40.697198],[-96.91108,40.697198],[-96.91108,40.521935],[-96.916557,40.35215],[-97.365666,40.35215],[-97.365666,40.697198]]]}},
+{"type":"Feature","id":"31153","properties":{"name":"Sarpy"},"geometry":{"type":"Polygon","coordinates":[[[-95.936185,41.190122],[-95.925231,41.190122],[-95.881416,41.157261],[-95.881416,41.053199],[-96.040247,41.064153],[-96.319571,41.047722],[-96.325048,41.190122],[-95.936185,41.190122]]]}},
+{"type":"Feature","id":"31155","properties":{"name":"Saunders"},"geometry":{"type":"Polygon","coordinates":[[[-96.905603,41.453015],[-96.472925,41.392769],[-96.325048,41.190122],[-96.319571,41.047722],[-96.461971,41.01486],[-96.91108,41.047722],[-96.905603,41.453015]]]}},
+{"type":"Feature","id":"31157","properties":{"name":"Scotts Bluff"},"geometry":{"type":"Polygon","coordinates":[[[-103.456024,42.006186],[-103.401255,42.006186],[-103.362916,42.000709],[-103.368393,41.699478],[-104.053011,41.699478],[-104.053011,42.000709],[-103.456024,42.006186]]]}},
+{"type":"Feature","id":"31159","properties":{"name":"Seward"},"geometry":{"type":"Polygon","coordinates":[[[-97.349236,41.047722],[-96.91108,41.047722],[-96.91108,40.697198],[-97.365666,40.697198],[-97.365666,41.047722],[-97.349236,41.047722]]]}},
+{"type":"Feature","id":"31161","properties":{"name":"Sheridan"},"geometry":{"type":"Polygon","coordinates":[[[-102.081312,42.997512],[-102.004635,42.093817],[-102.064881,42.011663],[-102.240143,42.006186],[-102.678299,42.006186],[-102.700206,42.006186],[-102.771407,42.438865],[-102.793314,42.997512],[-102.081312,42.997512]]]}},
+{"type":"Feature","id":"31163","properties":{"name":"Sherman"},"geometry":{"type":"Polygon","coordinates":[[[-98.822533,41.392769],[-98.751332,41.392769],[-98.745855,41.392769],[-98.745855,41.047722],[-99.052564,41.047722],[-99.205918,41.047722],[-99.205918,41.392769],[-98.822533,41.392769]]]}},
+{"type":"Feature","id":"31165","properties":{"name":"Sioux"},"geometry":{"type":"Polygon","coordinates":[[[-103.505317,43.002989],[-103.44507,42.438865],[-103.401255,42.006186],[-103.456024,42.006186],[-104.053011,42.000709],[-104.053011,42.614127],[-104.053011,43.002989],[-103.505317,43.002989]]]}},
+{"type":"Feature","id":"31167","properties":{"name":"Stanton"},"geometry":{"type":"Polygon","coordinates":[[[-97.36019,42.08834],[-97.020619,42.08834],[-97.020619,41.743293],[-97.250651,41.743293],[-97.250651,41.743293],[-97.365666,41.743293],[-97.365666,42.08834],[-97.36019,42.08834]]]}},
+{"type":"Feature","id":"31169","properties":{"name":"Thayer"},"geometry":{"type":"Polygon","coordinates":[[[-97.50259,40.35215],[-97.365666,40.35215],[-97.371143,40.001626],[-97.820252,40.001626],[-97.820252,40.35215],[-97.50259,40.35215]]]}},
+{"type":"Feature","id":"31171","properties":{"name":"Thomas"},"geometry":{"type":"Polygon","coordinates":[[[-100.843524,42.08834],[-100.268445,42.08834],[-100.262968,41.737816],[-100.712077,41.737816],[-100.843524,41.737816],[-100.843524,42.08834]]]}},
+{"type":"Feature","id":"31173","properties":{"name":"Thurston"},"geometry":{"type":"Polygon","coordinates":[[[-96.724864,42.280033],[-96.357909,42.274556],[-96.357909,42.21431],[-96.270278,42.044525],[-96.555079,42.01714],[-96.823449,42.08834],[-96.823449,42.263602],[-96.724864,42.280033]]]}},
+{"type":"Feature","id":"31175","properties":{"name":"Valley"},"geometry":{"type":"Polygon","coordinates":[[[-99.074472,41.737816],[-98.756809,41.737816],[-98.751332,41.737816],[-98.751332,41.392769],[-98.822533,41.392769],[-99.205918,41.392769],[-99.211395,41.743293],[-99.074472,41.737816]]]}},
+{"type":"Feature","id":"31177","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-96.407202,41.683047],[-96.122401,41.683047],[-95.996431,41.507785],[-95.936185,41.392769],[-96.330525,41.392769],[-96.44554,41.683047],[-96.407202,41.683047]]]}},
+{"type":"Feature","id":"31179","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-97.365666,42.351234],[-97.015142,42.351234],[-96.823449,42.263602],[-96.823449,42.08834],[-96.89465,42.08834],[-97.020619,42.08834],[-97.36019,42.08834],[-97.365666,42.08834],[-97.365666,42.351234]]]}},
+{"type":"Feature","id":"31181","properties":{"name":"Webster"},"geometry":{"type":"Polygon","coordinates":[[[-98.291269,40.35215],[-98.280315,40.35215],[-98.274839,40.35215],[-98.274839,40.001626],[-98.50487,40.001626],[-98.691086,40.001626],[-98.723948,40.001626],[-98.729425,40.35215],[-98.723948,40.35215],[-98.291269,40.35215]]]}},
+{"type":"Feature","id":"31183","properties":{"name":"Wheeler"},"geometry":{"type":"Polygon","coordinates":[[[-98.302223,42.08834],[-98.296746,41.913078],[-98.296746,41.743293],[-98.521301,41.743293],[-98.751332,41.737816],[-98.756809,41.737816],[-98.762286,42.08834],[-98.302223,42.08834]]]}},
+{"type":"Feature","id":"31185","properties":{"name":"York"},"geometry":{"type":"Polygon","coordinates":[[[-97.365666,41.047722],[-97.365666,40.697198],[-97.798345,40.697198],[-97.825729,40.697198],[-97.825729,40.697198],[-97.825729,41.047722],[-97.365666,41.047722]]]}},
+{"type":"Feature","id":"32001","properties":{"name":"Churchill"},"geometry":{"type":"Polygon","coordinates":[[[-117.948008,40.001626],[-117.542715,40.001626],[-117.493422,39.530609],[-117.772746,39.092454],[-117.865854,39.076023],[-118.753119,39.076023],[-119.191274,39.629194],[-119.224135,40.001626],[-117.948008,40.001626]]]}},
+{"type":"Feature","id":"32003","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-114.081288,36.841432],[-114.048427,36.841432],[-114.048427,36.195153],[-114.754952,36.085614],[-114.634459,35.00118],[-115.647693,35.80629],[-115.899633,36.00346],[-115.894156,36.841432],[-114.081288,36.841432]]]}},
+{"type":"Feature","id":"32005","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-119.760876,39.114362],[-119.552752,39.086977],[-119.328197,38.533806],[-119.585614,38.714545],[-119.903276,38.933623],[-120.001861,39.065069],[-120.001861,39.114362],[-119.760876,39.114362]]]}},
+{"type":"Feature","id":"32007","properties":{"name":"Elko"},"geometry":{"type":"Polygon","coordinates":[[[-115.039753,41.995232],[-114.283935,41.995232],[-114.04295,41.995232],[-114.04295,40.998429],[-114.048427,40.116642],[-115.833909,40.127596],[-116.157049,40.998429],[-116.58425,40.998429],[-117.016928,40.998429],[-117.016928,42.000709],[-115.039753,41.995232]]]}},
+{"type":"Feature","id":"32009","properties":{"name":"Esmeralda"},"geometry":{"type":"Polygon","coordinates":[[[-117.690592,38.47356],[-117.164806,38.002543],[-117.164806,36.972878],[-117.832993,37.465803],[-118.429979,37.898481],[-117.690592,38.47356]]]}},
+{"type":"Feature","id":"32011","properties":{"name":"Eureka"},"geometry":{"type":"Polygon","coordinates":[[[-116.58425,40.998429],[-116.157049,40.998429],[-115.833909,40.127596],[-115.90511,39.163654],[-116.233726,39.163654],[-116.600681,39.163654],[-116.58425,40.998429]]]}},
+{"type":"Feature","id":"32013","properties":{"name":"Humboldt"},"geometry":{"type":"Polygon","coordinates":[[[-117.027882,42.000709],[-117.016928,42.000709],[-117.016928,40.998429],[-117.301729,40.527412],[-118.013732,40.856029],[-119.311766,40.960091],[-119.32272,41.995232],[-118.194471,41.995232],[-117.027882,42.000709]]]}},
+{"type":"Feature","id":"32015","properties":{"name":"Lander"},"geometry":{"type":"Polygon","coordinates":[[[-117.016928,40.998429],[-116.58425,40.998429],[-116.600681,39.163654],[-117.772746,39.092454],[-117.493422,39.530609],[-117.542715,40.001626],[-117.301729,40.527412],[-117.016928,40.998429]]]}},
+{"type":"Feature","id":"32017","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-114.70566,38.676207],[-114.048427,38.676207],[-114.048427,38.572145],[-114.048427,38.15042],[-114.053904,37.602726],[-114.048427,37.000263],[-114.048427,36.841432],[-114.081288,36.841432],[-115.894156,36.841432],[-115.894156,38.051835],[-115.001414,38.051835],[-115.001414,38.676207],[-114.70566,38.676207]]]}},
+{"type":"Feature","id":"32019","properties":{"name":"Lyon"},"geometry":{"type":"Polygon","coordinates":[[[-119.196751,39.623717],[-119.191274,39.629194],[-118.753119,39.076023],[-118.764072,39.076023],[-118.906473,38.413313],[-119.158412,38.413313],[-119.328197,38.533806],[-119.552752,39.086977],[-119.580137,39.196516],[-119.711583,39.251285],[-119.284382,39.623717],[-119.196751,39.623717]]]}},
+{"type":"Feature","id":"32021","properties":{"name":"Mineral"},"geometry":{"type":"Polygon","coordinates":[[[-118.764072,39.076023],[-118.753119,39.076023],[-117.865854,39.076023],[-118.194471,38.917192],[-117.690592,38.47356],[-118.429979,37.898481],[-119.158412,38.413313],[-118.906473,38.413313],[-118.764072,39.076023]]]}},
+{"type":"Feature","id":"32023","properties":{"name":"Nye"},"geometry":{"type":"Polygon","coordinates":[[[-116.233726,39.163654],[-115.90511,39.163654],[-115.001414,38.676207],[-115.001414,38.051835],[-115.894156,38.051835],[-115.894156,36.841432],[-115.899633,36.00346],[-117.164806,36.972878],[-117.164806,38.002543],[-117.690592,38.47356],[-118.194471,38.917192],[-117.865854,39.076023],[-117.772746,39.092454],[-116.600681,39.163654],[-116.233726,39.163654]]]}},
+{"type":"Feature","id":"32027","properties":{"name":"Pershing"},"geometry":{"type":"Polygon","coordinates":[[[-118.013732,40.856029],[-117.301729,40.527412],[-117.542715,40.001626],[-117.948008,40.001626],[-119.224135,40.001626],[-119.311766,40.960091],[-118.013732,40.856029]]]}},
+{"type":"Feature","id":"32029","properties":{"name":"Storey"},"geometry":{"type":"Polygon","coordinates":[[[-119.689675,39.519655],[-119.284382,39.623717],[-119.711583,39.251285],[-119.689675,39.519655]]]}},
+{"type":"Feature","id":"32031","properties":{"name":"Washoe"},"geometry":{"type":"Polygon","coordinates":[[[-119.361059,41.995232],[-119.32272,41.995232],[-119.311766,40.960091],[-119.224135,40.001626],[-119.191274,39.629194],[-119.196751,39.623717],[-119.284382,39.623717],[-119.689675,39.519655],[-119.711583,39.251285],[-120.001861,39.163654],[-120.007338,39.317009],[-120.001861,39.442978],[-120.001861,39.722302],[-120.001861,41.184645],[-120.001861,41.995232],[-119.361059,41.995232]]]}},
+{"type":"Feature","id":"32033","properties":{"name":"White Pine"},"geometry":{"type":"Polygon","coordinates":[[[-114.048427,40.116642],[-114.048427,39.908518],[-114.048427,39.541563],[-114.048427,38.676207],[-114.70566,38.676207],[-115.001414,38.676207],[-115.90511,39.163654],[-115.833909,40.127596],[-114.048427,40.116642]]]}},
+{"type":"Feature","id":"32510","properties":{"name":"Carson City"},"geometry":{"type":"Polygon","coordinates":[[[-119.580137,39.196516],[-119.552752,39.086977],[-119.760876,39.114362],[-120.001861,39.114362],[-120.001861,39.163654],[-119.711583,39.251285],[-119.580137,39.196516]]]}},
+{"type":"Feature","id":"33001","properties":{"name":"Belknap"},"geometry":{"type":"Polygon","coordinates":[[[-71.530939,43.764284],[-71.163984,43.53973],[-71.235184,43.282313],[-71.728109,43.561637],[-71.530939,43.764284]]]}},
+{"type":"Feature","id":"33003","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-71.010629,44.284593],[-70.988722,43.791669],[-70.961337,43.53973],[-71.109214,43.506868],[-71.163984,43.53973],[-71.530939,43.764284],[-71.415923,44.213393],[-71.010629,44.284593]]]}},
+{"type":"Feature","id":"33005","properties":{"name":"Cheshire"},"geometry":{"type":"Polygon","coordinates":[[[-72.199125,43.178252],[-72.040294,43.128959],[-71.930755,42.712712],[-72.28128,42.723665],[-72.456542,42.729142],[-72.451065,43.161821],[-72.199125,43.178252]]]}},
+{"type":"Feature","id":"33007","properties":{"name":"Coos"},"geometry":{"type":"Polygon","coordinates":[[[-71.08183,45.303304],[-71.010629,44.284593],[-71.415923,44.213393],[-71.766447,44.405086],[-71.503554,45.013027],[-71.08183,45.303304]]]}},
+{"type":"Feature","id":"33009","properties":{"name":"Grafton"},"geometry":{"type":"Polygon","coordinates":[[[-71.837647,44.350317],[-71.766447,44.405086],[-71.415923,44.213393],[-71.530939,43.764284],[-71.728109,43.561637],[-71.81574,43.545207],[-71.936232,43.528776],[-72.330572,43.599976],[-72.204602,43.769761],[-72.040294,44.153147],[-71.837647,44.350317]]]}},
+{"type":"Feature","id":"33011","properties":{"name":"Hillsborough"},"geometry":{"type":"Polygon","coordinates":[[[-71.914325,43.205636],[-71.394015,43.008466],[-71.246138,42.740096],[-71.257092,42.734619],[-71.897894,42.712712],[-71.930755,42.712712],[-72.040294,43.128959],[-72.007433,43.189205],[-71.914325,43.205636]]]}},
+{"type":"Feature","id":"33013","properties":{"name":"Merrimack"},"geometry":{"type":"Polygon","coordinates":[[[-71.81574,43.545207],[-71.728109,43.561637],[-71.235184,43.282313],[-71.246138,43.276836],[-71.394015,43.008466],[-71.914325,43.205636],[-72.007433,43.189205],[-71.936232,43.528776],[-71.81574,43.545207]]]}},
+{"type":"Feature","id":"33015","properties":{"name":"Rockingham"},"geometry":{"type":"Polygon","coordinates":[[[-71.246138,43.276836],[-70.818936,43.123482],[-70.703921,43.057759],[-70.818936,42.871543],[-70.917521,42.887974],[-71.246138,42.740096],[-71.394015,43.008466],[-71.246138,43.276836]]]}},
+{"type":"Feature","id":"33017","properties":{"name":"Strafford"},"geometry":{"type":"Polygon","coordinates":[[[-71.109214,43.506868],[-70.961337,43.53973],[-70.818936,43.123482],[-71.246138,43.276836],[-71.235184,43.282313],[-71.163984,43.53973],[-71.109214,43.506868]]]}},
+{"type":"Feature","id":"33019","properties":{"name":"Sullivan"},"geometry":{"type":"Polygon","coordinates":[[[-72.330572,43.599976],[-71.936232,43.528776],[-72.007433,43.189205],[-72.040294,43.128959],[-72.199125,43.178252],[-72.451065,43.161821],[-72.434634,43.233021],[-72.330572,43.599976]]]}},
+{"type":"Feature","id":"34001","properties":{"name":"Atlantic"},"geometry":{"type":"Polygon","coordinates":[[[-74.734949,39.727779],[-74.417286,39.557994],[-74.313224,39.497748],[-74.548733,39.295101],[-74.860918,39.322485],[-74.986888,39.514178],[-74.877349,39.607286],[-74.734949,39.727779]]]}},
+{"type":"Feature","id":"34003","properties":{"name":"Bergen"},"geometry":{"type":"Polygon","coordinates":[[[-74.21464,41.135353],[-73.8915,40.998429],[-73.918885,40.916275],[-73.918885,40.910798],[-73.935316,40.883413],[-73.984608,40.795782],[-74.011993,40.823167],[-74.148916,40.784829],[-74.132485,40.81769],[-74.21464,41.135353]]]}},
+{"type":"Feature","id":"34005","properties":{"name":"Burlington"},"geometry":{"type":"Polygon","coordinates":[[[-74.702087,40.182365],[-74.587071,40.13855],[-74.55421,40.078303],[-74.417286,39.557994],[-74.734949,39.727779],[-75.030704,39.990672],[-75.058088,39.990672],[-74.975934,40.050919],[-74.723995,40.149503],[-74.702087,40.182365]]]}},
+{"type":"Feature","id":"34007","properties":{"name":"Camden"},"geometry":{"type":"Polygon","coordinates":[[[-75.030704,39.990672],[-74.734949,39.727779],[-74.877349,39.607286],[-75.140242,39.88661],[-75.058088,39.990672],[-75.030704,39.990672]]]}},
+{"type":"Feature","id":"34009","properties":{"name":"Cape May"},"geometry":{"type":"Polygon","coordinates":[[[-74.860918,39.322485],[-74.548733,39.295101],[-74.915688,39.180085],[-74.860918,39.322485]]]}},
+{"type":"Feature","id":"34011","properties":{"name":"Cumberland"},"geometry":{"type":"Polygon","coordinates":[[[-75.058088,39.568948],[-74.986888,39.514178],[-74.860918,39.322485],[-74.915688,39.180085],[-75.408613,39.382732],[-75.063565,39.568948],[-75.058088,39.568948]]]}},
+{"type":"Feature","id":"34013","properties":{"name":"Essex"},"geometry":{"type":"Polygon","coordinates":[[[-74.28584,40.894367],[-74.269409,40.899844],[-74.132485,40.81769],[-74.148916,40.784829],[-74.137962,40.67529],[-74.362517,40.735536],[-74.373471,40.741013],[-74.28584,40.894367]]]}},
+{"type":"Feature","id":"34015","properties":{"name":"Gloucester"},"geometry":{"type":"Polygon","coordinates":[[[-75.211443,39.864703],[-75.140242,39.88661],[-74.877349,39.607286],[-74.986888,39.514178],[-75.058088,39.568948],[-75.063565,39.568948],[-75.446951,39.771595],[-75.414089,39.804456],[-75.211443,39.864703]]]}},
+{"type":"Feature","id":"34017","properties":{"name":"Hudson"},"geometry":{"type":"Polygon","coordinates":[[[-74.011993,40.823167],[-73.984608,40.795782],[-74.022947,40.708151],[-74.15987,40.642428],[-74.137962,40.67529],[-74.148916,40.784829],[-74.011993,40.823167]]]}},
+{"type":"Feature","id":"34019","properties":{"name":"Hunterdon"},"geometry":{"type":"Polygon","coordinates":[[[-74.888303,40.790306],[-74.723995,40.719105],[-74.745903,40.423351],[-74.800672,40.417874],[-74.943073,40.341196],[-75.189535,40.593136],[-74.888303,40.790306]]]}},
+{"type":"Feature","id":"34021","properties":{"name":"Mercer"},"geometry":{"type":"Polygon","coordinates":[[[-74.800672,40.417874],[-74.745903,40.423351],[-74.619933,40.374058],[-74.48301,40.253565],[-74.587071,40.13855],[-74.702087,40.182365],[-74.723995,40.149503],[-74.943073,40.341196],[-74.800672,40.417874]]]}},
+{"type":"Feature","id":"34023","properties":{"name":"Middlesex"},"geometry":{"type":"Polygon","coordinates":[[[-74.291317,40.593136],[-74.209163,40.593136],[-74.225593,40.450735],[-74.48301,40.253565],[-74.619933,40.374058],[-74.461102,40.598613],[-74.291317,40.593136]]]}},
+{"type":"Feature","id":"34025","properties":{"name":"Monmouth"},"geometry":{"type":"Polygon","coordinates":[[[-74.0339,40.100211],[-74.406332,40.171411],[-74.55421,40.078303],[-74.587071,40.13855],[-74.48301,40.253565],[-74.225593,40.450735],[-74.0339,40.100211]]]}},
+{"type":"Feature","id":"34027","properties":{"name":"Morris"},"geometry":{"type":"Polygon","coordinates":[[[-74.504917,41.08606],[-74.269409,40.899844],[-74.28584,40.894367],[-74.373471,40.741013],[-74.461102,40.67529],[-74.718518,40.719105],[-74.723995,40.719105],[-74.888303,40.790306],[-74.76781,40.910798],[-74.504917,41.08606]]]}},
+{"type":"Feature","id":"34029","properties":{"name":"Ocean"},"geometry":{"type":"Polygon","coordinates":[[[-74.406332,40.171411],[-74.0339,40.100211],[-74.313224,39.497748],[-74.417286,39.557994],[-74.55421,40.078303],[-74.406332,40.171411]]]}},
+{"type":"Feature","id":"34031","properties":{"name":"Passaic"},"geometry":{"type":"Polygon","coordinates":[[[-74.367994,41.201076],[-74.236547,41.14083],[-74.21464,41.135353],[-74.132485,40.81769],[-74.269409,40.899844],[-74.504917,41.08606],[-74.367994,41.201076]]]}},
+{"type":"Feature","id":"34033","properties":{"name":"Salem"},"geometry":{"type":"Polygon","coordinates":[[[-75.446951,39.771595],[-75.063565,39.568948],[-75.408613,39.382732],[-75.55649,39.607286],[-75.561967,39.629194],[-75.507197,39.683964],[-75.446951,39.771595]]]}},
+{"type":"Feature","id":"34035","properties":{"name":"Somerset"},"geometry":{"type":"Polygon","coordinates":[[[-74.718518,40.719105],[-74.461102,40.67529],[-74.461102,40.598613],[-74.619933,40.374058],[-74.745903,40.423351],[-74.723995,40.719105],[-74.718518,40.719105]]]}},
+{"type":"Feature","id":"34037","properties":{"name":"Sussex"},"geometry":{"type":"Polygon","coordinates":[[[-74.367994,41.201076],[-74.504917,41.08606],[-74.76781,40.910798],[-74.96498,41.091537],[-74.96498,41.097014],[-74.992365,41.091537],[-74.69661,41.359907],[-74.367994,41.201076]]]}},
+{"type":"Feature","id":"34039","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-74.362517,40.735536],[-74.137962,40.67529],[-74.15987,40.642428],[-74.209163,40.593136],[-74.291317,40.593136],[-74.461102,40.598613],[-74.461102,40.67529],[-74.373471,40.741013],[-74.362517,40.735536]]]}},
+{"type":"Feature","id":"34041","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-74.96498,41.091537],[-74.76781,40.910798],[-74.888303,40.790306],[-75.189535,40.593136],[-75.195012,40.609566],[-75.118335,40.965568],[-74.96498,41.097014],[-74.96498,41.091537]]]}},
+{"type":"Feature","id":"35001","properties":{"name":"Bernalillo"},"geometry":{"type":"Polygon","coordinates":[[[-107.196774,35.220257],[-106.243787,35.21478],[-106.243787,35.039518],[-106.413572,34.869733],[-107.065328,34.957364],[-107.196774,35.220257]]]}},
+{"type":"Feature","id":"35003","properties":{"name":"Catron"},"geometry":{"type":"Polygon","coordinates":[[[-108.987734,34.579455],[-107.722561,34.579455],[-107.711607,33.47859],[-108.001885,33.199266],[-108.182624,33.199266],[-109.04798,33.21022],[-109.04798,33.779822],[-109.04798,34.579455],[-108.987734,34.579455]]]}},
+{"type":"Feature","id":"35005","properties":{"name":"Chaves"},"geometry":{"type":"Polygon","coordinates":[[[-103.877749,34.081054],[-103.510794,33.571698],[-103.812025,32.963758],[-104.102303,32.963758],[-104.84169,32.963758],[-104.852644,32.520126],[-105.356522,32.520126],[-105.318184,33.133543],[-104.907413,33.13902],[-104.890983,34.08653],[-103.943472,34.081054],[-103.877749,34.081054]]]}},
+{"type":"Feature","id":"35006","properties":{"name":"Cibola"},"geometry":{"type":"Polygon","coordinates":[[[-107.985454,35.307888],[-107.31179,35.307888],[-107.196774,35.220257],[-107.065328,34.957364],[-107.196774,34.957364],[-107.202251,34.579455],[-107.536345,34.579455],[-107.722561,34.579455],[-108.987734,34.579455],[-109.04798,34.579455],[-109.04798,34.957364],[-108.467425,34.957364],[-108.467425,35.307888],[-107.985454,35.307888]]]}},
+{"type":"Feature","id":"35007","properties":{"name":"Colfax"},"geometry":{"type":"Polygon","coordinates":[[[-104.009195,36.994786],[-104.009195,36.21706],[-104.436396,36.21706],[-105.340092,36.260876],[-105.219599,36.994786],[-105.153876,36.994786],[-104.009195,36.994786]]]}},
+{"type":"Feature","id":"35009","properties":{"name":"Curry"},"geometry":{"type":"Polygon","coordinates":[[[-103.264331,34.951887],[-103.045254,34.951887],[-103.045254,34.74924],[-103.045254,34.311085],[-103.045254,34.300131],[-103.740825,34.305608],[-103.740825,34.60684],[-103.264331,34.951887]]]}},
+{"type":"Feature","id":"35011","properties":{"name":"De Baca"},"geometry":{"type":"Polygon","coordinates":[[[-104.129688,34.776625],[-103.948949,34.60684],[-103.943472,34.081054],[-104.890983,34.08653],[-104.890983,34.349424],[-104.890983,34.60684],[-104.129688,34.776625]]]}},
+{"type":"Feature","id":"35013","properties":{"name":"Dona Ana"},"geometry":{"type":"Polygon","coordinates":[[[-106.342372,33.051389],[-106.375233,31.999816],[-106.528588,31.786216],[-107.295359,31.786216],[-107.300836,32.607757],[-107.300836,32.777542],[-106.342372,33.051389]]]}},
+{"type":"Feature","id":"35015","properties":{"name":"Eddy"},"geometry":{"type":"Polygon","coordinates":[[[-104.102303,32.963758],[-103.812025,32.963758],[-103.724394,31.999816],[-103.98181,31.999816],[-104.025626,31.999816],[-104.847167,31.999816],[-104.852644,32.520126],[-104.84169,32.963758],[-104.102303,32.963758]]]}},
+{"type":"Feature","id":"35017","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-108.182624,33.199266],[-108.001885,33.199266],[-107.607545,32.607757],[-108.231916,32.514649],[-108.215485,31.862893],[-108.522194,31.862893],[-108.538625,32.514649],[-109.04798,32.777542],[-109.04798,33.21022],[-108.182624,33.199266]]]}},
+{"type":"Feature","id":"35019","properties":{"name":"Guadalupe"},"geometry":{"type":"Polygon","coordinates":[[[-104.124211,35.14358],[-104.129688,34.776625],[-104.890983,34.60684],[-104.890983,34.349424],[-105.312707,34.349424],[-105.290799,35.039518],[-105.290799,35.21478],[-104.124211,35.14358]]]}},
+{"type":"Feature","id":"35021","properties":{"name":"Harding"},"geometry":{"type":"Polygon","coordinates":[[[-104.436396,36.21706],[-104.009195,36.21706],[-103.362916,36.085614],[-103.37387,35.740566],[-103.636763,35.390042],[-103.976333,35.800813],[-104.365196,35.778905],[-104.436396,36.21706]]]}},
+{"type":"Feature","id":"35023","properties":{"name":"Hidalgo"},"geometry":{"type":"Polygon","coordinates":[[[-109.04798,32.777542],[-108.538625,32.514649],[-108.522194,31.862893],[-108.215485,31.862893],[-108.210008,31.786216],[-108.210008,31.331629],[-109.04798,31.331629],[-109.04798,32.427018],[-109.04798,32.777542]]]}},
+{"type":"Feature","id":"35025","properties":{"name":"Lea"},"geometry":{"type":"Polygon","coordinates":[[[-103.050731,33.571698],[-103.056207,33.390959],[-103.067161,32.958281],[-103.067161,32.520126],[-103.061684,32.087447],[-103.324578,31.999816],[-103.71344,31.999816],[-103.724394,31.999816],[-103.812025,32.963758],[-103.510794,33.571698],[-103.050731,33.571698]]]}},
+{"type":"Feature","id":"35027","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-104.890983,34.349424],[-104.890983,34.08653],[-104.907413,33.13902],[-105.318184,33.133543],[-105.728954,33.390959],[-106.347849,33.390959],[-106.375233,33.47859],[-106.052094,33.648375],[-105.926124,34.261793],[-105.312707,34.349424],[-104.890983,34.349424]]]}},
+{"type":"Feature","id":"35028","properties":{"name":"Los Alamos"},"geometry":{"type":"Polygon","coordinates":[[[-106.249264,35.965121],[-106.243787,35.932259],[-106.249264,35.855582],[-106.249264,35.839151],[-106.249264,35.756997],[-106.249264,35.965121]]]}},
+{"type":"Feature","id":"35029","properties":{"name":"Luna"},"geometry":{"type":"Polygon","coordinates":[[[-107.607545,32.607757],[-107.300836,32.607757],[-107.295359,31.786216],[-108.210008,31.786216],[-108.215485,31.862893],[-108.231916,32.514649],[-107.607545,32.607757]]]}},
+{"type":"Feature","id":"35031","properties":{"name":"McKinley"},"geometry":{"type":"Polygon","coordinates":[[[-108.883672,36.00346],[-107.623976,35.997983],[-107.306313,35.997983],[-107.31179,35.307888],[-107.985454,35.307888],[-108.467425,35.307888],[-108.467425,34.957364],[-109.04798,34.957364],[-109.04798,36.00346],[-108.883672,36.00346]]]}},
+{"type":"Feature","id":"35033","properties":{"name":"Mora"},"geometry":{"type":"Polygon","coordinates":[[[-105.340092,36.260876],[-104.436396,36.21706],[-104.365196,35.778905],[-105.718001,35.872013],[-105.718001,35.976075],[-105.531785,36.014414],[-105.340092,36.260876]]]}},
+{"type":"Feature","id":"35035","properties":{"name":"Otero"},"geometry":{"type":"Polygon","coordinates":[[[-105.728954,33.390959],[-105.318184,33.133543],[-105.356522,32.520126],[-104.852644,32.520126],[-104.847167,31.999816],[-104.918367,31.999816],[-105.997324,31.999816],[-106.375233,31.999816],[-106.342372,33.051389],[-106.347849,33.390959],[-105.728954,33.390959]]]}},
+{"type":"Feature","id":"35037","properties":{"name":"Quay"},"geometry":{"type":"Polygon","coordinates":[[[-103.37387,35.740566],[-103.039777,35.740566],[-103.039777,35.620074],[-103.039777,35.181919],[-103.045254,34.951887],[-103.264331,34.951887],[-103.740825,34.60684],[-103.948949,34.60684],[-104.129688,34.776625],[-104.124211,35.14358],[-103.636763,35.390042],[-103.37387,35.740566]]]}},
+{"type":"Feature","id":"35039","properties":{"name":"Rio Arriba"},"geometry":{"type":"Polygon","coordinates":[[[-107.421329,37.000263],[-106.473818,36.994786],[-106.008278,36.994786],[-105.958986,36.353984],[-105.531785,36.014414],[-105.718001,35.976075],[-106.068525,35.997983],[-106.243787,35.932259],[-106.249264,35.965121],[-106.884589,36.21706],[-107.623976,36.222537],[-107.421329,37.000263]]]}},
+{"type":"Feature","id":"35041","properties":{"name":"Roosevelt"},"geometry":{"type":"Polygon","coordinates":[[[-103.740825,34.60684],[-103.740825,34.305608],[-103.045254,34.300131],[-103.045254,33.823637],[-103.050731,33.571698],[-103.510794,33.571698],[-103.877749,34.081054],[-103.943472,34.081054],[-103.948949,34.60684],[-103.740825,34.60684]]]}},
+{"type":"Feature","id":"35043","properties":{"name":"Sandoval"},"geometry":{"type":"Polygon","coordinates":[[[-107.623976,36.222537],[-106.884589,36.21706],[-106.249264,35.965121],[-106.249264,35.756997],[-106.243787,35.21478],[-107.196774,35.220257],[-107.31179,35.307888],[-107.306313,35.997983],[-107.623976,35.997983],[-107.623976,36.222537]]]}},
+{"type":"Feature","id":"35045","properties":{"name":"San Juan"},"geometry":{"type":"Polygon","coordinates":[[[-107.421329,37.000263],[-107.623976,36.222537],[-107.623976,35.997983],[-108.883672,36.00346],[-109.04798,36.00346],[-109.042503,37.000263],[-108.379794,37.000263],[-107.481575,37.000263],[-107.421329,37.000263]]]}},
+{"type":"Feature","id":"35047","properties":{"name":"San Miguel"},"geometry":{"type":"Polygon","coordinates":[[[-104.365196,35.778905],[-103.976333,35.800813],[-103.636763,35.390042],[-104.124211,35.14358],[-105.290799,35.21478],[-105.290799,35.039518],[-105.712524,35.039518],[-105.718001,35.872013],[-104.365196,35.778905]]]}},
+{"type":"Feature","id":"35049","properties":{"name":"Santa Fe"},"geometry":{"type":"Polygon","coordinates":[[[-106.068525,35.997983],[-105.718001,35.976075],[-105.718001,35.872013],[-105.712524,35.039518],[-106.243787,35.039518],[-106.243787,35.21478],[-106.249264,35.756997],[-106.249264,35.839151],[-106.249264,35.855582],[-106.243787,35.932259],[-106.068525,35.997983]]]}},
+{"type":"Feature","id":"35051","properties":{"name":"Sierra"},"geometry":{"type":"Polygon","coordinates":[[[-106.375233,33.47859],[-106.347849,33.390959],[-106.342372,33.051389],[-107.300836,32.777542],[-107.300836,32.607757],[-107.607545,32.607757],[-108.001885,33.199266],[-107.711607,33.47859],[-106.375233,33.47859]]]}},
+{"type":"Feature","id":"35053","properties":{"name":"Socorro"},"geometry":{"type":"Polygon","coordinates":[[[-107.536345,34.579455],[-107.202251,34.579455],[-106.419049,34.442532],[-105.926124,34.261793],[-106.052094,33.648375],[-106.375233,33.47859],[-107.711607,33.47859],[-107.722561,34.579455],[-107.536345,34.579455]]]}},
+{"type":"Feature","id":"35055","properties":{"name":"Taos"},"geometry":{"type":"Polygon","coordinates":[[[-105.219599,36.994786],[-105.340092,36.260876],[-105.531785,36.014414],[-105.958986,36.353984],[-106.008278,36.994786],[-105.718001,36.994786],[-105.219599,36.994786]]]}},
+{"type":"Feature","id":"35057","properties":{"name":"Torrance"},"geometry":{"type":"Polygon","coordinates":[[[-105.290799,35.039518],[-105.312707,34.349424],[-105.926124,34.261793],[-106.419049,34.442532],[-106.413572,34.869733],[-106.243787,35.039518],[-105.712524,35.039518],[-105.290799,35.039518]]]}},
+{"type":"Feature","id":"35059","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-103.001438,37.000263],[-103.001438,36.501861],[-103.039777,36.052752],[-103.039777,35.740566],[-103.37387,35.740566],[-103.362916,36.085614],[-104.009195,36.21706],[-104.009195,36.994786],[-103.083592,37.000263],[-103.001438,37.000263]]]}},
+{"type":"Feature","id":"35061","properties":{"name":"Valencia"},"geometry":{"type":"Polygon","coordinates":[[[-107.196774,34.957364],[-107.065328,34.957364],[-106.413572,34.869733],[-106.419049,34.442532],[-107.202251,34.579455],[-107.196774,34.957364]]]}},
+{"type":"Feature","id":"36001","properties":{"name":"Albany"},"geometry":{"type":"Polygon","coordinates":[[[-73.809346,42.778435],[-73.677899,42.783912],[-73.781961,42.466249],[-74.252978,42.406003],[-74.181778,42.729142],[-73.809346,42.778435]]]}},
+{"type":"Feature","id":"36003","properties":{"name":"Allegany"},"geometry":{"type":"Polygon","coordinates":[[[-78.22376,42.521019],[-78.037544,42.521019],[-77.725358,42.471726],[-77.747266,42.000709],[-78.207329,42.000709],[-78.305914,42.000709],[-78.311391,42.521019],[-78.22376,42.521019]]]}},
+{"type":"Feature","id":"36005","properties":{"name":"Bronx"},"geometry":{"type":"Polygon","coordinates":[[[-73.918885,40.910798],[-73.918885,40.916275],[-73.781961,40.883413],[-73.787438,40.801259],[-73.814823,40.806736],[-73.913408,40.795782],[-73.924362,40.877937],[-73.935316,40.883413],[-73.918885,40.910798]]]}},
+{"type":"Feature","id":"36007","properties":{"name":"Broome"},"geometry":{"type":"Polygon","coordinates":[[[-75.863199,42.416957],[-75.419566,42.192402],[-75.35932,42.000709],[-75.479813,42.000709],[-75.48529,42.000709],[-75.890583,42.000709],[-76.104184,42.000709],[-76.131569,42.41148],[-75.863199,42.416957]]]}},
+{"type":"Feature","id":"36009","properties":{"name":"Cattaraugus"},"geometry":{"type":"Polygon","coordinates":[[[-79.001485,42.531973],[-78.464745,42.537449],[-78.311391,42.521019],[-78.305914,42.000709],[-78.919331,42.000709],[-79.061732,42.000709],[-79.061732,42.537449],[-79.001485,42.531973]]]}},
+{"type":"Feature","id":"36011","properties":{"name":"Cayuga"},"geometry":{"type":"Polygon","coordinates":[[[-76.619016,43.419237],[-76.476616,43.227544],[-76.273969,42.772958],[-76.263015,42.625081],[-76.460185,42.625081],[-76.668309,42.625081],[-76.712124,43.024897],[-76.723078,43.34256],[-76.619016,43.419237]]]}},
+{"type":"Feature","id":"36013","properties":{"name":"Chautauqua"},"geometry":{"type":"Polygon","coordinates":[[[-79.138409,42.570311],[-79.061732,42.537449],[-79.061732,42.000709],[-79.609426,42.000709],[-79.76278,42.252649],[-79.76278,42.269079],[-79.138409,42.570311],[-79.138409,42.570311]]]}},
+{"type":"Feature","id":"36015","properties":{"name":"Chemung"},"geometry":{"type":"Polygon","coordinates":[[[-76.766894,42.296464],[-76.619016,42.28551],[-76.536862,42.280033],[-76.55877,42.000709],[-76.920248,42.000709],[-76.925725,42.000709],[-76.964064,42.000709],[-76.964064,42.280033],[-76.766894,42.296464]]]}},
+{"type":"Feature","id":"36017","properties":{"name":"Chenango"},"geometry":{"type":"Polygon","coordinates":[[[-75.310028,42.745573],[-75.293597,42.745573],[-75.414089,42.312895],[-75.419566,42.192402],[-75.863199,42.416957],[-75.890583,42.723665],[-75.310028,42.745573]]]}},
+{"type":"Feature","id":"36019","properties":{"name":"Clinton"},"geometry":{"type":"Polygon","coordinates":[[[-73.343806,45.013027],[-73.360237,44.563917],[-73.338329,44.547487],[-73.907931,44.426994],[-74.028424,44.996596],[-73.343806,45.013027]]]}},
+{"type":"Feature","id":"36021","properties":{"name":"Columbia"},"geometry":{"type":"Polygon","coordinates":[[[-73.398575,42.504588],[-73.35476,42.510065],[-73.49716,42.050002],[-73.929839,42.077386],[-73.913408,42.126679],[-73.781961,42.466249],[-73.398575,42.504588]]]}},
+{"type":"Feature","id":"36023","properties":{"name":"Cortland"},"geometry":{"type":"Polygon","coordinates":[[[-75.917968,42.789389],[-75.89606,42.789389],[-75.890583,42.723665],[-75.863199,42.416957],[-76.131569,42.41148],[-76.252061,42.406003],[-76.263015,42.625081],[-76.273969,42.772958],[-75.917968,42.789389]]]}},
+{"type":"Feature","id":"36025","properties":{"name":"Delaware"},"geometry":{"type":"Polygon","coordinates":[[[-74.844488,42.510065],[-74.713041,42.515542],[-74.444671,42.35671],[-74.450148,42.170494],[-74.778764,42.01714],[-74.789718,42.011663],[-75.145719,41.852832],[-75.35932,42.000709],[-75.419566,42.192402],[-75.414089,42.312895],[-74.844488,42.510065]]]}},
+{"type":"Feature","id":"36027","properties":{"name":"Dutchess"},"geometry":{"type":"Polygon","coordinates":[[[-73.929839,42.077386],[-73.49716,42.050002],[-73.486206,42.050002],[-73.519068,41.666616],[-73.530022,41.529692],[-73.979131,41.436584],[-73.951746,41.589939],[-73.929839,42.077386]]]}},
+{"type":"Feature","id":"36029","properties":{"name":"Erie"},"geometry":{"type":"Polygon","coordinates":[[[-78.552376,43.096097],[-78.464745,43.09062],[-78.464745,42.866066],[-78.464745,42.537449],[-79.001485,42.531973],[-79.061732,42.537449],[-79.138409,42.570311],[-79.138409,42.570311],[-79.023393,43.068713],[-78.552376,43.096097]]]}},
+{"type":"Feature","id":"36031","properties":{"name":"Essex"},"geometry":{"type":"Polygon","coordinates":[[[-73.338329,44.547487],[-73.310944,44.262686],[-73.376668,43.8081],[-73.436914,43.802623],[-73.853161,43.764284],[-74.055808,43.742376],[-74.280363,44.120285],[-73.907931,44.426994],[-73.338329,44.547487]]]}},
+{"type":"Feature","id":"36033","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-74.028424,44.996596],[-73.907931,44.426994],[-74.280363,44.120285],[-74.537779,44.098377],[-74.723995,44.996596],[-74.028424,44.996596]]]}},
+{"type":"Feature","id":"36035","properties":{"name":"Fulton"},"geometry":{"type":"Polygon","coordinates":[[[-74.713041,43.28779],[-74.137962,43.254929],[-74.099624,42.981082],[-74.581595,42.997512],[-74.762334,43.046805],[-74.713041,43.28779]]]}},
+{"type":"Feature","id":"36037","properties":{"name":"Genesee"},"geometry":{"type":"Polygon","coordinates":[[[-77.906097,43.128959],[-77.911574,42.986559],[-77.95539,42.860589],[-78.09779,42.871543],[-78.464745,42.866066],[-78.464745,43.09062],[-78.464745,43.128959],[-77.999205,43.134436],[-77.906097,43.128959]]]}},
+{"type":"Feature","id":"36039","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-73.781961,42.466249],[-73.913408,42.126679],[-74.01747,42.159541],[-74.450148,42.170494],[-74.444671,42.35671],[-74.252978,42.406003],[-73.781961,42.466249]]]}},
+{"type":"Feature","id":"36041","properties":{"name":"Hamilton"},"geometry":{"type":"Polygon","coordinates":[[[-74.280363,44.120285],[-74.055808,43.742376],[-74.15987,43.369944],[-74.137962,43.254929],[-74.713041,43.28779],[-74.855442,44.070993],[-74.537779,44.098377],[-74.280363,44.120285]]]}},
+{"type":"Feature","id":"36043","properties":{"name":"Herkimer"},"geometry":{"type":"Polygon","coordinates":[[[-75.167627,44.098377],[-74.855442,44.070993],[-74.713041,43.28779],[-74.762334,43.046805],[-74.762334,42.860589],[-75.096427,42.904404],[-75.211443,42.882497],[-75.112858,43.616407],[-75.167627,44.098377]]]}},
+{"type":"Feature","id":"36045","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-75.857722,44.405086],[-75.446951,44.21887],[-75.775568,43.687607],[-76.087753,43.671176],[-76.202769,43.68213],[-76.312308,44.196962],[-75.857722,44.405086]]]}},
+{"type":"Feature","id":"36047","properties":{"name":"Kings"},"geometry":{"type":"Polygon","coordinates":[[[-73.951746,40.741013],[-73.940792,40.565751],[-74.022947,40.680767],[-73.9627,40.735536],[-73.951746,40.741013]]]}},
+{"type":"Feature","id":"36049","properties":{"name":"Lewis"},"geometry":{"type":"Polygon","coordinates":[[[-75.446951,44.21887],[-75.167627,44.098377],[-75.112858,43.616407],[-75.75366,43.468529],[-75.775568,43.687607],[-75.446951,44.21887]]]}},
+{"type":"Feature","id":"36051","properties":{"name":"Livingston"},"geometry":{"type":"Polygon","coordinates":[[[-77.823943,42.986559],[-77.582958,42.942743],[-77.48985,42.575788],[-77.648681,42.581265],[-77.725358,42.471726],[-78.037544,42.521019],[-77.95539,42.860589],[-77.911574,42.986559],[-77.823943,42.986559]]]}},
+{"type":"Feature","id":"36053","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-75.978214,43.167298],[-75.994645,43.183728],[-75.885106,43.156344],[-75.249781,42.871543],[-75.293597,42.745573],[-75.310028,42.745573],[-75.890583,42.723665],[-75.89606,42.789389],[-75.978214,43.167298]]]}},
+{"type":"Feature","id":"36055","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-77.374834,43.276836],[-77.369357,43.035851],[-77.582958,42.942743],[-77.823943,42.986559],[-77.911574,42.986559],[-77.906097,43.128959],[-77.999205,43.134436],[-77.993728,43.364467],[-77.374834,43.276836]]]}},
+{"type":"Feature","id":"36057","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-74.581595,42.997512],[-74.099624,42.981082],[-74.094147,42.953697],[-74.263932,42.794866],[-74.647318,42.827727],[-74.762334,42.860589],[-74.762334,43.046805],[-74.581595,42.997512]]]}},
+{"type":"Feature","id":"36059","properties":{"name":"Nassau"},"geometry":{"type":"Polygon","coordinates":[[[-73.49716,40.921752],[-73.42596,40.609566],[-73.754577,40.587659],[-73.76553,40.801259],[-73.49716,40.921752]]]}},
+{"type":"Feature","id":"36061","properties":{"name":"New York"},"geometry":{"type":"Polygon","coordinates":[[[-73.924362,40.877937],[-73.913408,40.795782],[-73.9627,40.735536],[-74.022947,40.680767],[-74.022947,40.708151],[-73.984608,40.795782],[-73.935316,40.883413],[-73.924362,40.877937]]]}},
+{"type":"Feature","id":"36063","properties":{"name":"Niagara"},"geometry":{"type":"Polygon","coordinates":[[[-78.464745,43.369944],[-78.464745,43.128959],[-78.464745,43.09062],[-78.552376,43.096097],[-79.023393,43.068713],[-78.464745,43.369944]]]}},
+{"type":"Feature","id":"36065","properties":{"name":"Oneida"},"geometry":{"type":"Polygon","coordinates":[[[-75.112858,43.616407],[-75.211443,42.882497],[-75.249781,42.871543],[-75.885106,43.156344],[-75.75366,43.468529],[-75.112858,43.616407]]]}},
+{"type":"Feature","id":"36067","properties":{"name":"Onondaga"},"geometry":{"type":"Polygon","coordinates":[[[-76.169907,43.249452],[-75.994645,43.183728],[-75.978214,43.167298],[-75.89606,42.789389],[-75.917968,42.789389],[-76.273969,42.772958],[-76.476616,43.227544],[-76.169907,43.249452]]]}},
+{"type":"Feature","id":"36069","properties":{"name":"Ontario"},"geometry":{"type":"Polygon","coordinates":[[[-77.122895,43.013943],[-76.964064,43.013943],[-76.975017,42.762004],[-77.36388,42.575788],[-77.48985,42.575788],[-77.582958,42.942743],[-77.369357,43.035851],[-77.122895,43.013943]]]}},
+{"type":"Feature","id":"36071","properties":{"name":"Orange"},"geometry":{"type":"Polygon","coordinates":[[[-74.263932,41.633754],[-73.951746,41.589939],[-73.979131,41.436584],[-73.979131,41.327046],[-74.236547,41.14083],[-74.367994,41.201076],[-74.69661,41.359907],[-74.756857,41.425631],[-74.367994,41.589939],[-74.263932,41.633754]]]}},
+{"type":"Feature","id":"36073","properties":{"name":"Orleans"},"geometry":{"type":"Polygon","coordinates":[[[-77.993728,43.364467],[-77.999205,43.134436],[-78.464745,43.128959],[-78.464745,43.369944],[-77.993728,43.364467]]]}},
+{"type":"Feature","id":"36075","properties":{"name":"Oswego"},"geometry":{"type":"Polygon","coordinates":[[[-76.087753,43.671176],[-75.775568,43.687607],[-75.75366,43.468529],[-75.885106,43.156344],[-75.994645,43.183728],[-76.169907,43.249452],[-76.476616,43.227544],[-76.619016,43.419237],[-76.202769,43.68213],[-76.087753,43.671176]]]}},
+{"type":"Feature","id":"36077","properties":{"name":"Otsego"},"geometry":{"type":"Polygon","coordinates":[[[-75.096427,42.904404],[-74.762334,42.860589],[-74.647318,42.827727],[-74.713041,42.515542],[-74.844488,42.510065],[-75.414089,42.312895],[-75.293597,42.745573],[-75.249781,42.871543],[-75.211443,42.882497],[-75.096427,42.904404]]]}},
+{"type":"Feature","id":"36079","properties":{"name":"Putnam"},"geometry":{"type":"Polygon","coordinates":[[[-73.530022,41.529692],[-73.546453,41.365384],[-73.661469,41.35443],[-73.984608,41.321569],[-73.979131,41.327046],[-73.979131,41.436584],[-73.530022,41.529692]]]}},
+{"type":"Feature","id":"36081","properties":{"name":"Queens"},"geometry":{"type":"Polygon","coordinates":[[[-73.814823,40.806736],[-73.787438,40.801259],[-73.76553,40.801259],[-73.754577,40.587659],[-73.940792,40.565751],[-73.951746,40.741013],[-73.9627,40.735536],[-73.913408,40.795782],[-73.814823,40.806736]]]}},
+{"type":"Feature","id":"36083","properties":{"name":"Rensselaer"},"geometry":{"type":"Polygon","coordinates":[[[-73.387622,42.94822],[-73.272606,42.942743],[-73.267129,42.745573],[-73.35476,42.510065],[-73.398575,42.504588],[-73.781961,42.466249],[-73.677899,42.783912],[-73.634084,42.942743],[-73.387622,42.94822]]]}},
+{"type":"Feature","id":"36087","properties":{"name":"Rockland"},"geometry":{"type":"Polygon","coordinates":[[[-73.984608,41.321569],[-73.8915,40.998429],[-74.21464,41.135353],[-74.236547,41.14083],[-73.979131,41.327046],[-73.984608,41.321569]]]}},
+{"type":"Feature","id":"36089","properties":{"name":"St. Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-74.723995,44.996596],[-74.537779,44.098377],[-74.855442,44.070993],[-75.167627,44.098377],[-75.446951,44.21887],[-75.857722,44.405086],[-75.238827,44.865149],[-74.723995,44.996596]]]}},
+{"type":"Feature","id":"36091","properties":{"name":"Saratoga"},"geometry":{"type":"Polygon","coordinates":[[[-73.886023,43.397329],[-73.595745,43.304221],[-73.634084,42.942743],[-73.677899,42.783912],[-73.809346,42.778435],[-74.094147,42.953697],[-74.099624,42.981082],[-74.137962,43.254929],[-74.15987,43.369944],[-73.886023,43.397329]]]}},
+{"type":"Feature","id":"36093","properties":{"name":"Schenectady"},"geometry":{"type":"Polygon","coordinates":[[[-74.094147,42.953697],[-73.809346,42.778435],[-74.181778,42.729142],[-74.263932,42.794866],[-74.094147,42.953697]]]}},
+{"type":"Feature","id":"36095","properties":{"name":"Schoharie"},"geometry":{"type":"Polygon","coordinates":[[[-74.647318,42.827727],[-74.263932,42.794866],[-74.181778,42.729142],[-74.252978,42.406003],[-74.444671,42.35671],[-74.713041,42.515542],[-74.647318,42.827727]]]}},
+{"type":"Feature","id":"36097","properties":{"name":"Schuyler"},"geometry":{"type":"Polygon","coordinates":[[[-76.70117,42.548403],[-76.695693,42.548403],[-76.619016,42.28551],[-76.766894,42.296464],[-76.964064,42.280033],[-77.106464,42.48268],[-76.892863,42.542926],[-76.70117,42.548403]]]}},
+{"type":"Feature","id":"36099","properties":{"name":"Seneca"},"geometry":{"type":"Polygon","coordinates":[[[-76.712124,43.024897],[-76.668309,42.625081],[-76.695693,42.548403],[-76.70117,42.548403],[-76.892863,42.542926],[-76.975017,42.762004],[-76.964064,43.013943],[-76.712124,43.024897]]]}},
+{"type":"Feature","id":"36101","properties":{"name":"Steuben"},"geometry":{"type":"Polygon","coordinates":[[[-77.648681,42.581265],[-77.48985,42.575788],[-77.36388,42.575788],[-77.106464,42.48268],[-76.964064,42.280033],[-76.964064,42.000709],[-77.610343,42.000709],[-77.747266,42.000709],[-77.725358,42.471726],[-77.648681,42.581265]]]}},
+{"type":"Feature","id":"36103","properties":{"name":"Suffolk"},"geometry":{"type":"Polygon","coordinates":[[[-73.42596,40.609566],[-73.49716,40.921752],[-72.100541,40.992952],[-73.42596,40.609566]]]}},
+{"type":"Feature","id":"36105","properties":{"name":"Sullivan"},"geometry":{"type":"Polygon","coordinates":[[[-74.789718,42.011663],[-74.778764,42.01714],[-74.367994,41.589939],[-74.756857,41.425631],[-75.069042,41.600893],[-75.145719,41.852832],[-74.789718,42.011663]]]}},
+{"type":"Feature","id":"36107","properties":{"name":"Tioga"},"geometry":{"type":"Polygon","coordinates":[[[-76.131569,42.41148],[-76.104184,42.000709],[-76.147999,42.000709],[-76.55877,42.000709],[-76.536862,42.280033],[-76.252061,42.406003],[-76.131569,42.41148]]]}},
+{"type":"Feature","id":"36109","properties":{"name":"Tompkins"},"geometry":{"type":"Polygon","coordinates":[[[-76.460185,42.625081],[-76.263015,42.625081],[-76.252061,42.406003],[-76.536862,42.280033],[-76.619016,42.28551],[-76.695693,42.548403],[-76.668309,42.625081],[-76.460185,42.625081]]]}},
+{"type":"Feature","id":"36111","properties":{"name":"Ulster"},"geometry":{"type":"Polygon","coordinates":[[[-74.01747,42.159541],[-73.913408,42.126679],[-73.929839,42.077386],[-73.951746,41.589939],[-74.263932,41.633754],[-74.367994,41.589939],[-74.778764,42.01714],[-74.450148,42.170494],[-74.01747,42.159541]]]}},
+{"type":"Feature","id":"36113","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-73.853161,43.764284],[-73.436914,43.802623],[-73.595745,43.304221],[-73.886023,43.397329],[-74.15987,43.369944],[-74.055808,43.742376],[-73.853161,43.764284]]]}},
+{"type":"Feature","id":"36115","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-73.376668,43.8081],[-73.365714,43.75333],[-73.256175,43.315175],[-73.272606,42.942743],[-73.387622,42.94822],[-73.634084,42.942743],[-73.595745,43.304221],[-73.436914,43.802623],[-73.376668,43.8081]]]}},
+{"type":"Feature","id":"36117","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-76.723078,43.34256],[-76.712124,43.024897],[-76.964064,43.013943],[-77.122895,43.013943],[-77.369357,43.035851],[-77.374834,43.276836],[-76.723078,43.34256]]]}},
+{"type":"Feature","id":"36119","properties":{"name":"Westchester"},"geometry":{"type":"Polygon","coordinates":[[[-73.661469,41.35443],[-73.546453,41.365384],[-73.655992,40.987475],[-73.781961,40.883413],[-73.918885,40.916275],[-73.8915,40.998429],[-73.984608,41.321569],[-73.661469,41.35443]]]}},
+{"type":"Feature","id":"36121","properties":{"name":"Wyoming"},"geometry":{"type":"Polygon","coordinates":[[[-78.09779,42.871543],[-77.95539,42.860589],[-78.037544,42.521019],[-78.22376,42.521019],[-78.311391,42.521019],[-78.464745,42.537449],[-78.464745,42.866066],[-78.09779,42.871543]]]}},
+{"type":"Feature","id":"36123","properties":{"name":"Yates"},"geometry":{"type":"Polygon","coordinates":[[[-76.975017,42.762004],[-76.892863,42.542926],[-77.106464,42.48268],[-77.36388,42.575788],[-76.975017,42.762004]]]}},
+{"type":"Feature","id":"37001","properties":{"name":"Alamance"},"geometry":{"type":"Polygon","coordinates":[[[-79.532749,36.249922],[-79.258902,36.244445],[-79.247948,35.87749],[-79.543702,35.844628],[-79.543702,35.899398],[-79.532749,36.238968],[-79.532749,36.249922]]]}},
+{"type":"Feature","id":"37003","properties":{"name":"Alexander"},"geometry":{"type":"Polygon","coordinates":[[[-81.027953,36.047275],[-81.110107,35.778905],[-81.192262,35.822721],[-81.334662,35.795336],[-81.329185,35.997983],[-81.027953,36.047275]]]}},
+{"type":"Feature","id":"37005","properties":{"name":"Alleghany"},"geometry":{"type":"Polygon","coordinates":[[[-80.978661,36.562108],[-80.901984,36.562108],[-80.967707,36.403276],[-81.082723,36.430661],[-81.252508,36.364938],[-81.351093,36.573061],[-80.978661,36.562108]]]}},
+{"type":"Feature","id":"37007","properties":{"name":"Anson"},"geometry":{"type":"Polygon","coordinates":[[[-80.173551,35.149057],[-80.074966,35.14358],[-79.927088,34.80401],[-80.321428,34.814964],[-80.277612,35.198349],[-80.173551,35.149057]]]}},
+{"type":"Feature","id":"37009","properties":{"name":"Ashe"},"geometry":{"type":"Polygon","coordinates":[[[-81.351093,36.573061],[-81.252508,36.364938],[-81.477062,36.238968],[-81.734479,36.392322],[-81.679709,36.589492],[-81.351093,36.573061]]]}},
+{"type":"Feature","id":"37011","properties":{"name":"Avery"},"geometry":{"type":"Polygon","coordinates":[[[-81.931648,36.266353],[-81.920695,36.288261],[-81.811156,36.112998],[-81.805679,35.959644],[-81.898787,35.997983],[-81.942602,35.959644],[-81.948079,35.954167],[-81.980941,35.910352],[-82.079526,36.107521],[-81.931648,36.266353]]]}},
+{"type":"Feature","id":"37013","properties":{"name":"Beaufort"},"geometry":{"type":"Polygon","coordinates":[[[-77.172187,35.73509],[-76.843571,35.707705],[-76.640924,35.707705],[-76.547816,35.390042],[-76.602586,35.335273],[-76.624493,35.253119],[-76.89834,35.253119],[-77.188618,35.417427],[-77.172187,35.73509]]]}},
+{"type":"Feature","id":"37015","properties":{"name":"Bertie"},"geometry":{"type":"Polygon","coordinates":[[[-76.706647,36.244445],[-76.668309,36.01989],[-76.690217,35.943213],[-76.761417,35.866536],[-77.325542,36.07466],[-77.29268,36.167768],[-77.210526,36.244445],[-76.706647,36.244445]]]}},
+{"type":"Feature","id":"37017","properties":{"name":"Bladen"},"geometry":{"type":"Polygon","coordinates":[[[-78.49213,34.847825],[-78.256622,34.55207],[-78.256622,34.398716],[-78.870039,34.48087],[-78.9029,34.836871],[-78.49213,34.858779],[-78.49213,34.847825]]]}},
+{"type":"Feature","id":"37019","properties":{"name":"Brunswick"},"geometry":{"type":"Polygon","coordinates":[[[-78.125175,34.365854],[-78.032067,34.332993],[-77.938959,33.927699],[-78.541422,33.851022],[-78.650961,33.94413],[-78.163514,34.354901],[-78.125175,34.365854]]]}},
+{"type":"Feature","id":"37021","properties":{"name":"Buncombe"},"geometry":{"type":"Polygon","coordinates":[[[-82.276696,35.702228],[-82.167157,35.526966],[-82.265742,35.466719],[-82.408142,35.472196],[-82.747713,35.422904],[-82.884636,35.68032],[-82.408142,35.817244],[-82.276696,35.702228]]]}},
+{"type":"Feature","id":"37023","properties":{"name":"Burke"},"geometry":{"type":"Polygon","coordinates":[[[-81.898787,35.997983],[-81.805679,35.959644],[-81.362047,35.767951],[-81.531832,35.570781],[-81.537309,35.565304],[-81.586601,35.565304],[-81.690663,35.581735],[-81.82211,35.576258],[-81.942602,35.959644],[-81.898787,35.997983]]]}},
+{"type":"Feature","id":"37025","properties":{"name":"Cabarrus"},"geometry":{"type":"Polygon","coordinates":[[[-80.737675,35.505058],[-80.294043,35.505058],[-80.507644,35.187396],[-80.55146,35.209303],[-80.781491,35.505058],[-80.737675,35.505058]]]}},
+{"type":"Feature","id":"37027","properties":{"name":"Caldwell"},"geometry":{"type":"Polygon","coordinates":[[[-81.685186,36.123952],[-81.542786,36.118475],[-81.329185,35.997983],[-81.334662,35.795336],[-81.362047,35.767951],[-81.805679,35.959644],[-81.811156,36.112998],[-81.685186,36.123952]]]}},
+{"type":"Feature","id":"37029","properties":{"name":"Camden"},"geometry":{"type":"Polygon","coordinates":[[[-76.493047,36.551154],[-76.312308,36.551154],[-75.885106,36.162291],[-76.049415,36.184199],[-76.493047,36.512815],[-76.542339,36.551154],[-76.493047,36.551154]]]}},
+{"type":"Feature","id":"37031","properties":{"name":"Carteret"},"geometry":{"type":"Polygon","coordinates":[[[-77.111941,34.639701],[-77.16671,34.787579],[-77.090033,34.80401],[-76.712124,34.979272],[-76.646401,35.01761],[-76.279446,34.940933],[-76.536862,34.590409],[-77.111941,34.639701]]]}},
+{"type":"Feature","id":"37033","properties":{"name":"Caswell"},"geometry":{"type":"Polygon","coordinates":[[[-79.138409,36.5402],[-79.15484,36.244445],[-79.247948,36.244445],[-79.258902,36.244445],[-79.532749,36.249922],[-79.510841,36.5402],[-79.472502,36.5402],[-79.341056,36.5402],[-79.220563,36.5402],[-79.138409,36.5402]]]}},
+{"type":"Feature","id":"37035","properties":{"name":"Catawba"},"geometry":{"type":"Polygon","coordinates":[[[-81.192262,35.822721],[-81.110107,35.778905],[-80.96223,35.548874],[-81.488016,35.570781],[-81.531832,35.570781],[-81.362047,35.767951],[-81.334662,35.795336],[-81.192262,35.822721]]]}},
+{"type":"Feature","id":"37037","properties":{"name":"Chatham"},"geometry":{"type":"Polygon","coordinates":[[[-79.187701,35.872013],[-79.017916,35.861059],[-78.908377,35.866536],[-78.913854,35.581735],[-78.968624,35.521489],[-79.242471,35.570781],[-79.35201,35.516012],[-79.554656,35.516012],[-79.543702,35.844628],[-79.247948,35.87749],[-79.187701,35.872013]]]}},
+{"type":"Feature","id":"37039","properties":{"name":"Cherokee"},"geometry":{"type":"Polygon","coordinates":[[[-83.7007,35.247642],[-83.739039,35.154534],[-84.007409,34.984749],[-84.127902,34.990226],[-84.319594,34.990226],[-84.29221,35.209303],[-84.029317,35.291457],[-83.7007,35.247642]]]}},
+{"type":"Feature","id":"37041","properties":{"name":"Chowan"},"geometry":{"type":"Polygon","coordinates":[[[-76.695693,36.293737],[-76.55877,36.353984],[-76.410893,36.07466],[-76.668309,36.01989],[-76.706647,36.244445],[-76.695693,36.293737]]]}},
+{"type":"Feature","id":"37043","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-83.739039,35.154534],[-83.481623,34.995703],[-83.547346,34.990226],[-83.936209,34.984749],[-84.007409,34.984749],[-83.739039,35.154534]]]}},
+{"type":"Feature","id":"37045","properties":{"name":"Cleveland"},"geometry":{"type":"Polygon","coordinates":[[[-81.586601,35.565304],[-81.537309,35.565304],[-81.455155,35.417427],[-81.329185,35.165488],[-81.367524,35.165488],[-81.76734,35.181919],[-81.690663,35.581735],[-81.586601,35.565304]]]}},
+{"type":"Feature","id":"37047","properties":{"name":"Columbus"},"geometry":{"type":"Polygon","coordinates":[[[-78.870039,34.48087],[-78.256622,34.398716],[-78.163514,34.354901],[-78.650961,33.94413],[-79.072686,34.300131],[-78.870039,34.48087]]]}},
+{"type":"Feature","id":"37049","properties":{"name":"Craven"},"geometry":{"type":"Polygon","coordinates":[[[-77.188618,35.417427],[-76.89834,35.253119],[-76.712124,34.979272],[-77.090033,34.80401],[-77.473419,35.231211],[-77.391265,35.34075],[-77.188618,35.417427]]]}},
+{"type":"Feature","id":"37051","properties":{"name":"Cumberland"},"geometry":{"type":"Polygon","coordinates":[[[-78.952193,35.21478],[-78.6181,35.247642],[-78.49213,34.858779],[-78.9029,34.836871],[-79.034347,34.951887],[-79.10007,35.176442],[-79.094593,35.192872],[-78.952193,35.21478]]]}},
+{"type":"Feature","id":"37053","properties":{"name":"Currituck"},"geometry":{"type":"Polygon","coordinates":[[[-75.901537,36.551154],[-75.868676,36.551154],[-75.775568,36.233491],[-75.791998,36.228014],[-75.885106,36.162291],[-76.312308,36.551154],[-76.120615,36.551154],[-75.901537,36.551154]]]}},
+{"type":"Feature","id":"37055","properties":{"name":"Dare"},"geometry":{"type":"Polygon","coordinates":[[[-75.868676,35.581735],[-76.027507,35.669366],[-76.000122,35.904875],[-75.868676,35.581735]]]}},
+{"type":"Feature","id":"37057","properties":{"name":"Davidson"},"geometry":{"type":"Polygon","coordinates":[[[-80.211889,36.008937],[-80.042104,36.008937],[-80.047581,35.921306],[-80.064012,35.505058],[-80.184505,35.505058],[-80.458352,35.740566],[-80.398105,35.970598],[-80.211889,36.008937]]]}},
+{"type":"Feature","id":"37059","properties":{"name":"Davie"},"geometry":{"type":"Polygon","coordinates":[[[-80.69386,36.052752],[-80.49669,36.047275],[-80.398105,35.970598],[-80.458352,35.740566],[-80.688383,35.861059],[-80.710291,35.850105],[-80.69386,36.052752]]]}},
+{"type":"Feature","id":"37061","properties":{"name":"Duplin"},"geometry":{"type":"Polygon","coordinates":[[[-78.043021,35.192872],[-77.834897,35.176442],[-77.730835,35.006656],[-77.676066,34.973795],[-77.681543,34.721856],[-78.015636,34.732809],[-78.114221,34.721856],[-78.163514,35.187396],[-78.043021,35.192872]]]}},
+{"type":"Feature","id":"37063","properties":{"name":"Durham"},"geometry":{"type":"Polygon","coordinates":[[[-78.952193,36.238968],[-78.804316,36.233491],[-78.749546,36.069183],[-78.908377,35.866536],[-79.017916,35.861059],[-78.952193,36.238968]]]}},
+{"type":"Feature","id":"37065","properties":{"name":"Edgecombe"},"geometry":{"type":"Polygon","coordinates":[[[-77.697974,36.151337],[-77.402219,36.00346],[-77.352926,35.817244],[-77.413173,35.822721],[-77.659635,35.674843],[-77.82942,35.866536],[-77.82942,35.866536],[-77.697974,36.151337]]]}},
+{"type":"Feature","id":"37067","properties":{"name":"Forsyth"},"geometry":{"type":"Polygon","coordinates":[[[-80.452875,36.260876],[-80.036627,36.255399],[-80.042104,36.008937],[-80.211889,36.008937],[-80.398105,35.970598],[-80.49669,36.047275],[-80.452875,36.238968],[-80.452875,36.260876]]]}},
+{"type":"Feature","id":"37069","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-78.163514,36.249922],[-78.004682,36.200629],[-78.053975,36.134906],[-78.256622,35.817244],[-78.546899,36.01989],[-78.497607,36.173245],[-78.305914,36.266353],[-78.163514,36.249922]]]}},
+{"type":"Feature","id":"37071","properties":{"name":"Gaston"},"geometry":{"type":"Polygon","coordinates":[[[-81.455155,35.417427],[-80.956753,35.400996],[-81.044384,35.149057],[-81.329185,35.165488],[-81.455155,35.417427]]]}},
+{"type":"Feature","id":"37073","properties":{"name":"Gates"},"geometry":{"type":"Polygon","coordinates":[[[-76.914771,36.551154],[-76.542339,36.551154],[-76.493047,36.512815],[-76.454708,36.375892],[-76.55877,36.353984],[-76.695693,36.293737],[-76.914771,36.545677],[-76.914771,36.551154]]]}},
+{"type":"Feature","id":"37075","properties":{"name":"Graham"},"geometry":{"type":"Polygon","coordinates":[[[-83.952639,35.461243],[-83.678792,35.280503],[-83.7007,35.247642],[-84.029317,35.291457],[-83.963593,35.461243],[-83.952639,35.461243]]]}},
+{"type":"Feature","id":"37077","properties":{"name":"Granville"},"geometry":{"type":"Polygon","coordinates":[[[-78.470222,36.5402],[-78.459268,36.5402],[-78.497607,36.173245],[-78.546899,36.01989],[-78.749546,36.069183],[-78.804316,36.233491],[-78.798839,36.5402],[-78.733115,36.5402],[-78.470222,36.5402]]]}},
+{"type":"Feature","id":"37079","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-77.681543,35.636505],[-77.473419,35.428381],[-77.807512,35.368135],[-77.823943,35.570781],[-77.697974,35.652935],[-77.681543,35.636505]]]}},
+{"type":"Feature","id":"37081","properties":{"name":"Guilford"},"geometry":{"type":"Polygon","coordinates":[[[-80.036627,36.255399],[-80.036627,36.255399],[-79.532749,36.238968],[-79.543702,35.899398],[-80.036627,35.921306],[-80.047581,35.921306],[-80.042104,36.008937],[-80.036627,36.255399]]]}},
+{"type":"Feature","id":"37083","properties":{"name":"Halifax"},"geometry":{"type":"Polygon","coordinates":[[[-77.90062,36.507338],[-77.29268,36.167768],[-77.325542,36.07466],[-77.402219,36.00346],[-77.697974,36.151337],[-78.004682,36.200629],[-77.90062,36.507338]]]}},
+{"type":"Feature","id":"37085","properties":{"name":"Harnett"},"geometry":{"type":"Polygon","coordinates":[[[-78.913854,35.581735],[-78.711208,35.521489],[-78.541422,35.313365],[-78.6181,35.247642],[-78.952193,35.21478],[-79.094593,35.192872],[-79.182224,35.307888],[-78.968624,35.521489],[-78.913854,35.581735]]]}},
+{"type":"Feature","id":"37087","properties":{"name":"Haywood"},"geometry":{"type":"Polygon","coordinates":[[[-82.961313,35.789859],[-82.884636,35.68032],[-82.747713,35.422904],[-82.922975,35.291457],[-83.185868,35.516012],[-83.257068,35.696751],[-83.257068,35.713182],[-82.961313,35.789859]]]}},
+{"type":"Feature","id":"37089","properties":{"name":"Henderson"},"geometry":{"type":"Polygon","coordinates":[[[-82.408142,35.472196],[-82.265742,35.466719],[-82.260265,35.395519],[-82.353373,35.192872],[-82.572451,35.14358],[-82.747713,35.422904],[-82.408142,35.472196]]]}},
+{"type":"Feature","id":"37091","properties":{"name":"Hertford"},"geometry":{"type":"Polygon","coordinates":[[[-76.914771,36.545677],[-76.695693,36.293737],[-76.706647,36.244445],[-77.210526,36.244445],[-77.16671,36.545677],[-76.914771,36.545677]]]}},
+{"type":"Feature","id":"37093","properties":{"name":"Hoke"},"geometry":{"type":"Polygon","coordinates":[[[-79.127455,35.165488],[-79.10007,35.176442],[-79.034347,34.951887],[-79.346533,34.836871],[-79.461548,35.044995],[-79.127455,35.165488]]]}},
+{"type":"Feature","id":"37095","properties":{"name":"Hyde"},"geometry":{"type":"Polygon","coordinates":[[[-76.635447,35.707705],[-76.394462,35.696751],[-76.027507,35.669366],[-75.868676,35.581735],[-76.547816,35.390042],[-76.640924,35.707705],[-76.635447,35.707705]]]}},
+{"type":"Feature","id":"37097","properties":{"name":"Iredell"},"geometry":{"type":"Polygon","coordinates":[[[-80.880076,36.058229],[-80.69386,36.052752],[-80.710291,35.850105],[-80.737675,35.505058],[-80.781491,35.505058],[-80.907461,35.516012],[-80.945799,35.488627],[-80.96223,35.548874],[-81.110107,35.778905],[-81.027953,36.047275],[-80.880076,36.058229]]]}},
+{"type":"Feature","id":"37099","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-83.207776,35.516012],[-83.185868,35.516012],[-82.922975,35.291457],[-83.010606,35.028564],[-83.109191,35.00118],[-83.339222,35.329796],[-83.207776,35.516012]]]}},
+{"type":"Feature","id":"37101","properties":{"name":"Johnston"},"geometry":{"type":"Polygon","coordinates":[[[-78.256622,35.817244],[-78.190898,35.729613],[-78.064929,35.587212],[-78.305914,35.28598],[-78.541422,35.313365],[-78.711208,35.521489],[-78.256622,35.817244]]]}},
+{"type":"Feature","id":"37103","properties":{"name":"Jones"},"geometry":{"type":"Polygon","coordinates":[[[-77.473419,35.231211],[-77.090033,34.80401],[-77.16671,34.787579],[-77.676066,34.973795],[-77.730835,35.006656],[-77.473419,35.231211]]]}},
+{"type":"Feature","id":"37105","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-79.242471,35.570781],[-78.968624,35.521489],[-79.182224,35.307888],[-79.35201,35.516012],[-79.242471,35.570781]]]}},
+{"type":"Feature","id":"37107","properties":{"name":"Lenoir"},"geometry":{"type":"Polygon","coordinates":[[[-77.446034,35.379088],[-77.391265,35.34075],[-77.473419,35.231211],[-77.730835,35.006656],[-77.834897,35.176442],[-77.807512,35.368135],[-77.473419,35.428381],[-77.446034,35.379088]]]}},
+{"type":"Feature","id":"37109","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-81.488016,35.570781],[-80.96223,35.548874],[-80.945799,35.488627],[-80.956753,35.400996],[-81.455155,35.417427],[-81.537309,35.565304],[-81.531832,35.570781],[-81.488016,35.570781]]]}},
+{"type":"Feature","id":"37111","properties":{"name":"McDowell"},"geometry":{"type":"Polygon","coordinates":[[[-81.948079,35.954167],[-81.942602,35.959644],[-81.82211,35.576258],[-82.167157,35.526966],[-82.276696,35.702228],[-82.134295,35.822721],[-81.980941,35.910352],[-81.948079,35.954167]]]}},
+{"type":"Feature","id":"37113","properties":{"name":"Macon"},"geometry":{"type":"Polygon","coordinates":[[[-83.339222,35.329796],[-83.109191,35.00118],[-83.481623,34.995703],[-83.739039,35.154534],[-83.7007,35.247642],[-83.678792,35.280503],[-83.339222,35.329796]]]}},
+{"type":"Feature","id":"37115","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-82.786051,35.987029],[-82.605312,36.041798],[-82.506727,35.976075],[-82.408142,35.817244],[-82.884636,35.68032],[-82.961313,35.789859],[-82.901067,35.943213],[-82.786051,35.987029]]]}},
+{"type":"Feature","id":"37117","properties":{"name":"Martin"},"geometry":{"type":"Polygon","coordinates":[[[-77.325542,36.07466],[-76.761417,35.866536],[-76.843571,35.707705],[-77.172187,35.73509],[-77.352926,35.817244],[-77.402219,36.00346],[-77.325542,36.07466]]]}},
+{"type":"Feature","id":"37119","properties":{"name":"Mecklenburg"},"geometry":{"type":"Polygon","coordinates":[[[-80.907461,35.516012],[-80.781491,35.505058],[-80.55146,35.209303],[-80.841737,35.00118],[-80.907461,35.077857],[-81.044384,35.149057],[-80.956753,35.400996],[-80.945799,35.488627],[-80.907461,35.516012]]]}},
+{"type":"Feature","id":"37121","properties":{"name":"Mitchell"},"geometry":{"type":"Polygon","coordinates":[[[-82.079526,36.107521],[-81.980941,35.910352],[-82.134295,35.822721],[-82.419096,36.07466],[-82.221926,36.156814],[-82.079526,36.107521]]]}},
+{"type":"Feature","id":"37123","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-79.768257,35.510535],[-79.614903,35.165488],[-79.729918,35.176442],[-80.074966,35.14358],[-80.184505,35.505058],[-80.064012,35.505058],[-79.768257,35.510535]]]}},
+{"type":"Feature","id":"37125","properties":{"name":"Moore"},"geometry":{"type":"Polygon","coordinates":[[[-79.35201,35.516012],[-79.182224,35.307888],[-79.094593,35.192872],[-79.10007,35.176442],[-79.127455,35.165488],[-79.461548,35.044995],[-79.614903,35.165488],[-79.768257,35.510535],[-79.554656,35.516012],[-79.35201,35.516012]]]}},
+{"type":"Feature","id":"37127","properties":{"name":"Nash"},"geometry":{"type":"Polygon","coordinates":[[[-78.053975,36.134906],[-78.004682,36.200629],[-77.697974,36.151337],[-77.82942,35.866536],[-78.190898,35.729613],[-78.256622,35.817244],[-78.053975,36.134906]]]}},
+{"type":"Feature","id":"37129","properties":{"name":"New Hanover"},"geometry":{"type":"Polygon","coordinates":[[[-77.960867,34.376808],[-77.714404,34.294654],[-77.938959,33.927699],[-78.032067,34.332993],[-77.960867,34.376808]]]}},
+{"type":"Feature","id":"37131","properties":{"name":"Northampton"},"geometry":{"type":"Polygon","coordinates":[[[-77.298157,36.545677],[-77.16671,36.545677],[-77.210526,36.244445],[-77.29268,36.167768],[-77.90062,36.507338],[-77.90062,36.545677],[-77.769174,36.545677],[-77.298157,36.545677]]]}},
+{"type":"Feature","id":"37133","properties":{"name":"Onslow"},"geometry":{"type":"Polygon","coordinates":[[[-77.676066,34.973795],[-77.16671,34.787579],[-77.111941,34.639701],[-77.517235,34.442532],[-77.681543,34.721856],[-77.676066,34.973795]]]}},
+{"type":"Feature","id":"37135","properties":{"name":"Orange"},"geometry":{"type":"Polygon","coordinates":[[[-79.247948,36.244445],[-79.15484,36.244445],[-78.952193,36.238968],[-79.017916,35.861059],[-79.187701,35.872013],[-79.247948,35.87749],[-79.258902,36.244445],[-79.247948,36.244445]]]}},
+{"type":"Feature","id":"37137","properties":{"name":"Pamlico"},"geometry":{"type":"Polygon","coordinates":[[[-76.624493,35.253119],[-76.602586,35.335273],[-76.646401,35.01761],[-76.712124,34.979272],[-76.89834,35.253119],[-76.624493,35.253119]]]}},
+{"type":"Feature","id":"37139","properties":{"name":"Pasquotank"},"geometry":{"type":"Polygon","coordinates":[[[-76.493047,36.512815],[-76.049415,36.184199],[-76.191815,36.118475],[-76.454708,36.375892],[-76.493047,36.512815]]]}},
+{"type":"Feature","id":"37141","properties":{"name":"Pender"},"geometry":{"type":"Polygon","coordinates":[[[-78.015636,34.732809],[-77.681543,34.721856],[-77.517235,34.442532],[-77.714404,34.294654],[-77.960867,34.376808],[-78.032067,34.332993],[-78.125175,34.365854],[-78.163514,34.354901],[-78.256622,34.398716],[-78.256622,34.55207],[-78.114221,34.721856],[-78.015636,34.732809]]]}},
+{"type":"Feature","id":"37143","properties":{"name":"Perquimans"},"geometry":{"type":"Polygon","coordinates":[[[-76.454708,36.375892],[-76.191815,36.118475],[-76.410893,36.07466],[-76.55877,36.353984],[-76.454708,36.375892]]]}},
+{"type":"Feature","id":"37145","properties":{"name":"Person"},"geometry":{"type":"Polygon","coordinates":[[[-79.138409,36.5402],[-78.798839,36.5402],[-78.804316,36.233491],[-78.952193,36.238968],[-79.15484,36.244445],[-79.138409,36.5402]]]}},
+{"type":"Feature","id":"37147","properties":{"name":"Pitt"},"geometry":{"type":"Polygon","coordinates":[[[-77.413173,35.822721],[-77.352926,35.817244],[-77.172187,35.73509],[-77.188618,35.417427],[-77.391265,35.34075],[-77.446034,35.379088],[-77.473419,35.428381],[-77.681543,35.636505],[-77.697974,35.652935],[-77.659635,35.674843],[-77.413173,35.822721]]]}},
+{"type":"Feature","id":"37149","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-82.09048,35.357181],[-81.969987,35.187396],[-82.216449,35.198349],[-82.353373,35.192872],[-82.260265,35.395519],[-82.09048,35.357181]]]}},
+{"type":"Feature","id":"37151","properties":{"name":"Randolph"},"geometry":{"type":"Polygon","coordinates":[[[-80.036627,35.921306],[-79.543702,35.899398],[-79.543702,35.844628],[-79.554656,35.516012],[-79.768257,35.510535],[-80.064012,35.505058],[-80.047581,35.921306],[-80.036627,35.921306]]]}},
+{"type":"Feature","id":"37153","properties":{"name":"Richmond"},"geometry":{"type":"Polygon","coordinates":[[[-79.729918,35.176442],[-79.614903,35.165488],[-79.461548,35.044995],[-79.686103,34.80401],[-79.927088,34.80401],[-80.074966,35.14358],[-79.729918,35.176442]]]}},
+{"type":"Feature","id":"37155","properties":{"name":"Robeson"},"geometry":{"type":"Polygon","coordinates":[[[-79.034347,34.951887],[-78.9029,34.836871],[-78.870039,34.48087],[-79.072686,34.300131],[-79.450595,34.623271],[-79.461548,34.628748],[-79.346533,34.836871],[-79.034347,34.951887]]]}},
+{"type":"Feature","id":"37157","properties":{"name":"Rockingham"},"geometry":{"type":"Polygon","coordinates":[[[-79.965427,36.5402],[-79.713488,36.5402],[-79.510841,36.5402],[-79.532749,36.249922],[-79.532749,36.238968],[-80.036627,36.255399],[-80.025673,36.5402],[-79.965427,36.5402]]]}},
+{"type":"Feature","id":"37159","properties":{"name":"Rowan"},"geometry":{"type":"Polygon","coordinates":[[[-80.688383,35.861059],[-80.458352,35.740566],[-80.184505,35.505058],[-80.233797,35.505058],[-80.294043,35.505058],[-80.737675,35.505058],[-80.710291,35.850105],[-80.688383,35.861059]]]}},
+{"type":"Feature","id":"37161","properties":{"name":"Rutherford"},"geometry":{"type":"Polygon","coordinates":[[[-81.82211,35.576258],[-81.690663,35.581735],[-81.76734,35.181919],[-81.876879,35.181919],[-81.969987,35.187396],[-82.09048,35.357181],[-82.260265,35.395519],[-82.265742,35.466719],[-82.167157,35.526966],[-81.82211,35.576258]]]}},
+{"type":"Feature","id":"37163","properties":{"name":"Sampson"},"geometry":{"type":"Polygon","coordinates":[[[-78.541422,35.313365],[-78.305914,35.28598],[-78.163514,35.187396],[-78.114221,34.721856],[-78.256622,34.55207],[-78.49213,34.847825],[-78.49213,34.858779],[-78.6181,35.247642],[-78.541422,35.313365]]]}},
+{"type":"Feature","id":"37165","properties":{"name":"Scotland"},"geometry":{"type":"Polygon","coordinates":[[[-79.461548,35.044995],[-79.346533,34.836871],[-79.461548,34.628748],[-79.686103,34.80401],[-79.461548,35.044995]]]}},
+{"type":"Feature","id":"37167","properties":{"name":"Stanly"},"geometry":{"type":"Polygon","coordinates":[[[-80.233797,35.505058],[-80.184505,35.505058],[-80.074966,35.14358],[-80.173551,35.149057],[-80.277612,35.198349],[-80.507644,35.187396],[-80.294043,35.505058],[-80.233797,35.505058]]]}},
+{"type":"Feature","id":"37169","properties":{"name":"Stokes"},"geometry":{"type":"Polygon","coordinates":[[[-80.441921,36.551154],[-80.053058,36.5402],[-80.025673,36.5402],[-80.036627,36.255399],[-80.036627,36.255399],[-80.452875,36.260876],[-80.441921,36.551154]]]}},
+{"type":"Feature","id":"37171","properties":{"name":"Surry"},"geometry":{"type":"Polygon","coordinates":[[[-80.83626,36.556631],[-80.611706,36.556631],[-80.441921,36.551154],[-80.452875,36.260876],[-80.452875,36.238968],[-80.874599,36.238968],[-80.967707,36.403276],[-80.901984,36.562108],[-80.83626,36.556631],[-80.83626,36.556631]]]}},
+{"type":"Feature","id":"37173","properties":{"name":"Swain"},"geometry":{"type":"Polygon","coordinates":[[[-83.662362,35.570781],[-83.257068,35.696751],[-83.185868,35.516012],[-83.207776,35.516012],[-83.339222,35.329796],[-83.678792,35.280503],[-83.952639,35.461243],[-83.662362,35.570781]]]}},
+{"type":"Feature","id":"37175","properties":{"name":"Transylvania"},"geometry":{"type":"Polygon","coordinates":[[[-82.747713,35.422904],[-82.572451,35.14358],[-82.764143,35.066903],[-82.89559,35.055949],[-83.010606,35.028564],[-82.922975,35.291457],[-82.747713,35.422904]]]}},
+{"type":"Feature","id":"37177","properties":{"name":"Tyrrell"},"geometry":{"type":"Polygon","coordinates":[[[-76.000122,35.904875],[-76.027507,35.669366],[-76.394462,35.696751],[-76.367077,35.943213],[-76.000122,35.904875]]]}},
+{"type":"Feature","id":"37179","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-80.55146,35.209303],[-80.507644,35.187396],[-80.277612,35.198349],[-80.321428,34.814964],[-80.562413,34.814964],[-80.841737,35.00118],[-80.55146,35.209303]]]}},
+{"type":"Feature","id":"37181","properties":{"name":"Vance"},"geometry":{"type":"Polygon","coordinates":[[[-78.322345,36.545677],[-78.305914,36.266353],[-78.497607,36.173245],[-78.459268,36.5402],[-78.322345,36.545677]]]}},
+{"type":"Feature","id":"37183","properties":{"name":"Wake"},"geometry":{"type":"Polygon","coordinates":[[[-78.749546,36.069183],[-78.546899,36.01989],[-78.256622,35.817244],[-78.711208,35.521489],[-78.913854,35.581735],[-78.908377,35.866536],[-78.749546,36.069183]]]}},
+{"type":"Feature","id":"37185","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-78.322345,36.545677],[-78.048498,36.545677],[-77.90062,36.545677],[-77.90062,36.507338],[-78.004682,36.200629],[-78.163514,36.249922],[-78.305914,36.266353],[-78.322345,36.545677]]]}},
+{"type":"Feature","id":"37187","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-76.367077,35.943213],[-76.394462,35.696751],[-76.635447,35.707705],[-76.640924,35.707705],[-76.843571,35.707705],[-76.761417,35.866536],[-76.690217,35.943213],[-76.367077,35.943213]]]}},
+{"type":"Feature","id":"37189","properties":{"name":"Watauga"},"geometry":{"type":"Polygon","coordinates":[[[-81.734479,36.392322],[-81.477062,36.238968],[-81.542786,36.118475],[-81.685186,36.123952],[-81.811156,36.112998],[-81.920695,36.288261],[-81.734479,36.392322]]]}},
+{"type":"Feature","id":"37191","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-78.064929,35.587212],[-77.823943,35.570781],[-77.807512,35.368135],[-77.834897,35.176442],[-78.043021,35.192872],[-78.163514,35.187396],[-78.305914,35.28598],[-78.064929,35.587212]]]}},
+{"type":"Feature","id":"37193","properties":{"name":"Wilkes"},"geometry":{"type":"Polygon","coordinates":[[[-81.082723,36.430661],[-80.967707,36.403276],[-80.874599,36.238968],[-80.880076,36.058229],[-81.027953,36.047275],[-81.329185,35.997983],[-81.542786,36.118475],[-81.477062,36.238968],[-81.252508,36.364938],[-81.082723,36.430661]]]}},
+{"type":"Feature","id":"37195","properties":{"name":"Wilson"},"geometry":{"type":"Polygon","coordinates":[[[-77.82942,35.866536],[-77.659635,35.674843],[-77.697974,35.652935],[-77.823943,35.570781],[-78.064929,35.587212],[-78.190898,35.729613],[-77.82942,35.866536],[-77.82942,35.866536]]]}},
+{"type":"Feature","id":"37197","properties":{"name":"Yadkin"},"geometry":{"type":"Polygon","coordinates":[[[-80.452875,36.238968],[-80.49669,36.047275],[-80.69386,36.052752],[-80.880076,36.058229],[-80.874599,36.238968],[-80.452875,36.238968]]]}},
+{"type":"Feature","id":"37199","properties":{"name":"Yancey"},"geometry":{"type":"Polygon","coordinates":[[[-82.419096,36.07466],[-82.134295,35.822721],[-82.276696,35.702228],[-82.408142,35.817244],[-82.506727,35.976075],[-82.419096,36.07466]]]}},
+{"type":"Feature","id":"38001","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-102.49756,46.283677],[-101.999158,46.207],[-101.999158,46.053645],[-101.999158,45.944106],[-101.999158,45.944106],[-102.623529,45.944106],[-102.941192,45.944106],[-102.995961,45.944106],[-102.995961,46.2782],[-102.924761,46.283677],[-102.49756,46.283677]]]}},
+{"type":"Feature","id":"38003","properties":{"name":"Barnes"},"geometry":{"type":"Polygon","coordinates":[[[-98.088623,47.242141],[-97.962653,47.242141],[-97.705237,47.242141],[-97.683329,46.628724],[-97.957176,46.628724],[-98.033853,46.628724],[-98.439147,46.628724],[-98.466531,47.242141],[-98.088623,47.242141]]]}},
+{"type":"Feature","id":"38005","properties":{"name":"Benson"},"geometry":{"type":"Polygon","coordinates":[[[-99.819336,48.370391],[-99.490719,48.370391],[-99.200441,48.370391],[-98.992318,47.992482],[-98.526778,47.915805],[-98.526778,47.844605],[-98.636317,47.850082],[-99.299026,47.844605],[-99.813859,47.850082],[-99.819336,48.370391]]]}},
+{"type":"Feature","id":"38007","properties":{"name":"Billings"},"geometry":{"type":"Polygon","coordinates":[[[-103.664148,47.329772],[-103.100023,47.329772],[-103.0343,46.979248],[-103.23147,46.628724],[-103.609378,46.628724],[-103.664148,47.329772]]]}},
+{"type":"Feature","id":"38009","properties":{"name":"Bottineau"},"geometry":{"type":"Polygon","coordinates":[[[-100.180814,49.000239],[-100.147952,48.545653],[-100.279399,48.545653],[-100.668261,48.633284],[-101.057124,48.545653],[-101.451464,48.545653],[-101.495279,49.000239],[-100.180814,49.000239]]]}},
+{"type":"Feature","id":"38011","properties":{"name":"Bowman"},"geometry":{"type":"Polygon","coordinates":[[[-102.995961,46.2782],[-102.995961,45.944106],[-104.047534,45.944106],[-104.047534,46.2782],[-102.995961,46.2782]]]}},
+{"type":"Feature","id":"38013","properties":{"name":"Burke"},"geometry":{"type":"Polygon","coordinates":[[[-102.021066,49.000239],[-102.021066,48.808546],[-102.152512,48.808546],[-102.234666,48.545653],[-102.886422,48.545653],[-102.886422,48.633284],[-102.941192,49.000239],[-102.021066,49.000239]]]}},
+{"type":"Feature","id":"38015","properties":{"name":"Burleigh"},"geometry":{"type":"Polygon","coordinates":[[[-100.608015,47.329772],[-100.115091,47.329772],[-100.082229,46.634201],[-100.586107,46.634201],[-100.662785,46.634201],[-100.936632,46.984725],[-100.964016,47.15451],[-100.673738,47.329772],[-100.608015,47.329772]]]}},
+{"type":"Feature","id":"38017","properties":{"name":"Cass"},"geometry":{"type":"Polygon","coordinates":[[[-97.453297,47.236664],[-96.834403,47.236664],[-96.828926,47.149033],[-96.790588,46.628724],[-97.278035,46.628724],[-97.683329,46.628724],[-97.705237,47.242141],[-97.453297,47.236664]]]}},
+{"type":"Feature","id":"38019","properties":{"name":"Cavalier"},"geometry":{"type":"Polygon","coordinates":[[[-97.951699,49.000239],[-97.929791,48.545653],[-98.017422,48.545653],[-98.318654,48.545653],[-98.838963,48.545653],[-98.97041,48.545653],[-98.997795,49.000239],[-97.951699,49.000239]]]}},
+{"type":"Feature","id":"38021","properties":{"name":"Dickey"},"geometry":{"type":"Polygon","coordinates":[[[-98.335085,46.283677],[-98.033853,46.283677],[-98.006468,46.283677],[-98.006468,45.938629],[-98.723948,45.938629],[-99.003272,45.938629],[-99.003272,46.283677],[-98.335085,46.283677]]]}},
+{"type":"Feature","id":"38023","properties":{"name":"Divide"},"geometry":{"type":"Polygon","coordinates":[[[-102.941192,49.000239],[-102.886422,48.633284],[-104.047534,48.633284],[-104.047534,49.000239],[-102.941192,49.000239]]]}},
+{"type":"Feature","id":"38025","properties":{"name":"Dunn"},"geometry":{"type":"Polygon","coordinates":[[[-102.63996,47.822697],[-102.388021,47.756974],[-102.207282,47.576235],[-102.147035,47.01211],[-103.0343,46.979248],[-103.100023,47.329772],[-103.100023,47.67482],[-102.63996,47.822697]]]}},
+{"type":"Feature","id":"38027","properties":{"name":"Eddy"},"geometry":{"type":"Polygon","coordinates":[[[-98.636317,47.850082],[-98.526778,47.844605],[-98.499393,47.67482],[-98.499393,47.587189],[-99.200441,47.587189],[-99.266165,47.587189],[-99.299026,47.844605],[-98.636317,47.850082]]]}},
+{"type":"Feature","id":"38029","properties":{"name":"Emmons"},"geometry":{"type":"Polygon","coordinates":[[[-100.586107,46.634201],[-100.082229,46.634201],[-99.917921,46.634201],[-99.879582,46.283677],[-99.879582,45.944106],[-100.432753,45.944106],[-100.498476,45.944106],[-100.50943,45.944106],[-100.591584,46.426077],[-100.662785,46.634201],[-100.586107,46.634201]]]}},
+{"type":"Feature","id":"38031","properties":{"name":"Foster"},"geometry":{"type":"Polygon","coordinates":[[[-99.200441,47.587189],[-98.499393,47.587189],[-98.499393,47.324295],[-99.266165,47.329772],[-99.266165,47.587189],[-99.200441,47.587189]]]}},
+{"type":"Feature","id":"38033","properties":{"name":"Golden Valley"},"geometry":{"type":"Polygon","coordinates":[[[-103.992764,47.329772],[-103.664148,47.329772],[-103.609378,46.628724],[-104.047534,46.541093],[-104.047534,46.639678],[-104.047534,47.329772],[-103.992764,47.329772]]]}},
+{"type":"Feature","id":"38035","properties":{"name":"Grand Forks"},"geometry":{"type":"Polygon","coordinates":[[[-97.825729,48.195129],[-97.141112,48.195129],[-97.146589,48.173221],[-96.889173,47.67482],[-97.475205,47.669343],[-97.880499,47.67482],[-97.902407,48.195129],[-97.825729,48.195129]]]}},
+{"type":"Feature","id":"38037","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-102.097743,46.716355],[-101.29811,46.628724],[-101.024263,46.283677],[-101.999158,46.053645],[-101.999158,46.207],[-102.097743,46.628724],[-102.097743,46.716355]]]}},
+{"type":"Feature","id":"38039","properties":{"name":"Griggs"},"geometry":{"type":"Polygon","coordinates":[[[-98.11053,47.67482],[-97.984561,47.67482],[-97.962653,47.242141],[-98.088623,47.242141],[-98.466531,47.242141],[-98.499393,47.324295],[-98.499393,47.587189],[-98.499393,47.67482],[-98.11053,47.67482]]]}},
+{"type":"Feature","id":"38041","properties":{"name":"Hettinger"},"geometry":{"type":"Polygon","coordinates":[[[-102.17442,46.628724],[-102.097743,46.628724],[-101.999158,46.207],[-102.49756,46.283677],[-102.924761,46.283677],[-102.930238,46.628724],[-102.17442,46.628724]]]}},
+{"type":"Feature","id":"38043","properties":{"name":"Kidder"},"geometry":{"type":"Polygon","coordinates":[[[-99.863151,47.329772],[-99.479765,47.329772],[-99.452381,46.634201],[-99.917921,46.634201],[-100.082229,46.634201],[-100.115091,47.329772],[-100.032936,47.329772],[-99.863151,47.329772]]]}},
+{"type":"Feature","id":"38045","properties":{"name":"LaMoure"},"geometry":{"type":"Polygon","coordinates":[[[-98.033853,46.628724],[-98.033853,46.283677],[-98.335085,46.283677],[-99.003272,46.283677],[-99.036133,46.283677],[-99.036133,46.628724],[-98.439147,46.628724],[-98.033853,46.628724]]]}},
+{"type":"Feature","id":"38047","properties":{"name":"Logan"},"geometry":{"type":"Polygon","coordinates":[[[-99.917921,46.634201],[-99.452381,46.634201],[-99.036133,46.628724],[-99.036133,46.283677],[-99.348319,46.283677],[-99.879582,46.283677],[-99.917921,46.634201]]]}},
+{"type":"Feature","id":"38049","properties":{"name":"McHenry"},"geometry":{"type":"Polygon","coordinates":[[[-100.668261,48.633284],[-100.279399,48.545653],[-100.197245,47.850082],[-100.520384,47.850082],[-100.586107,47.850082],[-100.969493,47.850082],[-101.062601,48.458022],[-101.057124,48.545653],[-100.668261,48.633284]]]}},
+{"type":"Feature","id":"38051","properties":{"name":"McIntosh"},"geometry":{"type":"Polygon","coordinates":[[[-99.348319,46.283677],[-99.036133,46.283677],[-99.003272,46.283677],[-99.003272,45.938629],[-99.720751,45.938629],[-99.879582,45.944106],[-99.879582,46.283677],[-99.348319,46.283677]]]}},
+{"type":"Feature","id":"38053","properties":{"name":"McKenzie"},"geometry":{"type":"Polygon","coordinates":[[[-103.171223,48.134883],[-102.826176,48.123929],[-102.63996,47.822697],[-103.100023,47.67482],[-103.100023,47.329772],[-103.664148,47.329772],[-103.992764,47.329772],[-104.047534,47.329772],[-104.047534,47.395496],[-104.042057,47.997959],[-103.171223,48.134883]]]}},
+{"type":"Feature","id":"38055","properties":{"name":"McLean"},"geometry":{"type":"Polygon","coordinates":[[[-100.969493,47.850082],[-100.586107,47.850082],[-100.673738,47.329772],[-100.964016,47.15451],[-101.254294,47.264049],[-101.429556,47.559804],[-102.081312,47.576235],[-102.207282,47.576235],[-102.388021,47.756974],[-101.873188,47.850082],[-100.969493,47.850082]]]}},
+{"type":"Feature","id":"38057","properties":{"name":"Mercer"},"geometry":{"type":"Polygon","coordinates":[[[-102.081312,47.576235],[-101.429556,47.559804],[-101.254294,47.264049],[-101.76365,46.979248],[-102.097743,46.979248],[-102.147035,47.01211],[-102.207282,47.576235],[-102.081312,47.576235]]]}},
+{"type":"Feature","id":"38059","properties":{"name":"Morton"},"geometry":{"type":"Polygon","coordinates":[[[-100.936632,46.984725],[-100.662785,46.634201],[-100.591584,46.426077],[-101.024263,46.283677],[-101.29811,46.628724],[-102.097743,46.716355],[-102.097743,46.979248],[-101.76365,46.979248],[-100.936632,46.984725]]]}},
+{"type":"Feature","id":"38061","properties":{"name":"Mountrail"},"geometry":{"type":"Polygon","coordinates":[[[-102.886422,48.545653],[-102.234666,48.545653],[-101.971773,48.545653],[-101.873188,47.850082],[-102.388021,47.756974],[-102.63996,47.822697],[-102.826176,48.123929],[-102.886422,48.545653]]]}},
+{"type":"Feature","id":"38063","properties":{"name":"Nelson"},"geometry":{"type":"Polygon","coordinates":[[[-97.91336,48.195129],[-97.902407,48.195129],[-97.880499,47.67482],[-97.979084,47.67482],[-97.984561,47.67482],[-98.11053,47.67482],[-98.499393,47.67482],[-98.526778,47.844605],[-98.526778,47.915805],[-98.291269,48.195129],[-97.91336,48.195129]]]}},
+{"type":"Feature","id":"38065","properties":{"name":"Oliver"},"geometry":{"type":"Polygon","coordinates":[[[-101.254294,47.264049],[-100.964016,47.15451],[-100.936632,46.984725],[-101.76365,46.979248],[-101.254294,47.264049]]]}},
+{"type":"Feature","id":"38067","properties":{"name":"Pembina"},"geometry":{"type":"Polygon","coordinates":[[[-97.228743,49.000239],[-97.16302,48.545653],[-97.16302,48.540176],[-97.929791,48.545653],[-97.951699,49.000239],[-97.228743,49.000239]]]}},
+{"type":"Feature","id":"38069","properties":{"name":"Pierce"},"geometry":{"type":"Polygon","coordinates":[[[-99.616689,48.545653],[-99.490719,48.545653],[-99.490719,48.370391],[-99.819336,48.370391],[-99.813859,47.850082],[-100.000075,47.850082],[-100.071275,47.844605],[-100.197245,47.850082],[-100.279399,48.545653],[-100.147952,48.545653],[-99.616689,48.545653]]]}},
+{"type":"Feature","id":"38071","properties":{"name":"Ramsey"},"geometry":{"type":"Polygon","coordinates":[[[-98.838963,48.545653],[-98.318654,48.545653],[-98.291269,48.195129],[-98.526778,47.915805],[-98.992318,47.992482],[-99.200441,48.370391],[-98.97041,48.545653],[-98.838963,48.545653]]]}},
+{"type":"Feature","id":"38073","properties":{"name":"Ransom"},"geometry":{"type":"Polygon","coordinates":[[[-97.957176,46.628724],[-97.683329,46.628724],[-97.278035,46.628724],[-97.278035,46.283677],[-98.006468,46.283677],[-98.033853,46.283677],[-98.033853,46.628724],[-97.957176,46.628724]]]}},
+{"type":"Feature","id":"38075","properties":{"name":"Renville"},"geometry":{"type":"Polygon","coordinates":[[[-101.495279,49.000239],[-101.451464,48.545653],[-101.057124,48.545653],[-101.062601,48.458022],[-101.840327,48.458022],[-102.021066,48.808546],[-102.021066,49.000239],[-101.495279,49.000239]]]}},
+{"type":"Feature","id":"38077","properties":{"name":"Richland"},"geometry":{"type":"Polygon","coordinates":[[[-96.790588,46.628724],[-96.790588,46.628724],[-96.576987,46.020784],[-96.560556,45.933153],[-96.735818,45.933153],[-97.228743,45.933153],[-97.278035,46.283677],[-97.278035,46.628724],[-96.790588,46.628724]]]}},
+{"type":"Feature","id":"38079","properties":{"name":"Rolette"},"geometry":{"type":"Polygon","coordinates":[[[-99.523581,49.000239],[-99.490719,48.545653],[-99.616689,48.545653],[-100.147952,48.545653],[-100.180814,49.000239],[-99.523581,49.000239]]]}},
+{"type":"Feature","id":"38081","properties":{"name":"Sargent"},"geometry":{"type":"Polygon","coordinates":[[[-98.006468,46.283677],[-97.278035,46.283677],[-97.228743,45.933153],[-97.853114,45.933153],[-97.979084,45.938629],[-98.006468,45.938629],[-98.006468,46.283677]]]}},
+{"type":"Feature","id":"38083","properties":{"name":"Sheridan"},"geometry":{"type":"Polygon","coordinates":[[[-100.520384,47.850082],[-100.197245,47.850082],[-100.071275,47.844605],[-100.032936,47.329772],[-100.115091,47.329772],[-100.608015,47.329772],[-100.673738,47.329772],[-100.586107,47.850082],[-100.520384,47.850082]]]}},
+{"type":"Feature","id":"38085","properties":{"name":"Sioux"},"geometry":{"type":"Polygon","coordinates":[[[-100.591584,46.426077],[-100.50943,45.944106],[-101.999158,45.944106],[-101.999158,46.053645],[-101.024263,46.283677],[-100.591584,46.426077]]]}},
+{"type":"Feature","id":"38087","properties":{"name":"Slope"},"geometry":{"type":"Polygon","coordinates":[[[-103.23147,46.628724],[-102.930238,46.628724],[-102.924761,46.283677],[-102.995961,46.2782],[-104.047534,46.2782],[-104.047534,46.541093],[-103.609378,46.628724],[-103.23147,46.628724]]]}},
+{"type":"Feature","id":"38089","properties":{"name":"Stark"},"geometry":{"type":"Polygon","coordinates":[[[-102.147035,47.01211],[-102.097743,46.979248],[-102.097743,46.716355],[-102.097743,46.628724],[-102.17442,46.628724],[-102.930238,46.628724],[-103.23147,46.628724],[-103.0343,46.979248],[-102.147035,47.01211]]]}},
+{"type":"Feature","id":"38091","properties":{"name":"Steele"},"geometry":{"type":"Polygon","coordinates":[[[-97.979084,47.67482],[-97.880499,47.67482],[-97.475205,47.669343],[-97.453297,47.236664],[-97.705237,47.242141],[-97.962653,47.242141],[-97.984561,47.67482],[-97.979084,47.67482]]]}},
+{"type":"Feature","id":"38093","properties":{"name":"Stutsman"},"geometry":{"type":"Polygon","coordinates":[[[-99.479765,47.329772],[-99.266165,47.329772],[-98.499393,47.324295],[-98.466531,47.242141],[-98.439147,46.628724],[-99.036133,46.628724],[-99.452381,46.634201],[-99.479765,47.329772]]]}},
+{"type":"Feature","id":"38095","properties":{"name":"Towner"},"geometry":{"type":"Polygon","coordinates":[[[-98.997795,49.000239],[-98.97041,48.545653],[-99.200441,48.370391],[-99.490719,48.370391],[-99.490719,48.545653],[-99.523581,49.000239],[-98.997795,49.000239]]]}},
+{"type":"Feature","id":"38097","properties":{"name":"Traill"},"geometry":{"type":"Polygon","coordinates":[[[-97.475205,47.669343],[-96.889173,47.67482],[-96.850834,47.499557],[-96.834403,47.236664],[-97.453297,47.236664],[-97.475205,47.669343]]]}},
+{"type":"Feature","id":"38099","properties":{"name":"Walsh"},"geometry":{"type":"Polygon","coordinates":[[[-98.017422,48.545653],[-97.929791,48.545653],[-97.16302,48.540176],[-97.141112,48.195129],[-97.825729,48.195129],[-97.902407,48.195129],[-97.91336,48.195129],[-98.291269,48.195129],[-98.318654,48.545653],[-98.017422,48.545653]]]}},
+{"type":"Feature","id":"38101","properties":{"name":"Ward"},"geometry":{"type":"Polygon","coordinates":[[[-102.152512,48.808546],[-102.021066,48.808546],[-101.840327,48.458022],[-101.062601,48.458022],[-100.969493,47.850082],[-101.873188,47.850082],[-101.971773,48.545653],[-102.234666,48.545653],[-102.152512,48.808546]]]}},
+{"type":"Feature","id":"38103","properties":{"name":"Wells"},"geometry":{"type":"Polygon","coordinates":[[[-100.000075,47.850082],[-99.813859,47.850082],[-99.299026,47.844605],[-99.266165,47.587189],[-99.266165,47.329772],[-99.479765,47.329772],[-99.863151,47.329772],[-100.032936,47.329772],[-100.071275,47.844605],[-100.000075,47.850082]]]}},
+{"type":"Feature","id":"38105","properties":{"name":"Williams"},"geometry":{"type":"Polygon","coordinates":[[[-104.047534,48.633284],[-102.886422,48.633284],[-102.886422,48.545653],[-102.826176,48.123929],[-103.171223,48.134883],[-104.042057,47.997959],[-104.047534,48.386822],[-104.047534,48.633284]]]}},
+{"type":"Feature","id":"39001","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-83.383038,39.054115],[-83.273499,39.015777],[-83.273499,39.0103],[-83.268022,38.61596],[-83.645931,38.637868],[-83.706177,38.637868],[-83.673316,39.021254],[-83.383038,39.054115]]]}},
+{"type":"Feature","id":"39003","properties":{"name":"Allen"},"geometry":{"type":"Polygon","coordinates":[[[-83.881439,40.921752],[-83.881439,40.81769],[-83.881439,40.642428],[-84.253871,40.686244],[-84.396272,40.686244],[-84.341502,40.861506],[-83.881439,40.921752]]]}},
+{"type":"Feature","id":"39005","properties":{"name":"Ashland"},"geometry":{"type":"Polygon","coordinates":[[[-82.375281,41.064153],[-82.336942,41.064153],[-82.172634,41.064153],[-82.128818,40.992952],[-82.128818,40.669813],[-82.221926,40.565751],[-82.336942,40.554797],[-82.435527,40.992952],[-82.375281,41.064153]]]}},
+{"type":"Feature","id":"39007","properties":{"name":"Ashtabula"},"geometry":{"type":"Polygon","coordinates":[[[-80.518598,41.978802],[-80.518598,41.847355],[-80.518598,41.502308],[-81.000569,41.502308],[-81.006046,41.715908],[-81.000569,41.852832],[-80.518598,41.978802],[-80.518598,41.978802]]]}},
+{"type":"Feature","id":"39009","properties":{"name":"Athens"},"geometry":{"type":"Polygon","coordinates":[[[-82.046664,39.552517],[-81.844017,39.448455],[-81.723525,39.218424],[-81.756386,39.180085],[-82.271219,39.201993],[-82.28765,39.382732],[-82.16168,39.557994],[-82.046664,39.552517]]]}},
+{"type":"Feature","id":"39011","properties":{"name":"Auglaize"},"geometry":{"type":"Polygon","coordinates":[[[-84.253871,40.686244],[-83.881439,40.642428],[-83.881439,40.538366],[-84.001932,40.483597],[-84.105994,40.483597],[-84.43461,40.35215],[-84.456518,40.686244],[-84.396272,40.686244],[-84.253871,40.686244]]]}},
+{"type":"Feature","id":"39013","properties":{"name":"Belmont"},"geometry":{"type":"Polygon","coordinates":[[[-81.219646,40.171411],[-80.885553,40.160457],[-80.704814,40.15498],[-80.732199,40.034488],[-80.81983,39.848272],[-81.236077,39.87018],[-81.236077,39.952334],[-81.225123,40.171411],[-81.219646,40.171411]]]}},
+{"type":"Feature","id":"39015","properties":{"name":"Brown"},"geometry":{"type":"Polygon","coordinates":[[[-83.990978,39.256762],[-83.865008,39.245808],[-83.673316,39.021254],[-83.706177,38.637868],[-83.848578,38.747407],[-83.903347,38.769315],[-84.051224,38.769315],[-83.990978,39.256762]]]}},
+{"type":"Feature","id":"39017","properties":{"name":"Butler"},"geometry":{"type":"Polygon","coordinates":[[[-84.478426,39.590856],[-84.36341,39.590856],[-84.352456,39.289624],[-84.598918,39.306055],[-84.817996,39.306055],[-84.817996,39.519655],[-84.812519,39.568948],[-84.478426,39.590856]]]}},
+{"type":"Feature","id":"39019","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-81.121061,40.730059],[-81.0882,40.730059],[-80.863645,40.598613],[-80.940322,40.423351],[-81.186785,40.434304],[-81.268939,40.434304],[-81.318231,40.653382],[-81.121061,40.730059]]]}},
+{"type":"Feature","id":"39021","properties":{"name":"Champaign"},"geometry":{"type":"Polygon","coordinates":[[[-83.881439,40.264519],[-83.552823,40.231658],[-83.50353,40.111165],[-83.514484,40.01258],[-84.034794,40.039965],[-84.02384,40.182365],[-84.012886,40.275473],[-83.881439,40.264519]]]}},
+{"type":"Feature","id":"39023","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-84.034794,40.039965],[-83.514484,40.01258],[-83.645931,39.771595],[-84.029317,39.848272],[-84.051224,39.848272],[-84.051224,39.881133],[-84.034794,40.039965]]]}},
+{"type":"Feature","id":"39025","properties":{"name":"Clermont"},"geometry":{"type":"Polygon","coordinates":[[[-84.259348,39.273193],[-84.007409,39.256762],[-83.990978,39.256762],[-84.051224,38.769315],[-84.231963,38.829561],[-84.231963,38.873376],[-84.319594,39.021254],[-84.259348,39.273193]]]}},
+{"type":"Feature","id":"39027","properties":{"name":"Clinton"},"geometry":{"type":"Polygon","coordinates":[[[-83.974547,39.568948],[-83.667839,39.552517],[-83.591161,39.377255],[-83.865008,39.245808],[-83.990978,39.256762],[-84.007409,39.256762],[-83.974547,39.568948],[-83.974547,39.568948]]]}},
+{"type":"Feature","id":"39029","properties":{"name":"Columbiana"},"geometry":{"type":"Polygon","coordinates":[[[-80.858168,40.927229],[-80.518598,40.899844],[-80.518598,40.850552],[-80.518598,40.636951],[-80.666475,40.582182],[-80.863645,40.598613],[-81.0882,40.730059],[-81.0882,40.905321],[-80.858168,40.927229]]]}},
+{"type":"Feature","id":"39031","properties":{"name":"Coshocton"},"geometry":{"type":"Polygon","coordinates":[[[-82.183588,40.456212],[-81.707094,40.445258],[-81.62494,40.220704],[-81.652325,40.220704],[-81.718048,40.149503],[-82.189065,40.165934],[-82.194542,40.237135],[-82.183588,40.456212]]]}},
+{"type":"Feature","id":"39033","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-82.725805,40.998429],[-82.725805,40.713628],[-82.857251,40.713628],[-82.857251,40.702674],[-82.977744,40.702674],[-83.109191,40.702674],[-83.114668,40.992952],[-82.829867,40.998429],[-82.725805,40.998429]]]}},
+{"type":"Feature","id":"39035","properties":{"name":"Cuyahoga"},"geometry":{"type":"Polygon","coordinates":[[[-81.488016,41.633754],[-81.389431,41.568031],[-81.389431,41.348953],[-81.389431,41.348953],[-81.537309,41.348953],[-81.685186,41.277753],[-81.876879,41.277753],[-81.969987,41.507785],[-81.488016,41.633754]]]}},
+{"type":"Feature","id":"39037","properties":{"name":"Darke"},"geometry":{"type":"Polygon","coordinates":[[[-84.456518,40.35215],[-84.43461,40.35215],[-84.43461,40.198796],[-84.423656,39.919472],[-84.483903,39.919472],[-84.812519,39.919472],[-84.812519,40.007103],[-84.801565,40.308335],[-84.801565,40.35215],[-84.456518,40.35215]]]}},
+{"type":"Feature","id":"39039","properties":{"name":"Defiance"},"geometry":{"type":"Polygon","coordinates":[[[-84.270302,41.425631],[-84.226487,41.168214],[-84.341502,41.162737],[-84.577011,41.250368],[-84.801565,41.250368],[-84.801565,41.272276],[-84.801565,41.425631],[-84.341502,41.425631],[-84.270302,41.425631]]]}},
+{"type":"Feature","id":"39041","properties":{"name":"Delaware"},"geometry":{"type":"Polygon","coordinates":[[[-83.246114,40.445258],[-83.02156,40.434304],[-82.742236,40.346673],[-82.75319,40.275473],[-82.764143,40.127596],[-83.03799,40.13855],[-83.169437,40.144027],[-83.246114,40.445258]]]}},
+{"type":"Feature","id":"39043","properties":{"name":"Erie"},"geometry":{"type":"Polygon","coordinates":[[[-82.775097,41.4804],[-82.692943,41.491354],[-82.347896,41.431108],[-82.342419,41.28323],[-82.840821,41.288707],[-82.955836,41.458492],[-82.775097,41.4804]]]}},
+{"type":"Feature","id":"39045","properties":{"name":"Fairfield"},"geometry":{"type":"Polygon","coordinates":[[[-82.797005,39.94138],[-82.780574,39.94138],[-82.462912,39.930426],[-82.375281,39.656579],[-82.731282,39.552517],[-82.82439,39.793502],[-82.797005,39.94138]]]}},
+{"type":"Feature","id":"39047","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-83.651408,39.716825],[-83.251591,39.694917],[-83.268022,39.514178],[-83.372084,39.377255],[-83.591161,39.377255],[-83.667839,39.552517],[-83.651408,39.716825]]]}},
+{"type":"Feature","id":"39049","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-83.03799,40.13855],[-82.764143,40.127596],[-82.780574,39.94138],[-82.797005,39.94138],[-82.82439,39.793502],[-83.246114,39.81541],[-83.207776,40.105688],[-83.169437,40.144027],[-83.03799,40.13855]]]}},
+{"type":"Feature","id":"39051","properties":{"name":"Fulton"},"geometry":{"type":"Polygon","coordinates":[[[-83.89787,41.721385],[-83.881439,41.721385],[-83.881439,41.485877],[-83.886916,41.485877],[-84.341502,41.485877],[-84.401749,41.704955],[-84.357933,41.704955],[-83.89787,41.721385]]]}},
+{"type":"Feature","id":"39053","properties":{"name":"Gallia"},"geometry":{"type":"Polygon","coordinates":[[[-82.435527,39.037685],[-82.320511,39.026731],[-82.101434,38.95553],[-82.216449,38.594052],[-82.265742,38.599529],[-82.28765,38.583099],[-82.577927,38.845992],[-82.435527,39.037685]]]}},
+{"type":"Feature","id":"39055","properties":{"name":"Geauga"},"geometry":{"type":"Polygon","coordinates":[[[-81.006046,41.715908],[-81.000569,41.502308],[-81.000569,41.348953],[-81.389431,41.348953],[-81.389431,41.568031],[-81.006046,41.715908]]]}},
+{"type":"Feature","id":"39057","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-84.029317,39.848272],[-83.645931,39.771595],[-83.651408,39.716825],[-83.667839,39.552517],[-83.974547,39.568948],[-83.974547,39.568948],[-84.111471,39.579902],[-84.051224,39.848272],[-84.029317,39.848272]]]}},
+{"type":"Feature","id":"39059","properties":{"name":"Guernsey"},"geometry":{"type":"Polygon","coordinates":[[[-81.652325,40.220704],[-81.62494,40.220704],[-81.340139,40.215227],[-81.225123,40.171411],[-81.236077,39.952334],[-81.471585,39.892087],[-81.69614,39.842795],[-81.718048,40.149503],[-81.652325,40.220704]]]}},
+{"type":"Feature","id":"39061","properties":{"name":"Hamilton"},"geometry":{"type":"Polygon","coordinates":[[[-84.598918,39.306055],[-84.352456,39.289624],[-84.259348,39.273193],[-84.319594,39.021254],[-84.50581,39.092454],[-84.620826,39.076023],[-84.817996,39.103408],[-84.817996,39.306055],[-84.598918,39.306055]]]}},
+{"type":"Feature","id":"39063","properties":{"name":"Hancock"},"geometry":{"type":"Polygon","coordinates":[[[-83.881439,41.168214],[-83.421376,41.168214],[-83.421376,40.992952],[-83.514484,40.81769],[-83.574731,40.81769],[-83.881439,40.81769],[-83.881439,40.921752],[-83.881439,41.168214]]]}},
+{"type":"Feature","id":"39065","properties":{"name":"Hardin"},"geometry":{"type":"Polygon","coordinates":[[[-83.574731,40.81769],[-83.514484,40.81769],[-83.421376,40.686244],[-83.415899,40.505505],[-83.519961,40.505505],[-83.881439,40.538366],[-83.881439,40.642428],[-83.881439,40.81769],[-83.574731,40.81769]]]}},
+{"type":"Feature","id":"39067","properties":{"name":"Harrison"},"geometry":{"type":"Polygon","coordinates":[[[-81.186785,40.434304],[-80.940322,40.423351],[-80.885553,40.160457],[-81.219646,40.171411],[-81.225123,40.171411],[-81.340139,40.215227],[-81.268939,40.434304],[-81.186785,40.434304]]]}},
+{"type":"Feature","id":"39069","properties":{"name":"Henry"},"geometry":{"type":"Polygon","coordinates":[[[-83.886916,41.485877],[-83.881439,41.485877],[-83.881439,41.414677],[-83.881439,41.168214],[-84.029317,41.168214],[-84.226487,41.168214],[-84.270302,41.425631],[-84.341502,41.425631],[-84.341502,41.485877],[-83.886916,41.485877]]]}},
+{"type":"Feature","id":"39071","properties":{"name":"Highland"},"geometry":{"type":"Polygon","coordinates":[[[-83.591161,39.377255],[-83.372084,39.377255],[-83.355653,39.196516],[-83.383038,39.054115],[-83.673316,39.021254],[-83.865008,39.245808],[-83.591161,39.377255]]]}},
+{"type":"Feature","id":"39073","properties":{"name":"Hocking"},"geometry":{"type":"Polygon","coordinates":[[[-82.375281,39.656579],[-82.16168,39.557994],[-82.28765,39.382732],[-82.747713,39.366301],[-82.742236,39.470363],[-82.731282,39.552517],[-82.375281,39.656579]]]}},
+{"type":"Feature","id":"39075","properties":{"name":"Holmes"},"geometry":{"type":"Polygon","coordinates":[[[-81.657801,40.669813],[-81.652325,40.669813],[-81.652325,40.636951],[-81.707094,40.445258],[-82.183588,40.456212],[-82.221926,40.565751],[-82.128818,40.669813],[-81.657801,40.669813]]]}},
+{"type":"Feature","id":"39077","properties":{"name":"Huron"},"geometry":{"type":"Polygon","coordinates":[[[-82.840821,41.288707],[-82.342419,41.28323],[-82.336942,41.064153],[-82.375281,41.064153],[-82.435527,40.992952],[-82.687466,40.992952],[-82.725805,40.998429],[-82.829867,40.998429],[-82.840821,41.255845],[-82.840821,41.288707]]]}},
+{"type":"Feature","id":"39079","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-82.671035,39.201993],[-82.435527,39.037685],[-82.577927,38.845992],[-82.649128,38.851469],[-82.807959,38.950054],[-82.786051,39.169131],[-82.764143,39.20747],[-82.671035,39.201993]]]}},
+{"type":"Feature","id":"39081","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-80.863645,40.598613],[-80.666475,40.582182],[-80.633614,40.395966],[-80.682906,40.187842],[-80.704814,40.15498],[-80.885553,40.160457],[-80.940322,40.423351],[-80.863645,40.598613]]]}},
+{"type":"Feature","id":"39083","properties":{"name":"Knox"},"geometry":{"type":"Polygon","coordinates":[[[-82.221926,40.565751],[-82.183588,40.456212],[-82.194542,40.237135],[-82.75319,40.275473],[-82.742236,40.346673],[-82.621743,40.54932],[-82.336942,40.554797],[-82.221926,40.565751]]]}},
+{"type":"Feature","id":"39085","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-81.000569,41.852832],[-81.006046,41.715908],[-81.389431,41.568031],[-81.488016,41.633754],[-81.000569,41.852832]]]}},
+{"type":"Feature","id":"39087","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-82.649128,38.851469],[-82.577927,38.845992],[-82.28765,38.583099],[-82.506727,38.413313],[-82.561497,38.40236],[-82.594358,38.424267],[-82.665558,38.506421],[-82.813436,38.572145],[-82.649128,38.851469]]]}},
+{"type":"Feature","id":"39089","properties":{"name":"Licking"},"geometry":{"type":"Polygon","coordinates":[[[-82.75319,40.275473],[-82.194542,40.237135],[-82.189065,40.165934],[-82.23288,39.913995],[-82.462912,39.930426],[-82.780574,39.94138],[-82.764143,40.127596],[-82.75319,40.275473]]]}},
+{"type":"Feature","id":"39091","properties":{"name":"Logan"},"geometry":{"type":"Polygon","coordinates":[[[-83.881439,40.538366],[-83.519961,40.505505],[-83.552823,40.231658],[-83.881439,40.264519],[-84.012886,40.275473],[-84.001932,40.483597],[-83.881439,40.538366]]]}},
+{"type":"Feature","id":"39093","properties":{"name":"Lorain"},"geometry":{"type":"Polygon","coordinates":[[[-81.969987,41.507785],[-81.876879,41.277753],[-82.172634,41.064153],[-82.336942,41.064153],[-82.342419,41.28323],[-82.347896,41.431108],[-81.969987,41.507785]]]}},
+{"type":"Feature","id":"39095","properties":{"name":"Lucas"},"geometry":{"type":"Polygon","coordinates":[[[-83.16396,41.6228],[-83.180391,41.6228],[-83.415899,41.617324],[-83.881439,41.414677],[-83.881439,41.485877],[-83.881439,41.721385],[-83.760947,41.721385],[-83.454238,41.732339],[-83.16396,41.6228]]]}},
+{"type":"Feature","id":"39097","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-83.50353,40.111165],[-83.207776,40.105688],[-83.246114,39.81541],[-83.246114,39.809933],[-83.251591,39.694917],[-83.651408,39.716825],[-83.645931,39.771595],[-83.514484,40.01258],[-83.50353,40.111165]]]}},
+{"type":"Feature","id":"39099","properties":{"name":"Mahoning"},"geometry":{"type":"Polygon","coordinates":[[[-80.786968,41.135353],[-80.518598,41.135353],[-80.518598,41.124399],[-80.518598,40.899844],[-80.858168,40.927229],[-81.0882,40.905321],[-81.0882,40.987475],[-81.000569,41.135353],[-80.786968,41.135353]]]}},
+{"type":"Feature","id":"39101","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-82.977744,40.702674],[-82.857251,40.702674],[-83.02156,40.434304],[-83.246114,40.445258],[-83.273499,40.505505],[-83.415899,40.505505],[-83.421376,40.686244],[-83.109191,40.702674],[-82.977744,40.702674]]]}},
+{"type":"Feature","id":"39103","properties":{"name":"Medina"},"geometry":{"type":"Polygon","coordinates":[[[-81.685186,41.277753],[-81.690663,40.987475],[-82.079526,40.992952],[-82.128818,40.992952],[-82.172634,41.064153],[-81.876879,41.277753],[-81.685186,41.277753]]]}},
+{"type":"Feature","id":"39105","properties":{"name":"Meigs"},"geometry":{"type":"Polygon","coordinates":[[[-82.28765,39.201993],[-82.271219,39.201993],[-81.756386,39.180085],[-81.745433,39.097931],[-81.909741,38.878853],[-82.101434,38.95553],[-82.320511,39.026731],[-82.28765,39.201993]]]}},
+{"type":"Feature","id":"39107","properties":{"name":"Mercer"},"geometry":{"type":"Polygon","coordinates":[[[-84.774181,40.730059],[-84.456518,40.686244],[-84.43461,40.35215],[-84.43461,40.35215],[-84.456518,40.35215],[-84.801565,40.35215],[-84.801565,40.571228],[-84.801565,40.730059],[-84.774181,40.730059]]]}},
+{"type":"Feature","id":"39109","properties":{"name":"Miami"},"geometry":{"type":"Polygon","coordinates":[[[-84.22101,40.198796],[-84.02384,40.182365],[-84.034794,40.039965],[-84.051224,39.881133],[-84.155286,39.924949],[-84.423656,39.919472],[-84.43461,40.198796],[-84.22101,40.198796]]]}},
+{"type":"Feature","id":"39111","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-81.307277,39.87018],[-81.236077,39.87018],[-80.81983,39.848272],[-80.830783,39.722302],[-80.945799,39.607286],[-81.038907,39.541563],[-81.28537,39.607286],[-81.307277,39.87018]]]}},
+{"type":"Feature","id":"39113","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-84.155286,39.924949],[-84.051224,39.881133],[-84.051224,39.848272],[-84.111471,39.579902],[-84.36341,39.590856],[-84.478426,39.590856],[-84.483903,39.919472],[-84.423656,39.919472],[-84.155286,39.924949]]]}},
+{"type":"Feature","id":"39115","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-82.074049,39.771595],[-81.69614,39.755164],[-81.586601,39.585379],[-81.844017,39.448455],[-82.046664,39.552517],[-82.074049,39.771595]]]}},
+{"type":"Feature","id":"39117","properties":{"name":"Morrow"},"geometry":{"type":"Polygon","coordinates":[[[-82.857251,40.713628],[-82.725805,40.713628],[-82.621743,40.54932],[-82.742236,40.346673],[-83.02156,40.434304],[-82.857251,40.702674],[-82.857251,40.713628]]]}},
+{"type":"Feature","id":"39119","properties":{"name":"Muskingum"},"geometry":{"type":"Polygon","coordinates":[[[-82.189065,40.165934],[-81.718048,40.149503],[-81.69614,39.842795],[-81.69614,39.755164],[-82.074049,39.771595],[-82.23288,39.913995],[-82.189065,40.165934]]]}},
+{"type":"Feature","id":"39121","properties":{"name":"Noble"},"geometry":{"type":"Polygon","coordinates":[[[-81.471585,39.892087],[-81.236077,39.952334],[-81.236077,39.87018],[-81.307277,39.87018],[-81.28537,39.607286],[-81.449678,39.634671],[-81.586601,39.585379],[-81.69614,39.755164],[-81.69614,39.842795],[-81.471585,39.892087]]]}},
+{"type":"Feature","id":"39123","properties":{"name":"Ottawa"},"geometry":{"type":"Polygon","coordinates":[[[-83.180391,41.6228],[-83.16396,41.6228],[-82.692943,41.491354],[-82.775097,41.4804],[-82.955836,41.458492],[-83.415899,41.502308],[-83.415899,41.617324],[-83.180391,41.6228]]]}},
+{"type":"Feature","id":"39125","properties":{"name":"Paulding"},"geometry":{"type":"Polygon","coordinates":[[[-84.577011,41.250368],[-84.341502,41.162737],[-84.401749,40.992952],[-84.456518,40.987475],[-84.801565,40.987475],[-84.801565,41.250368],[-84.577011,41.250368]]]}},
+{"type":"Feature","id":"39127","properties":{"name":"Perry"},"geometry":{"type":"Polygon","coordinates":[[[-82.462912,39.930426],[-82.23288,39.913995],[-82.074049,39.771595],[-82.046664,39.552517],[-82.16168,39.557994],[-82.375281,39.656579],[-82.462912,39.930426]]]}},
+{"type":"Feature","id":"39129","properties":{"name":"Pickaway"},"geometry":{"type":"Polygon","coordinates":[[[-83.246114,39.809933],[-83.246114,39.81541],[-82.82439,39.793502],[-82.731282,39.552517],[-82.742236,39.470363],[-83.268022,39.514178],[-83.251591,39.694917],[-83.246114,39.809933]]]}},
+{"type":"Feature","id":"39131","properties":{"name":"Pike"},"geometry":{"type":"Polygon","coordinates":[[[-83.355653,39.196516],[-82.786051,39.169131],[-82.807959,38.950054],[-83.273499,39.015777],[-83.383038,39.054115],[-83.355653,39.196516]]]}},
+{"type":"Feature","id":"39133","properties":{"name":"Portage"},"geometry":{"type":"Polygon","coordinates":[[[-81.389431,41.348953],[-81.000569,41.348953],[-81.000569,41.135353],[-81.0882,40.987475],[-81.394908,40.987475],[-81.389431,41.348953],[-81.389431,41.348953]]]}},
+{"type":"Feature","id":"39135","properties":{"name":"Preble"},"geometry":{"type":"Polygon","coordinates":[[[-84.483903,39.919472],[-84.478426,39.590856],[-84.812519,39.568948],[-84.812519,39.727779],[-84.812519,39.919472],[-84.483903,39.919472]]]}},
+{"type":"Feature","id":"39137","properties":{"name":"Putnam"},"geometry":{"type":"Polygon","coordinates":[[[-84.029317,41.168214],[-83.881439,41.168214],[-83.881439,40.921752],[-84.341502,40.861506],[-84.401749,40.992952],[-84.341502,41.162737],[-84.226487,41.168214],[-84.029317,41.168214]]]}},
+{"type":"Feature","id":"39139","properties":{"name":"Richland"},"geometry":{"type":"Polygon","coordinates":[[[-82.687466,40.992952],[-82.435527,40.992952],[-82.336942,40.554797],[-82.621743,40.54932],[-82.725805,40.713628],[-82.725805,40.998429],[-82.687466,40.992952]]]}},
+{"type":"Feature","id":"39141","properties":{"name":"Ross"},"geometry":{"type":"Polygon","coordinates":[[[-83.268022,39.514178],[-82.742236,39.470363],[-82.747713,39.366301],[-82.764143,39.20747],[-82.786051,39.169131],[-83.355653,39.196516],[-83.372084,39.377255],[-83.268022,39.514178]]]}},
+{"type":"Feature","id":"39143","properties":{"name":"Sandusky"},"geometry":{"type":"Polygon","coordinates":[[[-83.415899,41.502308],[-82.955836,41.458492],[-82.840821,41.288707],[-82.840821,41.255845],[-83.070852,41.255845],[-83.421376,41.255845],[-83.415899,41.502308]]]}},
+{"type":"Feature","id":"39145","properties":{"name":"Scioto"},"geometry":{"type":"Polygon","coordinates":[[[-83.273499,39.0103],[-83.273499,39.015777],[-82.807959,38.950054],[-82.649128,38.851469],[-82.813436,38.572145],[-83.032514,38.725499],[-83.268022,38.61596],[-83.273499,39.0103]]]}},
+{"type":"Feature","id":"39147","properties":{"name":"Seneca"},"geometry":{"type":"Polygon","coordinates":[[[-83.070852,41.255845],[-82.840821,41.255845],[-82.829867,40.998429],[-83.114668,40.992952],[-83.421376,40.992952],[-83.421376,41.168214],[-83.421376,41.255845],[-83.070852,41.255845]]]}},
+{"type":"Feature","id":"39149","properties":{"name":"Shelby"},"geometry":{"type":"Polygon","coordinates":[[[-84.105994,40.483597],[-84.001932,40.483597],[-84.012886,40.275473],[-84.02384,40.182365],[-84.22101,40.198796],[-84.43461,40.198796],[-84.43461,40.35215],[-84.43461,40.35215],[-84.105994,40.483597]]]}},
+{"type":"Feature","id":"39151","properties":{"name":"Stark"},"geometry":{"type":"Polygon","coordinates":[[[-81.394908,40.987475],[-81.0882,40.987475],[-81.0882,40.905321],[-81.0882,40.730059],[-81.121061,40.730059],[-81.318231,40.653382],[-81.42777,40.653382],[-81.652325,40.636951],[-81.652325,40.669813],[-81.646848,40.916275],[-81.394908,40.987475]]]}},
+{"type":"Feature","id":"39153","properties":{"name":"Summit"},"geometry":{"type":"Polygon","coordinates":[[[-81.537309,41.348953],[-81.389431,41.348953],[-81.394908,40.987475],[-81.646848,40.916275],[-81.690663,40.987475],[-81.685186,41.277753],[-81.537309,41.348953]]]}},
+{"type":"Feature","id":"39155","properties":{"name":"Trumbull"},"geometry":{"type":"Polygon","coordinates":[[[-81.000569,41.502308],[-80.518598,41.502308],[-80.518598,41.491354],[-80.518598,41.135353],[-80.786968,41.135353],[-81.000569,41.135353],[-81.000569,41.348953],[-81.000569,41.502308]]]}},
+{"type":"Feature","id":"39157","properties":{"name":"Tuscarawas"},"geometry":{"type":"Polygon","coordinates":[[[-81.42777,40.653382],[-81.318231,40.653382],[-81.268939,40.434304],[-81.340139,40.215227],[-81.62494,40.220704],[-81.707094,40.445258],[-81.652325,40.636951],[-81.42777,40.653382]]]}},
+{"type":"Feature","id":"39159","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-83.273499,40.505505],[-83.246114,40.445258],[-83.169437,40.144027],[-83.207776,40.105688],[-83.50353,40.111165],[-83.552823,40.231658],[-83.519961,40.505505],[-83.415899,40.505505],[-83.273499,40.505505]]]}},
+{"type":"Feature","id":"39161","properties":{"name":"Van Wert"},"geometry":{"type":"Polygon","coordinates":[[[-84.456518,40.987475],[-84.401749,40.992952],[-84.341502,40.861506],[-84.396272,40.686244],[-84.456518,40.686244],[-84.774181,40.730059],[-84.801565,40.730059],[-84.801565,40.921752],[-84.801565,40.987475],[-84.456518,40.987475]]]}},
+{"type":"Feature","id":"39163","properties":{"name":"Vinton"},"geometry":{"type":"Polygon","coordinates":[[[-82.747713,39.366301],[-82.28765,39.382732],[-82.271219,39.201993],[-82.28765,39.201993],[-82.320511,39.026731],[-82.435527,39.037685],[-82.671035,39.201993],[-82.764143,39.20747],[-82.747713,39.366301]]]}},
+{"type":"Feature","id":"39165","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-84.36341,39.590856],[-84.111471,39.579902],[-83.974547,39.568948],[-84.007409,39.256762],[-84.259348,39.273193],[-84.352456,39.289624],[-84.36341,39.590856]]]}},
+{"type":"Feature","id":"39167","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-81.449678,39.634671],[-81.28537,39.607286],[-81.038907,39.541563],[-81.121061,39.459409],[-81.373001,39.344393],[-81.723525,39.218424],[-81.844017,39.448455],[-81.586601,39.585379],[-81.449678,39.634671]]]}},
+{"type":"Feature","id":"39169","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-82.079526,40.992952],[-81.690663,40.987475],[-81.646848,40.916275],[-81.652325,40.669813],[-81.657801,40.669813],[-82.128818,40.669813],[-82.128818,40.992952],[-82.079526,40.992952]]]}},
+{"type":"Feature","id":"39171","properties":{"name":"Williams"},"geometry":{"type":"Polygon","coordinates":[[[-84.401749,41.704955],[-84.341502,41.485877],[-84.341502,41.425631],[-84.801565,41.425631],[-84.807042,41.529692],[-84.807042,41.694001],[-84.401749,41.704955]]]}},
+{"type":"Feature","id":"39173","properties":{"name":"Wood"},"geometry":{"type":"Polygon","coordinates":[[[-83.415899,41.617324],[-83.415899,41.502308],[-83.421376,41.255845],[-83.421376,41.168214],[-83.881439,41.168214],[-83.881439,41.414677],[-83.415899,41.617324]]]}},
+{"type":"Feature","id":"39175","properties":{"name":"Wyandot"},"geometry":{"type":"Polygon","coordinates":[[[-83.114668,40.992952],[-83.109191,40.702674],[-83.421376,40.686244],[-83.514484,40.81769],[-83.421376,40.992952],[-83.114668,40.992952]]]}},
+{"type":"Feature","id":"40001","properties":{"name":"Adair"},"geometry":{"type":"Polygon","coordinates":[[[-94.769597,36.162291],[-94.561473,36.162291],[-94.550519,36.102045],[-94.490273,35.756997],[-94.473842,35.636505],[-94.807935,35.636505],[-94.796981,36.162291],[-94.769597,36.162291]]]}},
+{"type":"Feature","id":"40003","properties":{"name":"Alfalfa"},"geometry":{"type":"Polygon","coordinates":[[[-98.543209,37.000263],[-98.346039,37.000263],[-98.11053,37.000263],[-98.105053,36.594969],[-98.105053,36.463523],[-98.532255,36.463523],[-98.543209,37.000263]]]}},
+{"type":"Feature","id":"40005","properties":{"name":"Atoka"},"geometry":{"type":"Polygon","coordinates":[[[-95.673292,34.595886],[-95.777354,34.157731],[-95.990954,34.157731],[-96.407202,34.157731],[-96.407202,34.420624],[-96.089539,34.67804],[-95.673292,34.595886]]]}},
+{"type":"Feature","id":"40007","properties":{"name":"Beaver"},"geometry":{"type":"Polygon","coordinates":[[[-100.087706,37.000263],[-100.000075,37.000263],[-100.005552,36.594969],[-100.005552,36.501861],[-100.547769,36.501861],[-100.805185,36.501861],[-100.953062,36.501861],[-100.947585,37.000263],[-100.6354,37.000263],[-100.087706,37.000263]]]}},
+{"type":"Feature","id":"40009","properties":{"name":"Beckham"},"geometry":{"type":"Polygon","coordinates":[[[-99.36475,35.510535],[-99.36475,35.466719],[-99.359273,35.116195],[-99.408565,35.116195],[-99.709797,35.116195],[-99.890536,35.028564],[-99.934351,35.028564],[-100.000075,35.028564],[-100.000075,35.181919],[-100.000075,35.422904],[-99.36475,35.510535]]]}},
+{"type":"Feature","id":"40011","properties":{"name":"Blaine"},"geometry":{"type":"Polygon","coordinates":[[[-98.488439,36.162291],[-98.209115,36.162291],[-98.209115,35.724136],[-98.313177,35.548874],[-98.587024,35.548874],[-98.625363,35.548874],[-98.63084,35.811767],[-98.636317,36.162291],[-98.488439,36.162291]]]}},
+{"type":"Feature","id":"40013","properties":{"name":"Bryan"},"geometry":{"type":"Polygon","coordinates":[[[-96.412679,34.157731],[-96.407202,34.157731],[-95.990954,34.157731],[-95.760923,33.87293],[-95.843077,33.840068],[-96.379817,33.725052],[-96.587941,33.894838],[-96.587941,34.113915],[-96.412679,34.157731]]]}},
+{"type":"Feature","id":"40015","properties":{"name":"Caddo"},"geometry":{"type":"Polygon","coordinates":[[[-98.587024,35.548874],[-98.313177,35.548874],[-98.0941,35.379088],[-98.0941,34.853302],[-98.619886,34.853302],[-98.619886,35.099764],[-98.625363,35.466719],[-98.625363,35.548874],[-98.587024,35.548874]]]}},
+{"type":"Feature","id":"40017","properties":{"name":"Canadian"},"geometry":{"type":"Polygon","coordinates":[[[-97.973607,35.724136],[-97.672375,35.724136],[-97.672375,35.379088],[-97.672375,35.335273],[-97.672375,35.335273],[-98.0941,35.379088],[-98.313177,35.548874],[-98.209115,35.724136],[-97.973607,35.724136]]]}},
+{"type":"Feature","id":"40019","properties":{"name":"Carter"},"geometry":{"type":"Polygon","coordinates":[[[-97.562836,34.508255],[-97.354713,34.508255],[-96.932988,34.332993],[-96.932988,34.174162],[-96.971327,34.0701],[-97.562836,34.0701],[-97.562836,34.289177],[-97.562836,34.508255]]]}},
+{"type":"Feature","id":"40021","properties":{"name":"Cherokee"},"geometry":{"type":"Polygon","coordinates":[[[-95.027013,36.162291],[-95.010582,36.162291],[-94.796981,36.162291],[-94.807935,35.636505],[-94.851751,35.636505],[-95.125598,35.636505],[-95.267998,35.811767],[-95.207752,36.07466],[-95.027013,36.162291]]]}},
+{"type":"Feature","id":"40023","properties":{"name":"Choctaw"},"geometry":{"type":"Polygon","coordinates":[[[-95.383014,34.157731],[-95.158459,34.157731],[-95.158459,33.938653],[-95.311814,33.878407],[-95.760923,33.87293],[-95.990954,34.157731],[-95.777354,34.157731],[-95.383014,34.157731]]]}},
+{"type":"Feature","id":"40025","properties":{"name":"Cimarron"},"geometry":{"type":"Polygon","coordinates":[[[-102.042974,36.994786],[-102.026543,36.994786],[-102.03202,36.501861],[-102.163466,36.501861],[-103.001438,36.501861],[-103.001438,37.000263],[-102.042974,36.994786]]]}},
+{"type":"Feature","id":"40027","properties":{"name":"Cleveland"},"geometry":{"type":"Polygon","coordinates":[[[-97.425913,35.379088],[-97.141112,35.379088],[-97.141112,34.929979],[-97.672375,35.335273],[-97.672375,35.379088],[-97.425913,35.379088]]]}},
+{"type":"Feature","id":"40029","properties":{"name":"Coal"},"geometry":{"type":"Polygon","coordinates":[[[-96.089539,34.765671],[-96.089539,34.67804],[-96.407202,34.420624],[-96.511264,34.502778],[-96.407202,34.765671],[-96.089539,34.765671]]]}},
+{"type":"Feature","id":"40031","properties":{"name":"Comanche"},"geometry":{"type":"Polygon","coordinates":[[[-98.795148,34.853302],[-98.619886,34.853302],[-98.0941,34.853302],[-98.088623,34.683517],[-98.143392,34.508255],[-98.663701,34.404193],[-98.82801,34.595886],[-98.795148,34.853302]]]}},
+{"type":"Feature","id":"40033","properties":{"name":"Cotton"},"geometry":{"type":"Polygon","coordinates":[[[-98.143392,34.508255],[-98.137915,34.289177],[-98.137915,34.1413],[-98.422716,34.081054],[-98.608932,34.157731],[-98.663701,34.404193],[-98.143392,34.508255],[-98.143392,34.508255]]]}},
+{"type":"Feature","id":"40035","properties":{"name":"Craig"},"geometry":{"type":"Polygon","coordinates":[[[-95.152983,37.000263],[-95.070828,37.000263],[-95.005105,37.000263],[-94.999628,36.671646],[-95.005105,36.507338],[-95.322768,36.512815],[-95.328245,36.512815],[-95.432306,36.594969],[-95.410399,37.000263],[-95.152983,37.000263]]]}},
+{"type":"Feature","id":"40037","properties":{"name":"Creek"},"geometry":{"type":"Polygon","coordinates":[[[-96.620803,36.162291],[-96.297663,36.162291],[-96.03477,35.855582],[-96.138832,35.855582],[-96.193601,35.636505],[-96.478402,35.636505],[-96.620803,35.636505],[-96.620803,35.943213],[-96.620803,36.162291]]]}},
+{"type":"Feature","id":"40039","properties":{"name":"Custer"},"geometry":{"type":"Polygon","coordinates":[[[-98.817056,35.811767],[-98.63084,35.811767],[-98.625363,35.548874],[-98.625363,35.466719],[-99.16758,35.466719],[-99.36475,35.466719],[-99.36475,35.510535],[-99.375704,35.811767],[-98.817056,35.811767]]]}},
+{"type":"Feature","id":"40041","properties":{"name":"Delaware"},"geometry":{"type":"Polygon","coordinates":[[[-94.890089,36.671646],[-94.616242,36.666169],[-94.616242,36.501861],[-94.561473,36.162291],[-94.769597,36.162291],[-94.796981,36.162291],[-95.010582,36.162291],[-95.005105,36.507338],[-94.999628,36.671646],[-94.890089,36.671646]]]}},
+{"type":"Feature","id":"40043","properties":{"name":"Dewey"},"geometry":{"type":"Polygon","coordinates":[[[-98.636317,36.162291],[-98.63084,35.811767],[-98.817056,35.811767],[-99.375704,35.811767],[-99.38118,36.014414],[-99.38118,36.162291],[-98.953979,36.162291],[-98.636317,36.162291]]]}},
+{"type":"Feature","id":"40045","properties":{"name":"Ellis"},"geometry":{"type":"Polygon","coordinates":[[[-99.605735,36.594969],[-99.38118,36.162291],[-99.38118,36.014414],[-100.000075,35.882967],[-100.000075,36.058229],[-100.005552,36.501861],[-100.005552,36.594969],[-99.605735,36.594969]]]}},
+{"type":"Feature","id":"40047","properties":{"name":"Garfield"},"geometry":{"type":"Polygon","coordinates":[[[-97.984561,36.594969],[-97.464251,36.594969],[-97.464251,36.594969],[-97.458774,36.162291],[-97.677852,36.162291],[-98.0941,36.167768],[-98.105053,36.162291],[-98.105053,36.463523],[-98.105053,36.594969],[-97.984561,36.594969]]]}},
+{"type":"Feature","id":"40049","properties":{"name":"Garvin"},"geometry":{"type":"Polygon","coordinates":[[[-97.425913,34.853302],[-96.932988,34.853302],[-96.932988,34.634225],[-97.091819,34.639701],[-97.354713,34.508255],[-97.562836,34.508255],[-97.666898,34.683517],[-97.666898,34.853302],[-97.425913,34.853302]]]}},
+{"type":"Feature","id":"40051","properties":{"name":"Grady"},"geometry":{"type":"Polygon","coordinates":[[[-98.0941,35.379088],[-97.672375,35.335273],[-97.666898,34.853302],[-97.666898,34.683517],[-97.995515,34.683517],[-98.088623,34.683517],[-98.0941,34.853302],[-98.0941,35.379088]]]}},
+{"type":"Feature","id":"40053","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-97.650467,37.000263],[-97.464251,37.000263],[-97.464251,36.594969],[-97.984561,36.594969],[-98.105053,36.594969],[-98.11053,37.000263],[-97.803822,37.000263],[-97.650467,37.000263]]]}},
+{"type":"Feature","id":"40055","properties":{"name":"Greer"},"geometry":{"type":"Polygon","coordinates":[[[-99.709797,35.116195],[-99.408565,35.116195],[-99.244257,34.820441],[-99.397611,34.814964],[-99.665981,34.727333],[-99.890536,35.028564],[-99.709797,35.116195]]]}},
+{"type":"Feature","id":"40057","properties":{"name":"Harmon"},"geometry":{"type":"Polygon","coordinates":[[[-99.934351,35.028564],[-99.890536,35.028564],[-99.665981,34.727333],[-99.84672,34.508255],[-100.000075,34.563024],[-100.000075,34.743763],[-100.000075,35.028564],[-99.934351,35.028564]]]}},
+{"type":"Feature","id":"40059","properties":{"name":"Harper"},"geometry":{"type":"Polygon","coordinates":[[[-100.000075,37.000263],[-99.540012,37.000263],[-99.457858,37.000263],[-99.293549,36.819524],[-99.605735,36.594969],[-100.005552,36.594969],[-100.000075,37.000263]]]}},
+{"type":"Feature","id":"40061","properties":{"name":"Haskell"},"geometry":{"type":"Polygon","coordinates":[[[-95.048921,35.461243],[-94.813412,35.324319],[-94.928428,35.055949],[-95.333722,35.055949],[-95.350152,35.055949],[-95.448737,35.296934],[-95.344675,35.291457],[-95.048921,35.461243]]]}},
+{"type":"Feature","id":"40063","properties":{"name":"Hughes"},"geometry":{"type":"Polygon","coordinates":[[[-96.199078,35.291457],[-95.980001,35.291457],[-95.985477,35.149057],[-96.089539,34.765671],[-96.407202,34.765671],[-96.489356,34.908072],[-96.440064,35.291457],[-96.199078,35.291457]]]}},
+{"type":"Feature","id":"40065","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-99.397611,34.814964],[-99.244257,34.820441],[-99.101857,34.639701],[-99.211395,34.33847],[-99.474288,34.398716],[-99.84672,34.508255],[-99.665981,34.727333],[-99.397611,34.814964]]]}},
+{"type":"Feature","id":"40067","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-98.061238,34.289177],[-97.562836,34.289177],[-97.562836,34.0701],[-97.562836,33.894838],[-97.979084,33.889361],[-98.137915,34.1413],[-98.137915,34.289177],[-98.061238,34.289177]]]}},
+{"type":"Feature","id":"40069","properties":{"name":"Johnston"},"geometry":{"type":"Polygon","coordinates":[[[-96.878219,34.502778],[-96.828926,34.508255],[-96.511264,34.502778],[-96.407202,34.420624],[-96.407202,34.157731],[-96.412679,34.157731],[-96.587941,34.113915],[-96.932988,34.174162],[-96.932988,34.332993],[-96.878219,34.502778]]]}},
+{"type":"Feature","id":"40071","properties":{"name":"Kay"},"geometry":{"type":"Polygon","coordinates":[[[-96.867265,37.000263],[-96.752249,37.000263],[-97.058958,36.594969],[-97.464251,36.594969],[-97.464251,36.594969],[-97.464251,37.000263],[-97.146589,37.000263],[-96.867265,37.000263]]]}},
+{"type":"Feature","id":"40073","properties":{"name":"Kingfisher"},"geometry":{"type":"Polygon","coordinates":[[[-98.0941,36.167768],[-97.677852,36.162291],[-97.672375,35.724136],[-97.973607,35.724136],[-98.209115,35.724136],[-98.209115,36.162291],[-98.105053,36.162291],[-98.0941,36.167768]]]}},
+{"type":"Feature","id":"40075","properties":{"name":"Kiowa"},"geometry":{"type":"Polygon","coordinates":[[[-99.184011,35.116195],[-98.619886,35.099764],[-98.619886,34.853302],[-98.795148,34.853302],[-98.82801,34.595886],[-99.101857,34.639701],[-99.244257,34.820441],[-99.408565,35.116195],[-99.359273,35.116195],[-99.184011,35.116195]]]}},
+{"type":"Feature","id":"40077","properties":{"name":"Latimer"},"geometry":{"type":"Polygon","coordinates":[[[-95.333722,35.055949],[-94.928428,35.055949],[-95.059875,34.67804],[-95.311814,34.683517],[-95.514461,34.683517],[-95.350152,35.055949],[-95.333722,35.055949]]]}},
+{"type":"Feature","id":"40079","properties":{"name":"Le Flore"},"geometry":{"type":"Polygon","coordinates":[[[-94.430026,35.379088],[-94.446457,34.935456],[-94.451934,34.727333],[-94.462888,34.508255],[-94.616242,34.508255],[-94.939382,34.508255],[-95.059875,34.67804],[-94.928428,35.055949],[-94.813412,35.324319],[-94.430026,35.379088]]]}},
+{"type":"Feature","id":"40081","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-97.080866,35.943213],[-96.620803,35.943213],[-96.620803,35.636505],[-96.626279,35.461243],[-97.141112,35.466719],[-97.141112,35.724136],[-97.141112,35.943213],[-97.080866,35.943213]]]}},
+{"type":"Feature","id":"40083","properties":{"name":"Logan"},"geometry":{"type":"Polygon","coordinates":[[[-97.677852,36.162291],[-97.458774,36.162291],[-97.354713,36.156814],[-97.141112,35.943213],[-97.141112,35.724136],[-97.672375,35.724136],[-97.677852,36.162291]]]}},
+{"type":"Feature","id":"40085","properties":{"name":"Love"},"geometry":{"type":"Polygon","coordinates":[[[-97.562836,34.0701],[-96.971327,34.0701],[-96.932988,33.955084],[-96.943942,33.949607],[-97.486159,33.916745],[-97.562836,33.894838],[-97.562836,34.0701]]]}},
+{"type":"Feature","id":"40087","properties":{"name":"McClain"},"geometry":{"type":"Polygon","coordinates":[[[-97.672375,35.335273],[-97.141112,34.929979],[-96.932988,34.962841],[-96.932988,34.853302],[-97.425913,34.853302],[-97.666898,34.853302],[-97.672375,35.335273],[-97.672375,35.335273]]]}},
+{"type":"Feature","id":"40089","properties":{"name":"McCurtain"},"geometry":{"type":"Polygon","coordinates":[[[-94.616242,34.508255],[-94.462888,34.508255],[-94.468365,34.190592],[-94.479319,33.938653],[-94.484796,33.637421],[-94.736735,33.703145],[-95.158459,33.938653],[-95.158459,34.157731],[-94.939382,34.508255],[-94.616242,34.508255]]]}},
+{"type":"Feature","id":"40091","properties":{"name":"McIntosh"},"geometry":{"type":"Polygon","coordinates":[[[-95.476122,35.554351],[-95.344675,35.291457],[-95.448737,35.296934],[-95.706154,35.203826],[-95.985477,35.149057],[-95.980001,35.291457],[-95.980001,35.379088],[-95.71163,35.554351],[-95.476122,35.554351]]]}},
+{"type":"Feature","id":"40093","properties":{"name":"Major"},"geometry":{"type":"Polygon","coordinates":[[[-98.959456,36.501861],[-98.959456,36.507338],[-98.532255,36.463523],[-98.105053,36.463523],[-98.105053,36.162291],[-98.209115,36.162291],[-98.488439,36.162291],[-98.636317,36.162291],[-98.953979,36.162291],[-98.959456,36.501861]]]}},
+{"type":"Feature","id":"40095","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-96.932988,34.174162],[-96.587941,34.113915],[-96.587941,33.894838],[-96.932988,33.955084],[-96.971327,34.0701],[-96.932988,34.174162]]]}},
+{"type":"Feature","id":"40097","properties":{"name":"Mayes"},"geometry":{"type":"Polygon","coordinates":[[[-95.322768,36.512815],[-95.005105,36.507338],[-95.010582,36.162291],[-95.027013,36.162291],[-95.207752,36.07466],[-95.437783,36.07466],[-95.328245,36.512815],[-95.322768,36.512815]]]}},
+{"type":"Feature","id":"40099","properties":{"name":"Murray"},"geometry":{"type":"Polygon","coordinates":[[[-97.091819,34.639701],[-96.932988,34.634225],[-96.828926,34.508255],[-96.878219,34.502778],[-96.932988,34.332993],[-97.354713,34.508255],[-97.091819,34.639701]]]}},
+{"type":"Feature","id":"40101","properties":{"name":"Muskogee"},"geometry":{"type":"Polygon","coordinates":[[[-95.656861,35.855582],[-95.267998,35.811767],[-95.125598,35.636505],[-95.048921,35.461243],[-95.344675,35.291457],[-95.476122,35.554351],[-95.71163,35.554351],[-95.7664,35.855582],[-95.656861,35.855582]]]}},
+{"type":"Feature","id":"40103","properties":{"name":"Noble"},"geometry":{"type":"Polygon","coordinates":[[[-97.464251,36.594969],[-97.058958,36.594969],[-97.009665,36.507338],[-96.927511,36.244445],[-97.031573,36.244445],[-97.354713,36.156814],[-97.458774,36.162291],[-97.464251,36.594969]]]}},
+{"type":"Feature","id":"40105","properties":{"name":"Nowata"},"geometry":{"type":"Polygon","coordinates":[[[-95.613046,37.000263],[-95.519938,37.000263],[-95.410399,37.000263],[-95.432306,36.594969],[-95.810215,36.594969],[-95.788308,37.000263],[-95.613046,37.000263]]]}},
+{"type":"Feature","id":"40107","properties":{"name":"Okfuskee"},"geometry":{"type":"Polygon","coordinates":[[[-96.478402,35.636505],[-96.193601,35.636505],[-95.980001,35.379088],[-95.980001,35.291457],[-96.199078,35.291457],[-96.440064,35.291457],[-96.440064,35.466719],[-96.626279,35.400996],[-96.626279,35.461243],[-96.620803,35.636505],[-96.478402,35.636505]]]}},
+{"type":"Feature","id":"40109","properties":{"name":"Oklahoma"},"geometry":{"type":"Polygon","coordinates":[[[-97.672375,35.724136],[-97.141112,35.724136],[-97.141112,35.466719],[-97.141112,35.379088],[-97.425913,35.379088],[-97.672375,35.379088],[-97.672375,35.724136]]]}},
+{"type":"Feature","id":"40111","properties":{"name":"Okmulgee"},"geometry":{"type":"Polygon","coordinates":[[[-96.138832,35.855582],[-96.03477,35.855582],[-95.821169,35.855582],[-95.7664,35.855582],[-95.71163,35.554351],[-95.980001,35.379088],[-96.193601,35.636505],[-96.138832,35.855582]]]}},
+{"type":"Feature","id":"40113","properties":{"name":"Osage"},"geometry":{"type":"Polygon","coordinates":[[[-96.730341,37.000263],[-96.527695,37.000263],[-96.001908,37.000263],[-96.001908,36.425184],[-96.270278,36.162291],[-96.724864,36.529246],[-97.009665,36.507338],[-97.058958,36.594969],[-96.752249,37.000263],[-96.730341,37.000263]]]}},
+{"type":"Feature","id":"40115","properties":{"name":"Ottawa"},"geometry":{"type":"Polygon","coordinates":[[[-94.994151,37.000263],[-94.616242,37.000263],[-94.616242,36.764754],[-94.616242,36.666169],[-94.890089,36.671646],[-94.999628,36.671646],[-95.005105,37.000263],[-94.994151,37.000263]]]}},
+{"type":"Feature","id":"40117","properties":{"name":"Pawnee"},"geometry":{"type":"Polygon","coordinates":[[[-96.724864,36.529246],[-96.270278,36.162291],[-96.297663,36.162291],[-96.620803,36.162291],[-96.927511,36.244445],[-97.009665,36.507338],[-96.724864,36.529246]]]}},
+{"type":"Feature","id":"40119","properties":{"name":"Payne"},"geometry":{"type":"Polygon","coordinates":[[[-97.031573,36.244445],[-96.927511,36.244445],[-96.620803,36.162291],[-96.620803,35.943213],[-97.080866,35.943213],[-97.141112,35.943213],[-97.354713,36.156814],[-97.031573,36.244445]]]}},
+{"type":"Feature","id":"40121","properties":{"name":"Pittsburg"},"geometry":{"type":"Polygon","coordinates":[[[-95.706154,35.203826],[-95.448737,35.296934],[-95.350152,35.055949],[-95.514461,34.683517],[-95.673292,34.595886],[-96.089539,34.67804],[-96.089539,34.765671],[-95.985477,35.149057],[-95.706154,35.203826]]]}},
+{"type":"Feature","id":"40123","properties":{"name":"Pontotoc"},"geometry":{"type":"Polygon","coordinates":[[[-96.932988,34.962841],[-96.774157,34.902595],[-96.489356,34.908072],[-96.407202,34.765671],[-96.511264,34.502778],[-96.828926,34.508255],[-96.932988,34.634225],[-96.932988,34.853302],[-96.932988,34.962841]]]}},
+{"type":"Feature","id":"40125","properties":{"name":"Pottawatomie"},"geometry":{"type":"Polygon","coordinates":[[[-97.141112,35.466719],[-96.626279,35.461243],[-96.626279,35.400996],[-96.774157,34.902595],[-96.932988,34.962841],[-97.141112,34.929979],[-97.141112,35.379088],[-97.141112,35.466719]]]}},
+{"type":"Feature","id":"40127","properties":{"name":"Pushmataha"},"geometry":{"type":"Polygon","coordinates":[[[-95.311814,34.683517],[-95.059875,34.67804],[-94.939382,34.508255],[-95.158459,34.157731],[-95.383014,34.157731],[-95.777354,34.157731],[-95.673292,34.595886],[-95.514461,34.683517],[-95.311814,34.683517]]]}},
+{"type":"Feature","id":"40129","properties":{"name":"Roger Mills"},"geometry":{"type":"Polygon","coordinates":[[[-99.38118,36.014414],[-99.375704,35.811767],[-99.36475,35.510535],[-100.000075,35.422904],[-100.000075,35.620074],[-100.000075,35.882967],[-99.38118,36.014414]]]}},
+{"type":"Feature","id":"40131","properties":{"name":"Rogers"},"geometry":{"type":"Polygon","coordinates":[[[-95.810215,36.594969],[-95.432306,36.594969],[-95.328245,36.512815],[-95.437783,36.07466],[-95.618522,36.162291],[-95.760923,36.162291],[-95.810215,36.425184],[-95.810215,36.594969]]]}},
+{"type":"Feature","id":"40133","properties":{"name":"Seminole"},"geometry":{"type":"Polygon","coordinates":[[[-96.440064,35.466719],[-96.440064,35.291457],[-96.489356,34.908072],[-96.774157,34.902595],[-96.626279,35.400996],[-96.440064,35.466719]]]}},
+{"type":"Feature","id":"40135","properties":{"name":"Sequoyah"},"geometry":{"type":"Polygon","coordinates":[[[-94.851751,35.636505],[-94.807935,35.636505],[-94.473842,35.636505],[-94.430026,35.395519],[-94.430026,35.379088],[-94.813412,35.324319],[-95.048921,35.461243],[-95.125598,35.636505],[-94.851751,35.636505]]]}},
+{"type":"Feature","id":"40137","properties":{"name":"Stephens"},"geometry":{"type":"Polygon","coordinates":[[[-97.995515,34.683517],[-97.666898,34.683517],[-97.562836,34.508255],[-97.562836,34.289177],[-98.061238,34.289177],[-98.137915,34.289177],[-98.143392,34.508255],[-98.143392,34.508255],[-98.088623,34.683517],[-97.995515,34.683517]]]}},
+{"type":"Feature","id":"40139","properties":{"name":"Texas"},"geometry":{"type":"Polygon","coordinates":[[[-100.947585,37.000263],[-100.953062,36.501861],[-101.084509,36.501861],[-101.621249,36.501861],[-101.812942,36.501861],[-102.03202,36.501861],[-102.026543,36.994786],[-101.555526,36.994786],[-101.068078,37.000263],[-100.947585,37.000263]]]}},
+{"type":"Feature","id":"40141","properties":{"name":"Tillman"},"geometry":{"type":"Polygon","coordinates":[[[-99.101857,34.639701],[-98.82801,34.595886],[-98.663701,34.404193],[-98.608932,34.157731],[-98.953979,34.2125],[-99.211395,34.33847],[-99.101857,34.639701]]]}},
+{"type":"Feature","id":"40143","properties":{"name":"Tulsa"},"geometry":{"type":"Polygon","coordinates":[[[-95.919754,36.425184],[-95.810215,36.425184],[-95.760923,36.162291],[-95.821169,35.855582],[-96.03477,35.855582],[-96.297663,36.162291],[-96.270278,36.162291],[-96.001908,36.425184],[-95.919754,36.425184]]]}},
+{"type":"Feature","id":"40145","properties":{"name":"Wagoner"},"geometry":{"type":"Polygon","coordinates":[[[-95.618522,36.162291],[-95.437783,36.07466],[-95.207752,36.07466],[-95.267998,35.811767],[-95.656861,35.855582],[-95.7664,35.855582],[-95.821169,35.855582],[-95.760923,36.162291],[-95.618522,36.162291]]]}},
+{"type":"Feature","id":"40147","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-95.9088,37.000263],[-95.788308,37.000263],[-95.810215,36.594969],[-95.810215,36.425184],[-95.919754,36.425184],[-96.001908,36.425184],[-96.001908,37.000263],[-95.96357,37.000263],[-95.9088,37.000263]]]}},
+{"type":"Feature","id":"40149","properties":{"name":"Washita"},"geometry":{"type":"Polygon","coordinates":[[[-99.16758,35.466719],[-98.625363,35.466719],[-98.619886,35.099764],[-99.184011,35.116195],[-99.359273,35.116195],[-99.36475,35.466719],[-99.16758,35.466719]]]}},
+{"type":"Feature","id":"40151","properties":{"name":"Woods"},"geometry":{"type":"Polygon","coordinates":[[[-99.457858,37.000263],[-99.003272,37.000263],[-98.543209,37.000263],[-98.532255,36.463523],[-98.959456,36.507338],[-99.293549,36.819524],[-99.457858,37.000263]]]}},
+{"type":"Feature","id":"40153","properties":{"name":"Woodward"},"geometry":{"type":"Polygon","coordinates":[[[-99.293549,36.819524],[-98.959456,36.507338],[-98.959456,36.501861],[-98.953979,36.162291],[-99.38118,36.162291],[-99.605735,36.594969],[-99.293549,36.819524]]]}},
+{"type":"Feature","id":"41001","properties":{"name":"Baker"},"geometry":{"type":"Polygon","coordinates":[[[-117.778223,44.991119],[-117.268868,45.07875],[-116.78142,45.07875],[-116.901913,44.843241],[-117.219575,44.301024],[-117.608438,44.443425],[-118.232809,44.257209],[-118.495702,44.257209],[-118.243763,44.958257],[-117.778223,44.991119]]]}},
+{"type":"Feature","id":"41003","properties":{"name":"Benton"},"geometry":{"type":"Polygon","coordinates":[[[-123.561872,44.722749],[-123.151102,44.722749],[-123.200394,44.284593],[-123.775473,44.284593],[-123.600211,44.722749],[-123.561872,44.722749]]]}},
+{"type":"Feature","id":"41005","properties":{"name":"Clackamas"},"geometry":{"type":"Polygon","coordinates":[[[-122.356945,45.462136],[-121.820205,45.462136],[-121.694236,45.259489],[-121.732574,44.887057],[-122.395284,44.887057],[-122.84987,45.259489],[-122.866301,45.319735],[-122.745808,45.434751],[-122.356945,45.462136]]]}},
+{"type":"Feature","id":"41007","properties":{"name":"Clatsop"},"geometry":{"type":"Polygon","coordinates":[[[-123.364702,46.146753],[-123.359225,45.779798],[-123.841196,45.785275],[-123.967166,45.785275],[-124.010981,46.22343],[-123.545441,46.261769],[-123.364702,46.146753]]]}},
+{"type":"Feature","id":"41009","properties":{"name":"Columbia"},"geometry":{"type":"Polygon","coordinates":[[[-122.784147,45.850998],[-122.762239,45.730506],[-122.926547,45.725029],[-123.134671,45.779798],[-123.359225,45.779798],[-123.364702,46.146753],[-123.211348,46.174138],[-122.784147,45.850998]]]}},
+{"type":"Feature","id":"41011","properties":{"name":"Coos"},"geometry":{"type":"Polygon","coordinates":[[[-124.147905,43.61093],[-123.874058,43.61093],[-123.813811,42.789389],[-124.295782,42.953697],[-124.481998,42.953697],[-124.219105,43.61093],[-124.147905,43.61093]]]}},
+{"type":"Feature","id":"41013","properties":{"name":"Crook"},"geometry":{"type":"Polygon","coordinates":[[[-120.385247,44.563917],[-119.656814,44.306501],[-119.656814,43.961454],[-119.897799,43.698561],[-120.98771,43.961454],[-121.108203,44.388655],[-120.385247,44.563917]]]}},
+{"type":"Feature","id":"41015","properties":{"name":"Curry"},"geometry":{"type":"Polygon","coordinates":[[[-124.295782,42.953697],[-123.813811,42.789389],[-123.715227,42.783912],[-124.027412,42.35671],[-123.819288,41.995232],[-124.213628,42.000709],[-124.481998,42.953697],[-124.295782,42.953697]]]}},
+{"type":"Feature","id":"41017","properties":{"name":"Deschutes"},"geometry":{"type":"Polygon","coordinates":[[[-121.108203,44.388655],[-120.98771,43.961454],[-119.897799,43.698561],[-119.897799,43.61093],[-121.130111,43.616407],[-121.332757,43.616407],[-121.486112,43.616407],[-122.000944,43.616407],[-121.798297,44.257209],[-121.842113,44.394132],[-121.108203,44.388655]]]}},
+{"type":"Feature","id":"41019","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-123.824765,43.945023],[-123.140148,43.780715],[-123.107286,43.53973],[-122.132391,43.441145],[-122.280268,42.997512],[-123.227779,42.701758],[-123.715227,42.783912],[-123.813811,42.789389],[-123.874058,43.61093],[-124.147905,43.61093],[-124.219105,43.61093],[-124.158859,43.862869],[-123.824765,43.945023]]]}},
+{"type":"Feature","id":"41021","properties":{"name":"Gilliam"},"geometry":{"type":"Polygon","coordinates":[[[-120.653617,45.735983],[-120.001861,45.81266],[-119.78826,45.067796],[-119.870414,45.067796],[-120.494786,45.067796],[-120.505739,45.084227],[-120.653617,45.735983]]]}},
+{"type":"Feature","id":"41023","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-118.676441,44.996596],[-118.51761,44.996596],[-118.243763,44.958257],[-118.495702,44.257209],[-118.232809,44.257209],[-118.227332,44.038131],[-118.468318,44.038131],[-119.656814,43.961454],[-119.656814,44.306501],[-119.673245,44.996596],[-119.163889,44.996596],[-118.676441,44.996596]]]}},
+{"type":"Feature","id":"41025","properties":{"name":"Harney"},"geometry":{"type":"Polygon","coordinates":[[[-118.468318,44.038131],[-118.227332,44.038131],[-118.194471,41.995232],[-119.32272,41.995232],[-119.361059,41.995232],[-119.366536,42.75105],[-119.941615,42.745573],[-119.897799,43.61093],[-119.897799,43.698561],[-119.656814,43.961454],[-118.468318,44.038131]]]}},
+{"type":"Feature","id":"41027","properties":{"name":"Hood River"},"geometry":{"type":"Polygon","coordinates":[[[-121.924267,45.648352],[-121.52445,45.725029],[-121.442296,45.697644],[-121.694236,45.259489],[-121.820205,45.462136],[-121.924267,45.648352]]]}},
+{"type":"Feature","id":"41029","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-122.280268,42.992036],[-122.291222,42.006186],[-123.233256,42.006186],[-123.227779,42.701758],[-122.280268,42.997512],[-122.280268,42.992036]]]}},
+{"type":"Feature","id":"41031","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-120.998664,44.821334],[-120.374293,44.821334],[-120.385247,44.563917],[-121.108203,44.388655],[-121.842113,44.394132],[-121.79282,44.68441],[-121.759959,44.826811],[-120.998664,44.821334]]]}},
+{"type":"Feature","id":"41033","properties":{"name":"Josephine"},"geometry":{"type":"Polygon","coordinates":[[[-123.715227,42.783912],[-123.227779,42.701758],[-123.233256,42.006186],[-123.518057,42.000709],[-123.819288,41.995232],[-124.027412,42.35671],[-123.715227,42.783912]]]}},
+{"type":"Feature","id":"41035","properties":{"name":"Klamath"},"geometry":{"type":"Polygon","coordinates":[[[-121.486112,43.616407],[-121.332757,43.616407],[-121.349188,42.745573],[-120.883648,42.745573],[-120.878171,41.995232],[-121.316327,41.995232],[-121.447773,41.995232],[-122.291222,42.006186],[-122.280268,42.992036],[-122.280268,42.997512],[-122.132391,43.441145],[-122.000944,43.616407],[-121.486112,43.616407]]]}},
+{"type":"Feature","id":"41037","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-121.130111,43.616407],[-119.897799,43.61093],[-119.941615,42.745573],[-119.366536,42.75105],[-119.361059,41.995232],[-120.001861,41.995232],[-120.878171,41.995232],[-120.883648,42.745573],[-121.349188,42.745573],[-121.332757,43.616407],[-121.130111,43.616407]]]}},
+{"type":"Feature","id":"41039","properties":{"name":"Lane"},"geometry":{"type":"Polygon","coordinates":[[[-124.010981,44.279117],[-123.775473,44.284593],[-123.200394,44.284593],[-121.798297,44.257209],[-122.000944,43.616407],[-122.132391,43.441145],[-123.107286,43.53973],[-123.140148,43.780715],[-123.824765,43.945023],[-124.158859,43.862869],[-124.115043,44.27364],[-124.010981,44.279117]]]}},
+{"type":"Feature","id":"41041","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-124.000027,45.045888],[-123.72618,45.045888],[-123.600211,44.722749],[-123.775473,44.284593],[-124.010981,44.279117],[-124.115043,44.27364],[-124.005504,45.045888],[-124.000027,45.045888]]]}},
+{"type":"Feature","id":"41043","properties":{"name":"Linn"},"geometry":{"type":"Polygon","coordinates":[[[-122.658177,44.777518],[-121.79282,44.68441],[-121.842113,44.394132],[-121.798297,44.257209],[-123.200394,44.284593],[-123.151102,44.722749],[-123.145625,44.750133],[-122.658177,44.777518]]]}},
+{"type":"Feature","id":"41045","properties":{"name":"Malheur"},"geometry":{"type":"Polygon","coordinates":[[[-117.608438,44.443425],[-117.219575,44.301024],[-116.896436,44.153147],[-116.97859,43.8793],[-117.027882,43.68213],[-117.027882,42.000709],[-118.194471,41.995232],[-118.227332,44.038131],[-118.232809,44.257209],[-117.608438,44.443425]]]}},
+{"type":"Feature","id":"41047","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-122.964886,45.286874],[-122.84987,45.259489],[-122.395284,44.887057],[-121.732574,44.887057],[-121.759959,44.826811],[-121.79282,44.68441],[-122.658177,44.777518],[-123.145625,44.750133],[-123.068948,45.073273],[-122.964886,45.286874]]]}},
+{"type":"Feature","id":"41049","properties":{"name":"Morrow"},"geometry":{"type":"Polygon","coordinates":[[[-119.432259,45.916722],[-119.147458,45.516905],[-119.163889,44.996596],[-119.673245,44.996596],[-119.78826,45.067796],[-120.001861,45.81266],[-119.870414,45.834568],[-119.432259,45.916722]]]}},
+{"type":"Feature","id":"41051","properties":{"name":"Multnomah"},"geometry":{"type":"Polygon","coordinates":[[[-122.926547,45.725029],[-122.762239,45.730506],[-122.247407,45.549767],[-121.924267,45.648352],[-121.820205,45.462136],[-122.356945,45.462136],[-122.745808,45.434751],[-122.926547,45.725029]]]}},
+{"type":"Feature","id":"41053","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-123.622119,45.07875],[-123.068948,45.073273],[-123.145625,44.750133],[-123.151102,44.722749],[-123.561872,44.722749],[-123.600211,44.722749],[-123.72618,45.045888],[-123.72618,45.07875],[-123.622119,45.07875]]]}},
+{"type":"Feature","id":"41055","properties":{"name":"Sherman"},"geometry":{"type":"Polygon","coordinates":[[[-120.834356,45.675736],[-120.653617,45.735983],[-120.505739,45.084227],[-121.026049,45.22115],[-120.91651,45.642875],[-120.834356,45.675736]]]}},
+{"type":"Feature","id":"41057","properties":{"name":"Tillamook"},"geometry":{"type":"Polygon","coordinates":[[[-123.841196,45.785275],[-123.359225,45.779798],[-123.463287,45.434751],[-123.72618,45.07875],[-123.72618,45.045888],[-124.000027,45.045888],[-124.005504,45.045888],[-123.967166,45.785275],[-123.841196,45.785275]]]}},
+{"type":"Feature","id":"41059","properties":{"name":"Umatilla"},"geometry":{"type":"Polygon","coordinates":[[[-118.58881,45.998876],[-117.997301,45.998876],[-117.975393,45.998876],[-117.975393,45.861952],[-118.117793,45.47309],[-118.698349,45.34712],[-118.51761,44.996596],[-118.676441,44.996596],[-119.163889,44.996596],[-119.147458,45.516905],[-119.432259,45.916722],[-118.988627,45.998876],[-118.58881,45.998876]]]}},
+{"type":"Feature","id":"41061","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-117.898716,45.861952],[-117.268868,45.07875],[-117.778223,44.991119],[-118.243763,44.958257],[-118.51761,44.996596],[-118.698349,45.34712],[-118.117793,45.47309],[-117.975393,45.861952],[-117.898716,45.861952]]]}},
+{"type":"Feature","id":"41063","properties":{"name":"Wallowa"},"geometry":{"type":"Polygon","coordinates":[[[-117.975393,45.998876],[-117.602961,45.998876],[-117.482468,45.998876],[-116.918344,45.993399],[-116.792374,45.856475],[-116.463758,45.61549],[-116.688312,45.270443],[-116.78142,45.07875],[-117.268868,45.07875],[-117.898716,45.861952],[-117.975393,45.861952],[-117.975393,45.998876]]]}},
+{"type":"Feature","id":"41065","properties":{"name":"Wasco"},"geometry":{"type":"Polygon","coordinates":[[[-121.442296,45.697644],[-120.91651,45.642875],[-121.026049,45.22115],[-120.505739,45.084227],[-120.494786,45.067796],[-120.374293,44.821334],[-120.998664,44.821334],[-121.759959,44.826811],[-121.732574,44.887057],[-121.694236,45.259489],[-121.442296,45.697644]]]}},
+{"type":"Feature","id":"41067","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-123.134671,45.779798],[-122.926547,45.725029],[-122.745808,45.434751],[-122.866301,45.319735],[-123.063471,45.401889],[-123.463287,45.434751],[-123.359225,45.779798],[-123.134671,45.779798]]]}},
+{"type":"Feature","id":"41069","properties":{"name":"Wheeler"},"geometry":{"type":"Polygon","coordinates":[[[-119.870414,45.067796],[-119.78826,45.067796],[-119.673245,44.996596],[-119.656814,44.306501],[-120.385247,44.563917],[-120.374293,44.821334],[-120.494786,45.067796],[-119.870414,45.067796]]]}},
+{"type":"Feature","id":"41071","properties":{"name":"Yamhill"},"geometry":{"type":"Polygon","coordinates":[[[-123.063471,45.401889],[-122.866301,45.319735],[-122.84987,45.259489],[-122.964886,45.286874],[-123.068948,45.073273],[-123.622119,45.07875],[-123.72618,45.07875],[-123.463287,45.434751],[-123.063471,45.401889]]]}},
+{"type":"Feature","id":"42001","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-77.139326,40.067349],[-76.996925,39.722302],[-77.216003,39.722302],[-77.456988,39.722302],[-77.473419,39.946857],[-77.139326,40.067349]]]}},
+{"type":"Feature","id":"42003","properties":{"name":"Allegheny"},"geometry":{"type":"Polygon","coordinates":[[[-80.146166,40.67529],[-79.69158,40.669813],[-79.69158,40.669813],[-79.872319,40.198796],[-80.359767,40.47812],[-80.146166,40.67529]]]}},
+{"type":"Feature","id":"42005","properties":{"name":"Armstrong"},"geometry":{"type":"Polygon","coordinates":[[[-79.603949,41.020337],[-79.215086,41.053199],[-79.215086,40.910798],[-79.450595,40.527412],[-79.538226,40.54932],[-79.69158,40.669813],[-79.69158,40.669813],[-79.69158,41.168214],[-79.603949,41.020337]]]}},
+{"type":"Feature","id":"42007","properties":{"name":"Beaver"},"geometry":{"type":"Polygon","coordinates":[[[-80.255705,40.856029],[-80.15712,40.856029],[-80.146166,40.67529],[-80.359767,40.47812],[-80.398105,40.47812],[-80.518598,40.47812],[-80.518598,40.636951],[-80.518598,40.850552],[-80.255705,40.856029]]]}},
+{"type":"Feature","id":"42009","properties":{"name":"Bedford"},"geometry":{"type":"Polygon","coordinates":[[[-78.6181,40.324766],[-78.256622,40.297381],[-78.136129,40.165934],[-78.382591,39.722302],[-78.809792,39.722302],[-78.656438,40.242611],[-78.6181,40.324766]]]}},
+{"type":"Feature","id":"42011","properties":{"name":"Berks"},"geometry":{"type":"Polygon","coordinates":[[[-75.890583,40.67529],[-75.529105,40.445258],[-75.69889,40.242611],[-75.874152,40.13855],[-76.153476,40.313812],[-76.438277,40.494551],[-75.890583,40.67529]]]}},
+{"type":"Feature","id":"42013","properties":{"name":"Blair"},"geometry":{"type":"Polygon","coordinates":[[[-78.360683,40.735536],[-78.114221,40.741013],[-78.256622,40.297381],[-78.6181,40.324766],[-78.349729,40.724582],[-78.360683,40.735536]]]}},
+{"type":"Feature","id":"42015","properties":{"name":"Bradford"},"geometry":{"type":"Polygon","coordinates":[[[-76.920248,42.000709],[-76.55877,42.000709],[-76.147999,42.000709],[-76.115138,41.650185],[-76.2192,41.540646],[-76.816186,41.589939],[-76.876433,41.595416],[-76.925725,42.000709],[-76.920248,42.000709]]]}},
+{"type":"Feature","id":"42017","properties":{"name":"Bucks"},"geometry":{"type":"Polygon","coordinates":[[[-75.195012,40.609566],[-75.189535,40.593136],[-74.943073,40.341196],[-74.723995,40.149503],[-74.975934,40.050919],[-75.014273,40.13855],[-75.48529,40.417874],[-75.331935,40.538366],[-75.195012,40.609566]]]}},
+{"type":"Feature","id":"42019","properties":{"name":"Butler"},"geometry":{"type":"Polygon","coordinates":[[[-79.998289,41.173691],[-79.697057,41.173691],[-79.69158,41.168214],[-79.69158,40.669813],[-80.146166,40.67529],[-80.15712,40.856029],[-80.096873,41.069629],[-79.998289,41.173691]]]}},
+{"type":"Feature","id":"42021","properties":{"name":"Cambria"},"geometry":{"type":"Polygon","coordinates":[[[-78.804316,40.724582],[-78.349729,40.724582],[-78.6181,40.324766],[-78.656438,40.242611],[-79.001485,40.286427],[-79.056255,40.286427],[-78.974101,40.395966],[-78.804316,40.724582]]]}},
+{"type":"Feature","id":"42023","properties":{"name":"Cameron"},"geometry":{"type":"Polygon","coordinates":[[[-78.42093,41.600893],[-78.201852,41.617324],[-77.988251,41.474923],[-78.092313,41.217507],[-78.234714,41.228461],[-78.42093,41.600893]]]}},
+{"type":"Feature","id":"42025","properties":{"name":"Carbon"},"geometry":{"type":"Polygon","coordinates":[[[-75.687936,41.129876],[-75.649598,41.124399],[-75.474336,40.812213],[-75.611259,40.784829],[-75.759137,40.735536],[-75.994645,40.910798],[-75.687936,41.129876]]]}},
+{"type":"Feature","id":"42027","properties":{"name":"Centre"},"geometry":{"type":"Polygon","coordinates":[[[-77.708927,41.113445],[-77.144803,41.042245],[-77.36388,40.845075],[-77.681543,40.730059],[-78.114221,40.741013],[-78.360683,40.735536],[-78.037544,41.151784],[-77.708927,41.113445]]]}},
+{"type":"Feature","id":"42029","properties":{"name":"Chester"},"geometry":{"type":"Polygon","coordinates":[[[-75.676983,40.242611],[-75.35932,40.067349],[-75.594828,39.837318],[-75.786521,39.722302],[-75.808429,39.722302],[-76.137046,39.722302],[-75.874152,40.13855],[-75.69889,40.242611],[-75.676983,40.242611]]]}},
+{"type":"Feature","id":"42031","properties":{"name":"Clarion"},"geometry":{"type":"Polygon","coordinates":[[[-79.357487,41.431108],[-79.209609,41.332523],[-79.215086,41.053199],[-79.603949,41.020337],[-79.69158,41.168214],[-79.697057,41.173691],[-79.477979,41.387292],[-79.357487,41.431108]]]}},
+{"type":"Feature","id":"42033","properties":{"name":"Clearfield"},"geometry":{"type":"Polygon","coordinates":[[[-78.234714,41.228461],[-78.092313,41.217507],[-78.037544,41.151784],[-78.360683,40.735536],[-78.349729,40.724582],[-78.804316,40.724582],[-78.804316,40.905321],[-78.711208,41.201076],[-78.234714,41.228461]]]}},
+{"type":"Feature","id":"42035","properties":{"name":"Clinton"},"geometry":{"type":"Polygon","coordinates":[[[-77.747266,41.474923],[-77.599389,41.4804],[-77.144803,41.069629],[-77.144803,41.042245],[-77.708927,41.113445],[-78.037544,41.151784],[-78.092313,41.217507],[-77.988251,41.474923],[-77.747266,41.474923]]]}},
+{"type":"Feature","id":"42037","properties":{"name":"Columbia"},"geometry":{"type":"Polygon","coordinates":[[[-76.317785,41.310615],[-76.312308,41.310615],[-76.208246,40.949137],[-76.378031,40.773875],[-76.525908,40.883413],[-76.640924,41.157261],[-76.449231,41.277753],[-76.317785,41.310615]]]}},
+{"type":"Feature","id":"42039","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-79.708011,41.852832],[-79.609426,41.847355],[-79.614903,41.6228],[-79.998289,41.491354],[-80.003765,41.491354],[-80.518598,41.491354],[-80.518598,41.502308],[-80.518598,41.847355],[-79.708011,41.852832]]]}},
+{"type":"Feature","id":"42041","properties":{"name":"Cumberland"},"geometry":{"type":"Polygon","coordinates":[[[-77.122895,40.297381],[-76.914771,40.330243],[-76.860002,40.226181],[-76.903817,40.220704],[-77.139326,40.067349],[-77.473419,39.946857],[-77.615819,40.198796],[-77.122895,40.297381]]]}},
+{"type":"Feature","id":"42043","properties":{"name":"Dauphin"},"geometry":{"type":"Polygon","coordinates":[[[-76.536862,40.554797],[-76.564247,40.198796],[-76.723078,40.122119],[-76.860002,40.226181],[-76.914771,40.330243],[-76.95311,40.60409],[-76.947633,40.625997],[-76.70117,40.658859],[-76.536862,40.554797]]]}},
+{"type":"Feature","id":"42045","properties":{"name":"Delaware"},"geometry":{"type":"Polygon","coordinates":[[[-75.353843,40.056395],[-75.277166,39.974241],[-75.211443,39.864703],[-75.414089,39.804456],[-75.578398,39.837318],[-75.594828,39.837318],[-75.594828,39.837318],[-75.35932,40.067349],[-75.353843,40.056395]]]}},
+{"type":"Feature","id":"42047","properties":{"name":"Elk"},"geometry":{"type":"Polygon","coordinates":[[[-78.95767,41.6228],[-78.42093,41.600893],[-78.234714,41.228461],[-78.711208,41.201076],[-78.95767,41.370861],[-79.094593,41.343476],[-78.95767,41.6228]]]}},
+{"type":"Feature","id":"42049","properties":{"name":"Erie"},"geometry":{"type":"Polygon","coordinates":[[[-79.76278,42.252649],[-79.609426,42.000709],[-79.609426,41.847355],[-79.708011,41.852832],[-80.518598,41.847355],[-80.518598,41.978802],[-80.518598,41.978802],[-79.76278,42.269079],[-79.76278,42.252649]]]}},
+{"type":"Feature","id":"42051","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-79.499887,40.13855],[-79.291763,40.039965],[-79.390348,39.722302],[-79.477979,39.722302],[-79.609426,39.722302],[-79.76278,39.722302],[-79.916134,39.722302],[-79.998289,39.985195],[-79.877796,40.127596],[-79.499887,40.13855]]]}},
+{"type":"Feature","id":"42053","properties":{"name":"Forest"},"geometry":{"type":"Polygon","coordinates":[[[-78.996008,41.6228],[-78.95767,41.6228],[-79.094593,41.343476],[-79.209609,41.332523],[-79.357487,41.431108],[-79.477979,41.387292],[-79.510841,41.6228],[-78.996008,41.6228]]]}},
+{"type":"Feature","id":"42055","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-77.670589,40.291904],[-77.615819,40.198796],[-77.473419,39.946857],[-77.456988,39.722302],[-77.467942,39.722302],[-78.09779,39.722302],[-77.862282,40.061872],[-77.703451,40.264519],[-77.670589,40.291904]]]}},
+{"type":"Feature","id":"42057","properties":{"name":"Fulton"},"geometry":{"type":"Polygon","coordinates":[[[-78.136129,40.165934],[-77.862282,40.061872],[-78.09779,39.722302],[-78.284006,39.722302],[-78.344253,39.722302],[-78.382591,39.722302],[-78.136129,40.165934]]]}},
+{"type":"Feature","id":"42059","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-80.064012,40.007103],[-79.998289,39.985195],[-79.916134,39.722302],[-80.420013,39.722302],[-80.518598,39.722302],[-80.518598,39.963288],[-80.064012,40.007103]]]}},
+{"type":"Feature","id":"42061","properties":{"name":"Huntingdon"},"geometry":{"type":"Polygon","coordinates":[[[-78.114221,40.741013],[-77.681543,40.730059],[-77.752743,40.379535],[-77.703451,40.264519],[-77.862282,40.061872],[-78.136129,40.165934],[-78.256622,40.297381],[-78.114221,40.741013]]]}},
+{"type":"Feature","id":"42063","properties":{"name":"Indiana"},"geometry":{"type":"Polygon","coordinates":[[[-79.215086,40.910798],[-78.804316,40.905321],[-78.804316,40.724582],[-78.974101,40.395966],[-79.450595,40.527412],[-79.215086,40.910798]]]}},
+{"type":"Feature","id":"42065","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-78.95767,41.370861],[-78.711208,41.201076],[-78.804316,40.905321],[-79.215086,40.910798],[-79.215086,41.053199],[-79.209609,41.332523],[-79.094593,41.343476],[-78.95767,41.370861]]]}},
+{"type":"Feature","id":"42067","properties":{"name":"Juniata"},"geometry":{"type":"Polygon","coordinates":[[[-77.133849,40.686244],[-76.936679,40.636951],[-76.947633,40.625997],[-77.670589,40.291904],[-77.703451,40.264519],[-77.752743,40.379535],[-77.287203,40.691721],[-77.133849,40.686244]]]}},
+{"type":"Feature","id":"42069","properties":{"name":"Lackawanna"},"geometry":{"type":"Polygon","coordinates":[[[-75.720798,41.644708],[-75.463382,41.639231],[-75.507197,41.233938],[-75.600305,41.162737],[-75.835814,41.425631],[-75.720798,41.644708]]]}},
+{"type":"Feature","id":"42071","properties":{"name":"Lancaster"},"geometry":{"type":"Polygon","coordinates":[[[-76.306831,40.253565],[-76.153476,40.313812],[-75.874152,40.13855],[-76.137046,39.722302],[-76.235631,39.722302],[-76.241107,39.722302],[-76.723078,40.122119],[-76.564247,40.198796],[-76.306831,40.253565]]]}},
+{"type":"Feature","id":"42073","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-80.518598,41.124399],[-80.096873,41.069629],[-80.15712,40.856029],[-80.255705,40.856029],[-80.518598,40.850552],[-80.518598,40.899844],[-80.518598,41.124399]]]}},
+{"type":"Feature","id":"42075","properties":{"name":"Lebanon"},"geometry":{"type":"Polygon","coordinates":[[[-76.536862,40.554797],[-76.438277,40.494551],[-76.153476,40.313812],[-76.306831,40.253565],[-76.564247,40.198796],[-76.536862,40.554797]]]}},
+{"type":"Feature","id":"42077","properties":{"name":"Lehigh"},"geometry":{"type":"Polygon","coordinates":[[[-75.611259,40.784829],[-75.331935,40.538366],[-75.48529,40.417874],[-75.490767,40.423351],[-75.529105,40.445258],[-75.890583,40.67529],[-75.759137,40.735536],[-75.611259,40.784829]]]}},
+{"type":"Feature","id":"42079","properties":{"name":"Luzerne"},"geometry":{"type":"Polygon","coordinates":[[[-75.835814,41.425631],[-75.835814,41.425631],[-75.600305,41.162737],[-75.649598,41.124399],[-75.687936,41.129876],[-75.994645,40.910798],[-76.208246,40.949137],[-76.312308,41.310615],[-76.284923,41.376338],[-75.835814,41.425631]]]}},
+{"type":"Feature","id":"42081","properties":{"name":"Lycoming"},"geometry":{"type":"Polygon","coordinates":[[[-76.876433,41.595416],[-76.816186,41.589939],[-76.449231,41.277753],[-76.640924,41.157261],[-76.734032,41.173691],[-76.799755,41.173691],[-76.89834,41.14083],[-77.144803,41.069629],[-77.599389,41.4804],[-77.599389,41.540646],[-76.876433,41.595416]]]}},
+{"type":"Feature","id":"42083","properties":{"name":"McKean"},"geometry":{"type":"Polygon","coordinates":[[[-78.919331,42.000709],[-78.305914,42.000709],[-78.207329,42.000709],[-78.201852,41.617324],[-78.42093,41.600893],[-78.95767,41.6228],[-78.919331,42.000709]]]}},
+{"type":"Feature","id":"42085","properties":{"name":"Mercer"},"geometry":{"type":"Polygon","coordinates":[[[-80.003765,41.491354],[-79.998289,41.491354],[-79.998289,41.173691],[-80.096873,41.069629],[-80.518598,41.124399],[-80.518598,41.135353],[-80.518598,41.491354],[-80.003765,41.491354]]]}},
+{"type":"Feature","id":"42087","properties":{"name":"Mifflin"},"geometry":{"type":"Polygon","coordinates":[[[-77.36388,40.845075],[-77.358403,40.806736],[-77.287203,40.691721],[-77.752743,40.379535],[-77.681543,40.730059],[-77.36388,40.845075]]]}},
+{"type":"Feature","id":"42089","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-75.271689,41.244892],[-74.992365,41.091537],[-74.96498,41.097014],[-75.118335,40.965568],[-75.474336,40.812213],[-75.649598,41.124399],[-75.600305,41.162737],[-75.507197,41.233938],[-75.35932,41.239415],[-75.271689,41.244892]]]}},
+{"type":"Feature","id":"42091","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-75.490767,40.423351],[-75.48529,40.417874],[-75.014273,40.13855],[-75.025227,40.133073],[-75.277166,39.974241],[-75.353843,40.056395],[-75.35932,40.067349],[-75.676983,40.242611],[-75.69889,40.242611],[-75.529105,40.445258],[-75.490767,40.423351]]]}},
+{"type":"Feature","id":"42093","properties":{"name":"Montour"},"geometry":{"type":"Polygon","coordinates":[[[-76.734032,41.173691],[-76.640924,41.157261],[-76.525908,40.883413],[-76.734032,41.173691]]]}},
+{"type":"Feature","id":"42095","properties":{"name":"Northampton"},"geometry":{"type":"Polygon","coordinates":[[[-75.118335,40.965568],[-75.195012,40.609566],[-75.331935,40.538366],[-75.611259,40.784829],[-75.474336,40.812213],[-75.118335,40.965568]]]}},
+{"type":"Feature","id":"42097","properties":{"name":"Northumberland"},"geometry":{"type":"Polygon","coordinates":[[[-76.799755,41.173691],[-76.734032,41.173691],[-76.525908,40.883413],[-76.378031,40.773875],[-76.70117,40.658859],[-76.947633,40.625997],[-76.936679,40.636951],[-76.799755,40.883413],[-76.89834,41.14083],[-76.799755,41.173691]]]}},
+{"type":"Feature","id":"42099","properties":{"name":"Perry"},"geometry":{"type":"Polygon","coordinates":[[[-76.95311,40.60409],[-76.914771,40.330243],[-77.122895,40.297381],[-77.615819,40.198796],[-77.670589,40.291904],[-76.947633,40.625997],[-76.95311,40.60409]]]}},
+{"type":"Feature","id":"42101","properties":{"name":"Philadelphia"},"geometry":{"type":"Polygon","coordinates":[[[-75.025227,40.133073],[-75.014273,40.13855],[-74.975934,40.050919],[-75.058088,39.990672],[-75.140242,39.88661],[-75.211443,39.864703],[-75.277166,39.974241],[-75.025227,40.133073]]]}},
+{"type":"Feature","id":"42103","properties":{"name":"Pike"},"geometry":{"type":"Polygon","coordinates":[[[-75.069042,41.600893],[-74.756857,41.425631],[-74.69661,41.359907],[-74.992365,41.091537],[-75.271689,41.244892],[-75.35932,41.239415],[-75.069042,41.600893]]]}},
+{"type":"Feature","id":"42105","properties":{"name":"Potter"},"geometry":{"type":"Polygon","coordinates":[[[-78.207329,42.000709],[-77.747266,42.000709],[-77.610343,42.000709],[-77.599389,41.540646],[-77.599389,41.4804],[-77.747266,41.474923],[-77.988251,41.474923],[-78.201852,41.617324],[-78.207329,42.000709]]]}},
+{"type":"Feature","id":"42107","properties":{"name":"Schuylkill"},"geometry":{"type":"Polygon","coordinates":[[[-76.208246,40.949137],[-75.994645,40.910798],[-75.759137,40.735536],[-75.890583,40.67529],[-76.438277,40.494551],[-76.536862,40.554797],[-76.70117,40.658859],[-76.378031,40.773875],[-76.208246,40.949137]]]}},
+{"type":"Feature","id":"42109","properties":{"name":"Snyder"},"geometry":{"type":"Polygon","coordinates":[[[-76.854525,40.88889],[-76.799755,40.883413],[-76.936679,40.636951],[-77.133849,40.686244],[-77.287203,40.691721],[-77.358403,40.806736],[-76.854525,40.88889]]]}},
+{"type":"Feature","id":"42111","properties":{"name":"Somerset"},"geometry":{"type":"Polygon","coordinates":[[[-79.001485,40.286427],[-78.656438,40.242611],[-78.809792,39.722302],[-78.930285,39.722302],[-79.390348,39.722302],[-79.291763,40.039965],[-79.056255,40.286427],[-79.001485,40.286427]]]}},
+{"type":"Feature","id":"42113","properties":{"name":"Sullivan"},"geometry":{"type":"Polygon","coordinates":[[[-76.816186,41.589939],[-76.2192,41.540646],[-76.284923,41.376338],[-76.312308,41.310615],[-76.317785,41.310615],[-76.449231,41.277753],[-76.816186,41.589939]]]}},
+{"type":"Feature","id":"42115","properties":{"name":"Susquehanna"},"geometry":{"type":"Polygon","coordinates":[[[-75.890583,42.000709],[-75.48529,42.000709],[-75.463382,41.639231],[-75.720798,41.644708],[-76.115138,41.650185],[-76.147999,42.000709],[-76.104184,42.000709],[-75.890583,42.000709]]]}},
+{"type":"Feature","id":"42117","properties":{"name":"Tioga"},"geometry":{"type":"Polygon","coordinates":[[[-76.925725,42.000709],[-76.876433,41.595416],[-77.599389,41.540646],[-77.610343,42.000709],[-76.964064,42.000709],[-76.925725,42.000709]]]}},
+{"type":"Feature","id":"42119","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-77.144803,41.069629],[-76.89834,41.14083],[-76.799755,40.883413],[-76.854525,40.88889],[-77.358403,40.806736],[-77.36388,40.845075],[-77.144803,41.042245],[-77.144803,41.069629]]]}},
+{"type":"Feature","id":"42121","properties":{"name":"Venango"},"geometry":{"type":"Polygon","coordinates":[[[-79.510841,41.6228],[-79.477979,41.387292],[-79.697057,41.173691],[-79.998289,41.173691],[-79.998289,41.491354],[-79.614903,41.6228],[-79.510841,41.6228]]]}},
+{"type":"Feature","id":"42123","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-79.061732,42.000709],[-78.919331,42.000709],[-78.95767,41.6228],[-78.996008,41.6228],[-79.510841,41.6228],[-79.614903,41.6228],[-79.609426,41.847355],[-79.609426,42.000709],[-79.061732,42.000709]]]}},
+{"type":"Feature","id":"42125","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-80.398105,40.47812],[-80.359767,40.47812],[-79.872319,40.198796],[-79.877796,40.127596],[-79.998289,39.985195],[-80.064012,40.007103],[-80.518598,39.963288],[-80.518598,40.018057],[-80.518598,40.160457],[-80.518598,40.401443],[-80.518598,40.47812],[-80.398105,40.47812]]]}},
+{"type":"Feature","id":"42127","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-75.479813,42.000709],[-75.35932,42.000709],[-75.145719,41.852832],[-75.069042,41.600893],[-75.35932,41.239415],[-75.507197,41.233938],[-75.463382,41.639231],[-75.48529,42.000709],[-75.479813,42.000709]]]}},
+{"type":"Feature","id":"42129","properties":{"name":"Westmoreland"},"geometry":{"type":"Polygon","coordinates":[[[-79.538226,40.54932],[-79.450595,40.527412],[-78.974101,40.395966],[-79.056255,40.286427],[-79.291763,40.039965],[-79.499887,40.13855],[-79.877796,40.127596],[-79.872319,40.198796],[-79.69158,40.669813],[-79.538226,40.54932]]]}},
+{"type":"Feature","id":"42131","properties":{"name":"Wyoming"},"geometry":{"type":"Polygon","coordinates":[[[-76.2192,41.540646],[-76.115138,41.650185],[-75.720798,41.644708],[-75.835814,41.425631],[-75.835814,41.425631],[-76.284923,41.376338],[-76.2192,41.540646]]]}},
+{"type":"Feature","id":"42133","properties":{"name":"York"},"geometry":{"type":"Polygon","coordinates":[[[-76.903817,40.220704],[-76.860002,40.226181],[-76.723078,40.122119],[-76.241107,39.722302],[-76.569724,39.722302],[-76.70117,39.722302],[-76.788801,39.722302],[-76.996925,39.722302],[-77.139326,40.067349],[-76.903817,40.220704]]]}},
+{"type":"Feature","id":"44001","properties":{"name":"Bristol"},"geometry":{"type":"Polygon","coordinates":[[[-71.317338,41.776155],[-71.22423,41.710431],[-71.355677,41.726862],[-71.366631,41.737816],[-71.317338,41.776155]]]}},
+{"type":"Feature","id":"44003","properties":{"name":"Kent"},"geometry":{"type":"Polygon","coordinates":[[[-71.4214,41.765201],[-71.366631,41.737816],[-71.355677,41.726862],[-71.410446,41.655662],[-71.470692,41.633754],[-71.788355,41.595416],[-71.788355,41.639231],[-71.788355,41.726862],[-71.4214,41.765201]]]}},
+{"type":"Feature","id":"44007","properties":{"name":"Providence"},"geometry":{"type":"Polygon","coordinates":[[[-71.498077,42.01714],[-71.383061,41.984279],[-71.317338,41.776155],[-71.366631,41.737816],[-71.4214,41.765201],[-71.788355,41.726862],[-71.799309,42.006186],[-71.498077,42.01714]]]}},
+{"type":"Feature","id":"44009","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-71.470692,41.633754],[-71.410446,41.655662],[-71.859555,41.321569],[-71.788355,41.595416],[-71.470692,41.633754]]]}},
+{"type":"Feature","id":"45001","properties":{"name":"Abbeville"},"geometry":{"type":"Polygon","coordinates":[[[-82.325988,34.475393],[-82.315034,34.486347],[-82.243834,34.40967],[-82.325988,34.064623],[-82.594358,34.01533],[-82.742236,34.207023],[-82.325988,34.475393]]]}},
+{"type":"Feature","id":"45003","properties":{"name":"Aiken"},"geometry":{"type":"Polygon","coordinates":[[[-81.57017,33.878407],[-81.186785,33.653852],[-81.373001,33.489544],[-81.756386,33.199266],[-81.849494,33.248559],[-82.013803,33.53336],[-81.652325,33.812683],[-81.57017,33.878407]]]}},
+{"type":"Feature","id":"45005","properties":{"name":"Allendale"},"geometry":{"type":"Polygon","coordinates":[[[-81.613986,33.095204],[-81.192262,33.117112],[-81.082723,33.024004],[-81.411339,32.74468],[-81.542786,33.045912],[-81.613986,33.095204]]]}},
+{"type":"Feature","id":"45007","properties":{"name":"Anderson"},"geometry":{"type":"Polygon","coordinates":[[[-82.490296,34.820441],[-82.484819,34.820441],[-82.315034,34.486347],[-82.325988,34.475393],[-82.742236,34.207023],[-82.775097,34.289177],[-82.994175,34.48087],[-82.857251,34.60684],[-82.846298,34.617794],[-82.840821,34.623271],[-82.490296,34.820441]]]}},
+{"type":"Feature","id":"45009","properties":{"name":"Bamberg"},"geometry":{"type":"Polygon","coordinates":[[[-81.10463,33.380005],[-80.797922,33.177358],[-81.082723,33.024004],[-81.192262,33.117112],[-81.225123,33.440252],[-81.10463,33.380005]]]}},
+{"type":"Feature","id":"45011","properties":{"name":"Barnwell"},"geometry":{"type":"Polygon","coordinates":[[[-81.373001,33.489544],[-81.225123,33.440252],[-81.192262,33.117112],[-81.613986,33.095204],[-81.756386,33.199266],[-81.373001,33.489544]]]}},
+{"type":"Feature","id":"45013","properties":{"name":"Beaufort"},"geometry":{"type":"Polygon","coordinates":[[[-80.825307,32.706342],[-80.474782,32.487264],[-80.880076,32.08197],[-80.869122,32.662526],[-80.825307,32.706342]]]}},
+{"type":"Feature","id":"45015","properties":{"name":"Berkeley"},"geometry":{"type":"Polygon","coordinates":[[[-80.053058,33.505975],[-79.675149,33.303328],[-79.445118,33.215697],[-79.49441,33.188312],[-79.927088,32.821357],[-80.151643,33.024004],[-80.359767,33.259513],[-80.222843,33.445728],[-80.10235,33.495021],[-80.053058,33.505975]]]}},
+{"type":"Feature","id":"45017","properties":{"name":"Calhoun"},"geometry":{"type":"Polygon","coordinates":[[[-81.044384,33.796253],[-81.011523,33.878407],[-80.62266,33.741483],[-80.535029,33.642898],[-80.49669,33.560744],[-81.044384,33.708622],[-81.044384,33.796253]]]}},
+{"type":"Feature","id":"45019","properties":{"name":"Charleston"},"geometry":{"type":"Polygon","coordinates":[[[-79.49441,33.188312],[-79.445118,33.215697],[-79.291763,33.111635],[-80.250228,32.531079],[-80.403582,32.859696],[-80.151643,33.024004],[-79.927088,32.821357],[-79.49441,33.188312]]]}},
+{"type":"Feature","id":"45021","properties":{"name":"Cherokee"},"geometry":{"type":"Polygon","coordinates":[[[-81.76734,35.181919],[-81.367524,35.165488],[-81.455155,34.836871],[-81.712571,34.913548],[-81.876879,35.181919],[-81.76734,35.181919]]]}},
+{"type":"Feature","id":"45023","properties":{"name":"Chester"},"geometry":{"type":"Polygon","coordinates":[[[-81.28537,34.820441],[-80.896507,34.820441],[-80.880076,34.541117],[-81.416816,34.573978],[-81.422293,34.573978],[-81.477062,34.820441],[-81.28537,34.820441]]]}},
+{"type":"Feature","id":"45025","properties":{"name":"Chesterfield"},"geometry":{"type":"Polygon","coordinates":[[[-80.562413,34.814964],[-80.321428,34.814964],[-79.927088,34.80401],[-79.828503,34.530163],[-79.866842,34.508255],[-80.288566,34.365854],[-80.387151,34.595886],[-80.409059,34.612317],[-80.562413,34.814964]]]}},
+{"type":"Feature","id":"45027","properties":{"name":"Clarendon"},"geometry":{"type":"Polygon","coordinates":[[[-80.332382,33.779822],[-79.976381,33.94413],[-79.877796,33.883884],[-80.10235,33.495021],[-80.222843,33.445728],[-80.49669,33.560744],[-80.535029,33.642898],[-80.332382,33.779822]]]}},
+{"type":"Feature","id":"45029","properties":{"name":"Colleton"},"geometry":{"type":"Polygon","coordinates":[[[-80.792445,33.182835],[-80.403582,32.859696],[-80.250228,32.531079],[-80.474782,32.487264],[-80.825307,32.706342],[-81.055338,33.002096],[-81.082723,33.024004],[-80.797922,33.177358],[-80.792445,33.182835]]]}},
+{"type":"Feature","id":"45031","properties":{"name":"Darlington"},"geometry":{"type":"Polygon","coordinates":[[[-79.866842,34.508255],[-79.828503,34.530163],[-79.658718,34.305608],[-80.074966,34.08653],[-80.244751,34.322039],[-80.288566,34.365854],[-80.288566,34.365854],[-79.866842,34.508255]]]}},
+{"type":"Feature","id":"45033","properties":{"name":"Dillon"},"geometry":{"type":"Polygon","coordinates":[[[-79.450595,34.623271],[-79.072686,34.300131],[-79.078163,34.294654],[-79.127455,34.256316],[-79.36844,34.300131],[-79.549179,34.228931],[-79.631334,34.300131],[-79.450595,34.623271]]]}},
+{"type":"Feature","id":"45035","properties":{"name":"Dorchester"},"geometry":{"type":"Polygon","coordinates":[[[-80.502167,33.33619],[-80.359767,33.259513],[-80.151643,33.024004],[-80.403582,32.859696],[-80.792445,33.182835],[-80.502167,33.33619]]]}},
+{"type":"Feature","id":"45037","properties":{"name":"Edgefield"},"geometry":{"type":"Polygon","coordinates":[[[-82.008326,33.960561],[-81.652325,33.812683],[-82.013803,33.53336],[-82.030233,33.544313],[-82.117864,33.599083],[-82.046664,33.955084],[-82.008326,33.960561]]]}},
+{"type":"Feature","id":"45039","properties":{"name":"Fairfield"},"geometry":{"type":"Polygon","coordinates":[[[-81.416816,34.573978],[-80.880076,34.541117],[-80.880076,34.458962],[-80.825307,34.26727],[-80.863645,34.261793],[-81.318231,34.239885],[-81.422293,34.491824],[-81.422293,34.573978],[-81.416816,34.573978]]]}},
+{"type":"Feature","id":"45041","properties":{"name":"Florence"},"geometry":{"type":"Polygon","coordinates":[[[-79.658718,34.305608],[-79.631334,34.300131],[-79.549179,34.228931],[-79.324625,33.80173],[-79.83398,33.883884],[-79.877796,33.883884],[-79.976381,33.94413],[-79.998289,34.048192],[-80.074966,34.08653],[-79.658718,34.305608]]]}},
+{"type":"Feature","id":"45043","properties":{"name":"Georgetown"},"geometry":{"type":"Polygon","coordinates":[[[-79.319148,33.779822],[-79.319148,33.779822],[-79.187701,33.703145],[-79.001485,33.571698],[-79.291763,33.111635],[-79.445118,33.215697],[-79.675149,33.303328],[-79.319148,33.779822]]]}},
+{"type":"Feature","id":"45045","properties":{"name":"Greenville"},"geometry":{"type":"Polygon","coordinates":[[[-82.353373,35.192872],[-82.216449,35.198349],[-82.145249,34.787579],[-82.315034,34.486347],[-82.484819,34.820441],[-82.621743,35.066903],[-82.764143,35.066903],[-82.572451,35.14358],[-82.353373,35.192872]]]}},
+{"type":"Feature","id":"45047","properties":{"name":"Greenwood"},"geometry":{"type":"Polygon","coordinates":[[[-82.243834,34.40967],[-81.942602,34.201546],[-81.871402,34.135823],[-82.008326,33.960561],[-82.046664,33.955084],[-82.325988,34.064623],[-82.243834,34.40967]]]}},
+{"type":"Feature","id":"45049","properties":{"name":"Hampton"},"geometry":{"type":"Polygon","coordinates":[[[-81.055338,33.002096],[-80.825307,32.706342],[-80.869122,32.662526],[-81.142969,32.657049],[-81.279893,32.558464],[-81.389431,32.596803],[-81.411339,32.74468],[-81.082723,33.024004],[-81.055338,33.002096]]]}},
+{"type":"Feature","id":"45051","properties":{"name":"Horry"},"geometry":{"type":"Polygon","coordinates":[[[-79.078163,34.294654],[-79.072686,34.300131],[-78.650961,33.94413],[-78.541422,33.851022],[-79.001485,33.571698],[-79.187701,33.703145],[-79.127455,34.256316],[-79.078163,34.294654]]]}},
+{"type":"Feature","id":"45053","properties":{"name":"Jasper"},"geometry":{"type":"Polygon","coordinates":[[[-81.142969,32.657049],[-80.869122,32.662526],[-80.880076,32.08197],[-80.885553,32.032678],[-81.148446,32.224371],[-81.279893,32.558464],[-81.142969,32.657049]]]}},
+{"type":"Feature","id":"45055","properties":{"name":"Kershaw"},"geometry":{"type":"Polygon","coordinates":[[[-80.387151,34.595886],[-80.288566,34.365854],[-80.288566,34.365854],[-80.480259,34.168685],[-80.617183,34.097484],[-80.825307,34.26727],[-80.880076,34.458962],[-80.409059,34.612317],[-80.387151,34.595886]]]}},
+{"type":"Feature","id":"45057","properties":{"name":"Lancaster"},"geometry":{"type":"Polygon","coordinates":[[[-80.907461,35.077857],[-80.907461,35.077857],[-80.841737,35.00118],[-80.562413,34.814964],[-80.409059,34.612317],[-80.880076,34.458962],[-80.880076,34.541117],[-80.896507,34.820441],[-80.907461,35.077857]]]}},
+{"type":"Feature","id":"45059","properties":{"name":"Laurens"},"geometry":{"type":"Polygon","coordinates":[[[-82.145249,34.787579],[-81.854971,34.595886],[-81.641371,34.53564],[-81.646848,34.519209],[-81.942602,34.201546],[-82.243834,34.40967],[-82.315034,34.486347],[-82.145249,34.787579]]]}},
+{"type":"Feature","id":"45061","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-80.244751,34.322039],[-80.074966,34.08653],[-79.998289,34.048192],[-80.480259,34.168685],[-80.288566,34.365854],[-80.244751,34.322039]]]}},
+{"type":"Feature","id":"45063","properties":{"name":"Lexington"},"geometry":{"type":"Polygon","coordinates":[[[-81.340139,34.196069],[-81.011523,33.878407],[-81.044384,33.796253],[-81.044384,33.708622],[-81.186785,33.653852],[-81.57017,33.878407],[-81.471585,34.075577],[-81.340139,34.196069]]]}},
+{"type":"Feature","id":"45065","properties":{"name":"McCormick"},"geometry":{"type":"Polygon","coordinates":[[[-82.594358,34.01533],[-82.325988,34.064623],[-82.046664,33.955084],[-82.117864,33.599083],[-82.216449,33.686714],[-82.566974,33.955084],[-82.594358,34.01533]]]}},
+{"type":"Feature","id":"45067","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-79.36844,34.300131],[-79.127455,34.256316],[-79.187701,33.703145],[-79.319148,33.779822],[-79.324625,33.80173],[-79.549179,34.228931],[-79.36844,34.300131]]]}},
+{"type":"Feature","id":"45069","properties":{"name":"Marlboro"},"geometry":{"type":"Polygon","coordinates":[[[-79.927088,34.80401],[-79.686103,34.80401],[-79.461548,34.628748],[-79.450595,34.623271],[-79.631334,34.300131],[-79.658718,34.305608],[-79.828503,34.530163],[-79.927088,34.80401]]]}},
+{"type":"Feature","id":"45071","properties":{"name":"Newberry"},"geometry":{"type":"Polygon","coordinates":[[[-81.646848,34.519209],[-81.641371,34.53564],[-81.422293,34.491824],[-81.318231,34.239885],[-81.340139,34.196069],[-81.471585,34.075577],[-81.739956,34.185115],[-81.871402,34.135823],[-81.942602,34.201546],[-81.646848,34.519209]]]}},
+{"type":"Feature","id":"45073","properties":{"name":"Oconee"},"geometry":{"type":"Polygon","coordinates":[[[-82.89559,35.055949],[-82.840821,34.623271],[-82.846298,34.617794],[-82.857251,34.60684],[-82.994175,34.48087],[-83.048944,34.497301],[-83.103714,34.53564],[-83.278976,34.645178],[-83.339222,34.688994],[-83.350176,34.716379],[-83.109191,35.00118],[-83.010606,35.028564],[-82.89559,35.055949]]]}},
+{"type":"Feature","id":"45075","properties":{"name":"Orangeburg"},"geometry":{"type":"Polygon","coordinates":[[[-81.044384,33.708622],[-80.49669,33.560744],[-80.222843,33.445728],[-80.359767,33.259513],[-80.502167,33.33619],[-80.792445,33.182835],[-80.797922,33.177358],[-81.10463,33.380005],[-81.225123,33.440252],[-81.373001,33.489544],[-81.186785,33.653852],[-81.044384,33.708622]]]}},
+{"type":"Feature","id":"45077","properties":{"name":"Pickens"},"geometry":{"type":"Polygon","coordinates":[[[-82.621743,35.066903],[-82.484819,34.820441],[-82.490296,34.820441],[-82.840821,34.623271],[-82.89559,35.055949],[-82.764143,35.066903],[-82.621743,35.066903]]]}},
+{"type":"Feature","id":"45079","properties":{"name":"Richland"},"geometry":{"type":"Polygon","coordinates":[[[-80.863645,34.261793],[-80.825307,34.26727],[-80.617183,34.097484],[-80.62266,33.741483],[-81.011523,33.878407],[-81.340139,34.196069],[-81.318231,34.239885],[-80.863645,34.261793]]]}},
+{"type":"Feature","id":"45081","properties":{"name":"Saluda"},"geometry":{"type":"Polygon","coordinates":[[[-81.739956,34.185115],[-81.471585,34.075577],[-81.57017,33.878407],[-81.652325,33.812683],[-82.008326,33.960561],[-81.871402,34.135823],[-81.739956,34.185115]]]}},
+{"type":"Feature","id":"45083","properties":{"name":"Spartanburg"},"geometry":{"type":"Polygon","coordinates":[[[-82.216449,35.198349],[-81.969987,35.187396],[-81.876879,35.181919],[-81.712571,34.913548],[-81.712571,34.913548],[-81.854971,34.595886],[-82.145249,34.787579],[-82.216449,35.198349]]]}},
+{"type":"Feature","id":"45085","properties":{"name":"Sumter"},"geometry":{"type":"Polygon","coordinates":[[[-80.480259,34.168685],[-79.998289,34.048192],[-79.976381,33.94413],[-80.332382,33.779822],[-80.535029,33.642898],[-80.62266,33.741483],[-80.617183,34.097484],[-80.480259,34.168685]]]}},
+{"type":"Feature","id":"45087","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-81.712571,34.913548],[-81.712571,34.913548],[-81.455155,34.836871],[-81.477062,34.820441],[-81.422293,34.573978],[-81.422293,34.491824],[-81.641371,34.53564],[-81.854971,34.595886],[-81.712571,34.913548]]]}},
+{"type":"Feature","id":"45089","properties":{"name":"Williamsburg"},"geometry":{"type":"Polygon","coordinates":[[[-79.83398,33.883884],[-79.324625,33.80173],[-79.319148,33.779822],[-79.319148,33.779822],[-79.675149,33.303328],[-80.053058,33.505975],[-80.10235,33.495021],[-79.877796,33.883884],[-79.83398,33.883884]]]}},
+{"type":"Feature","id":"45091","properties":{"name":"York"},"geometry":{"type":"Polygon","coordinates":[[[-81.367524,35.165488],[-81.329185,35.165488],[-81.044384,35.149057],[-80.907461,35.077857],[-80.907461,35.077857],[-80.896507,34.820441],[-81.28537,34.820441],[-81.477062,34.820441],[-81.455155,34.836871],[-81.367524,35.165488]]]}},
+{"type":"Feature","id":"46003","properties":{"name":"Aurora"},"geometry":{"type":"Polygon","coordinates":[[[-98.329608,43.939546],[-98.324131,43.851915],[-98.318654,43.501391],[-98.685609,43.501391],[-98.707517,43.501391],[-98.795148,43.501391],[-98.806102,43.934069],[-98.329608,43.939546]]]}},
+{"type":"Feature","id":"46005","properties":{"name":"Beadle"},"geometry":{"type":"Polygon","coordinates":[[[-98.088623,44.629641],[-97.979084,44.629641],[-97.853114,44.54201],[-97.853114,44.196962],[-98.209115,44.196962],[-98.329608,44.196962],[-98.691086,44.196962],[-98.70204,44.196962],[-98.707517,44.635118],[-98.088623,44.629641]]]}},
+{"type":"Feature","id":"46007","properties":{"name":"Bennett"},"geometry":{"type":"Polygon","coordinates":[[[-101.900573,43.391852],[-101.226909,43.391852],[-101.226909,42.997512],[-102.081312,42.997512],[-102.108697,43.391852],[-101.900573,43.391852]]]}},
+{"type":"Feature","id":"46009","properties":{"name":"Bon Homme"},"geometry":{"type":"Polygon","coordinates":[[[-97.754529,43.167298],[-97.639513,43.167298],[-97.634037,42.849635],[-98.154346,42.838681],[-98.077669,43.167298],[-97.754529,43.167298]]]}},
+{"type":"Feature","id":"46011","properties":{"name":"Brookings"},"geometry":{"type":"Polygon","coordinates":[[[-96.451017,44.54201],[-96.451017,44.196962],[-96.648187,44.196962],[-96.889173,44.196962],[-97.130158,44.196962],[-97.130158,44.54201],[-96.883696,44.54201],[-96.451017,44.54201]]]}},
+{"type":"Feature","id":"46013","properties":{"name":"Brown"},"geometry":{"type":"Polygon","coordinates":[[[-98.723948,45.938629],[-98.006468,45.938629],[-97.979084,45.938629],[-97.979084,45.588105],[-97.979084,45.243058],[-98.532255,45.243058],[-98.718471,45.243058],[-98.723948,45.243058],[-98.723948,45.593582],[-98.723948,45.938629]]]}},
+{"type":"Feature","id":"46015","properties":{"name":"Brule"},"geometry":{"type":"Polygon","coordinates":[[[-98.806102,43.934069],[-98.795148,43.501391],[-99.299026,43.501391],[-99.353796,43.934069],[-98.926594,43.934069],[-98.806102,43.934069]]]}},
+{"type":"Feature","id":"46017","properties":{"name":"Buffalo"},"geometry":{"type":"Polygon","coordinates":[[[-98.926594,44.196962],[-98.926594,43.934069],[-99.353796,43.934069],[-99.57835,44.191485],[-99.299026,44.196962],[-98.926594,44.196962]]]}},
+{"type":"Feature","id":"46019","properties":{"name":"Butte"},"geometry":{"type":"Polygon","coordinates":[[[-104.042057,45.210196],[-102.957623,45.210196],[-102.957623,45.040411],[-102.963099,44.602256],[-103.565563,44.602256],[-103.812025,44.602256],[-104.058488,44.569394],[-104.058488,44.996596],[-104.042057,45.210196]]]}},
+{"type":"Feature","id":"46021","properties":{"name":"Campbell"},"geometry":{"type":"Polygon","coordinates":[[[-100.432753,45.944106],[-99.879582,45.944106],[-99.720751,45.938629],[-99.715274,45.593582],[-100.339645,45.593582],[-100.432753,45.593582],[-100.498476,45.944106],[-100.432753,45.944106]]]}},
+{"type":"Feature","id":"46023","properties":{"name":"Charles Mix"},"geometry":{"type":"Polygon","coordinates":[[[-99.299026,43.501391],[-98.795148,43.501391],[-98.707517,43.501391],[-98.11053,43.194682],[-98.077669,43.167298],[-98.154346,42.838681],[-98.3077,42.882497],[-98.499393,42.997512],[-99.299026,43.501391],[-99.299026,43.501391]]]}},
+{"type":"Feature","id":"46025","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-97.924314,45.155427],[-97.491636,45.14995],[-97.491636,44.804903],[-97.491636,44.54201],[-97.732621,44.54201],[-97.853114,44.54201],[-97.979084,44.629641],[-97.979084,45.155427],[-97.924314,45.155427]]]}},
+{"type":"Feature","id":"46027","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-96.807019,43.085144],[-96.807019,42.701758],[-97.015142,42.762004],[-97.16302,42.800343],[-97.157543,43.085144],[-96.922034,43.085144],[-96.807019,43.085144]]]}},
+{"type":"Feature","id":"46029","properties":{"name":"Codington"},"geometry":{"type":"Polygon","coordinates":[[[-97.23422,45.14995],[-97.228743,45.14995],[-96.883696,44.974688],[-96.883696,44.804903],[-97.491636,44.804903],[-97.491636,45.14995],[-97.23422,45.14995]]]}},
+{"type":"Feature","id":"46031","properties":{"name":"Corson"},"geometry":{"type":"Polygon","coordinates":[[[-101.999158,45.944106],[-100.50943,45.944106],[-100.498476,45.944106],[-100.432753,45.593582],[-100.339645,45.47309],[-100.772323,45.47309],[-101.467895,45.47309],[-101.714357,45.47309],[-101.999158,45.47309],[-101.999158,45.944106],[-101.999158,45.944106]]]}},
+{"type":"Feature","id":"46033","properties":{"name":"Custer"},"geometry":{"type":"Polygon","coordinates":[[[-103.417686,43.857392],[-102.809745,43.687607],[-103.001438,43.479483],[-103.937995,43.479483],[-104.053011,43.479483],[-104.053011,43.501391],[-104.053011,43.851915],[-103.417686,43.857392]]]}},
+{"type":"Feature","id":"46035","properties":{"name":"Davison"},"geometry":{"type":"Polygon","coordinates":[[[-98.203638,43.851915],[-97.96813,43.851915],[-97.962653,43.501391],[-98.116007,43.495914],[-98.318654,43.501391],[-98.324131,43.851915],[-98.203638,43.851915]]]}},
+{"type":"Feature","id":"46037","properties":{"name":"Day"},"geometry":{"type":"Polygon","coordinates":[[[-97.979084,45.588105],[-97.228743,45.560721],[-97.228743,45.297827],[-97.228743,45.14995],[-97.23422,45.14995],[-97.491636,45.14995],[-97.924314,45.155427],[-97.979084,45.155427],[-97.979084,45.243058],[-97.979084,45.588105]]]}},
+{"type":"Feature","id":"46039","properties":{"name":"Deuel"},"geometry":{"type":"Polygon","coordinates":[[[-96.451017,44.980165],[-96.451017,44.804903],[-96.451017,44.629641],[-96.451017,44.54201],[-96.883696,44.54201],[-96.883696,44.804903],[-96.883696,44.974688],[-96.451017,44.980165]]]}},
+{"type":"Feature","id":"46041","properties":{"name":"Dewey"},"geometry":{"type":"Polygon","coordinates":[[[-100.772323,45.47309],[-100.339645,45.47309],[-100.257491,45.248535],[-100.405368,44.898011],[-100.717554,44.772041],[-101.139278,44.744656],[-101.500756,44.991119],[-101.467895,45.47309],[-100.772323,45.47309]]]}},
+{"type":"Feature","id":"46043","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-98.685609,43.501391],[-98.318654,43.501391],[-98.116007,43.495914],[-98.11053,43.194682],[-98.707517,43.501391],[-98.685609,43.501391]]]}},
+{"type":"Feature","id":"46045","properties":{"name":"Edmunds"},"geometry":{"type":"Polygon","coordinates":[[[-99.709797,45.593582],[-98.723948,45.593582],[-98.723948,45.243058],[-99.572873,45.243058],[-99.709797,45.243058],[-99.709797,45.593582]]]}},
+{"type":"Feature","id":"46047","properties":{"name":"Fall River"},"geometry":{"type":"Polygon","coordinates":[[[-103.937995,43.479483],[-103.001438,43.479483],[-103.001438,43.002989],[-103.324578,43.002989],[-103.505317,43.002989],[-104.053011,43.002989],[-104.053011,43.479483],[-103.937995,43.479483]]]}},
+{"type":"Feature","id":"46049","properties":{"name":"Faulk"},"geometry":{"type":"Polygon","coordinates":[[[-99.572873,45.243058],[-98.723948,45.243058],[-98.718471,45.243058],[-98.718471,44.898011],[-99.30998,44.898011],[-99.572873,44.898011],[-99.572873,45.243058]]]}},
+{"type":"Feature","id":"46051","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-96.681049,45.325212],[-96.472925,45.325212],[-96.456494,45.303304],[-96.451017,45.297827],[-96.451017,45.270443],[-96.451017,44.980165],[-96.883696,44.974688],[-97.228743,45.14995],[-97.228743,45.297827],[-96.681049,45.325212]]]}},
+{"type":"Feature","id":"46053","properties":{"name":"Gregory"},"geometry":{"type":"Polygon","coordinates":[[[-99.534535,43.501391],[-99.299026,43.501391],[-98.499393,42.997512],[-99.255211,42.997512],[-99.534535,42.997512],[-99.534535,43.501391]]]}},
+{"type":"Feature","id":"46055","properties":{"name":"Haakon"},"geometry":{"type":"Polygon","coordinates":[[[-101.380264,44.657025],[-101.139278,44.744656],[-101.04617,44.169578],[-101.062601,43.994316],[-101.407648,43.994316],[-102.004635,43.994316],[-101.999158,44.509148],[-101.999158,44.509148],[-101.380264,44.657025]]]}},
+{"type":"Feature","id":"46057","properties":{"name":"Hamlin"},"geometry":{"type":"Polygon","coordinates":[[[-96.883696,44.804903],[-96.883696,44.54201],[-97.130158,44.54201],[-97.491636,44.54201],[-97.491636,44.804903],[-96.883696,44.804903]]]}},
+{"type":"Feature","id":"46059","properties":{"name":"Hand"},"geometry":{"type":"Polygon","coordinates":[[[-99.30998,44.898011],[-98.718471,44.898011],[-98.707517,44.635118],[-98.70204,44.196962],[-98.926594,44.196962],[-99.299026,44.196962],[-99.30998,44.898011]]]}},
+{"type":"Feature","id":"46061","properties":{"name":"Hanson"},"geometry":{"type":"Polygon","coordinates":[[[-97.853114,43.851915],[-97.606652,43.846438],[-97.606652,43.501391],[-97.962653,43.501391],[-97.96813,43.851915],[-97.853114,43.851915]]]}},
+{"type":"Feature","id":"46063","properties":{"name":"Harding"},"geometry":{"type":"Polygon","coordinates":[[[-104.047534,45.944106],[-102.995961,45.944106],[-102.941192,45.944106],[-102.957623,45.210196],[-104.042057,45.210196],[-104.042057,45.88386],[-104.047534,45.944106]]]}},
+{"type":"Feature","id":"46065","properties":{"name":"Hughes"},"geometry":{"type":"Polygon","coordinates":[[[-99.857674,44.547487],[-99.676935,44.547487],[-99.665981,44.21887],[-99.939828,44.196962],[-100.525861,44.547487],[-99.857674,44.547487]]]}},
+{"type":"Feature","id":"46067","properties":{"name":"Hutchinson"},"geometry":{"type":"Polygon","coordinates":[[[-97.606652,43.501391],[-97.404005,43.501391],[-97.398528,43.167298],[-97.639513,43.167298],[-97.754529,43.167298],[-98.077669,43.167298],[-98.11053,43.194682],[-98.116007,43.495914],[-97.962653,43.501391],[-97.606652,43.501391]]]}},
+{"type":"Feature","id":"46069","properties":{"name":"Hyde"},"geometry":{"type":"Polygon","coordinates":[[[-99.572873,44.898011],[-99.30998,44.898011],[-99.299026,44.196962],[-99.57835,44.191485],[-99.665981,44.21887],[-99.676935,44.547487],[-99.676935,44.898011],[-99.572873,44.898011]]]}},
+{"type":"Feature","id":"46071","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-101.407648,43.994316],[-101.062601,43.994316],[-101.062601,43.840961],[-101.226909,43.391852],[-101.900573,43.391852],[-102.108697,43.391852],[-102.141558,43.698561],[-102.004635,43.994316],[-101.407648,43.994316]]]}},
+{"type":"Feature","id":"46073","properties":{"name":"Jerauld"},"geometry":{"type":"Polygon","coordinates":[[[-98.691086,44.196962],[-98.329608,44.196962],[-98.329608,43.939546],[-98.806102,43.934069],[-98.926594,43.934069],[-98.926594,44.196962],[-98.70204,44.196962],[-98.691086,44.196962]]]}},
+{"type":"Feature","id":"46075","properties":{"name":"Jones"},"geometry":{"type":"Polygon","coordinates":[[[-101.013309,44.169578],[-100.36703,44.169578],[-100.339645,43.714992],[-101.062601,43.840961],[-101.062601,43.994316],[-101.04617,44.169578],[-101.013309,44.169578]]]}},
+{"type":"Feature","id":"46077","properties":{"name":"Kingsbury"},"geometry":{"type":"Polygon","coordinates":[[[-97.732621,44.54201],[-97.491636,44.54201],[-97.130158,44.54201],[-97.130158,44.196962],[-97.217789,44.196962],[-97.371143,44.196962],[-97.727145,44.196962],[-97.847637,44.196962],[-97.853114,44.196962],[-97.853114,44.54201],[-97.732621,44.54201]]]}},
+{"type":"Feature","id":"46079","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-97.217789,44.196962],[-97.130158,44.196962],[-96.889173,44.196962],[-96.889173,43.846438],[-97.130158,43.846438],[-97.371143,43.846438],[-97.371143,44.196962],[-97.217789,44.196962]]]}},
+{"type":"Feature","id":"46081","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-103.812025,44.602256],[-103.565563,44.602256],[-103.450547,44.142193],[-104.053011,44.142193],[-104.053011,44.180532],[-104.058488,44.569394],[-103.812025,44.602256]]]}},
+{"type":"Feature","id":"46083","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-96.779634,43.501391],[-96.598895,43.501391],[-96.555079,43.260406],[-96.456494,43.085144],[-96.626279,43.085144],[-96.807019,43.085144],[-96.922034,43.085144],[-96.922034,43.501391],[-96.779634,43.501391]]]}},
+{"type":"Feature","id":"46085","properties":{"name":"Lyman"},"geometry":{"type":"Polygon","coordinates":[[[-100.224629,44.196962],[-99.939828,44.196962],[-99.665981,44.21887],[-99.57835,44.191485],[-99.353796,43.934069],[-99.299026,43.501391],[-99.299026,43.501391],[-99.534535,43.501391],[-99.665981,43.75333],[-100.230106,43.714992],[-100.339645,43.714992],[-100.36703,44.169578],[-100.224629,44.196962]]]}},
+{"type":"Feature","id":"46087","properties":{"name":"McCook"},"geometry":{"type":"Polygon","coordinates":[[[-97.491636,43.846438],[-97.371143,43.846438],[-97.130158,43.846438],[-97.130158,43.501391],[-97.404005,43.501391],[-97.606652,43.501391],[-97.606652,43.846438],[-97.491636,43.846438]]]}},
+{"type":"Feature","id":"46089","properties":{"name":"McPherson"},"geometry":{"type":"Polygon","coordinates":[[[-99.720751,45.938629],[-99.003272,45.938629],[-98.723948,45.938629],[-98.723948,45.593582],[-99.709797,45.593582],[-99.715274,45.593582],[-99.720751,45.938629]]]}},
+{"type":"Feature","id":"46091","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-97.853114,45.933153],[-97.228743,45.933153],[-97.228743,45.560721],[-97.979084,45.588105],[-97.979084,45.938629],[-97.853114,45.933153]]]}},
+{"type":"Feature","id":"46093","properties":{"name":"Meade"},"geometry":{"type":"Polygon","coordinates":[[[-102.042974,45.040411],[-101.999158,45.040411],[-101.999158,44.509148],[-101.999158,44.509148],[-102.119651,44.437948],[-102.388021,44.142193],[-103.450547,44.142193],[-103.565563,44.602256],[-102.963099,44.602256],[-102.957623,45.040411],[-102.042974,45.040411]]]}},
+{"type":"Feature","id":"46095","properties":{"name":"Mellette"},"geometry":{"type":"Polygon","coordinates":[[[-101.062601,43.840961],[-100.339645,43.714992],[-100.230106,43.714992],[-100.213675,43.391852],[-100.235583,43.391852],[-101.226909,43.391852],[-101.062601,43.840961]]]}},
+{"type":"Feature","id":"46097","properties":{"name":"Miner"},"geometry":{"type":"Polygon","coordinates":[[[-97.727145,44.196962],[-97.371143,44.196962],[-97.371143,43.846438],[-97.491636,43.846438],[-97.606652,43.846438],[-97.853114,43.851915],[-97.847637,44.196962],[-97.727145,44.196962]]]}},
+{"type":"Feature","id":"46099","properties":{"name":"Minnehaha"},"geometry":{"type":"Polygon","coordinates":[[[-96.489356,43.846438],[-96.451017,43.851915],[-96.451017,43.501391],[-96.598895,43.501391],[-96.779634,43.501391],[-96.922034,43.501391],[-97.130158,43.501391],[-97.130158,43.846438],[-96.889173,43.846438],[-96.489356,43.846438]]]}},
+{"type":"Feature","id":"46101","properties":{"name":"Moody"},"geometry":{"type":"Polygon","coordinates":[[[-96.648187,44.196962],[-96.451017,44.196962],[-96.451017,43.851915],[-96.489356,43.846438],[-96.889173,43.846438],[-96.889173,44.196962],[-96.648187,44.196962]]]}},
+{"type":"Feature","id":"46103","properties":{"name":"Pennington"},"geometry":{"type":"Polygon","coordinates":[[[-102.119651,44.437948],[-101.999158,44.509148],[-102.004635,43.994316],[-102.141558,43.698561],[-102.256574,43.687607],[-102.809745,43.687607],[-103.417686,43.857392],[-104.053011,43.851915],[-104.053011,44.142193],[-103.450547,44.142193],[-102.388021,44.142193],[-102.119651,44.437948]]]}},
+{"type":"Feature","id":"46105","properties":{"name":"Perkins"},"geometry":{"type":"Polygon","coordinates":[[[-102.623529,45.944106],[-101.999158,45.944106],[-101.999158,45.47309],[-101.999158,45.040411],[-102.042974,45.040411],[-102.957623,45.040411],[-102.957623,45.210196],[-102.941192,45.944106],[-102.623529,45.944106]]]}},
+{"type":"Feature","id":"46107","properties":{"name":"Potter"},"geometry":{"type":"Polygon","coordinates":[[[-100.257491,45.248535],[-99.709797,45.243058],[-99.572873,45.243058],[-99.572873,44.898011],[-99.676935,44.898011],[-100.405368,44.898011],[-100.257491,45.248535]]]}},
+{"type":"Feature","id":"46109","properties":{"name":"Roberts"},"geometry":{"type":"Polygon","coordinates":[[[-96.735818,45.933153],[-96.560556,45.933153],[-96.834403,45.588105],[-96.472925,45.325212],[-96.681049,45.325212],[-97.228743,45.297827],[-97.228743,45.560721],[-97.228743,45.933153],[-96.735818,45.933153]]]}},
+{"type":"Feature","id":"46111","properties":{"name":"Sanborn"},"geometry":{"type":"Polygon","coordinates":[[[-98.209115,44.196962],[-97.853114,44.196962],[-97.847637,44.196962],[-97.853114,43.851915],[-97.96813,43.851915],[-98.203638,43.851915],[-98.324131,43.851915],[-98.329608,43.939546],[-98.329608,44.196962],[-98.209115,44.196962]]]}},
+{"type":"Feature","id":"46113","properties":{"name":"Shannon"},"geometry":{"type":"Polygon","coordinates":[[[-102.256574,43.687607],[-102.141558,43.698561],[-102.108697,43.391852],[-102.081312,42.997512],[-102.081312,42.997512],[-102.793314,42.997512],[-103.001438,43.002989],[-103.001438,43.479483],[-102.809745,43.687607],[-102.256574,43.687607]]]}},
+{"type":"Feature","id":"46115","properties":{"name":"Spink"},"geometry":{"type":"Polygon","coordinates":[[[-98.532255,45.243058],[-97.979084,45.243058],[-97.979084,45.155427],[-97.979084,44.629641],[-98.088623,44.629641],[-98.707517,44.635118],[-98.718471,44.898011],[-98.718471,45.243058],[-98.532255,45.243058]]]}},
+{"type":"Feature","id":"46117","properties":{"name":"Stanley"},"geometry":{"type":"Polygon","coordinates":[[[-100.717554,44.772041],[-100.525861,44.547487],[-99.939828,44.196962],[-100.224629,44.196962],[-100.36703,44.169578],[-101.013309,44.169578],[-101.04617,44.169578],[-101.139278,44.744656],[-100.717554,44.772041]]]}},
+{"type":"Feature","id":"46119","properties":{"name":"Sully"},"geometry":{"type":"Polygon","coordinates":[[[-100.405368,44.898011],[-99.676935,44.898011],[-99.676935,44.547487],[-99.857674,44.547487],[-100.525861,44.547487],[-100.717554,44.772041],[-100.405368,44.898011]]]}},
+{"type":"Feature","id":"46121","properties":{"name":"Todd"},"geometry":{"type":"Polygon","coordinates":[[[-100.235583,43.391852],[-100.213675,43.391852],[-100.197245,42.997512],[-101.226909,42.997512],[-101.226909,43.391852],[-100.235583,43.391852]]]}},
+{"type":"Feature","id":"46123","properties":{"name":"Tripp"},"geometry":{"type":"Polygon","coordinates":[[[-99.665981,43.75333],[-99.534535,43.501391],[-99.534535,42.997512],[-100.126044,42.997512],[-100.197245,42.997512],[-100.213675,43.391852],[-100.230106,43.714992],[-99.665981,43.75333]]]}},
+{"type":"Feature","id":"46125","properties":{"name":"Turner"},"geometry":{"type":"Polygon","coordinates":[[[-96.922034,43.501391],[-96.922034,43.085144],[-97.157543,43.085144],[-97.343759,43.167298],[-97.398528,43.167298],[-97.404005,43.501391],[-97.130158,43.501391],[-96.922034,43.501391]]]}},
+{"type":"Feature","id":"46127","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-96.626279,43.085144],[-96.456494,43.085144],[-96.538648,42.909881],[-96.50031,42.559357],[-96.44554,42.488157],[-96.631756,42.526496],[-96.807019,42.701758],[-96.807019,43.085144],[-96.626279,43.085144]]]}},
+{"type":"Feature","id":"46129","properties":{"name":"Walworth"},"geometry":{"type":"Polygon","coordinates":[[[-100.339645,45.593582],[-99.715274,45.593582],[-99.709797,45.593582],[-99.709797,45.243058],[-100.257491,45.248535],[-100.339645,45.47309],[-100.432753,45.593582],[-100.339645,45.593582]]]}},
+{"type":"Feature","id":"46135","properties":{"name":"Yankton"},"geometry":{"type":"Polygon","coordinates":[[[-97.343759,43.167298],[-97.157543,43.085144],[-97.16302,42.800343],[-97.486159,42.849635],[-97.634037,42.849635],[-97.639513,43.167298],[-97.398528,43.167298],[-97.343759,43.167298]]]}},
+{"type":"Feature","id":"46137","properties":{"name":"Ziebach"},"geometry":{"type":"Polygon","coordinates":[[[-101.714357,45.47309],[-101.467895,45.47309],[-101.500756,44.991119],[-101.139278,44.744656],[-101.380264,44.657025],[-101.999158,44.509148],[-101.999158,45.040411],[-101.999158,45.47309],[-101.714357,45.47309]]]}},
+{"type":"Feature","id":"47001","properties":{"name":"Anderson"},"geometry":{"type":"Polygon","coordinates":[[[-84.001932,36.27183],[-83.941686,36.184199],[-84.270302,35.910352],[-84.341502,36.047275],[-84.440087,36.162291],[-84.374364,36.21706],[-84.001932,36.27183]]]}},
+{"type":"Feature","id":"47003","properties":{"name":"Bedford"},"geometry":{"type":"Polygon","coordinates":[[[-86.521325,35.691274],[-86.247477,35.631028],[-86.258431,35.41195],[-86.526801,35.357181],[-86.598002,35.362658],[-86.641817,35.685797],[-86.521325,35.691274]]]}},
+{"type":"Feature","id":"47005","properties":{"name":"Benton"},"geometry":{"type":"Polygon","coordinates":[[[-87.989145,36.359461],[-87.983668,36.353984],[-87.950806,36.244445],[-87.96176,35.839151],[-87.972714,35.817244],[-88.175361,35.844628],[-88.213699,36.118475],[-87.989145,36.359461]]]}},
+{"type":"Feature","id":"47007","properties":{"name":"Bledsoe"},"geometry":{"type":"Polygon","coordinates":[[[-85.256151,35.767951],[-85.256151,35.767951],[-84.916581,35.762474],[-85.135659,35.455766],[-85.22329,35.351704],[-85.425936,35.565304],[-85.256151,35.767951]]]}},
+{"type":"Feature","id":"47009","properties":{"name":"Blount"},"geometry":{"type":"Polygon","coordinates":[[[-83.793808,35.888444],[-83.662362,35.570781],[-83.952639,35.461243],[-83.963593,35.461243],[-84.188148,35.60912],[-84.16624,35.80629],[-83.793808,35.888444]]]}},
+{"type":"Feature","id":"47011","properties":{"name":"Bradley"},"geometry":{"type":"Polygon","coordinates":[[[-84.872765,35.357181],[-84.861812,35.351704],[-84.70298,35.242165],[-84.774181,34.990226],[-84.812519,34.990226],[-84.976827,34.990226],[-84.943966,35.28598],[-84.872765,35.357181]]]}},
+{"type":"Feature","id":"47013","properties":{"name":"Campbell"},"geometry":{"type":"Polygon","coordinates":[[[-84.226487,36.589492],[-83.985501,36.589492],[-83.903347,36.419707],[-84.001932,36.27183],[-84.374364,36.21706],[-84.259348,36.589492],[-84.226487,36.589492]]]}},
+{"type":"Feature","id":"47015","properties":{"name":"Cannon"},"geometry":{"type":"Polygon","coordinates":[[[-86.017446,35.959644],[-85.885999,35.839151],[-85.984584,35.658412],[-86.209139,35.702228],[-86.15437,35.954167],[-86.017446,35.959644]]]}},
+{"type":"Feature","id":"47017","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-88.531362,36.151337],[-88.213699,36.118475],[-88.175361,35.844628],[-88.180837,35.817244],[-88.514931,35.822721],[-88.608039,35.789859],[-88.706624,35.789859],[-88.690193,36.063706],[-88.531362,36.151337]]]}},
+{"type":"Feature","id":"47019","properties":{"name":"Carter"},"geometry":{"type":"Polygon","coordinates":[[[-81.986418,36.507338],[-81.931648,36.266353],[-82.079526,36.107521],[-82.221926,36.156814],[-82.320511,36.260876],[-82.342419,36.255399],[-82.298603,36.397799],[-81.986418,36.507338]]]}},
+{"type":"Feature","id":"47021","properties":{"name":"Cheatham"},"geometry":{"type":"Polygon","coordinates":[[[-87.118311,36.458046],[-86.915664,36.381369],[-87.052588,36.047275],[-87.184034,36.047275],[-87.288096,36.321122],[-87.118311,36.458046]]]}},
+{"type":"Feature","id":"47023","properties":{"name":"Chester"},"geometry":{"type":"Polygon","coordinates":[[[-88.701147,35.477673],[-88.613516,35.587212],[-88.361576,35.417427],[-88.361576,35.379088],[-88.378007,35.373611],[-88.783301,35.247642],[-88.843547,35.428381],[-88.701147,35.477673]]]}},
+{"type":"Feature","id":"47025","properties":{"name":"Claiborne"},"geometry":{"type":"Polygon","coordinates":[[[-83.673316,36.600446],[-83.470669,36.594969],[-83.388515,36.41423],[-83.667839,36.34303],[-83.903347,36.419707],[-83.985501,36.589492],[-83.930732,36.589492],[-83.673316,36.600446]]]}},
+{"type":"Feature","id":"47027","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-85.278059,36.627831],[-85.283536,36.529246],[-85.497137,36.403276],[-85.814799,36.501861],[-85.787415,36.622354],[-85.43689,36.616877],[-85.29449,36.627831],[-85.278059,36.627831]]]}},
+{"type":"Feature","id":"47029","properties":{"name":"Cocke"},"geometry":{"type":"Polygon","coordinates":[[[-83.16396,36.178722],[-82.901067,35.943213],[-82.961313,35.789859],[-83.257068,35.713182],[-83.311837,35.893921],[-83.23516,36.085614],[-83.16396,36.178722]]]}},
+{"type":"Feature","id":"47031","properties":{"name":"Coffee"},"geometry":{"type":"Polygon","coordinates":[[[-86.209139,35.702228],[-85.984584,35.658412],[-85.875046,35.521489],[-85.913384,35.291457],[-86.214616,35.346227],[-86.263908,35.335273],[-86.258431,35.41195],[-86.258431,35.41195],[-86.247477,35.631028],[-86.209139,35.702228]]]}},
+{"type":"Feature","id":"47033","properties":{"name":"Crockett"},"geometry":{"type":"Polygon","coordinates":[[[-89.188594,35.997983],[-88.914747,35.795336],[-89.068102,35.691274],[-89.341949,35.789859],[-89.35838,35.817244],[-89.341949,35.882967],[-89.188594,35.997983],[-89.188594,35.997983]]]}},
+{"type":"Feature","id":"47035","properties":{"name":"Cumberland"},"geometry":{"type":"Polygon","coordinates":[[[-84.987781,36.162291],[-84.905627,36.156814],[-84.681073,35.910352],[-84.779657,35.822721],[-84.916581,35.762474],[-85.256151,35.767951],[-85.256151,35.767951],[-85.272582,35.789859],[-85.267105,35.795336],[-85.261628,35.981552],[-85.102797,36.140383],[-84.987781,36.162291]]]}},
+{"type":"Feature","id":"47037","properties":{"name":"Davidson"},"geometry":{"type":"Polygon","coordinates":[[[-86.76231,36.403276],[-86.756833,36.403276],[-86.592525,36.244445],[-86.515848,36.102045],[-86.619909,35.970598],[-86.921141,36.052752],[-87.052588,36.047275],[-86.915664,36.381369],[-86.76231,36.403276]]]}},
+{"type":"Feature","id":"47039","properties":{"name":"Decatur"},"geometry":{"type":"Polygon","coordinates":[[[-88.175361,35.844628],[-87.972714,35.817244],[-88.005575,35.422904],[-88.022006,35.390042],[-88.241084,35.422904],[-88.180837,35.817244],[-88.175361,35.844628]]]}},
+{"type":"Feature","id":"47041","properties":{"name":"DeKalb"},"geometry":{"type":"Polygon","coordinates":[[[-85.809322,36.129429],[-85.645014,36.014414],[-85.683353,35.833674],[-85.885999,35.839151],[-86.017446,35.959644],[-86.061262,36.085614],[-85.809322,36.129429]]]}},
+{"type":"Feature","id":"47043","properties":{"name":"Dickson"},"geometry":{"type":"Polygon","coordinates":[[[-87.512651,36.332076],[-87.288096,36.321122],[-87.184034,36.047275],[-87.205942,35.959644],[-87.512651,35.992506],[-87.534558,35.992506],[-87.56742,36.178722],[-87.512651,36.332076]]]}},
+{"type":"Feature","id":"47045","properties":{"name":"Dyer"},"geometry":{"type":"Polygon","coordinates":[[[-89.265272,36.206106],[-89.155733,36.206106],[-89.188594,35.997983],[-89.341949,35.882967],[-89.489826,35.94869],[-89.643181,35.904875],[-89.730812,35.997983],[-89.62675,36.184199],[-89.484349,36.211583],[-89.265272,36.206106]]]}},
+{"type":"Feature","id":"47047","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-89.550073,35.400996],[-89.473395,35.400996],[-89.183118,35.395519],[-89.199548,34.995703],[-89.352903,34.995703],[-89.643181,34.995703],[-89.632227,35.373611],[-89.550073,35.400996]]]}},
+{"type":"Feature","id":"47049","properties":{"name":"Fentress"},"geometry":{"type":"Polygon","coordinates":[[[-85.009689,36.567584],[-84.730365,36.523769],[-84.70298,36.370415],[-84.724888,36.375892],[-84.905627,36.156814],[-84.987781,36.162291],[-85.102797,36.140383],[-85.119228,36.14586],[-85.119228,36.408753],[-85.009689,36.567584]]]}},
+{"type":"Feature","id":"47051","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-86.214616,35.346227],[-85.913384,35.291457],[-85.875046,35.225734],[-85.864092,34.990226],[-86.313201,34.990226],[-86.318678,34.990226],[-86.318678,35.127149],[-86.263908,35.335273],[-86.214616,35.346227]]]}},
+{"type":"Feature","id":"47053","properties":{"name":"Gibson"},"geometry":{"type":"Polygon","coordinates":[[[-89.155733,36.206106],[-88.958563,36.222537],[-88.690193,36.063706],[-88.706624,35.789859],[-88.914747,35.795336],[-89.188594,35.997983],[-89.188594,35.997983],[-89.155733,36.206106]]]}},
+{"type":"Feature","id":"47055","properties":{"name":"Giles"},"geometry":{"type":"Polygon","coordinates":[[[-87.129265,35.455766],[-86.95948,35.417427],[-86.828033,35.264073],[-86.838987,34.990226],[-87.211419,35.00118],[-87.222373,35.00118],[-87.205942,35.433858],[-87.129265,35.455766]]]}},
+{"type":"Feature","id":"47057","properties":{"name":"Grainger"},"geometry":{"type":"Polygon","coordinates":[[[-83.278976,36.392322],[-83.257068,36.288261],[-83.465192,36.173245],[-83.602115,36.151337],[-83.667839,36.080137],[-83.733562,36.162291],[-83.667839,36.34303],[-83.388515,36.41423],[-83.278976,36.392322]]]}},
+{"type":"Feature","id":"47059","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-82.632697,36.419707],[-82.594358,36.096568],[-82.605312,36.041798],[-82.786051,35.987029],[-82.901067,35.943213],[-83.16396,36.178722],[-83.081806,36.244445],[-82.703897,36.408753],[-82.632697,36.419707]]]}},
+{"type":"Feature","id":"47061","properties":{"name":"Grundy"},"geometry":{"type":"Polygon","coordinates":[[[-85.590245,35.521489],[-85.557383,35.318842],[-85.601199,35.307888],[-85.875046,35.225734],[-85.913384,35.291457],[-85.875046,35.521489],[-85.606675,35.532443],[-85.590245,35.521489]]]}},
+{"type":"Feature","id":"47063","properties":{"name":"Hamblen"},"geometry":{"type":"Polygon","coordinates":[[[-83.158483,36.332076],[-83.081806,36.244445],[-83.16396,36.178722],[-83.23516,36.085614],[-83.465192,36.173245],[-83.257068,36.288261],[-83.158483,36.332076]]]}},
+{"type":"Feature","id":"47065","properties":{"name":"Hamilton"},"geometry":{"type":"Polygon","coordinates":[[[-85.130182,35.455766],[-85.015166,35.41195],[-84.943966,35.28598],[-84.976827,34.990226],[-84.982304,34.990226],[-85.267105,34.984749],[-85.272582,34.984749],[-85.36569,34.984749],[-85.475229,34.984749],[-85.387598,35.149057],[-85.22329,35.351704],[-85.135659,35.455766],[-85.130182,35.455766]]]}},
+{"type":"Feature","id":"47067","properties":{"name":"Hancock"},"geometry":{"type":"Polygon","coordinates":[[[-82.983221,36.594969],[-82.829867,36.594969],[-83.278976,36.392322],[-83.388515,36.41423],[-83.470669,36.594969],[-82.983221,36.594969]]]}},
+{"type":"Feature","id":"47069","properties":{"name":"Hardeman"},"geometry":{"type":"Polygon","coordinates":[[[-89.150256,35.433858],[-89.079056,35.433858],[-88.843547,35.428381],[-88.783301,35.247642],[-88.788778,34.995703],[-88.821639,34.995703],[-89.018809,34.995703],[-89.199548,34.995703],[-89.183118,35.395519],[-89.150256,35.433858]]]}},
+{"type":"Feature","id":"47071","properties":{"name":"Hardin"},"geometry":{"type":"Polygon","coordinates":[[[-88.361576,35.417427],[-88.241084,35.422904],[-88.022006,35.390042],[-87.983668,35.006656],[-88.202745,34.995703],[-88.252038,34.995703],[-88.361576,34.995703],[-88.378007,34.995703],[-88.361576,35.379088],[-88.361576,35.417427]]]}},
+{"type":"Feature","id":"47073","properties":{"name":"Hawkins"},"geometry":{"type":"Polygon","coordinates":[[[-82.654605,36.594969],[-82.610789,36.594969],[-82.681989,36.430661],[-82.703897,36.408753],[-83.081806,36.244445],[-83.158483,36.332076],[-83.257068,36.288261],[-83.278976,36.392322],[-82.829867,36.594969],[-82.654605,36.594969]]]}},
+{"type":"Feature","id":"47075","properties":{"name":"Haywood"},"geometry":{"type":"Polygon","coordinates":[[[-89.341949,35.789859],[-89.068102,35.691274],[-89.079056,35.433858],[-89.150256,35.433858],[-89.183118,35.395519],[-89.473395,35.400996],[-89.50078,35.581735],[-89.35838,35.817244],[-89.341949,35.789859]]]}},
+{"type":"Feature","id":"47077","properties":{"name":"Henderson"},"geometry":{"type":"Polygon","coordinates":[[[-88.514931,35.822721],[-88.180837,35.817244],[-88.241084,35.422904],[-88.361576,35.417427],[-88.613516,35.587212],[-88.608039,35.789859],[-88.514931,35.822721]]]}},
+{"type":"Feature","id":"47079","properties":{"name":"Henry"},"geometry":{"type":"Polygon","coordinates":[[[-88.514931,36.501861],[-88.487546,36.501861],[-88.054868,36.496384],[-87.989145,36.359461],[-88.213699,36.118475],[-88.531362,36.151337],[-88.514931,36.501861]]]}},
+{"type":"Feature","id":"47081","properties":{"name":"Hickman"},"geometry":{"type":"Polygon","coordinates":[[[-87.512651,35.992506],[-87.205942,35.959644],[-87.216896,35.850105],[-87.337389,35.658412],[-87.660528,35.60912],[-87.720774,35.795336],[-87.715298,35.839151],[-87.534558,35.992506],[-87.512651,35.992506]]]}},
+{"type":"Feature","id":"47083","properties":{"name":"Houston"},"geometry":{"type":"Polygon","coordinates":[[[-87.753636,36.34303],[-87.594805,36.364938],[-87.512651,36.332076],[-87.56742,36.178722],[-87.879606,36.233491],[-87.950806,36.244445],[-87.983668,36.353984],[-87.753636,36.34303]]]}},
+{"type":"Feature","id":"47085","properties":{"name":"Humphreys"},"geometry":{"type":"Polygon","coordinates":[[[-87.879606,36.233491],[-87.56742,36.178722],[-87.534558,35.992506],[-87.715298,35.839151],[-87.96176,35.839151],[-87.950806,36.244445],[-87.879606,36.233491]]]}},
+{"type":"Feature","id":"47087","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-85.814799,36.501861],[-85.497137,36.403276],[-85.497137,36.304691],[-85.497137,36.299214],[-85.781938,36.238968],[-85.825753,36.41423],[-85.814799,36.501861]]]}},
+{"type":"Feature","id":"47089","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-83.602115,36.151337],[-83.465192,36.173245],[-83.23516,36.085614],[-83.311837,35.893921],[-83.673316,36.036321],[-83.667839,36.080137],[-83.602115,36.151337]]]}},
+{"type":"Feature","id":"47091","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-81.827587,36.616877],[-81.646848,36.6114],[-81.679709,36.589492],[-81.734479,36.392322],[-81.920695,36.288261],[-81.931648,36.266353],[-81.986418,36.507338],[-81.827587,36.616877]]]}},
+{"type":"Feature","id":"47093","properties":{"name":"Knox"},"geometry":{"type":"Polygon","coordinates":[[[-83.925255,36.173245],[-83.733562,36.162291],[-83.667839,36.080137],[-83.673316,36.036321],[-83.678792,36.030844],[-83.793808,35.888444],[-84.16624,35.80629],[-84.264825,35.899398],[-84.270302,35.910352],[-83.941686,36.184199],[-83.925255,36.173245]]]}},
+{"type":"Feature","id":"47095","properties":{"name":"Lake"},"geometry":{"type":"Polygon","coordinates":[[[-89.347426,36.501861],[-89.484349,36.211583],[-89.62675,36.184199],[-89.544596,36.337553],[-89.539119,36.496384],[-89.484349,36.496384],[-89.418626,36.496384],[-89.347426,36.501861]]]}},
+{"type":"Feature","id":"47097","properties":{"name":"Lauderdale"},"geometry":{"type":"Polygon","coordinates":[[[-89.489826,35.94869],[-89.341949,35.882967],[-89.35838,35.817244],[-89.50078,35.581735],[-89.643181,35.647459],[-89.911551,35.53792],[-89.643181,35.904875],[-89.489826,35.94869]]]}},
+{"type":"Feature","id":"47099","properties":{"name":"Lawrence"},"geometry":{"type":"Polygon","coordinates":[[[-87.435974,35.455766],[-87.293573,35.444812],[-87.205942,35.433858],[-87.222373,35.00118],[-87.605759,35.00118],[-87.572897,35.400996],[-87.435974,35.455766]]]}},
+{"type":"Feature","id":"47101","properties":{"name":"Lewis"},"geometry":{"type":"Polygon","coordinates":[[[-87.337389,35.658412],[-87.293573,35.444812],[-87.435974,35.455766],[-87.572897,35.400996],[-87.715298,35.48315],[-87.660528,35.60912],[-87.337389,35.658412]]]}},
+{"type":"Feature","id":"47103","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-86.598002,35.362658],[-86.526801,35.357181],[-86.318678,35.127149],[-86.318678,34.990226],[-86.784218,34.990226],[-86.838987,34.990226],[-86.828033,35.264073],[-86.598002,35.362658]]]}},
+{"type":"Feature","id":"47105","properties":{"name":"Loudon"},"geometry":{"type":"Polygon","coordinates":[[[-84.264825,35.899398],[-84.16624,35.80629],[-84.188148,35.60912],[-84.43461,35.669366],[-84.527718,35.625551],[-84.582488,35.641982],[-84.264825,35.899398]]]}},
+{"type":"Feature","id":"47107","properties":{"name":"McMinn"},"geometry":{"type":"Polygon","coordinates":[[[-84.582488,35.641982],[-84.527718,35.625551],[-84.522241,35.620074],[-84.522241,35.60912],[-84.494857,35.28598],[-84.686549,35.253119],[-84.70298,35.242165],[-84.861812,35.351704],[-84.620826,35.641982],[-84.582488,35.641982]]]}},
+{"type":"Feature","id":"47109","properties":{"name":"McNairy"},"geometry":{"type":"Polygon","coordinates":[[[-88.378007,35.373611],[-88.361576,35.379088],[-88.378007,34.995703],[-88.471115,34.995703],[-88.788778,34.995703],[-88.783301,35.247642],[-88.378007,35.373611]]]}},
+{"type":"Feature","id":"47111","properties":{"name":"Macon"},"geometry":{"type":"Polygon","coordinates":[[[-86.203662,36.638785],[-85.979107,36.627831],[-85.787415,36.622354],[-85.814799,36.501861],[-85.825753,36.41423],[-85.979107,36.425184],[-86.231047,36.48543],[-86.203662,36.638785]]]}},
+{"type":"Feature","id":"47113","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-88.914747,35.795336],[-88.706624,35.789859],[-88.608039,35.789859],[-88.613516,35.587212],[-88.701147,35.477673],[-88.843547,35.428381],[-89.079056,35.433858],[-89.068102,35.691274],[-88.914747,35.795336]]]}},
+{"type":"Feature","id":"47115","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-85.601199,35.307888],[-85.557383,35.318842],[-85.387598,35.149057],[-85.475229,34.984749],[-85.606675,34.984749],[-85.864092,34.990226],[-85.875046,35.225734],[-85.601199,35.307888]]]}},
+{"type":"Feature","id":"47117","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-86.784218,35.707705],[-86.685633,35.707705],[-86.641817,35.685797],[-86.598002,35.362658],[-86.828033,35.264073],[-86.95948,35.417427],[-86.784218,35.707705]]]}},
+{"type":"Feature","id":"47119","properties":{"name":"Maury"},"geometry":{"type":"Polygon","coordinates":[[[-87.216896,35.850105],[-86.784218,35.707705],[-86.95948,35.417427],[-87.129265,35.455766],[-87.205942,35.433858],[-87.293573,35.444812],[-87.337389,35.658412],[-87.216896,35.850105]]]}},
+{"type":"Feature","id":"47121","properties":{"name":"Meigs"},"geometry":{"type":"Polygon","coordinates":[[[-84.620826,35.641982],[-84.861812,35.351704],[-84.872765,35.357181],[-84.943966,35.28598],[-85.015166,35.41195],[-84.724888,35.75152],[-84.620826,35.641982]]]}},
+{"type":"Feature","id":"47123","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-84.43461,35.669366],[-84.188148,35.60912],[-83.963593,35.461243],[-84.029317,35.291457],[-84.29221,35.209303],[-84.494857,35.28598],[-84.522241,35.60912],[-84.522241,35.620074],[-84.527718,35.625551],[-84.43461,35.669366]]]}},
+{"type":"Feature","id":"47125","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-87.112834,36.644262],[-87.118311,36.458046],[-87.288096,36.321122],[-87.512651,36.332076],[-87.594805,36.364938],[-87.63862,36.638785],[-87.337389,36.644262],[-87.112834,36.644262]]]}},
+{"type":"Feature","id":"47127","properties":{"name":"Moore"},"geometry":{"type":"Polygon","coordinates":[[[-86.258431,35.41195],[-86.263908,35.335273],[-86.318678,35.127149],[-86.526801,35.357181],[-86.258431,35.41195],[-86.258431,35.41195]]]}},
+{"type":"Feature","id":"47129","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-84.724888,36.375892],[-84.70298,36.370415],[-84.440087,36.162291],[-84.341502,36.047275],[-84.681073,35.910352],[-84.905627,36.156814],[-84.724888,36.375892]]]}},
+{"type":"Feature","id":"47131","properties":{"name":"Obion"},"geometry":{"type":"Polygon","coordinates":[[[-89.117394,36.501861],[-88.832593,36.501861],[-88.827116,36.501861],[-88.958563,36.222537],[-89.155733,36.206106],[-89.265272,36.206106],[-89.484349,36.211583],[-89.347426,36.501861],[-89.117394,36.501861]]]}},
+{"type":"Feature","id":"47133","properties":{"name":"Overton"},"geometry":{"type":"Polygon","coordinates":[[[-85.283536,36.534723],[-85.119228,36.408753],[-85.119228,36.14586],[-85.497137,36.304691],[-85.497137,36.403276],[-85.283536,36.529246],[-85.283536,36.534723]]]}},
+{"type":"Feature","id":"47135","properties":{"name":"Perry"},"geometry":{"type":"Polygon","coordinates":[[[-87.720774,35.795336],[-87.660528,35.60912],[-87.715298,35.48315],[-87.956283,35.461243],[-88.005575,35.422904],[-87.972714,35.817244],[-87.96176,35.839151],[-87.715298,35.839151],[-87.720774,35.795336]]]}},
+{"type":"Feature","id":"47137","properties":{"name":"Pickett"},"geometry":{"type":"Polygon","coordinates":[[[-85.278059,36.627831],[-84.976827,36.616877],[-84.785134,36.605923],[-84.730365,36.523769],[-85.009689,36.567584],[-85.119228,36.408753],[-85.283536,36.534723],[-85.283536,36.529246],[-85.278059,36.627831]]]}},
+{"type":"Feature","id":"47139","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-84.686549,35.253119],[-84.494857,35.28598],[-84.29221,35.209303],[-84.319594,34.990226],[-84.620826,34.990226],[-84.774181,34.990226],[-84.70298,35.242165],[-84.686549,35.253119]]]}},
+{"type":"Feature","id":"47141","properties":{"name":"Putnam"},"geometry":{"type":"Polygon","coordinates":[[[-85.497137,36.299214],[-85.497137,36.304691],[-85.119228,36.14586],[-85.102797,36.140383],[-85.261628,35.981552],[-85.508091,36.080137],[-85.645014,36.014414],[-85.809322,36.129429],[-85.781938,36.238968],[-85.497137,36.299214]]]}},
+{"type":"Feature","id":"47143","properties":{"name":"Rhea"},"geometry":{"type":"Polygon","coordinates":[[[-84.768704,35.80629],[-84.724888,35.75152],[-85.015166,35.41195],[-85.130182,35.455766],[-85.135659,35.455766],[-84.916581,35.762474],[-84.779657,35.822721],[-84.768704,35.80629]]]}},
+{"type":"Feature","id":"47145","properties":{"name":"Roane"},"geometry":{"type":"Polygon","coordinates":[[[-84.582488,35.641982],[-84.620826,35.641982],[-84.724888,35.75152],[-84.768704,35.80629],[-84.779657,35.822721],[-84.681073,35.910352],[-84.341502,36.047275],[-84.270302,35.910352],[-84.264825,35.899398],[-84.582488,35.641982]]]}},
+{"type":"Feature","id":"47147","properties":{"name":"Robertson"},"geometry":{"type":"Polygon","coordinates":[[[-86.76231,36.649739],[-86.56514,36.633308],[-86.756833,36.403276],[-86.76231,36.403276],[-86.915664,36.381369],[-87.118311,36.458046],[-87.112834,36.644262],[-87.058065,36.644262],[-86.76231,36.649739]]]}},
+{"type":"Feature","id":"47149","properties":{"name":"Rutherford"},"geometry":{"type":"Polygon","coordinates":[[[-86.515848,36.102045],[-86.15437,35.954167],[-86.209139,35.702228],[-86.247477,35.631028],[-86.521325,35.691274],[-86.641817,35.685797],[-86.685633,35.707705],[-86.619909,35.970598],[-86.515848,36.102045]]]}},
+{"type":"Feature","id":"47151","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-84.785134,36.605923],[-84.779657,36.605923],[-84.259348,36.589492],[-84.374364,36.21706],[-84.440087,36.162291],[-84.70298,36.370415],[-84.730365,36.523769],[-84.785134,36.605923]]]}},
+{"type":"Feature","id":"47153","properties":{"name":"Sequatchie"},"geometry":{"type":"Polygon","coordinates":[[[-85.425936,35.565304],[-85.22329,35.351704],[-85.387598,35.149057],[-85.557383,35.318842],[-85.590245,35.521489],[-85.606675,35.532443],[-85.557383,35.532443],[-85.425936,35.565304]]]}},
+{"type":"Feature","id":"47155","properties":{"name":"Sevier"},"geometry":{"type":"Polygon","coordinates":[[[-83.678792,36.030844],[-83.673316,36.036321],[-83.311837,35.893921],[-83.257068,35.713182],[-83.257068,35.696751],[-83.662362,35.570781],[-83.793808,35.888444],[-83.678792,36.030844]]]}},
+{"type":"Feature","id":"47157","properties":{"name":"Shelby"},"geometry":{"type":"Polygon","coordinates":[[[-89.774627,35.406473],[-89.632227,35.373611],[-89.643181,34.995703],[-89.725335,34.995703],[-89.829396,34.995703],[-90.311367,34.995703],[-90.075859,35.384565],[-89.774627,35.406473]]]}},
+{"type":"Feature","id":"47159","properties":{"name":"Smith"},"geometry":{"type":"Polygon","coordinates":[[[-85.979107,36.425184],[-85.825753,36.41423],[-85.781938,36.238968],[-85.809322,36.129429],[-86.061262,36.085614],[-86.137939,36.293737],[-85.979107,36.425184]]]}},
+{"type":"Feature","id":"47161","properties":{"name":"Stewart"},"geometry":{"type":"Polygon","coordinates":[[[-88.071299,36.677123],[-87.69339,36.638785],[-87.63862,36.638785],[-87.594805,36.364938],[-87.753636,36.34303],[-87.983668,36.353984],[-87.989145,36.359461],[-88.054868,36.496384],[-88.071299,36.677123]]]}},
+{"type":"Feature","id":"47163","properties":{"name":"Sullivan"},"geometry":{"type":"Polygon","coordinates":[[[-81.827587,36.616877],[-81.986418,36.507338],[-82.298603,36.397799],[-82.473866,36.441615],[-82.681989,36.430661],[-82.610789,36.594969],[-82.293127,36.594969],[-82.243834,36.594969],[-82.145249,36.594969],[-81.827587,36.616877]]]}},
+{"type":"Feature","id":"47165","properties":{"name":"Sumner"},"geometry":{"type":"Polygon","coordinates":[[[-86.411786,36.649739],[-86.203662,36.638785],[-86.231047,36.48543],[-86.285816,36.348507],[-86.36797,36.353984],[-86.592525,36.244445],[-86.756833,36.403276],[-86.56514,36.633308],[-86.411786,36.649739]]]}},
+{"type":"Feature","id":"47167","properties":{"name":"Tipton"},"geometry":{"type":"Polygon","coordinates":[[[-89.643181,35.647459],[-89.50078,35.581735],[-89.473395,35.400996],[-89.550073,35.400996],[-89.632227,35.373611],[-89.774627,35.406473],[-90.075859,35.384565],[-90.141582,35.439335],[-89.911551,35.53792],[-89.643181,35.647459]]]}},
+{"type":"Feature","id":"47169","properties":{"name":"Trousdale"},"geometry":{"type":"Polygon","coordinates":[[[-86.231047,36.48543],[-85.979107,36.425184],[-86.137939,36.293737],[-86.285816,36.348507],[-86.231047,36.48543]]]}},
+{"type":"Feature","id":"47171","properties":{"name":"Unicoi"},"geometry":{"type":"Polygon","coordinates":[[[-82.320511,36.260876],[-82.221926,36.156814],[-82.419096,36.07466],[-82.506727,35.976075],[-82.605312,36.041798],[-82.594358,36.096568],[-82.342419,36.255399],[-82.320511,36.260876]]]}},
+{"type":"Feature","id":"47173","properties":{"name":"Union"},"geometry":{"type":"Polygon","coordinates":[[[-83.903347,36.419707],[-83.667839,36.34303],[-83.733562,36.162291],[-83.925255,36.173245],[-83.941686,36.184199],[-84.001932,36.27183],[-83.903347,36.419707]]]}},
+{"type":"Feature","id":"47175","properties":{"name":"Van Buren"},"geometry":{"type":"Polygon","coordinates":[[[-85.42046,35.817244],[-85.267105,35.795336],[-85.272582,35.789859],[-85.256151,35.767951],[-85.256151,35.767951],[-85.256151,35.767951],[-85.425936,35.565304],[-85.557383,35.532443],[-85.601199,35.795336],[-85.42046,35.817244]]]}},
+{"type":"Feature","id":"47177","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-85.683353,35.833674],[-85.601199,35.795336],[-85.557383,35.532443],[-85.606675,35.532443],[-85.875046,35.521489],[-85.984584,35.658412],[-85.885999,35.839151],[-85.683353,35.833674]]]}},
+{"type":"Feature","id":"47179","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-82.473866,36.441615],[-82.298603,36.397799],[-82.342419,36.255399],[-82.594358,36.096568],[-82.632697,36.419707],[-82.703897,36.408753],[-82.681989,36.430661],[-82.473866,36.441615]]]}},
+{"type":"Feature","id":"47181","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-87.956283,35.461243],[-87.715298,35.48315],[-87.572897,35.400996],[-87.605759,35.00118],[-87.983668,35.006656],[-88.022006,35.390042],[-88.005575,35.422904],[-87.956283,35.461243]]]}},
+{"type":"Feature","id":"47183","properties":{"name":"Weakley"},"geometry":{"type":"Polygon","coordinates":[[[-88.827116,36.501861],[-88.816163,36.501861],[-88.514931,36.501861],[-88.531362,36.151337],[-88.690193,36.063706],[-88.958563,36.222537],[-88.827116,36.501861]]]}},
+{"type":"Feature","id":"47185","properties":{"name":"White"},"geometry":{"type":"Polygon","coordinates":[[[-85.508091,36.080137],[-85.261628,35.981552],[-85.267105,35.795336],[-85.42046,35.817244],[-85.601199,35.795336],[-85.683353,35.833674],[-85.645014,36.014414],[-85.508091,36.080137]]]}},
+{"type":"Feature","id":"47187","properties":{"name":"Williamson"},"geometry":{"type":"Polygon","coordinates":[[[-86.921141,36.052752],[-86.619909,35.970598],[-86.685633,35.707705],[-86.784218,35.707705],[-87.216896,35.850105],[-87.205942,35.959644],[-87.184034,36.047275],[-87.052588,36.047275],[-86.921141,36.052752]]]}},
+{"type":"Feature","id":"47189","properties":{"name":"Wilson"},"geometry":{"type":"Polygon","coordinates":[[[-86.36797,36.353984],[-86.285816,36.348507],[-86.137939,36.293737],[-86.061262,36.085614],[-86.017446,35.959644],[-86.15437,35.954167],[-86.515848,36.102045],[-86.592525,36.244445],[-86.36797,36.353984]]]}},
+{"type":"Feature","id":"48001","properties":{"name":"Anderson"},"geometry":{"type":"Polygon","coordinates":[[[-95.42683,32.08197],[-95.273475,31.594523],[-95.623999,31.54523],[-95.739015,31.501415],[-95.728061,31.643815],[-95.788308,31.61643],[-96.051201,32.005293],[-95.42683,32.08197]]]}},
+{"type":"Feature","id":"48003","properties":{"name":"Andrews"},"geometry":{"type":"Polygon","coordinates":[[[-102.995961,32.525602],[-102.212759,32.525602],[-102.212759,32.087447],[-102.289436,32.087447],[-102.798791,32.087447],[-103.061684,32.087447],[-103.067161,32.520126],[-102.995961,32.525602]]]}},
+{"type":"Feature","id":"48005","properties":{"name":"Angelina"},"geometry":{"type":"Polygon","coordinates":[[[-94.868182,31.528799],[-94.325965,31.222091],[-94.128795,31.101598],[-94.457411,31.035875],[-94.561473,31.057782],[-94.813412,31.13446],[-94.840797,31.145414],[-94.950336,31.342583],[-94.955813,31.386399],[-95.005105,31.424737],[-94.868182,31.528799]]]}},
+{"type":"Feature","id":"48007","properties":{"name":"Aransas"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-96.801542,28.275497],[-96.812495,28.21525],[-97.135635,27.903065],[-97.261605,28.078327],[-96.790588,28.319312],[-96.801542,28.275497]]],[[[-96.828926,28.111189],[-96.856311,28.061896],[-97.048004,27.837342],[-97.053481,27.842818],[-96.828926,28.111189]]]]}},
+{"type":"Feature","id":"48009","properties":{"name":"Archer"},"geometry":{"type":"Polygon","coordinates":[[[-98.43367,33.834591],[-98.422716,33.834591],[-98.422716,33.467636],[-98.422716,33.396436],[-98.953979,33.396436],[-98.953979,33.834591],[-98.43367,33.834591]]]}},
+{"type":"Feature","id":"48011","properties":{"name":"Armstrong"},"geometry":{"type":"Polygon","coordinates":[[[-101.621249,35.181919],[-101.084509,35.181919],[-101.089986,34.74924],[-101.473372,34.74924],[-101.626726,34.74924],[-101.621249,35.181919]]]}},
+{"type":"Feature","id":"48013","properties":{"name":"Atascosa"},"geometry":{"type":"Polygon","coordinates":[[[-98.800625,29.250392],[-98.406285,29.113469],[-98.192684,28.883437],[-98.099576,28.784852],[-98.335085,28.615067],[-98.581547,28.642452],[-98.800625,28.636975],[-98.800625,28.647929],[-98.806102,29.091561],[-98.806102,29.250392],[-98.800625,29.250392]]]}},
+{"type":"Feature","id":"48015","properties":{"name":"Austin"},"geometry":{"type":"Polygon","coordinates":[[[-96.379817,30.082887],[-96.144309,30.071933],[-96.03477,29.726886],[-96.089539,29.600916],[-96.17717,29.633778],[-96.57151,29.962394],[-96.620803,30.044549],[-96.379817,30.082887]]]}},
+{"type":"Feature","id":"48017","properties":{"name":"Bailey"},"geometry":{"type":"Polygon","coordinates":[[[-102.612575,34.311085],[-102.618052,33.823637],[-103.001438,33.823637],[-103.045254,33.823637],[-103.045254,34.300131],[-103.045254,34.311085],[-102.612575,34.311085]]]}},
+{"type":"Feature","id":"48019","properties":{"name":"Bandera"},"geometry":{"type":"Polygon","coordinates":[[[-99.600258,29.907625],[-98.915641,29.781655],[-98.778717,29.721409],[-98.806102,29.688547],[-99.414042,29.628301],[-99.605735,29.628301],[-99.600258,29.907625]]]}},
+{"type":"Feature","id":"48021","properties":{"name":"Bastrop"},"geometry":{"type":"Polygon","coordinates":[[[-97.332805,30.40055],[-97.026096,30.050025],[-97.316374,29.787132],[-97.650467,30.071933],[-97.371143,30.41698],[-97.332805,30.40055]]]}},
+{"type":"Feature","id":"48023","properties":{"name":"Baylor"},"geometry":{"type":"Polygon","coordinates":[[[-98.992318,33.834591],[-98.953979,33.834591],[-98.953979,33.396436],[-99.474288,33.396436],[-99.474288,33.736006],[-99.474288,33.834591],[-98.992318,33.834591]]]}},
+{"type":"Feature","id":"48025","properties":{"name":"Bee"},"geometry":{"type":"Polygon","coordinates":[[[-97.935268,28.713652],[-97.776437,28.669836],[-97.37662,28.390513],[-97.540929,28.165958],[-97.820252,28.176912],[-98.006468,28.691744],[-97.935268,28.713652]]]}},
+{"type":"Feature","id":"48027","properties":{"name":"Bell"},"geometry":{"type":"Polygon","coordinates":[[[-97.404005,31.304245],[-97.278035,31.282337],[-97.069912,30.986582],[-97.316374,30.751074],[-97.831206,30.904428],[-97.91336,31.035875],[-97.907884,31.068736],[-97.420436,31.320676],[-97.404005,31.304245]]]}},
+{"type":"Feature","id":"48029","properties":{"name":"Bexar"},"geometry":{"type":"Polygon","coordinates":[[[-98.64727,29.743317],[-98.313177,29.595439],[-98.132438,29.442085],[-98.285792,29.255869],[-98.406285,29.113469],[-98.800625,29.250392],[-98.806102,29.250392],[-98.806102,29.688547],[-98.778717,29.721409],[-98.64727,29.743317]]]}},
+{"type":"Feature","id":"48031","properties":{"name":"Blanco"},"geometry":{"type":"Polygon","coordinates":[[[-98.411762,30.504611],[-98.351516,30.488181],[-98.126961,30.427934],[-98.170777,30.356734],[-98.296746,30.039072],[-98.411762,29.93501],[-98.587024,30.137656],[-98.592501,30.499135],[-98.411762,30.504611]]]}},
+{"type":"Feature","id":"48033","properties":{"name":"Borden"},"geometry":{"type":"Polygon","coordinates":[[[-101.17214,32.963758],[-101.17214,32.525602],[-101.17214,32.525602],[-101.686972,32.525602],[-101.692449,32.963758],[-101.555526,32.963758],[-101.17214,32.963758]]]}},
+{"type":"Feature","id":"48035","properties":{"name":"Bosque"},"geometry":{"type":"Polygon","coordinates":[[[-97.62856,32.20794],[-97.617606,32.202463],[-97.475205,32.175078],[-97.278035,31.747877],[-97.606652,31.589046],[-97.688806,31.709538],[-97.765483,31.6712],[-98.006468,32.016247],[-97.864068,32.087447],[-97.62856,32.20794]]]}},
+{"type":"Feature","id":"48037","properties":{"name":"Bowie"},"geometry":{"type":"Polygon","coordinates":[[[-94.736735,33.703145],[-94.484796,33.637421],[-94.041164,33.54979],[-94.041164,33.270466],[-94.194518,33.297851],[-94.654581,33.270466],[-94.747689,33.330713],[-94.736735,33.703145]]]}},
+{"type":"Feature","id":"48039","properties":{"name":"Brazoria"},"geometry":{"type":"Polygon","coordinates":[[[-95.295383,29.595439],[-95.218706,29.557101],[-95.120121,29.07513],[-95.508984,28.823191],[-95.864985,29.223007],[-95.875939,29.228484],[-95.848554,29.261346],[-95.42683,29.579009],[-95.295383,29.595439]]]}},
+{"type":"Feature","id":"48041","properties":{"name":"Brazos"},"geometry":{"type":"Polygon","coordinates":[[[-96.237417,30.964674],[-96.166217,30.822274],[-96.155263,30.329349],[-96.297663,30.378642],[-96.566033,30.696304],[-96.242894,30.975628],[-96.237417,30.964674]]]}},
+{"type":"Feature","id":"48043","properties":{"name":"Brewster"},"geometry":{"type":"Polygon","coordinates":[[[-103.346485,30.603196],[-102.56876,30.050025],[-102.322297,29.88024],[-102.678299,29.73784],[-102.919284,29.190146],[-103.280762,28.982022],[-103.790117,29.261346],[-103.801071,30.411504],[-103.439593,30.663443],[-103.346485,30.603196]]]}},
+{"type":"Feature","id":"48045","properties":{"name":"Briscoe"},"geometry":{"type":"Polygon","coordinates":[[[-101.473372,34.74924],[-101.089986,34.74924],[-100.947585,34.74924],[-100.947585,34.311085],[-101.040693,34.311085],[-101.473372,34.311085],[-101.473372,34.74924]]]}},
+{"type":"Feature","id":"48047","properties":{"name":"Brooks"},"geometry":{"type":"Polygon","coordinates":[[[-98.521301,27.26774],[-98.231023,27.262263],[-98.055761,27.262263],[-97.984561,27.207493],[-97.984561,26.780292],[-98.318654,26.785769],[-98.422716,26.785769],[-98.521301,27.26774]]]}},
+{"type":"Feature","id":"48049","properties":{"name":"Brown"},"geometry":{"type":"Polygon","coordinates":[[[-99.118287,32.08197],[-98.926594,32.076493],[-98.669178,31.698584],[-98.992318,31.484984],[-99.090903,31.463076],[-99.200441,31.468553],[-99.194965,32.08197],[-99.118287,32.08197]]]}},
+{"type":"Feature","id":"48051","properties":{"name":"Burleson"},"geometry":{"type":"Polygon","coordinates":[[[-96.620803,30.729166],[-96.566033,30.696304],[-96.297663,30.378642],[-96.64271,30.296488],[-96.96585,30.559381],[-96.620803,30.729166]]]}},
+{"type":"Feature","id":"48053","properties":{"name":"Burnet"},"geometry":{"type":"Polygon","coordinates":[[[-98.017422,31.035875],[-97.91336,31.035875],[-97.831206,30.904428],[-98.050284,30.625104],[-98.126961,30.427934],[-98.351516,30.488181],[-98.444624,30.920859],[-98.439147,31.030398],[-98.017422,31.035875]]]}},
+{"type":"Feature","id":"48055","properties":{"name":"Caldwell"},"geometry":{"type":"Polygon","coordinates":[[[-97.666898,30.066456],[-97.650467,30.071933],[-97.316374,29.787132],[-97.316374,29.787132],[-97.634037,29.650209],[-97.798345,29.754271],[-97.875022,29.858333],[-97.710714,30.022641],[-97.666898,30.066456]]]}},
+{"type":"Feature","id":"48057","properties":{"name":"Calhoun"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-96.576987,28.708175],[-96.325048,28.675313],[-96.325048,28.642452],[-96.576987,28.702698],[-96.576987,28.708175]]],[[[-96.763203,28.41242],[-96.889173,28.505528],[-96.653664,28.702698],[-96.763203,28.41242]]]]}},
+{"type":"Feature","id":"48059","properties":{"name":"Callahan"},"geometry":{"type":"Polygon","coordinates":[[[-99.194965,32.514649],[-99.11281,32.514649],[-99.118287,32.08197],[-99.194965,32.08197],[-99.63312,32.08197],[-99.627643,32.514649],[-99.611212,32.514649],[-99.194965,32.514649]]]}},
+{"type":"Feature","id":"48061","properties":{"name":"Cameron"},"geometry":{"type":"Polygon","coordinates":[[[-97.864068,26.347614],[-97.382097,26.413337],[-97.371143,25.838258],[-97.864068,26.051859],[-97.864068,26.347614]]]}},
+{"type":"Feature","id":"48063","properties":{"name":"Camp"},"geometry":{"type":"Polygon","coordinates":[[[-95.125598,33.034958],[-94.818889,32.980189],[-94.720304,32.903511],[-94.780551,32.903511],[-95.152983,32.903511],[-95.152983,33.01305],[-95.125598,33.034958]]]}},
+{"type":"Feature","id":"48065","properties":{"name":"Carson"},"geometry":{"type":"Polygon","coordinates":[[[-101.084509,35.625551],[-101.084509,35.620074],[-101.084509,35.181919],[-101.621249,35.181919],[-101.621249,35.620074],[-101.621249,35.625551],[-101.084509,35.625551],[-101.084509,35.625551]]]}},
+{"type":"Feature","id":"48067","properties":{"name":"Cass"},"geometry":{"type":"Polygon","coordinates":[[[-94.194518,33.297851],[-94.041164,33.270466],[-94.041164,33.018527],[-94.041164,32.881604],[-94.249287,32.881604],[-94.654581,32.881604],[-94.654581,33.270466],[-94.194518,33.297851]]]}},
+{"type":"Feature","id":"48069","properties":{"name":"Castro"},"geometry":{"type":"Polygon","coordinates":[[[-102.004635,34.74924],[-101.999158,34.74924],[-101.999158,34.311085],[-102.092266,34.311085],[-102.327774,34.311085],[-102.524944,34.311085],[-102.524944,34.74924],[-102.168943,34.74924],[-102.004635,34.74924]]]}},
+{"type":"Feature","id":"48071","properties":{"name":"Chambers"},"geometry":{"type":"Polygon","coordinates":[[[-94.44098,29.891194],[-94.353349,29.562578],[-94.36978,29.557101],[-94.36978,29.595439],[-94.512181,29.54067],[-94.928428,29.672117],[-94.97772,29.885717],[-94.44098,29.891194]]]}},
+{"type":"Feature","id":"48073","properties":{"name":"Cherokee"},"geometry":{"type":"Polygon","coordinates":[[[-94.983197,32.13674],[-94.939382,31.846462],[-94.868182,31.528799],[-95.005105,31.424737],[-95.273475,31.594523],[-95.42683,32.08197],[-95.459691,32.13674],[-94.983197,32.13674]]]}},
+{"type":"Feature","id":"48075","properties":{"name":"Childress"},"geometry":{"type":"Polygon","coordinates":[[[-100.416322,34.74924],[-100.000075,34.743763],[-100.000075,34.563024],[-100.000075,34.311085],[-100.416322,34.311085],[-100.416322,34.74924]]]}},
+{"type":"Feature","id":"48077","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-98.137915,34.1413],[-97.979084,33.889361],[-97.979084,33.467636],[-98.422716,33.467636],[-98.422716,33.834591],[-98.422716,34.081054],[-98.137915,34.1413]]]}},
+{"type":"Feature","id":"48079","properties":{"name":"Cochran"},"geometry":{"type":"Polygon","coordinates":[[[-103.001438,33.823637],[-102.618052,33.823637],[-102.596144,33.390959],[-103.056207,33.390959],[-103.050731,33.571698],[-103.045254,33.823637],[-103.001438,33.823637]]]}},
+{"type":"Feature","id":"48081","properties":{"name":"Coke"},"geometry":{"type":"Polygon","coordinates":[[[-100.821616,32.087447],[-100.662785,32.087447],[-100.235583,32.08197],[-100.235583,31.693108],[-100.827093,31.698584],[-100.821616,32.087447]]]}},
+{"type":"Feature","id":"48083","properties":{"name":"Coleman"},"geometry":{"type":"Polygon","coordinates":[[[-99.63312,32.08197],[-99.194965,32.08197],[-99.200441,31.468553],[-99.430473,31.468553],[-99.600258,31.490461],[-99.720751,31.578092],[-99.715274,32.08197],[-99.63312,32.08197]]]}},
+{"type":"Feature","id":"48085","properties":{"name":"Collin"},"geometry":{"type":"Polygon","coordinates":[[[-96.834403,33.40739],[-96.834403,33.40739],[-96.385294,33.396436],[-96.297663,33.35262],[-96.297663,32.980189],[-96.440064,32.980189],[-96.516741,32.980189],[-96.845357,32.985665],[-96.834403,33.40739]]]}},
+{"type":"Feature","id":"48087","properties":{"name":"Collingsworth"},"geometry":{"type":"Polygon","coordinates":[[[-100.093183,35.181919],[-100.000075,35.181919],[-100.000075,35.028564],[-100.000075,34.743763],[-100.416322,34.74924],[-100.542292,34.74924],[-100.536815,35.181919],[-100.093183,35.181919]]]}},
+{"type":"Feature","id":"48089","properties":{"name":"Colorado"},"geometry":{"type":"Polygon","coordinates":[[[-96.57151,29.962394],[-96.17717,29.633778],[-96.64271,29.250392],[-96.659141,29.261346],[-96.872742,29.633778],[-96.57151,29.962394]]]}},
+{"type":"Feature","id":"48091","properties":{"name":"Comal"},"geometry":{"type":"Polygon","coordinates":[[[-98.296746,30.039072],[-98.000992,29.754271],[-98.313177,29.595439],[-98.64727,29.743317],[-98.411762,29.93501],[-98.296746,30.039072]]]}},
+{"type":"Feature","id":"48093","properties":{"name":"Comanche"},"geometry":{"type":"Polygon","coordinates":[[[-98.548686,32.262709],[-98.209115,31.917662],[-98.461055,31.682154],[-98.669178,31.698584],[-98.926594,32.076493],[-98.548686,32.262709]]]}},
+{"type":"Feature","id":"48095","properties":{"name":"Concho"},"geometry":{"type":"Polygon","coordinates":[[[-99.726228,31.578092],[-99.720751,31.578092],[-99.600258,31.490461],[-99.605735,31.085167],[-100.115091,31.090644],[-100.109614,31.578092],[-99.726228,31.578092]]]}},
+{"type":"Feature","id":"48097","properties":{"name":"Cooke"},"geometry":{"type":"Polygon","coordinates":[[[-96.943942,33.949607],[-96.943942,33.418344],[-97.382097,33.429298],[-97.486159,33.434775],[-97.486159,33.916745],[-96.943942,33.949607]]]}},
+{"type":"Feature","id":"48099","properties":{"name":"Coryell"},"geometry":{"type":"Polygon","coordinates":[[[-97.688806,31.709538],[-97.606652,31.589046],[-97.420436,31.320676],[-97.907884,31.068736],[-98.181731,31.463076],[-97.765483,31.6712],[-97.688806,31.709538]]]}},
+{"type":"Feature","id":"48101","properties":{"name":"Cottle"},"geometry":{"type":"Polygon","coordinates":[[[-100.514907,34.316562],[-100.416322,34.311085],[-100.000075,34.311085],[-100.000075,34.223454],[-100.049367,33.834591],[-100.520384,33.834591],[-100.514907,34.316562]]]}},
+{"type":"Feature","id":"48103","properties":{"name":"Crane"},"geometry":{"type":"Polygon","coordinates":[[[-102.76593,31.649292],[-102.316821,31.649292],[-102.30039,31.085167],[-102.388021,31.085167],[-102.76593,31.293291],[-102.76593,31.649292]]]}},
+{"type":"Feature","id":"48105","properties":{"name":"Crockett"},"geometry":{"type":"Polygon","coordinates":[[[-102.388021,31.085167],[-102.30039,31.085167],[-101.774603,31.07969],[-101.276202,31.07969],[-100.964016,31.085167],[-100.958539,30.707258],[-100.958539,30.285534],[-101.544572,30.285534],[-101.758173,30.285534],[-101.769126,30.652489],[-102.388021,31.085167]]]}},
+{"type":"Feature","id":"48107","properties":{"name":"Crosby"},"geometry":{"type":"Polygon","coordinates":[[[-101.561003,33.829114],[-101.040693,33.834591],[-101.040693,33.396436],[-101.111894,33.396436],[-101.555526,33.396436],[-101.561003,33.829114]]]}},
+{"type":"Feature","id":"48109","properties":{"name":"Culberson"},"geometry":{"type":"Polygon","coordinates":[[[-104.847167,31.999816],[-104.025626,31.999816],[-104.102303,31.107075],[-104.918367,30.663443],[-104.918367,31.999816],[-104.847167,31.999816]]]}},
+{"type":"Feature","id":"48111","properties":{"name":"Dallam"},"geometry":{"type":"Polygon","coordinates":[[[-103.001438,36.501861],[-102.163466,36.501861],[-102.163466,36.052752],[-102.30039,36.052752],[-103.039777,36.052752],[-103.001438,36.501861]]]}},
+{"type":"Feature","id":"48113","properties":{"name":"Dallas"},"geometry":{"type":"Polygon","coordinates":[[[-96.856311,32.985665],[-96.845357,32.985665],[-96.516741,32.980189],[-96.516741,32.81588],[-96.527695,32.54751],[-97.03705,32.54751],[-97.031573,32.985665],[-96.856311,32.985665]]]}},
+{"type":"Feature","id":"48115","properties":{"name":"Dawson"},"geometry":{"type":"Polygon","coordinates":[[[-101.692449,32.963758],[-101.686972,32.525602],[-102.201805,32.525602],[-102.207282,32.958281],[-102.075835,32.958281],[-101.692449,32.963758]]]}},
+{"type":"Feature","id":"48117","properties":{"name":"Deaf Smith"},"geometry":{"type":"Polygon","coordinates":[[[-102.579714,35.187396],[-102.168943,35.181919],[-102.168943,34.74924],[-102.524944,34.74924],[-103.045254,34.74924],[-103.045254,34.951887],[-103.039777,35.181919],[-102.579714,35.187396]]]}},
+{"type":"Feature","id":"48119","properties":{"name":"Delta"},"geometry":{"type":"Polygon","coordinates":[[[-95.651384,33.484067],[-95.306337,33.380005],[-95.306337,33.380005],[-95.306337,33.374528],[-95.492553,33.35262],[-95.859508,33.221174],[-95.859508,33.40739],[-95.859508,33.462159],[-95.651384,33.484067]]]}},
+{"type":"Feature","id":"48121","properties":{"name":"Denton"},"geometry":{"type":"Polygon","coordinates":[[[-97.382097,33.429298],[-96.943942,33.418344],[-96.834403,33.40739],[-96.834403,33.40739],[-96.845357,32.985665],[-96.856311,32.985665],[-97.031573,32.985665],[-97.398528,32.991142],[-97.382097,33.429298]]]}},
+{"type":"Feature","id":"48123","properties":{"name":"DeWitt"},"geometry":{"type":"Polygon","coordinates":[[[-97.239697,29.381839],[-96.976804,29.102515],[-97.30542,28.861529],[-97.57379,28.812237],[-97.612129,29.107992],[-97.239697,29.381839]]]}},
+{"type":"Feature","id":"48125","properties":{"name":"Dickens"},"geometry":{"type":"Polygon","coordinates":[[[-100.90377,33.834591],[-100.520384,33.834591],[-100.514907,33.396436],[-100.816139,33.396436],[-101.040693,33.396436],[-101.040693,33.834591],[-100.90377,33.834591]]]}},
+{"type":"Feature","id":"48127","properties":{"name":"Dimmit"},"geometry":{"type":"Polygon","coordinates":[[[-99.780997,28.642452],[-99.408565,28.642452],[-99.397611,28.642452],[-99.392134,28.204297],[-100.115091,28.19882],[-100.115091,28.647929],[-99.780997,28.642452]]]}},
+{"type":"Feature","id":"48129","properties":{"name":"Donley"},"geometry":{"type":"Polygon","coordinates":[[[-100.969493,35.181919],[-100.536815,35.181919],[-100.542292,34.74924],[-100.947585,34.74924],[-101.089986,34.74924],[-101.084509,35.181919],[-100.969493,35.181919]]]}},
+{"type":"Feature","id":"48131","properties":{"name":"Duval"},"geometry":{"type":"Polygon","coordinates":[[[-98.335085,28.056419],[-98.2365,28.056419],[-98.231023,27.262263],[-98.521301,27.26774],[-98.800625,27.355371],[-98.800625,28.056419],[-98.335085,28.056419]]]}},
+{"type":"Feature","id":"48133","properties":{"name":"Eastland"},"geometry":{"type":"Polygon","coordinates":[[[-98.740378,32.514649],[-98.57607,32.514649],[-98.477485,32.514649],[-98.548686,32.262709],[-98.926594,32.076493],[-99.118287,32.08197],[-99.11281,32.514649],[-99.09638,32.514649],[-98.740378,32.514649]]]}},
+{"type":"Feature","id":"48135","properties":{"name":"Ector"},"geometry":{"type":"Polygon","coordinates":[[[-102.289436,32.087447],[-102.289436,31.649292],[-102.316821,31.649292],[-102.76593,31.649292],[-102.798791,31.649292],[-102.798791,32.087447],[-102.289436,32.087447]]]}},
+{"type":"Feature","id":"48137","properties":{"name":"Edwards"},"geometry":{"type":"Polygon","coordinates":[[[-99.753612,30.291011],[-99.759089,30.071933],[-100.016506,29.622824],[-100.109614,29.622824],[-100.575153,29.622824],[-100.701123,29.622824],[-100.701123,30.291011],[-100.115091,30.291011],[-99.753612,30.291011]]]}},
+{"type":"Feature","id":"48139","properties":{"name":"Ellis"},"geometry":{"type":"Polygon","coordinates":[[[-97.086342,32.54751],[-97.03705,32.54751],[-96.527695,32.54751],[-96.451017,32.361294],[-96.385294,32.328433],[-96.89465,32.076493],[-97.086342,32.268186],[-97.086342,32.54751]]]}},
+{"type":"Feature","id":"48141","properties":{"name":"El Paso"},"geometry":{"type":"Polygon","coordinates":[[[-105.997324,31.999816],[-105.997324,31.386399],[-106.528588,31.786216],[-106.375233,31.999816],[-105.997324,31.999816]]]}},
+{"type":"Feature","id":"48143","properties":{"name":"Erath"},"geometry":{"type":"Polygon","coordinates":[[[-98.066715,32.509172],[-97.946222,32.235325],[-97.864068,32.087447],[-98.006468,32.016247],[-98.209115,31.917662],[-98.548686,32.262709],[-98.477485,32.514649],[-98.066715,32.509172]]]}},
+{"type":"Feature","id":"48145","properties":{"name":"Falls"},"geometry":{"type":"Polygon","coordinates":[[[-96.801542,31.523322],[-96.598895,31.222091],[-96.828926,31.107075],[-97.069912,30.986582],[-97.278035,31.282337],[-96.801542,31.523322]]]}},
+{"type":"Feature","id":"48147","properties":{"name":"Fannin"},"geometry":{"type":"Polygon","coordinates":[[[-95.843077,33.840068],[-95.859508,33.462159],[-95.859508,33.40739],[-96.297663,33.35262],[-96.385294,33.396436],[-96.379817,33.725052],[-95.843077,33.840068]]]}},
+{"type":"Feature","id":"48149","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-96.801542,30.154087],[-96.796065,30.159564],[-96.620803,30.044549],[-96.57151,29.962394],[-96.872742,29.633778],[-97.141112,29.628301],[-97.316374,29.787132],[-97.316374,29.787132],[-97.026096,30.050025],[-96.801542,30.154087]]]}},
+{"type":"Feature","id":"48151","properties":{"name":"Fisher"},"geometry":{"type":"Polygon","coordinates":[[[-100.520384,32.963758],[-100.142475,32.958281],[-100.147952,32.520126],[-100.662785,32.525602],[-100.657308,32.963758],[-100.520384,32.963758]]]}},
+{"type":"Feature","id":"48153","properties":{"name":"Floyd"},"geometry":{"type":"Polygon","coordinates":[[[-101.473372,34.311085],[-101.040693,34.311085],[-101.040693,33.834591],[-101.561003,33.829114],[-101.56648,34.311085],[-101.473372,34.311085]]]}},
+{"type":"Feature","id":"48155","properties":{"name":"Foard"},"geometry":{"type":"Polygon","coordinates":[[[-100.000075,34.223454],[-99.474288,34.08653],[-99.474288,33.834591],[-99.474288,33.736006],[-99.868628,33.834591],[-99.994598,33.834591],[-100.049367,33.834591],[-100.000075,34.223454]]]}},
+{"type":"Feature","id":"48157","properties":{"name":"Fort Bend"},"geometry":{"type":"Polygon","coordinates":[[[-95.826646,29.787132],[-95.826646,29.787132],[-95.42683,29.579009],[-95.848554,29.261346],[-96.089539,29.600916],[-96.03477,29.726886],[-95.826646,29.787132]]]}},
+{"type":"Feature","id":"48159","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-95.306337,33.380005],[-95.125598,33.390959],[-95.125598,33.034958],[-95.152983,33.01305],[-95.306337,32.963758],[-95.306337,33.374528],[-95.306337,33.380005]]]}},
+{"type":"Feature","id":"48161","properties":{"name":"Freestone"},"geometry":{"type":"Polygon","coordinates":[[[-96.051201,32.005293],[-95.788308,31.61643],[-96.237417,31.413784],[-96.494833,31.797169],[-96.056678,32.01077],[-96.051201,32.005293]]]}},
+{"type":"Feature","id":"48163","properties":{"name":"Frio"},"geometry":{"type":"Polygon","coordinates":[[[-98.904687,29.091561],[-98.806102,29.091561],[-98.800625,28.647929],[-99.397611,28.642452],[-99.408565,28.642452],[-99.414042,29.091561],[-98.904687,29.091561]]]}},
+{"type":"Feature","id":"48165","properties":{"name":"Gaines"},"geometry":{"type":"Polygon","coordinates":[[[-103.067161,32.958281],[-102.596144,32.958281],[-102.207282,32.958281],[-102.201805,32.525602],[-102.212759,32.525602],[-102.995961,32.525602],[-103.067161,32.520126],[-103.067161,32.958281]]]}},
+{"type":"Feature","id":"48167","properties":{"name":"Galveston"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-94.36978,29.595439],[-94.36978,29.557101],[-94.512181,29.54067],[-94.36978,29.595439]]],[[[-95.202275,29.562578],[-95.016059,29.557101],[-95.120121,29.07513],[-95.218706,29.557101],[-95.202275,29.562578]]]]}},
+{"type":"Feature","id":"48169","properties":{"name":"Garza"},"geometry":{"type":"Polygon","coordinates":[[[-101.111894,33.396436],[-101.040693,33.396436],[-101.040693,32.969235],[-101.17214,32.963758],[-101.555526,32.963758],[-101.555526,33.396436],[-101.111894,33.396436]]]}},
+{"type":"Feature","id":"48171","properties":{"name":"Gillespie"},"geometry":{"type":"Polygon","coordinates":[[[-99.304503,30.499135],[-98.964933,30.499135],[-98.592501,30.499135],[-98.587024,30.137656],[-98.921118,30.137656],[-99.304503,30.285534],[-99.304503,30.499135]]]}},
+{"type":"Feature","id":"48173","properties":{"name":"Glasscock"},"geometry":{"type":"Polygon","coordinates":[[[-101.747219,32.087447],[-101.692449,32.087447],[-101.265248,32.087447],[-101.265248,31.649292],[-101.686972,31.649292],[-101.774603,31.649292],[-101.774603,32.087447],[-101.747219,32.087447]]]}},
+{"type":"Feature","id":"48175","properties":{"name":"Goliad"},"geometry":{"type":"Polygon","coordinates":[[[-97.30542,28.861529],[-97.16302,28.554821],[-97.37662,28.390513],[-97.776437,28.669836],[-97.57379,28.812237],[-97.30542,28.861529]]]}},
+{"type":"Feature","id":"48177","properties":{"name":"Gonzales"},"geometry":{"type":"Polygon","coordinates":[[[-97.316374,29.787132],[-97.141112,29.628301],[-97.239697,29.381839],[-97.612129,29.107992],[-97.727145,29.223007],[-97.84216,29.376362],[-97.634037,29.650209],[-97.316374,29.787132]]]}},
+{"type":"Feature","id":"48179","properties":{"name":"Gray"},"geometry":{"type":"Polygon","coordinates":[[[-101.084509,35.620074],[-100.542292,35.620074],[-100.536815,35.181919],[-100.969493,35.181919],[-101.084509,35.181919],[-101.084509,35.620074]]]}},
+{"type":"Feature","id":"48181","properties":{"name":"Grayson"},"geometry":{"type":"Polygon","coordinates":[[[-96.587941,33.894838],[-96.379817,33.725052],[-96.385294,33.396436],[-96.834403,33.40739],[-96.943942,33.418344],[-96.943942,33.949607],[-96.932988,33.955084],[-96.587941,33.894838]]]}},
+{"type":"Feature","id":"48183","properties":{"name":"Gregg"},"geometry":{"type":"Polygon","coordinates":[[[-94.703873,32.651572],[-94.577904,32.394156],[-94.988674,32.366771],[-94.988674,32.536556],[-94.703873,32.651572]]]}},
+{"type":"Feature","id":"48185","properties":{"name":"Grimes"},"geometry":{"type":"Polygon","coordinates":[[[-96.166217,30.822274],[-95.864985,30.86609],[-95.832123,30.630581],[-95.804738,30.247195],[-95.821169,30.247195],[-96.095016,30.225288],[-96.155263,30.329349],[-96.166217,30.822274]]]}},
+{"type":"Feature","id":"48187","properties":{"name":"Guadalupe"},"geometry":{"type":"Polygon","coordinates":[[[-97.798345,29.754271],[-97.634037,29.650209],[-97.84216,29.376362],[-98.132438,29.442085],[-98.313177,29.595439],[-98.000992,29.754271],[-97.875022,29.858333],[-97.798345,29.754271]]]}},
+{"type":"Feature","id":"48189","properties":{"name":"Hale"},"geometry":{"type":"Polygon","coordinates":[[[-102.092266,34.311085],[-101.999158,34.311085],[-101.56648,34.311085],[-101.561003,33.829114],[-101.571957,33.829114],[-102.086789,33.823637],[-102.092266,34.311085]]]}},
+{"type":"Feature","id":"48191","properties":{"name":"Hall"},"geometry":{"type":"Polygon","coordinates":[[[-100.947585,34.74924],[-100.542292,34.74924],[-100.416322,34.74924],[-100.416322,34.311085],[-100.514907,34.316562],[-100.673738,34.311085],[-100.947585,34.311085],[-100.947585,34.74924]]]}},
+{"type":"Feature","id":"48193","properties":{"name":"Hamilton"},"geometry":{"type":"Polygon","coordinates":[[[-98.006468,32.016247],[-97.765483,31.6712],[-98.181731,31.463076],[-98.269362,31.413784],[-98.461055,31.682154],[-98.209115,31.917662],[-98.006468,32.016247]]]}},
+{"type":"Feature","id":"48195","properties":{"name":"Hansford"},"geometry":{"type":"Polygon","coordinates":[[[-101.084509,36.501861],[-101.084509,36.058229],[-101.084509,36.052752],[-101.621249,36.052752],[-101.621249,36.501861],[-101.084509,36.501861]]]}},
+{"type":"Feature","id":"48197","properties":{"name":"Hardeman"},"geometry":{"type":"Polygon","coordinates":[[[-99.84672,34.508255],[-99.474288,34.398716],[-99.474288,34.08653],[-100.000075,34.223454],[-100.000075,34.311085],[-100.000075,34.563024],[-99.84672,34.508255]]]}},
+{"type":"Feature","id":"48199","properties":{"name":"Hardin"},"geometry":{"type":"Polygon","coordinates":[[[-94.44098,30.526519],[-94.074025,30.526519],[-94.117841,30.241718],[-94.117841,30.159564],[-94.216426,30.175995],[-94.446457,30.110272],[-94.731258,30.488181],[-94.545042,30.526519],[-94.44098,30.526519]]]}},
+{"type":"Feature","id":"48201","properties":{"name":"Harris"},"geometry":{"type":"Polygon","coordinates":[[[-95.218706,30.066456],[-95.098213,30.165041],[-94.97772,29.885717],[-94.928428,29.672117],[-95.016059,29.557101],[-95.202275,29.562578],[-95.218706,29.557101],[-95.295383,29.595439],[-95.42683,29.579009],[-95.826646,29.787132],[-95.804738,30.088364],[-95.218706,30.066456]]]}},
+{"type":"Feature","id":"48203","properties":{"name":"Harrison"},"geometry":{"type":"Polygon","coordinates":[[[-94.703873,32.793973],[-94.041164,32.695388],[-94.041164,32.394156],[-94.462888,32.377725],[-94.490273,32.394156],[-94.577904,32.394156],[-94.703873,32.651572],[-94.703873,32.793973]]]}},
+{"type":"Feature","id":"48205","properties":{"name":"Hartley"},"geometry":{"type":"Polygon","coordinates":[[[-102.30039,36.052752],[-102.163466,36.052752],[-102.163466,35.625551],[-103.039777,35.620074],[-103.039777,35.740566],[-103.039777,36.052752],[-102.30039,36.052752]]]}},
+{"type":"Feature","id":"48207","properties":{"name":"Haskell"},"geometry":{"type":"Polygon","coordinates":[[[-99.518104,33.396436],[-99.474288,33.396436],[-99.468812,32.958281],[-99.611212,32.958281],[-99.989121,32.958281],[-99.989121,33.396436],[-99.518104,33.396436]]]}},
+{"type":"Feature","id":"48209","properties":{"name":"Hays"},"geometry":{"type":"Polygon","coordinates":[[[-98.170777,30.356734],[-97.710714,30.022641],[-97.875022,29.858333],[-98.000992,29.754271],[-98.296746,30.039072],[-98.170777,30.356734]]]}},
+{"type":"Feature","id":"48211","properties":{"name":"Hemphill"},"geometry":{"type":"Polygon","coordinates":[[[-100.000075,36.058229],[-100.000075,35.882967],[-100.000075,35.620074],[-100.542292,35.620074],[-100.542292,36.058229],[-100.000075,36.058229]]]}},
+{"type":"Feature","id":"48213","properties":{"name":"Henderson"},"geometry":{"type":"Polygon","coordinates":[[[-96.215509,32.361294],[-96.078585,32.355817],[-95.448737,32.355817],[-95.459691,32.13674],[-95.42683,32.08197],[-96.051201,32.005293],[-96.056678,32.01077],[-96.385294,32.328433],[-96.451017,32.361294],[-96.215509,32.361294]]]}},
+{"type":"Feature","id":"48215","properties":{"name":"Hidalgo"},"geometry":{"type":"Polygon","coordinates":[[[-98.318654,26.785769],[-97.984561,26.780292],[-97.957176,26.610507],[-97.864068,26.347614],[-97.864068,26.051859],[-98.587024,26.254506],[-98.318654,26.785769]]]}},
+{"type":"Feature","id":"48217","properties":{"name":"Hill"},"geometry":{"type":"Polygon","coordinates":[[[-97.113727,32.257232],[-97.086342,32.268186],[-96.89465,32.076493],[-96.719387,31.8136],[-96.932988,31.709538],[-97.080866,31.840985],[-97.278035,31.747877],[-97.475205,32.175078],[-97.113727,32.257232]]]}},
+{"type":"Feature","id":"48219","properties":{"name":"Hockley"},"geometry":{"type":"Polygon","coordinates":[[[-102.618052,33.823637],[-102.086789,33.823637],[-102.075835,33.390959],[-102.366113,33.390959],[-102.596144,33.390959],[-102.618052,33.823637]]]}},
+{"type":"Feature","id":"48221","properties":{"name":"Hood"},"geometry":{"type":"Polygon","coordinates":[[[-98.066715,32.558464],[-97.617606,32.552987],[-97.617606,32.317479],[-97.946222,32.235325],[-98.066715,32.509172],[-98.066715,32.558464]]]}},
+{"type":"Feature","id":"48223","properties":{"name":"Hopkins"},"geometry":{"type":"Polygon","coordinates":[[[-95.492553,33.35262],[-95.306337,33.374528],[-95.306337,32.963758],[-95.667815,32.958281],[-95.864985,32.980189],[-95.859508,33.221174],[-95.492553,33.35262]]]}},
+{"type":"Feature","id":"48225","properties":{"name":"Houston"},"geometry":{"type":"Polygon","coordinates":[[[-95.623999,31.54523],[-95.273475,31.594523],[-95.005105,31.424737],[-94.955813,31.386399],[-95.432306,31.057782],[-95.618522,30.931813],[-95.7664,31.096121],[-95.739015,31.501415],[-95.623999,31.54523]]]}},
+{"type":"Feature","id":"48227","properties":{"name":"Howard"},"geometry":{"type":"Polygon","coordinates":[[[-101.17214,32.525602],[-101.183094,32.087447],[-101.265248,32.087447],[-101.692449,32.087447],[-101.686972,32.525602],[-101.17214,32.525602]]]}},
+{"type":"Feature","id":"48229","properties":{"name":"Hudspeth"},"geometry":{"type":"Polygon","coordinates":[[[-105.997324,31.999816],[-104.918367,31.999816],[-104.918367,30.663443],[-104.98409,30.630581],[-104.98409,30.630581],[-105.997324,31.386399],[-105.997324,31.999816]]]}},
+{"type":"Feature","id":"48231","properties":{"name":"Hunt"},"geometry":{"type":"Polygon","coordinates":[[[-95.859508,33.40739],[-95.859508,33.221174],[-95.864985,32.980189],[-95.936185,32.837788],[-96.062155,32.837788],[-96.078585,32.837788],[-96.297663,32.843265],[-96.297663,32.980189],[-96.297663,33.35262],[-95.859508,33.40739]]]}},
+{"type":"Feature","id":"48233","properties":{"name":"Hutchinson"},"geometry":{"type":"Polygon","coordinates":[[[-101.621249,36.052752],[-101.084509,36.052752],[-101.084509,35.625551],[-101.621249,35.625551],[-101.621249,36.052752]]]}},
+{"type":"Feature","id":"48235","properties":{"name":"Irion"},"geometry":{"type":"Polygon","coordinates":[[[-101.265248,31.528799],[-100.695646,31.523322],[-100.690169,31.085167],[-100.964016,31.085167],[-101.276202,31.07969],[-101.265248,31.528799]]]}},
+{"type":"Feature","id":"48237","properties":{"name":"Jack"},"geometry":{"type":"Polygon","coordinates":[[[-98.422716,33.467636],[-97.979084,33.467636],[-97.918837,33.434775],[-97.924314,33.002096],[-98.055761,33.002096],[-98.055761,33.002096],[-98.428193,33.007573],[-98.422716,33.396436],[-98.422716,33.467636]]]}},
+{"type":"Feature","id":"48239","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-96.659141,29.261346],[-96.64271,29.250392],[-96.308617,28.965591],[-96.325048,28.675313],[-96.576987,28.708175],[-96.576987,28.702698],[-96.64271,28.713652],[-96.938465,29.064176],[-96.659141,29.261346]]]}},
+{"type":"Feature","id":"48241","properties":{"name":"Jasper"},"geometry":{"type":"Polygon","coordinates":[[[-93.997348,31.139937],[-93.909717,31.156367],[-93.898763,30.241718],[-94.117841,30.241718],[-94.074025,30.526519],[-94.29858,31.035875],[-94.457411,31.035875],[-94.128795,31.101598],[-94.041164,31.13446],[-93.997348,31.139937]]]}},
+{"type":"Feature","id":"48243","properties":{"name":"Jeff Davis"},"geometry":{"type":"Polygon","coordinates":[[[-104.102303,31.107075],[-103.587471,30.767505],[-103.439593,30.663443],[-103.801071,30.411504],[-104.98409,30.630581],[-104.918367,30.663443],[-104.102303,31.107075]]]}},
+{"type":"Feature","id":"48245","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-94.216426,30.175995],[-94.117841,30.159564],[-93.854948,29.863809],[-93.838517,29.688547],[-94.353349,29.562578],[-94.44098,29.891194],[-94.446457,30.110272],[-94.216426,30.175995]]]}},
+{"type":"Feature","id":"48247","properties":{"name":"Jim Hogg"},"geometry":{"type":"Polygon","coordinates":[[[-98.521301,27.26774],[-98.422716,26.785769],[-98.953979,26.785769],[-98.953979,27.26774],[-98.800625,27.355371],[-98.521301,27.26774]]]}},
+{"type":"Feature","id":"48249","properties":{"name":"Jim Wells"},"geometry":{"type":"Polygon","coordinates":[[[-98.2365,28.056419],[-97.880499,28.056419],[-97.798345,27.996173],[-97.940745,27.634695],[-98.011945,27.634695],[-98.055761,27.262263],[-98.231023,27.262263],[-98.2365,28.056419]]]}},
+{"type":"Feature","id":"48251","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-97.551882,32.552987],[-97.086342,32.54751],[-97.086342,32.268186],[-97.113727,32.257232],[-97.475205,32.175078],[-97.617606,32.202463],[-97.617606,32.317479],[-97.617606,32.552987],[-97.551882,32.552987]]]}},
+{"type":"Feature","id":"48253","properties":{"name":"Jones"},"geometry":{"type":"Polygon","coordinates":[[[-100.109614,32.958281],[-99.989121,32.958281],[-99.611212,32.958281],[-99.611212,32.514649],[-99.627643,32.514649],[-100.136998,32.520126],[-100.147952,32.520126],[-100.142475,32.958281],[-100.109614,32.958281]]]}},
+{"type":"Feature","id":"48255","properties":{"name":"Karnes"},"geometry":{"type":"Polygon","coordinates":[[[-97.727145,29.223007],[-97.612129,29.107992],[-97.57379,28.812237],[-97.776437,28.669836],[-97.935268,28.713652],[-98.006468,28.691744],[-98.099576,28.784852],[-98.192684,28.883437],[-97.727145,29.223007]]]}},
+{"type":"Feature","id":"48257","properties":{"name":"Kaufman"},"geometry":{"type":"Polygon","coordinates":[[[-96.297663,32.843265],[-96.078585,32.837788],[-96.078585,32.355817],[-96.215509,32.361294],[-96.451017,32.361294],[-96.527695,32.54751],[-96.516741,32.81588],[-96.297663,32.843265]]]}},
+{"type":"Feature","id":"48259","properties":{"name":"Kendall"},"geometry":{"type":"Polygon","coordinates":[[[-98.921118,30.137656],[-98.587024,30.137656],[-98.411762,29.93501],[-98.64727,29.743317],[-98.778717,29.721409],[-98.915641,29.781655],[-98.921118,30.137656]]]}},
+{"type":"Feature","id":"48261","properties":{"name":"Kenedy"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-97.738098,27.273217],[-97.634037,27.284171],[-97.442344,26.599553],[-97.655944,26.599553],[-97.957176,26.610507],[-97.984561,26.780292],[-97.984561,27.207493],[-97.738098,27.273217]]],[[[-97.371143,27.278694],[-97.349236,27.278694],[-97.288989,26.599553],[-97.316374,26.599553],[-97.371143,27.278694]]]]}},
+{"type":"Feature","id":"48263","properties":{"name":"Kent"},"geometry":{"type":"Polygon","coordinates":[[[-100.816139,33.396436],[-100.514907,33.396436],[-100.520384,32.963758],[-100.657308,32.963758],[-101.040693,32.969235],[-101.040693,33.396436],[-100.816139,33.396436]]]}},
+{"type":"Feature","id":"48265","properties":{"name":"Kerr"},"geometry":{"type":"Polygon","coordinates":[[[-99.605735,30.291011],[-99.304503,30.285534],[-98.921118,30.137656],[-98.915641,29.781655],[-99.600258,29.907625],[-99.759089,30.071933],[-99.753612,30.291011],[-99.605735,30.291011]]]}},
+{"type":"Feature","id":"48267","properties":{"name":"Kimble"},"geometry":{"type":"Polygon","coordinates":[[[-99.759089,30.712735],[-99.485242,30.712735],[-99.304503,30.499135],[-99.304503,30.285534],[-99.605735,30.291011],[-99.753612,30.291011],[-100.115091,30.291011],[-100.115091,30.712735],[-99.759089,30.712735]]]}},
+{"type":"Feature","id":"48269","properties":{"name":"King"},"geometry":{"type":"Polygon","coordinates":[[[-99.994598,33.834591],[-99.989121,33.396436],[-100.197245,33.396436],[-100.514907,33.396436],[-100.520384,33.834591],[-100.049367,33.834591],[-99.994598,33.834591]]]}},
+{"type":"Feature","id":"48271","properties":{"name":"Kinney"},"geometry":{"type":"Polygon","coordinates":[[[-100.575153,29.622824],[-100.109614,29.622824],[-100.109614,29.086084],[-100.668261,29.086084],[-100.794231,29.239438],[-100.701123,29.622824],[-100.575153,29.622824]]]}},
+{"type":"Feature","id":"48273","properties":{"name":"Kleberg"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-98.011945,27.634695],[-97.940745,27.634695],[-97.327328,27.563495],[-97.634037,27.284171],[-97.738098,27.273217],[-97.984561,27.207493],[-98.055761,27.262263],[-98.011945,27.634695]]],[[[-97.245174,27.579925],[-97.223266,27.574448],[-97.349236,27.278694],[-97.371143,27.278694],[-97.245174,27.579925]]]]}},
+{"type":"Feature","id":"48275","properties":{"name":"Knox"},"geometry":{"type":"Polygon","coordinates":[[[-99.868628,33.834591],[-99.474288,33.736006],[-99.474288,33.396436],[-99.518104,33.396436],[-99.989121,33.396436],[-99.994598,33.834591],[-99.868628,33.834591]]]}},
+{"type":"Feature","id":"48277","properties":{"name":"Lamar"},"geometry":{"type":"Polygon","coordinates":[[[-95.311814,33.878407],[-95.306337,33.380005],[-95.651384,33.484067],[-95.859508,33.462159],[-95.843077,33.840068],[-95.760923,33.87293],[-95.311814,33.878407]]]}},
+{"type":"Feature","id":"48279","properties":{"name":"Lamb"},"geometry":{"type":"Polygon","coordinates":[[[-102.327774,34.311085],[-102.092266,34.311085],[-102.086789,33.823637],[-102.618052,33.823637],[-102.612575,34.311085],[-102.524944,34.311085],[-102.327774,34.311085]]]}},
+{"type":"Feature","id":"48281","properties":{"name":"Lampasas"},"geometry":{"type":"Polygon","coordinates":[[[-98.181731,31.463076],[-97.907884,31.068736],[-97.91336,31.035875],[-98.017422,31.035875],[-98.439147,31.030398],[-98.565116,31.233045],[-98.269362,31.413784],[-98.181731,31.463076]]]}},
+{"type":"Feature","id":"48283","properties":{"name":"La Salle"},"geometry":{"type":"Polygon","coordinates":[[[-98.800625,28.647929],[-98.800625,28.636975],[-98.800625,28.056419],[-99.392134,28.204297],[-99.397611,28.642452],[-98.800625,28.647929]]]}},
+{"type":"Feature","id":"48285","properties":{"name":"Lavaca"},"geometry":{"type":"Polygon","coordinates":[[[-96.872742,29.633778],[-96.659141,29.261346],[-96.938465,29.064176],[-96.976804,29.102515],[-97.239697,29.381839],[-97.141112,29.628301],[-96.872742,29.633778]]]}},
+{"type":"Feature","id":"48287","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-97.157543,30.455319],[-96.96585,30.559381],[-96.64271,30.296488],[-96.796065,30.159564],[-96.801542,30.154087],[-97.026096,30.050025],[-97.332805,30.40055],[-97.157543,30.455319]]]}},
+{"type":"Feature","id":"48289","properties":{"name":"Leon"},"geometry":{"type":"Polygon","coordinates":[[[-95.728061,31.643815],[-95.739015,31.501415],[-95.7664,31.096121],[-95.903323,31.090644],[-96.242894,30.975628],[-96.319571,31.359014],[-96.237417,31.413784],[-95.788308,31.61643],[-95.728061,31.643815]]]}},
+{"type":"Feature","id":"48291","properties":{"name":"Liberty"},"geometry":{"type":"Polygon","coordinates":[[[-94.851751,30.493658],[-94.731258,30.488181],[-94.446457,30.110272],[-94.44098,29.891194],[-94.97772,29.885717],[-95.098213,30.165041],[-95.163936,30.34578],[-94.851751,30.493658]]]}},
+{"type":"Feature","id":"48293","properties":{"name":"Limestone"},"geometry":{"type":"Polygon","coordinates":[[[-96.719387,31.8136],[-96.494833,31.797169],[-96.237417,31.413784],[-96.319571,31.359014],[-96.598895,31.222091],[-96.801542,31.523322],[-96.932988,31.709538],[-96.719387,31.8136]]]}},
+{"type":"Feature","id":"48295","properties":{"name":"Lipscomb"},"geometry":{"type":"Polygon","coordinates":[[[-100.005552,36.501861],[-100.000075,36.058229],[-100.542292,36.058229],[-100.547769,36.058229],[-100.547769,36.501861],[-100.005552,36.501861]]]}},
+{"type":"Feature","id":"48297","properties":{"name":"Live Oak"},"geometry":{"type":"Polygon","coordinates":[[[-98.099576,28.784852],[-98.006468,28.691744],[-97.820252,28.176912],[-97.880499,28.056419],[-98.2365,28.056419],[-98.335085,28.056419],[-98.335085,28.615067],[-98.099576,28.784852]]]}},
+{"type":"Feature","id":"48299","properties":{"name":"Llano"},"geometry":{"type":"Polygon","coordinates":[[[-98.515824,30.920859],[-98.444624,30.920859],[-98.351516,30.488181],[-98.411762,30.504611],[-98.592501,30.499135],[-98.964933,30.499135],[-98.964933,30.920859],[-98.515824,30.920859]]]}},
+{"type":"Feature","id":"48301","properties":{"name":"Loving"},"geometry":{"type":"Polygon","coordinates":[[[-103.71344,31.999816],[-103.324578,31.999816],[-103.330055,31.649292],[-103.609378,31.649292],[-103.98181,31.999816],[-103.724394,31.999816],[-103.71344,31.999816]]]}},
+{"type":"Feature","id":"48303","properties":{"name":"Lubbock"},"geometry":{"type":"Polygon","coordinates":[[[-101.571957,33.829114],[-101.561003,33.829114],[-101.555526,33.396436],[-102.075835,33.390959],[-102.086789,33.823637],[-101.571957,33.829114]]]}},
+{"type":"Feature","id":"48305","properties":{"name":"Lynn"},"geometry":{"type":"Polygon","coordinates":[[[-101.555526,33.396436],[-101.555526,32.963758],[-101.692449,32.963758],[-102.075835,32.958281],[-102.075835,33.390959],[-101.555526,33.396436]]]}},
+{"type":"Feature","id":"48307","properties":{"name":"McCulloch"},"geometry":{"type":"Polygon","coordinates":[[[-99.430473,31.468553],[-99.200441,31.468553],[-99.090903,31.463076],[-99.090903,30.942767],[-99.485242,30.942767],[-99.605735,31.085167],[-99.600258,31.490461],[-99.430473,31.468553]]]}},
+{"type":"Feature","id":"48309","properties":{"name":"McLennan"},"geometry":{"type":"Polygon","coordinates":[[[-97.080866,31.840985],[-96.932988,31.709538],[-96.801542,31.523322],[-97.278035,31.282337],[-97.404005,31.304245],[-97.420436,31.320676],[-97.606652,31.589046],[-97.278035,31.747877],[-97.080866,31.840985]]]}},
+{"type":"Feature","id":"48311","properties":{"name":"McMullen"},"geometry":{"type":"Polygon","coordinates":[[[-98.581547,28.642452],[-98.335085,28.615067],[-98.335085,28.056419],[-98.800625,28.056419],[-98.800625,28.636975],[-98.581547,28.642452]]]}},
+{"type":"Feature","id":"48313","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-95.903323,31.090644],[-95.7664,31.096121],[-95.618522,30.931813],[-95.864985,30.86609],[-96.166217,30.822274],[-96.237417,30.964674],[-96.242894,30.975628],[-95.903323,31.090644]]]}},
+{"type":"Feature","id":"48315","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-94.249287,32.881604],[-94.041164,32.881604],[-94.041164,32.695388],[-94.703873,32.793973],[-94.703873,32.881604],[-94.654581,32.881604],[-94.249287,32.881604]]]}},
+{"type":"Feature","id":"48317","properties":{"name":"Martin"},"geometry":{"type":"Polygon","coordinates":[[[-101.686972,32.525602],[-101.692449,32.087447],[-101.747219,32.087447],[-101.774603,32.087447],[-101.933435,32.087447],[-102.212759,32.087447],[-102.212759,32.525602],[-102.201805,32.525602],[-101.686972,32.525602]]]}},
+{"type":"Feature","id":"48319","properties":{"name":"Mason"},"geometry":{"type":"Polygon","coordinates":[[[-99.485242,30.942767],[-99.090903,30.942767],[-98.964933,30.920859],[-98.964933,30.499135],[-99.304503,30.499135],[-99.485242,30.712735],[-99.485242,30.942767]]]}},
+{"type":"Feature","id":"48321","properties":{"name":"Matagorda"},"geometry":{"type":"Polygon","coordinates":[[[-95.864985,29.223007],[-95.508984,28.823191],[-96.379817,28.385036],[-96.37434,28.401466],[-96.325048,28.642452],[-96.325048,28.675313],[-96.308617,28.965591],[-95.875939,29.228484],[-95.864985,29.223007]]]}},
+{"type":"Feature","id":"48323","properties":{"name":"Maverick"},"geometry":{"type":"Polygon","coordinates":[[[-100.109614,29.086084],[-100.115091,28.647929],[-100.115091,28.19882],[-100.213675,28.19882],[-100.668261,29.086084],[-100.109614,29.086084]]]}},
+{"type":"Feature","id":"48325","properties":{"name":"Medina"},"geometry":{"type":"Polygon","coordinates":[[[-98.806102,29.688547],[-98.806102,29.250392],[-98.806102,29.091561],[-98.904687,29.091561],[-99.414042,29.091561],[-99.414042,29.628301],[-98.806102,29.688547]]]}},
+{"type":"Feature","id":"48327","properties":{"name":"Menard"},"geometry":{"type":"Polygon","coordinates":[[[-100.115091,31.090644],[-99.605735,31.085167],[-99.485242,30.942767],[-99.485242,30.712735],[-99.759089,30.712735],[-100.115091,30.712735],[-100.115091,31.090644]]]}},
+{"type":"Feature","id":"48329","properties":{"name":"Midland"},"geometry":{"type":"Polygon","coordinates":[[[-101.933435,32.087447],[-101.774603,32.087447],[-101.774603,31.649292],[-102.223713,31.649292],[-102.289436,31.649292],[-102.289436,32.087447],[-102.212759,32.087447],[-101.933435,32.087447]]]}},
+{"type":"Feature","id":"48331","properties":{"name":"Milam"},"geometry":{"type":"Polygon","coordinates":[[[-96.828926,31.107075],[-96.620803,30.729166],[-96.96585,30.559381],[-97.157543,30.455319],[-97.316374,30.751074],[-97.069912,30.986582],[-96.828926,31.107075]]]}},
+{"type":"Feature","id":"48333","properties":{"name":"Mills"},"geometry":{"type":"Polygon","coordinates":[[[-98.669178,31.698584],[-98.461055,31.682154],[-98.269362,31.413784],[-98.565116,31.233045],[-98.992318,31.484984],[-98.669178,31.698584]]]}},
+{"type":"Feature","id":"48335","properties":{"name":"Mitchell"},"geometry":{"type":"Polygon","coordinates":[[[-100.662785,32.525602],[-100.662785,32.087447],[-100.821616,32.087447],[-101.183094,32.087447],[-101.17214,32.525602],[-101.17214,32.525602],[-100.662785,32.525602]]]}},
+{"type":"Feature","id":"48337","properties":{"name":"Montague"},"geometry":{"type":"Polygon","coordinates":[[[-97.562836,33.894838],[-97.486159,33.916745],[-97.486159,33.434775],[-97.50259,33.434775],[-97.918837,33.434775],[-97.979084,33.467636],[-97.979084,33.889361],[-97.562836,33.894838]]]}},
+{"type":"Feature","id":"48339","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-95.832123,30.630581],[-95.361106,30.504611],[-95.163936,30.34578],[-95.098213,30.165041],[-95.218706,30.066456],[-95.804738,30.088364],[-95.804738,30.247195],[-95.832123,30.630581]]]}},
+{"type":"Feature","id":"48341","properties":{"name":"Moore"},"geometry":{"type":"Polygon","coordinates":[[[-102.125128,36.058229],[-101.621249,36.052752],[-101.621249,35.625551],[-101.621249,35.620074],[-101.659588,35.620074],[-102.163466,35.620074],[-102.163466,35.625551],[-102.163466,36.052752],[-102.125128,36.058229]]]}},
+{"type":"Feature","id":"48343","properties":{"name":"Morris"},"geometry":{"type":"Polygon","coordinates":[[[-94.807935,33.363574],[-94.747689,33.330713],[-94.654581,33.270466],[-94.654581,32.881604],[-94.703873,32.881604],[-94.720304,32.903511],[-94.818889,32.980189],[-94.807935,33.363574]]]}},
+{"type":"Feature","id":"48345","properties":{"name":"Motley"},"geometry":{"type":"Polygon","coordinates":[[[-100.673738,34.311085],[-100.514907,34.316562],[-100.520384,33.834591],[-100.90377,33.834591],[-101.040693,33.834591],[-101.040693,34.311085],[-100.947585,34.311085],[-100.673738,34.311085]]]}},
+{"type":"Feature","id":"48347","properties":{"name":"Nacogdoches"},"geometry":{"type":"Polygon","coordinates":[[[-94.512181,31.846462],[-94.451934,31.846462],[-94.397165,31.654769],[-94.325965,31.222091],[-94.868182,31.528799],[-94.939382,31.846462],[-94.512181,31.846462]]]}},
+{"type":"Feature","id":"48349","properties":{"name":"Navarro"},"geometry":{"type":"Polygon","coordinates":[[[-96.385294,32.328433],[-96.056678,32.01077],[-96.494833,31.797169],[-96.719387,31.8136],[-96.89465,32.076493],[-96.385294,32.328433]]]}},
+{"type":"Feature","id":"48351","properties":{"name":"Newton"},"geometry":{"type":"Polygon","coordinates":[[[-93.603008,31.178275],[-93.553716,31.183752],[-93.559193,30.86609],[-93.739932,30.40055],[-93.70707,30.247195],[-93.898763,30.241718],[-93.909717,31.156367],[-93.603008,31.178275]]]}},
+{"type":"Feature","id":"48353","properties":{"name":"Nolan"},"geometry":{"type":"Polygon","coordinates":[[[-100.147952,32.520126],[-100.153429,32.08197],[-100.235583,32.08197],[-100.662785,32.087447],[-100.662785,32.525602],[-100.147952,32.520126]]]}},
+{"type":"Feature","id":"48355","properties":{"name":"Nueces"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-97.803822,27.979742],[-97.365666,27.848295],[-97.327328,27.563495],[-97.940745,27.634695],[-97.798345,27.996173],[-97.803822,27.979742]]],[[[-97.053481,27.842818],[-97.048004,27.837342],[-97.223266,27.574448],[-97.245174,27.579925],[-97.053481,27.842818]]]]}},
+{"type":"Feature","id":"48357","properties":{"name":"Ochiltree"},"geometry":{"type":"Polygon","coordinates":[[[-100.805185,36.501861],[-100.547769,36.501861],[-100.547769,36.058229],[-100.947585,36.058229],[-101.084509,36.058229],[-101.084509,36.501861],[-100.953062,36.501861],[-100.805185,36.501861]]]}},
+{"type":"Feature","id":"48359","properties":{"name":"Oldham"},"geometry":{"type":"Polygon","coordinates":[[[-102.163466,35.625551],[-102.163466,35.620074],[-102.168943,35.181919],[-102.579714,35.187396],[-103.039777,35.181919],[-103.039777,35.620074],[-102.163466,35.625551]]]}},
+{"type":"Feature","id":"48361","properties":{"name":"Orange"},"geometry":{"type":"Polygon","coordinates":[[[-93.70707,30.247195],[-93.723501,30.050025],[-93.854948,29.863809],[-94.117841,30.159564],[-94.117841,30.241718],[-93.898763,30.241718],[-93.70707,30.247195]]]}},
+{"type":"Feature","id":"48363","properties":{"name":"Palo Pinto"},"geometry":{"type":"Polygon","coordinates":[[[-98.428193,33.007573],[-98.055761,33.002096],[-98.066715,32.558464],[-98.066715,32.509172],[-98.477485,32.514649],[-98.57607,32.514649],[-98.57607,32.952804],[-98.428193,33.007573]]]}},
+{"type":"Feature","id":"48365","properties":{"name":"Panola"},"geometry":{"type":"Polygon","coordinates":[[[-94.462888,32.377725],[-94.041164,32.394156],[-94.041164,32.196986],[-94.013779,31.977908],[-94.134272,31.977908],[-94.512181,31.972432],[-94.490273,32.394156],[-94.462888,32.377725]]]}},
+{"type":"Feature","id":"48367","properties":{"name":"Parker"},"geometry":{"type":"Polygon","coordinates":[[[-98.055761,33.002096],[-97.924314,33.002096],[-97.546405,32.996619],[-97.551882,32.552987],[-97.617606,32.552987],[-98.066715,32.558464],[-98.055761,33.002096],[-98.055761,33.002096]]]}},
+{"type":"Feature","id":"48369","properties":{"name":"Parmer"},"geometry":{"type":"Polygon","coordinates":[[[-103.045254,34.74924],[-102.524944,34.74924],[-102.524944,34.311085],[-102.612575,34.311085],[-103.045254,34.311085],[-103.045254,34.74924]]]}},
+{"type":"Feature","id":"48371","properties":{"name":"Pecos"},"geometry":{"type":"Polygon","coordinates":[[[-102.83713,31.282337],[-102.76593,31.293291],[-102.388021,31.085167],[-101.769126,30.652489],[-102.344205,30.597719],[-102.56876,30.050025],[-103.346485,30.603196],[-103.439593,30.663443],[-103.587471,30.767505],[-103.012392,31.369968],[-102.83713,31.282337]]]}},
+{"type":"Feature","id":"48373","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-94.813412,31.13446],[-94.561473,31.057782],[-94.545042,30.526519],[-94.731258,30.488181],[-94.851751,30.493658],[-95.202275,30.822274],[-94.840797,31.145414],[-94.813412,31.13446]]]}},
+{"type":"Feature","id":"48375","properties":{"name":"Potter"},"geometry":{"type":"Polygon","coordinates":[[[-101.659588,35.620074],[-101.621249,35.620074],[-101.621249,35.181919],[-101.988204,35.181919],[-102.168943,35.181919],[-102.163466,35.620074],[-101.659588,35.620074]]]}},
+{"type":"Feature","id":"48377","properties":{"name":"Presidio"},"geometry":{"type":"Polygon","coordinates":[[[-104.98409,30.630581],[-103.801071,30.411504],[-103.790117,29.261346],[-104.507597,29.639255],[-104.98409,30.630581],[-104.98409,30.630581]]]}},
+{"type":"Feature","id":"48379","properties":{"name":"Rains"},"geometry":{"type":"Polygon","coordinates":[[[-95.864985,32.980189],[-95.667815,32.958281],[-95.634953,32.722772],[-95.936185,32.837788],[-95.864985,32.980189]]]}},
+{"type":"Feature","id":"48381","properties":{"name":"Randall"},"geometry":{"type":"Polygon","coordinates":[[[-101.988204,35.181919],[-101.621249,35.181919],[-101.626726,34.74924],[-101.999158,34.74924],[-102.004635,34.74924],[-102.168943,34.74924],[-102.168943,35.181919],[-101.988204,35.181919]]]}},
+{"type":"Feature","id":"48383","properties":{"name":"Reagan"},"geometry":{"type":"Polygon","coordinates":[[[-101.686972,31.649292],[-101.265248,31.649292],[-101.265248,31.556184],[-101.265248,31.528799],[-101.276202,31.07969],[-101.774603,31.07969],[-101.774603,31.649292],[-101.686972,31.649292]]]}},
+{"type":"Feature","id":"48385","properties":{"name":"Real"},"geometry":{"type":"Polygon","coordinates":[[[-99.759089,30.071933],[-99.600258,29.907625],[-99.605735,29.628301],[-100.016506,29.622824],[-99.759089,30.071933]]]}},
+{"type":"Feature","id":"48387","properties":{"name":"Red River"},"geometry":{"type":"Polygon","coordinates":[[[-95.158459,33.938653],[-94.736735,33.703145],[-94.747689,33.330713],[-94.807935,33.363574],[-95.125598,33.390959],[-95.306337,33.380005],[-95.306337,33.380005],[-95.311814,33.878407],[-95.158459,33.938653]]]}},
+{"type":"Feature","id":"48389","properties":{"name":"Reeves"},"geometry":{"type":"Polygon","coordinates":[[[-104.025626,31.999816],[-103.98181,31.999816],[-103.609378,31.649292],[-103.012392,31.369968],[-103.587471,30.767505],[-104.102303,31.107075],[-104.025626,31.999816]]]}},
+{"type":"Feature","id":"48391","properties":{"name":"Refugio"},"geometry":{"type":"Polygon","coordinates":[[[-97.146589,28.549344],[-96.889173,28.505528],[-96.763203,28.41242],[-96.790588,28.319312],[-97.261605,28.078327],[-97.540929,28.165958],[-97.37662,28.390513],[-97.16302,28.554821],[-97.146589,28.549344]]]}},
+{"type":"Feature","id":"48393","properties":{"name":"Roberts"},"geometry":{"type":"Polygon","coordinates":[[[-100.947585,36.058229],[-100.547769,36.058229],[-100.542292,36.058229],[-100.542292,35.620074],[-101.084509,35.620074],[-101.084509,35.625551],[-101.084509,35.625551],[-101.084509,36.052752],[-101.084509,36.058229],[-100.947585,36.058229]]]}},
+{"type":"Feature","id":"48395","properties":{"name":"Robertson"},"geometry":{"type":"Polygon","coordinates":[[[-96.319571,31.359014],[-96.242894,30.975628],[-96.566033,30.696304],[-96.620803,30.729166],[-96.828926,31.107075],[-96.598895,31.222091],[-96.319571,31.359014]]]}},
+{"type":"Feature","id":"48397","properties":{"name":"Rockwall"},"geometry":{"type":"Polygon","coordinates":[[[-96.440064,32.980189],[-96.297663,32.980189],[-96.297663,32.843265],[-96.516741,32.81588],[-96.516741,32.980189],[-96.440064,32.980189]]]}},
+{"type":"Feature","id":"48399","properties":{"name":"Runnels"},"geometry":{"type":"Polygon","coordinates":[[[-100.054844,32.08197],[-99.715274,32.08197],[-99.720751,31.578092],[-99.726228,31.578092],[-100.109614,31.578092],[-100.235583,31.693108],[-100.235583,32.08197],[-100.153429,32.08197],[-100.054844,32.08197]]]}},
+{"type":"Feature","id":"48401","properties":{"name":"Rusk"},"geometry":{"type":"Polygon","coordinates":[[[-94.577904,32.394156],[-94.490273,32.394156],[-94.512181,31.972432],[-94.451934,31.846462],[-94.512181,31.846462],[-94.939382,31.846462],[-94.983197,32.13674],[-94.988674,32.366771],[-94.577904,32.394156]]]}},
+{"type":"Feature","id":"48403","properties":{"name":"Sabine"},"geometry":{"type":"Polygon","coordinates":[[[-93.843994,31.589046],[-93.83304,31.583569],[-93.603008,31.178275],[-93.909717,31.156367],[-93.997348,31.139937],[-94.041164,31.13446],[-93.986394,31.567138],[-93.843994,31.589046]]]}},
+{"type":"Feature","id":"48405","properties":{"name":"San Augustine"},"geometry":{"type":"Polygon","coordinates":[[[-94.002825,31.578092],[-93.986394,31.567138],[-94.041164,31.13446],[-94.128795,31.101598],[-94.325965,31.222091],[-94.397165,31.654769],[-94.002825,31.578092]]]}},
+{"type":"Feature","id":"48407","properties":{"name":"San Jacinto"},"geometry":{"type":"Polygon","coordinates":[[[-95.311814,30.88252],[-95.202275,30.822274],[-94.851751,30.493658],[-95.163936,30.34578],[-95.361106,30.504611],[-95.328245,30.860613],[-95.311814,30.88252]]]}},
+{"type":"Feature","id":"48409","properties":{"name":"San Patricio"},"geometry":{"type":"Polygon","coordinates":[[[-97.820252,28.176912],[-97.540929,28.165958],[-97.261605,28.078327],[-97.135635,27.903065],[-97.365666,27.848295],[-97.803822,27.979742],[-97.798345,27.996173],[-97.880499,28.056419],[-97.820252,28.176912]]]}},
+{"type":"Feature","id":"48411","properties":{"name":"San Saba"},"geometry":{"type":"Polygon","coordinates":[[[-98.992318,31.484984],[-98.565116,31.233045],[-98.439147,31.030398],[-98.444624,30.920859],[-98.515824,30.920859],[-98.964933,30.920859],[-99.090903,30.942767],[-99.090903,31.463076],[-98.992318,31.484984]]]}},
+{"type":"Feature","id":"48413","properties":{"name":"Schleicher"},"geometry":{"type":"Polygon","coordinates":[[[-100.690169,31.085167],[-100.115091,31.090644],[-100.115091,30.712735],[-100.958539,30.707258],[-100.964016,31.085167],[-100.690169,31.085167]]]}},
+{"type":"Feature","id":"48415","properties":{"name":"Scurry"},"geometry":{"type":"Polygon","coordinates":[[[-101.040693,32.969235],[-100.657308,32.963758],[-100.662785,32.525602],[-101.17214,32.525602],[-101.17214,32.963758],[-101.040693,32.969235]]]}},
+{"type":"Feature","id":"48417","properties":{"name":"Shackelford"},"geometry":{"type":"Polygon","coordinates":[[[-99.233303,32.958281],[-99.09638,32.958281],[-99.09638,32.514649],[-99.11281,32.514649],[-99.194965,32.514649],[-99.611212,32.514649],[-99.611212,32.958281],[-99.468812,32.958281],[-99.233303,32.958281]]]}},
+{"type":"Feature","id":"48419","properties":{"name":"Shelby"},"geometry":{"type":"Polygon","coordinates":[[[-94.134272,31.977908],[-94.013779,31.977908],[-93.882332,31.846462],[-93.83304,31.583569],[-93.843994,31.589046],[-93.986394,31.567138],[-94.002825,31.578092],[-94.397165,31.654769],[-94.451934,31.846462],[-94.512181,31.972432],[-94.134272,31.977908]]]}},
+{"type":"Feature","id":"48421","properties":{"name":"Sherman"},"geometry":{"type":"Polygon","coordinates":[[[-101.812942,36.501861],[-101.621249,36.501861],[-101.621249,36.052752],[-102.125128,36.058229],[-102.163466,36.052752],[-102.163466,36.501861],[-102.03202,36.501861],[-101.812942,36.501861]]]}},
+{"type":"Feature","id":"48423","properties":{"name":"Smith"},"geometry":{"type":"Polygon","coordinates":[[[-95.574707,32.67348],[-95.152983,32.569418],[-94.988674,32.536556],[-94.988674,32.366771],[-94.983197,32.13674],[-95.459691,32.13674],[-95.448737,32.355817],[-95.596615,32.684434],[-95.574707,32.67348]]]}},
+{"type":"Feature","id":"48425","properties":{"name":"Somervell"},"geometry":{"type":"Polygon","coordinates":[[[-97.946222,32.235325],[-97.617606,32.317479],[-97.617606,32.202463],[-97.62856,32.20794],[-97.864068,32.087447],[-97.946222,32.235325]]]}},
+{"type":"Feature","id":"48427","properties":{"name":"Starr"},"geometry":{"type":"Polygon","coordinates":[[[-98.953979,26.785769],[-98.422716,26.785769],[-98.318654,26.785769],[-98.587024,26.254506],[-99.16758,26.572168],[-98.953979,26.785769]]]}},
+{"type":"Feature","id":"48429","properties":{"name":"Stephens"},"geometry":{"type":"Polygon","coordinates":[[[-98.762286,32.958281],[-98.57607,32.952804],[-98.57607,32.514649],[-98.740378,32.514649],[-99.09638,32.514649],[-99.09638,32.958281],[-98.948502,32.958281],[-98.762286,32.958281]]]}},
+{"type":"Feature","id":"48431","properties":{"name":"Sterling"},"geometry":{"type":"Polygon","coordinates":[[[-101.265248,32.087447],[-101.183094,32.087447],[-100.821616,32.087447],[-100.827093,31.698584],[-101.265248,31.556184],[-101.265248,31.649292],[-101.265248,32.087447]]]}},
+{"type":"Feature","id":"48433","properties":{"name":"Stonewall"},"geometry":{"type":"Polygon","coordinates":[[[-100.197245,33.396436],[-99.989121,33.396436],[-99.989121,32.958281],[-100.109614,32.958281],[-100.142475,32.958281],[-100.520384,32.963758],[-100.514907,33.396436],[-100.197245,33.396436]]]}},
+{"type":"Feature","id":"48435","properties":{"name":"Sutton"},"geometry":{"type":"Polygon","coordinates":[[[-100.115091,30.712735],[-100.115091,30.291011],[-100.701123,30.291011],[-100.958539,30.285534],[-100.958539,30.707258],[-100.115091,30.712735]]]}},
+{"type":"Feature","id":"48437","properties":{"name":"Swisher"},"geometry":{"type":"Polygon","coordinates":[[[-101.999158,34.74924],[-101.626726,34.74924],[-101.473372,34.74924],[-101.473372,34.311085],[-101.56648,34.311085],[-101.999158,34.311085],[-101.999158,34.74924]]]}},
+{"type":"Feature","id":"48439","properties":{"name":"Tarrant"},"geometry":{"type":"Polygon","coordinates":[[[-97.535452,32.996619],[-97.398528,32.991142],[-97.031573,32.985665],[-97.03705,32.54751],[-97.086342,32.54751],[-97.551882,32.552987],[-97.546405,32.996619],[-97.535452,32.996619]]]}},
+{"type":"Feature","id":"48441","properties":{"name":"Taylor"},"geometry":{"type":"Polygon","coordinates":[[[-100.136998,32.520126],[-99.627643,32.514649],[-99.63312,32.08197],[-99.715274,32.08197],[-100.054844,32.08197],[-100.153429,32.08197],[-100.147952,32.520126],[-100.136998,32.520126]]]}},
+{"type":"Feature","id":"48443","properties":{"name":"Terrell"},"geometry":{"type":"Polygon","coordinates":[[[-102.56876,30.050025],[-102.344205,30.597719],[-101.769126,30.652489],[-101.758173,30.285534],[-101.76365,29.781655],[-102.322297,29.88024],[-102.56876,30.050025]]]}},
+{"type":"Feature","id":"48445","properties":{"name":"Terry"},"geometry":{"type":"Polygon","coordinates":[[[-102.366113,33.390959],[-102.075835,33.390959],[-102.075835,32.958281],[-102.207282,32.958281],[-102.596144,32.958281],[-102.596144,33.390959],[-102.366113,33.390959]]]}},
+{"type":"Feature","id":"48447","properties":{"name":"Throckmorton"},"geometry":{"type":"Polygon","coordinates":[[[-99.474288,33.396436],[-98.953979,33.396436],[-98.948502,32.958281],[-99.09638,32.958281],[-99.233303,32.958281],[-99.468812,32.958281],[-99.474288,33.396436]]]}},
+{"type":"Feature","id":"48449","properties":{"name":"Titus"},"geometry":{"type":"Polygon","coordinates":[[[-94.807935,33.363574],[-94.818889,32.980189],[-95.125598,33.034958],[-95.125598,33.390959],[-94.807935,33.363574]]]}},
+{"type":"Feature","id":"48451","properties":{"name":"Tom Green"},"geometry":{"type":"Polygon","coordinates":[[[-100.827093,31.698584],[-100.235583,31.693108],[-100.109614,31.578092],[-100.115091,31.090644],[-100.690169,31.085167],[-100.695646,31.523322],[-101.265248,31.528799],[-101.265248,31.556184],[-100.827093,31.698584]]]}},
+{"type":"Feature","id":"48453","properties":{"name":"Travis"},"geometry":{"type":"Polygon","coordinates":[[[-97.973607,30.625104],[-97.371143,30.41698],[-97.650467,30.071933],[-97.666898,30.066456],[-97.710714,30.022641],[-98.170777,30.356734],[-98.126961,30.427934],[-98.050284,30.625104],[-97.973607,30.625104]]]}},
+{"type":"Feature","id":"48455","properties":{"name":"Trinity"},"geometry":{"type":"Polygon","coordinates":[[[-94.950336,31.342583],[-94.840797,31.145414],[-95.202275,30.822274],[-95.311814,30.88252],[-95.328245,30.860613],[-95.432306,31.057782],[-94.955813,31.386399],[-94.950336,31.342583]]]}},
+{"type":"Feature","id":"48457","properties":{"name":"Tyler"},"geometry":{"type":"Polygon","coordinates":[[[-94.29858,31.035875],[-94.074025,30.526519],[-94.44098,30.526519],[-94.545042,30.526519],[-94.561473,31.057782],[-94.457411,31.035875],[-94.29858,31.035875]]]}},
+{"type":"Feature","id":"48459","properties":{"name":"Upshur"},"geometry":{"type":"Polygon","coordinates":[[[-94.780551,32.903511],[-94.720304,32.903511],[-94.703873,32.881604],[-94.703873,32.793973],[-94.703873,32.651572],[-94.988674,32.536556],[-95.152983,32.569418],[-95.152983,32.903511],[-94.780551,32.903511]]]}},
+{"type":"Feature","id":"48461","properties":{"name":"Upton"},"geometry":{"type":"Polygon","coordinates":[[[-102.223713,31.649292],[-101.774603,31.649292],[-101.774603,31.07969],[-102.30039,31.085167],[-102.316821,31.649292],[-102.289436,31.649292],[-102.223713,31.649292]]]}},
+{"type":"Feature","id":"48463","properties":{"name":"Uvalde"},"geometry":{"type":"Polygon","coordinates":[[[-99.605735,29.628301],[-99.414042,29.628301],[-99.414042,29.091561],[-100.109614,29.086084],[-100.109614,29.622824],[-100.016506,29.622824],[-99.605735,29.628301]]]}},
+{"type":"Feature","id":"48465","properties":{"name":"Val Verde"},"geometry":{"type":"Polygon","coordinates":[[[-101.544572,30.285534],[-100.958539,30.285534],[-100.701123,30.291011],[-100.701123,29.622824],[-100.794231,29.239438],[-101.413125,29.754271],[-101.76365,29.781655],[-101.758173,30.285534],[-101.544572,30.285534]]]}},
+{"type":"Feature","id":"48467","properties":{"name":"Van Zandt"},"geometry":{"type":"Polygon","coordinates":[[[-96.062155,32.837788],[-95.936185,32.837788],[-95.634953,32.722772],[-95.596615,32.684434],[-95.448737,32.355817],[-96.078585,32.355817],[-96.078585,32.837788],[-96.062155,32.837788]]]}},
+{"type":"Feature","id":"48469","properties":{"name":"Victoria"},"geometry":{"type":"Polygon","coordinates":[[[-96.976804,29.102515],[-96.938465,29.064176],[-96.64271,28.713652],[-96.653664,28.702698],[-96.889173,28.505528],[-97.146589,28.549344],[-97.16302,28.554821],[-97.30542,28.861529],[-96.976804,29.102515]]]}},
+{"type":"Feature","id":"48471","properties":{"name":"Walker"},"geometry":{"type":"Polygon","coordinates":[[[-95.432306,31.057782],[-95.328245,30.860613],[-95.361106,30.504611],[-95.832123,30.630581],[-95.864985,30.86609],[-95.618522,30.931813],[-95.432306,31.057782]]]}},
+{"type":"Feature","id":"48473","properties":{"name":"Waller"},"geometry":{"type":"Polygon","coordinates":[[[-95.821169,30.247195],[-95.804738,30.247195],[-95.804738,30.088364],[-95.826646,29.787132],[-95.826646,29.787132],[-96.03477,29.726886],[-96.144309,30.071933],[-96.095016,30.225288],[-95.821169,30.247195]]]}},
+{"type":"Feature","id":"48475","properties":{"name":"Ward"},"geometry":{"type":"Polygon","coordinates":[[[-102.798791,31.649292],[-102.76593,31.649292],[-102.76593,31.293291],[-102.83713,31.282337],[-103.012392,31.369968],[-103.609378,31.649292],[-103.330055,31.649292],[-102.798791,31.649292]]]}},
+{"type":"Feature","id":"48477","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-96.297663,30.378642],[-96.155263,30.329349],[-96.095016,30.225288],[-96.144309,30.071933],[-96.379817,30.082887],[-96.620803,30.044549],[-96.796065,30.159564],[-96.64271,30.296488],[-96.297663,30.378642]]]}},
+{"type":"Feature","id":"48479","properties":{"name":"Webb"},"geometry":{"type":"Polygon","coordinates":[[[-100.115091,28.19882],[-99.392134,28.204297],[-98.800625,28.056419],[-98.800625,27.355371],[-98.953979,27.26774],[-99.359273,27.306078],[-99.452381,27.262263],[-100.213675,28.19882],[-100.115091,28.19882]]]}},
+{"type":"Feature","id":"48481","properties":{"name":"Wharton"},"geometry":{"type":"Polygon","coordinates":[[[-96.17717,29.633778],[-96.089539,29.600916],[-95.848554,29.261346],[-95.875939,29.228484],[-96.308617,28.965591],[-96.64271,29.250392],[-96.17717,29.633778]]]}},
+{"type":"Feature","id":"48483","properties":{"name":"Wheeler"},"geometry":{"type":"Polygon","coordinates":[[[-100.542292,35.620074],[-100.000075,35.620074],[-100.000075,35.422904],[-100.000075,35.181919],[-100.093183,35.181919],[-100.536815,35.181919],[-100.542292,35.620074]]]}},
+{"type":"Feature","id":"48485","properties":{"name":"Wichita"},"geometry":{"type":"Polygon","coordinates":[[[-98.608932,34.157731],[-98.422716,34.081054],[-98.422716,33.834591],[-98.43367,33.834591],[-98.953979,33.834591],[-98.953979,34.2125],[-98.608932,34.157731]]]}},
+{"type":"Feature","id":"48487","properties":{"name":"Wilbarger"},"geometry":{"type":"Polygon","coordinates":[[[-99.211395,34.33847],[-98.953979,34.2125],[-98.953979,33.834591],[-98.992318,33.834591],[-99.474288,33.834591],[-99.474288,34.08653],[-99.474288,34.398716],[-99.211395,34.33847]]]}},
+{"type":"Feature","id":"48489","properties":{"name":"Willacy"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-97.655944,26.599553],[-97.442344,26.599553],[-97.382097,26.413337],[-97.864068,26.347614],[-97.957176,26.610507],[-97.655944,26.599553]]],[[[-97.316374,26.599553],[-97.288989,26.599553],[-97.223266,26.413337],[-97.239697,26.413337],[-97.316374,26.599553]]]]}},
+{"type":"Feature","id":"48491","properties":{"name":"Williamson"},"geometry":{"type":"Polygon","coordinates":[[[-97.831206,30.904428],[-97.316374,30.751074],[-97.157543,30.455319],[-97.332805,30.40055],[-97.371143,30.41698],[-97.973607,30.625104],[-98.050284,30.625104],[-97.831206,30.904428]]]}},
+{"type":"Feature","id":"48493","properties":{"name":"Wilson"},"geometry":{"type":"Polygon","coordinates":[[[-98.285792,29.255869],[-98.132438,29.442085],[-97.84216,29.376362],[-97.727145,29.223007],[-98.192684,28.883437],[-98.406285,29.113469],[-98.285792,29.255869]]]}},
+{"type":"Feature","id":"48495","properties":{"name":"Winkler"},"geometry":{"type":"Polygon","coordinates":[[[-103.061684,32.087447],[-102.798791,32.087447],[-102.798791,31.649292],[-103.330055,31.649292],[-103.324578,31.999816],[-103.061684,32.087447]]]}},
+{"type":"Feature","id":"48497","properties":{"name":"Wise"},"geometry":{"type":"Polygon","coordinates":[[[-97.50259,33.434775],[-97.486159,33.434775],[-97.382097,33.429298],[-97.398528,32.991142],[-97.535452,32.996619],[-97.546405,32.996619],[-97.924314,33.002096],[-97.918837,33.434775],[-97.50259,33.434775]]]}},
+{"type":"Feature","id":"48499","properties":{"name":"Wood"},"geometry":{"type":"Polygon","coordinates":[[[-95.152983,33.01305],[-95.152983,32.903511],[-95.152983,32.569418],[-95.574707,32.67348],[-95.596615,32.684434],[-95.634953,32.722772],[-95.667815,32.958281],[-95.306337,32.963758],[-95.152983,33.01305]]]}},
+{"type":"Feature","id":"48501","properties":{"name":"Yoakum"},"geometry":{"type":"Polygon","coordinates":[[[-103.056207,33.390959],[-102.596144,33.390959],[-102.596144,32.958281],[-103.067161,32.958281],[-103.056207,33.390959]]]}},
+{"type":"Feature","id":"48503","properties":{"name":"Young"},"geometry":{"type":"Polygon","coordinates":[[[-98.953979,33.396436],[-98.422716,33.396436],[-98.428193,33.007573],[-98.57607,32.952804],[-98.762286,32.958281],[-98.948502,32.958281],[-98.953979,33.396436]]]}},
+{"type":"Feature","id":"48505","properties":{"name":"Zapata"},"geometry":{"type":"Polygon","coordinates":[[[-99.359273,27.306078],[-98.953979,27.26774],[-98.953979,26.785769],[-99.16758,26.572168],[-99.452381,27.262263],[-99.359273,27.306078]]]}},
+{"type":"Feature","id":"48507","properties":{"name":"Zavala"},"geometry":{"type":"Polygon","coordinates":[[[-99.414042,29.091561],[-99.408565,28.642452],[-99.780997,28.642452],[-100.115091,28.647929],[-100.109614,29.086084],[-99.414042,29.091561]]]}},
+{"type":"Feature","id":"49001","properties":{"name":"Beaver"},"geometry":{"type":"Polygon","coordinates":[[[-113.97175,38.572145],[-112.514883,38.572145],[-112.52036,38.511898],[-112.443683,38.15042],[-112.476545,38.144943],[-112.876362,38.15042],[-114.048427,38.15042],[-114.048427,38.572145],[-113.97175,38.572145]]]}},
+{"type":"Feature","id":"49003","properties":{"name":"Box Elder"},"geometry":{"type":"Polygon","coordinates":[[[-112.164359,41.995232],[-111.885035,41.425631],[-112.492976,41.075106],[-113.073531,40.998429],[-114.04295,40.998429],[-114.04295,41.995232],[-113.002331,42.000709],[-112.164359,41.995232]]]}},
+{"type":"Feature","id":"49005","properties":{"name":"Cache"},"geometry":{"type":"Polygon","coordinates":[[[-111.507126,42.000709],[-111.512603,41.425631],[-111.655004,41.4092],[-111.885035,41.425631],[-112.164359,41.995232],[-112.10959,41.995232],[-111.507126,42.000709]]]}},
+{"type":"Feature","id":"49007","properties":{"name":"Carbon"},"geometry":{"type":"Polygon","coordinates":[[[-111.014202,39.81541],[-110.855371,39.81541],[-109.968106,39.804456],[-110.022876,39.470363],[-111.079925,39.464886],[-111.24971,39.705871],[-111.24971,39.81541],[-111.014202,39.81541]]]}},
+{"type":"Feature","id":"49009","properties":{"name":"Daggett"},"geometry":{"type":"Polygon","coordinates":[[[-109.677828,40.998429],[-109.04798,40.998429],[-109.04798,40.653382],[-109.283489,40.856029],[-109.97906,40.812213],[-110.000968,40.812213],[-110.000968,40.998429],[-109.677828,40.998429]]]}},
+{"type":"Feature","id":"49011","properties":{"name":"Davis"},"geometry":{"type":"Polygon","coordinates":[[[-112.011005,41.151784],[-111.857651,41.14083],[-111.737158,40.861506],[-111.98362,40.921752],[-112.262944,40.773875],[-112.492976,41.075106],[-112.011005,41.151784]]]}},
+{"type":"Feature","id":"49013","properties":{"name":"Duchesne"},"geometry":{"type":"Polygon","coordinates":[[[-110.148845,40.812213],[-110.000968,40.812213],[-109.97906,40.812213],[-109.968106,39.804456],[-110.855371,39.81541],[-110.893709,39.897564],[-110.904663,40.680767],[-110.148845,40.812213]]]}},
+{"type":"Feature","id":"49015","properties":{"name":"Emery"},"geometry":{"type":"Polygon","coordinates":[[[-111.24971,39.705871],[-111.079925,39.464886],[-110.022876,39.470363],[-110.022876,39.459409],[-110.022876,38.500944],[-111.30448,38.511898],[-111.299003,39.032208],[-111.24971,39.705871]]]}},
+{"type":"Feature","id":"49017","properties":{"name":"Garfield"},"geometry":{"type":"Polygon","coordinates":[[[-111.84122,38.15042],[-109.929768,38.15042],[-110.647247,37.54248],[-112.684669,37.54248],[-112.476545,38.144943],[-112.443683,38.15042],[-111.84122,38.15042]]]}},
+{"type":"Feature","id":"49019","properties":{"name":"Grand"},"geometry":{"type":"Polygon","coordinates":[[[-109.053457,39.497748],[-109.053457,39.366301],[-109.058934,38.500944],[-110.022876,38.500944],[-110.022876,39.459409],[-109.053457,39.497748]]]}},
+{"type":"Feature","id":"49021","properties":{"name":"Iron"},"geometry":{"type":"Polygon","coordinates":[[[-112.876362,38.15042],[-112.476545,38.144943],[-112.684669,37.54248],[-112.903746,37.498664],[-112.898269,37.498664],[-114.053904,37.602726],[-114.048427,38.15042],[-112.876362,38.15042]]]}},
+{"type":"Feature","id":"49023","properties":{"name":"Juab"},"geometry":{"type":"Polygon","coordinates":[[[-112.18079,40.01258],[-111.64405,39.81541],[-112.016482,39.317009],[-112.23556,39.552517],[-114.048427,39.541563],[-114.048427,39.908518],[-112.339621,39.903041],[-112.18079,40.01258]]]}},
+{"type":"Feature","id":"49025","properties":{"name":"Kane"},"geometry":{"type":"Polygon","coordinates":[[[-112.903746,37.498664],[-112.684669,37.54248],[-110.647247,37.54248],[-111.414018,37.000263],[-112.542268,37.000263],[-112.898269,37.000263],[-112.898269,37.498664],[-112.903746,37.498664]]]}},
+{"type":"Feature","id":"49027","properties":{"name":"Millard"},"geometry":{"type":"Polygon","coordinates":[[[-114.048427,39.541563],[-112.23556,39.552517],[-112.016482,39.317009],[-112.016482,39.043162],[-112.514883,38.572145],[-113.97175,38.572145],[-114.048427,38.572145],[-114.048427,38.676207],[-114.048427,39.541563]]]}},
+{"type":"Feature","id":"49029","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-111.419495,41.359907],[-111.266141,41.146307],[-111.638573,40.801259],[-111.737158,40.861506],[-111.857651,41.14083],[-111.419495,41.359907]]]}},
+{"type":"Feature","id":"49031","properties":{"name":"Piute"},"geometry":{"type":"Polygon","coordinates":[[[-111.857651,38.500944],[-111.764543,38.500944],[-111.84122,38.15042],[-112.443683,38.15042],[-112.52036,38.511898],[-111.857651,38.500944]]]}},
+{"type":"Feature","id":"49033","properties":{"name":"Rich"},"geometry":{"type":"Polygon","coordinates":[[[-111.047063,42.000709],[-111.047063,41.578985],[-111.047063,41.250368],[-111.266141,41.146307],[-111.419495,41.359907],[-111.512603,41.425631],[-111.507126,42.000709],[-111.047063,42.000709]]]}},
+{"type":"Feature","id":"49035","properties":{"name":"Salt Lake"},"geometry":{"type":"Polygon","coordinates":[[[-111.98362,40.921752],[-111.737158,40.861506],[-111.638573,40.801259],[-111.550942,40.609566],[-111.594758,40.576705],[-111.594758,40.576705],[-112.175313,40.467166],[-112.262944,40.773875],[-111.98362,40.921752]]]}},
+{"type":"Feature","id":"49037","properties":{"name":"San Juan"},"geometry":{"type":"Polygon","coordinates":[[[-110.022876,38.500944],[-109.058934,38.500944],[-109.042503,38.15042],[-109.042503,37.88205],[-109.042503,37.482234],[-109.042503,37.000263],[-110.000968,37.000263],[-110.751309,37.00574],[-111.414018,37.000263],[-110.647247,37.54248],[-109.929768,38.15042],[-110.022876,38.500944]]]}},
+{"type":"Feature","id":"49039","properties":{"name":"Sanpete"},"geometry":{"type":"Polygon","coordinates":[[[-111.556419,39.81541],[-111.24971,39.81541],[-111.24971,39.705871],[-111.299003,39.032208],[-111.978143,39.043162],[-112.016482,39.043162],[-112.016482,39.317009],[-111.64405,39.81541],[-111.556419,39.81541]]]}},
+{"type":"Feature","id":"49041","properties":{"name":"Sevier"},"geometry":{"type":"Polygon","coordinates":[[[-111.978143,39.043162],[-111.299003,39.032208],[-111.30448,38.511898],[-111.764543,38.500944],[-111.857651,38.500944],[-112.52036,38.511898],[-112.514883,38.572145],[-112.016482,39.043162],[-111.978143,39.043162]]]}},
+{"type":"Feature","id":"49043","properties":{"name":"Summit"},"geometry":{"type":"Polygon","coordinates":[[[-111.047063,41.250368],[-111.047063,40.998429],[-110.05026,40.998429],[-110.000968,40.998429],[-110.000968,40.812213],[-110.148845,40.812213],[-110.904663,40.680767],[-111.430449,40.686244],[-111.550942,40.609566],[-111.638573,40.801259],[-111.266141,41.146307],[-111.047063,41.250368]]]}},
+{"type":"Feature","id":"49045","properties":{"name":"Tooele"},"geometry":{"type":"Polygon","coordinates":[[[-113.073531,40.998429],[-112.492976,41.075106],[-112.262944,40.773875],[-112.175313,40.467166],[-112.18079,40.01258],[-112.339621,39.903041],[-114.048427,39.908518],[-114.048427,40.116642],[-114.04295,40.998429],[-113.073531,40.998429]]]}},
+{"type":"Feature","id":"49047","properties":{"name":"Uintah"},"geometry":{"type":"Polygon","coordinates":[[[-109.283489,40.856029],[-109.04798,40.653382],[-109.053457,40.220704],[-109.053457,39.662056],[-109.053457,39.497748],[-110.022876,39.459409],[-110.022876,39.470363],[-109.968106,39.804456],[-109.97906,40.812213],[-109.283489,40.856029]]]}},
+{"type":"Feature","id":"49049","properties":{"name":"Utah"},"geometry":{"type":"Polygon","coordinates":[[[-111.594758,40.576705],[-111.594758,40.576705],[-110.893709,39.897564],[-110.855371,39.81541],[-111.014202,39.81541],[-111.24971,39.81541],[-111.556419,39.81541],[-111.64405,39.81541],[-112.18079,40.01258],[-112.175313,40.467166],[-111.594758,40.576705]]]}},
+{"type":"Feature","id":"49051","properties":{"name":"Wasatch"},"geometry":{"type":"Polygon","coordinates":[[[-111.430449,40.686244],[-110.904663,40.680767],[-110.893709,39.897564],[-111.594758,40.576705],[-111.550942,40.609566],[-111.430449,40.686244]]]}},
+{"type":"Feature","id":"49053","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-114.053904,37.602726],[-112.898269,37.498664],[-112.898269,37.000263],[-114.048427,37.000263],[-114.053904,37.602726]]]}},
+{"type":"Feature","id":"49055","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-111.764543,38.500944],[-111.30448,38.511898],[-110.022876,38.500944],[-109.929768,38.15042],[-111.84122,38.15042],[-111.764543,38.500944]]]}},
+{"type":"Feature","id":"49057","properties":{"name":"Weber"},"geometry":{"type":"Polygon","coordinates":[[[-111.655004,41.4092],[-111.512603,41.425631],[-111.419495,41.359907],[-111.857651,41.14083],[-112.011005,41.151784],[-112.492976,41.075106],[-111.885035,41.425631],[-111.655004,41.4092]]]}},
+{"type":"Feature","id":"50001","properties":{"name":"Addison"},"geometry":{"type":"Polygon","coordinates":[[[-73.22879,44.262686],[-72.954943,44.164101],[-72.741343,44.027177],[-72.790635,43.961454],[-72.96042,43.82453],[-73.365714,43.75333],[-73.376668,43.8081],[-73.310944,44.262686],[-73.22879,44.262686]]]}},
+{"type":"Feature","id":"50003","properties":{"name":"Bennington"},"geometry":{"type":"Polygon","coordinates":[[[-73.256175,43.315175],[-72.867312,43.298744],[-72.81802,43.254929],[-72.927559,42.740096],[-73.020667,42.740096],[-73.267129,42.745573],[-73.272606,42.942743],[-73.256175,43.315175]]]}},
+{"type":"Feature","id":"50005","properties":{"name":"Caledonia"},"geometry":{"type":"Polygon","coordinates":[[[-71.941709,44.766564],[-71.837647,44.350317],[-72.040294,44.153147],[-72.368911,44.202439],[-72.42368,44.503671],[-72.434634,44.503671],[-72.374388,44.585825],[-71.941709,44.766564]]]}},
+{"type":"Feature","id":"50007","properties":{"name":"Chittenden"},"geometry":{"type":"Polygon","coordinates":[[[-73.22879,44.722749],[-72.922082,44.635118],[-72.807066,44.454379],[-72.954943,44.164101],[-73.22879,44.262686],[-73.310944,44.262686],[-73.338329,44.547487],[-73.360237,44.563917],[-73.22879,44.722749]]]}},
+{"type":"Feature","id":"50009","properties":{"name":"Essex"},"geometry":{"type":"Polygon","coordinates":[[[-71.503554,45.013027],[-71.766447,44.405086],[-71.837647,44.350317],[-71.941709,44.766564],[-71.897894,45.00755],[-71.503554,45.013027]]]}},
+{"type":"Feature","id":"50011","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-72.555127,45.00755],[-72.577034,44.782995],[-72.675619,44.793949],[-72.922082,44.635118],[-73.22879,44.722749],[-73.190452,45.013027],[-72.555127,45.00755]]]}},
+{"type":"Feature","id":"50013","properties":{"name":"Grand Isle"},"geometry":{"type":"Polygon","coordinates":[[[-73.190452,45.013027],[-73.22879,44.722749],[-73.360237,44.563917],[-73.343806,45.013027],[-73.190452,45.013027]]]}},
+{"type":"Feature","id":"50015","properties":{"name":"Lamoille"},"geometry":{"type":"Polygon","coordinates":[[[-72.675619,44.793949],[-72.577034,44.782995],[-72.374388,44.585825],[-72.434634,44.503671],[-72.807066,44.454379],[-72.922082,44.635118],[-72.675619,44.793949]]]}},
+{"type":"Feature","id":"50017","properties":{"name":"Orange"},"geometry":{"type":"Polygon","coordinates":[[[-72.434634,44.153147],[-72.368911,44.202439],[-72.040294,44.153147],[-72.204602,43.769761],[-72.790635,43.961454],[-72.741343,44.027177],[-72.434634,44.153147]]]}},
+{"type":"Feature","id":"50019","properties":{"name":"Orleans"},"geometry":{"type":"Polygon","coordinates":[[[-71.897894,45.00755],[-71.941709,44.766564],[-72.374388,44.585825],[-72.577034,44.782995],[-72.555127,45.00755],[-71.897894,45.00755]]]}},
+{"type":"Feature","id":"50021","properties":{"name":"Rutland"},"geometry":{"type":"Polygon","coordinates":[[[-73.365714,43.75333],[-72.96042,43.82453],[-72.867312,43.298744],[-73.256175,43.315175],[-73.365714,43.75333]]]}},
+{"type":"Feature","id":"50023","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-72.42368,44.503671],[-72.368911,44.202439],[-72.434634,44.153147],[-72.741343,44.027177],[-72.954943,44.164101],[-72.807066,44.454379],[-72.434634,44.503671],[-72.42368,44.503671]]]}},
+{"type":"Feature","id":"50025","properties":{"name":"Windham"},"geometry":{"type":"Polygon","coordinates":[[[-72.81802,43.254929],[-72.434634,43.233021],[-72.451065,43.161821],[-72.456542,42.729142],[-72.927559,42.740096],[-72.81802,43.254929]]]}},
+{"type":"Feature","id":"50027","properties":{"name":"Windsor"},"geometry":{"type":"Polygon","coordinates":[[[-72.790635,43.961454],[-72.204602,43.769761],[-72.330572,43.599976],[-72.434634,43.233021],[-72.81802,43.254929],[-72.867312,43.298744],[-72.96042,43.82453],[-72.790635,43.961454]]]}},
+{"type":"Feature","id":"51001","properties":{"name":"Accomack"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-75.397659,38.013497],[-75.244304,38.029928],[-75.666029,37.465803],[-75.939876,37.547957],[-75.671506,37.95325],[-75.622213,37.991589],[-75.397659,38.013497]]],[[[-76.016553,37.95325],[-75.994645,37.95325],[-76.043938,37.95325],[-76.016553,37.95325]]]]}},
+{"type":"Feature","id":"51003","properties":{"name":"Albemarle"},"geometry":{"type":"Polygon","coordinates":[[[-78.371637,38.183282],[-78.207329,38.133989],[-78.305914,38.00802],[-78.49213,37.794419],[-78.645484,37.734173],[-78.837177,38.046358],[-78.749546,38.20519],[-78.661915,38.27639],[-78.371637,38.183282]]]}},
+{"type":"Feature","id":"51005","properties":{"name":"Alleghany"},"geometry":{"type":"Polygon","coordinates":[[[-79.998289,37.958727],[-79.653241,37.871096],[-79.675149,37.761557],[-79.790165,37.794419],[-80.020196,37.646542],[-80.222843,37.630111],[-80.294043,37.690357],[-80.058535,37.95325],[-79.998289,37.958727]]]}},
+{"type":"Feature","id":"51007","properties":{"name":"Amelia"},"geometry":{"type":"Polygon","coordinates":[[[-77.988251,37.48771],[-77.856805,37.41651],[-77.648681,37.263156],[-77.796559,37.191956],[-78.229237,37.296018],[-78.234714,37.367218],[-78.130652,37.454849],[-77.988251,37.48771]]]}},
+{"type":"Feature","id":"51009","properties":{"name":"Amherst"},"geometry":{"type":"Polygon","coordinates":[[[-79.439641,37.619157],[-79.171271,37.805373],[-78.870039,37.54248],[-79.017916,37.427464],[-79.083639,37.394602],[-79.187701,37.465803],[-79.439641,37.619157]]]}},
+{"type":"Feature","id":"51011","properties":{"name":"Appomattox"},"geometry":{"type":"Polygon","coordinates":[[[-78.826223,37.553434],[-78.596192,37.400079],[-78.683823,37.246725],[-78.6893,37.246725],[-78.826223,37.20291],[-79.001485,37.400079],[-79.017916,37.427464],[-78.870039,37.54248],[-78.826223,37.553434]]]}},
+{"type":"Feature","id":"51013","properties":{"name":"Arlington"},"geometry":{"type":"Polygon","coordinates":[[[-77.117418,38.933623],[-77.046218,38.840515],[-77.084556,38.845992],[-77.111941,38.845992],[-77.15028,38.878853],[-77.172187,38.895284],[-77.117418,38.933623]]]}},
+{"type":"Feature","id":"51015","properties":{"name":"Augusta"},"geometry":{"type":"Polygon","coordinates":[[[-79.313671,38.413313],[-79.22604,38.479037],[-78.749546,38.20519],[-78.837177,38.046358],[-78.859085,38.029928],[-79.15484,37.893004],[-79.483456,38.084697],[-79.510841,38.177805],[-79.313671,38.413313]]]}},
+{"type":"Feature","id":"51017","properties":{"name":"Bath"},"geometry":{"type":"Polygon","coordinates":[[[-79.795642,38.265436],[-79.510841,38.177805],[-79.483456,38.084697],[-79.653241,37.871096],[-79.998289,37.958727],[-80.058535,37.95325],[-79.95995,38.062789],[-79.795642,38.265436]]]}},
+{"type":"Feature","id":"51019","properties":{"name":"Bedford"},"geometry":{"type":"Polygon","coordinates":[[[-79.439641,37.619157],[-79.187701,37.465803],[-79.187701,37.465803],[-79.258902,37.356264],[-79.445118,37.055032],[-79.592995,37.044078],[-79.784688,37.230294],[-79.844934,37.224817],[-79.844934,37.306971],[-79.499887,37.531526],[-79.439641,37.619157]]]}},
+{"type":"Feature","id":"51021","properties":{"name":"Bland"},"geometry":{"type":"Polygon","coordinates":[[[-81.225123,37.235771],[-80.978661,37.290541],[-80.852691,37.14814],[-80.912938,37.071463],[-81.378478,36.95097],[-81.438724,37.011217],[-81.225123,37.235771]]]}},
+{"type":"Feature","id":"51023","properties":{"name":"Botetourt"},"geometry":{"type":"Polygon","coordinates":[[[-79.790165,37.794419],[-79.675149,37.761557],[-79.499887,37.531526],[-79.844934,37.306971],[-80.074966,37.421987],[-80.020196,37.646542],[-79.790165,37.794419]]]}},
+{"type":"Feature","id":"51025","properties":{"name":"Brunswick"},"geometry":{"type":"Polygon","coordinates":[[[-78.004682,37.022171],[-77.889666,36.989309],[-77.659635,36.896201],[-77.769174,36.545677],[-77.90062,36.545677],[-78.048498,36.545677],[-78.02659,36.775708],[-78.004682,37.022171]]]}},
+{"type":"Feature","id":"51027","properties":{"name":"Buchanan"},"geometry":{"type":"Polygon","coordinates":[[[-81.969987,37.537003],[-81.926172,37.509618],[-81.739956,37.241248],[-81.898787,37.142663],[-82.150726,37.044078],[-82.315034,37.296018],[-82.315034,37.296018],[-81.969987,37.537003]]]}},
+{"type":"Feature","id":"51029","properties":{"name":"Buckingham"},"geometry":{"type":"Polygon","coordinates":[[[-78.49213,37.794419],[-78.240191,37.690357],[-78.464745,37.339833],[-78.596192,37.400079],[-78.826223,37.553434],[-78.645484,37.734173],[-78.49213,37.794419]]]}},
+{"type":"Feature","id":"51031","properties":{"name":"Campbell"},"geometry":{"type":"Polygon","coordinates":[[[-79.001485,37.400079],[-78.826223,37.20291],[-78.9029,37.022171],[-78.974101,37.049555],[-79.094593,37.060509],[-79.302717,37.109802],[-79.445118,37.055032],[-79.258902,37.356264],[-79.083639,37.394602],[-79.017916,37.427464],[-79.001485,37.400079]]]}},
+{"type":"Feature","id":"51033","properties":{"name":"Caroline"},"geometry":{"type":"Polygon","coordinates":[[[-77.325542,38.243528],[-77.117418,38.15042],[-77.068125,37.964204],[-77.073602,37.964204],[-77.183141,37.893004],[-77.347449,37.788942],[-77.643204,37.991589],[-77.369357,38.249005],[-77.325542,38.243528]]]}},
+{"type":"Feature","id":"51035","properties":{"name":"Carroll"},"geometry":{"type":"Polygon","coordinates":[[[-80.633614,36.929063],[-80.463828,36.709985],[-80.611706,36.556631],[-80.83626,36.556631],[-80.83626,36.556631],[-80.912938,36.649739],[-80.934845,36.671646],[-81.044384,36.80857],[-80.743152,36.87977],[-80.633614,36.929063]]]}},
+{"type":"Feature","id":"51036","properties":{"name":"Charles City"},"geometry":{"type":"Polygon","coordinates":[[[-77.040741,37.427464],[-76.903817,37.378172],[-76.881909,37.224817],[-76.975017,37.246725],[-77.270772,37.323402],[-77.248864,37.383649],[-77.177664,37.493187],[-77.040741,37.427464]]]}},
+{"type":"Feature","id":"51037","properties":{"name":"Charlotte"},"geometry":{"type":"Polygon","coordinates":[[[-78.6893,37.246725],[-78.683823,37.246725],[-78.442837,37.07694],[-78.49213,36.890724],[-78.650961,36.699031],[-78.9029,37.022171],[-78.826223,37.20291],[-78.6893,37.246725]]]}},
+{"type":"Feature","id":"51041","properties":{"name":"Chesterfield"},"geometry":{"type":"Polygon","coordinates":[[[-77.654158,37.564388],[-77.593912,37.553434],[-77.41865,37.449372],[-77.248864,37.383649],[-77.270772,37.323402],[-77.281726,37.312448],[-77.298157,37.312448],[-77.298157,37.312448],[-77.336496,37.312448],[-77.374834,37.246725],[-77.402219,37.241248],[-77.402219,37.235771],[-77.41865,37.235771],[-77.446034,37.224817],[-77.648681,37.263156],[-77.856805,37.41651],[-77.654158,37.564388]]]}},
+{"type":"Feature","id":"51043","properties":{"name":"Clarke"},"geometry":{"type":"Polygon","coordinates":[[[-78.032067,39.262239],[-78.032067,39.262239],[-77.82942,39.130793],[-77.960867,39.015777],[-78.004682,38.977438],[-78.15256,39.037685],[-78.032067,39.262239]]]}},
+{"type":"Feature","id":"51045","properties":{"name":"Craig"},"geometry":{"type":"Polygon","coordinates":[[[-80.020196,37.646542],[-80.074966,37.421987],[-80.173551,37.378172],[-80.261182,37.339833],[-80.430967,37.312448],[-80.474782,37.421987],[-80.222843,37.630111],[-80.020196,37.646542]]]}},
+{"type":"Feature","id":"51047","properties":{"name":"Culpeper"},"geometry":{"type":"Polygon","coordinates":[[[-77.933482,38.698114],[-77.637727,38.407836],[-77.621296,38.369498],[-77.703451,38.358544],[-77.895143,38.391406],[-78.092313,38.309252],[-78.229237,38.533806],[-77.933482,38.698114]]]}},
+{"type":"Feature","id":"51049","properties":{"name":"Cumberland"},"geometry":{"type":"Polygon","coordinates":[[[-78.163514,37.750604],[-78.158037,37.750604],[-78.070406,37.657496],[-78.130652,37.454849],[-78.234714,37.367218],[-78.262098,37.34531],[-78.464745,37.339833],[-78.240191,37.690357],[-78.163514,37.750604]]]}},
+{"type":"Feature","id":"51051","properties":{"name":"Dickenson"},"geometry":{"type":"Polygon","coordinates":[[[-82.315034,37.296018],[-82.150726,37.044078],[-82.325988,36.972878],[-82.55602,37.20291],[-82.315034,37.296018],[-82.315034,37.296018]]]}},
+{"type":"Feature","id":"51053","properties":{"name":"Dinwiddie"},"geometry":{"type":"Polygon","coordinates":[[[-77.648681,37.263156],[-77.446034,37.224817],[-77.396742,37.170048],[-77.396742,36.994786],[-77.621296,36.87977],[-77.659635,36.896201],[-77.889666,36.989309],[-77.796559,37.191956],[-77.648681,37.263156]]]}},
+{"type":"Feature","id":"51057","properties":{"name":"Essex"},"geometry":{"type":"Polygon","coordinates":[[[-77.062649,38.161374],[-76.936679,38.07922],[-76.777848,37.876573],[-76.68474,37.772511],[-76.750463,37.728696],[-77.068125,37.964204],[-77.117418,38.15042],[-77.062649,38.161374]]]}},
+{"type":"Feature","id":"51059","properties":{"name":"Fairfax"},"geometry":{"type":"Polygon","coordinates":[[[-77.331019,39.059592],[-77.117418,38.933623],[-77.172187,38.895284],[-77.15028,38.878853],[-77.111941,38.845992],[-77.040741,38.785745],[-77.084556,38.709068],[-77.128372,38.632391],[-77.22148,38.637868],[-77.533665,38.845992],[-77.331019,39.059592]]]}},
+{"type":"Feature","id":"51061","properties":{"name":"Fauquier"},"geometry":{"type":"Polygon","coordinates":[[[-77.960867,39.015777],[-77.654158,38.944577],[-77.533665,38.555714],[-77.637727,38.407836],[-77.933482,38.698114],[-78.130652,38.862422],[-78.004682,38.977438],[-77.960867,39.015777]]]}},
+{"type":"Feature","id":"51063","properties":{"name":"Floyd"},"geometry":{"type":"Polygon","coordinates":[[[-80.129735,37.120755],[-80.233797,36.874293],[-80.463828,36.709985],[-80.633614,36.929063],[-80.545983,36.983832],[-80.179028,37.115279],[-80.129735,37.120755]]]}},
+{"type":"Feature","id":"51065","properties":{"name":"Fluvanna"},"geometry":{"type":"Polygon","coordinates":[[[-78.305914,38.00802],[-78.064929,37.903958],[-78.158037,37.750604],[-78.163514,37.750604],[-78.240191,37.690357],[-78.49213,37.794419],[-78.305914,38.00802]]]}},
+{"type":"Feature","id":"51067","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-79.784688,37.230294],[-79.592995,37.044078],[-79.642287,36.857862],[-79.647764,36.852385],[-80.042104,36.792139],[-80.233797,36.874293],[-80.129735,37.120755],[-79.844934,37.224817],[-79.784688,37.230294]]]}},
+{"type":"Feature","id":"51069","properties":{"name":"Frederick"},"geometry":{"type":"Polygon","coordinates":[[[-78.349729,39.464886],[-78.229237,39.393686],[-78.032067,39.262239],[-78.032067,39.262239],[-78.15256,39.037685],[-78.311391,39.0103],[-78.338776,39.103408],[-78.541422,39.054115],[-78.508561,39.086977],[-78.349729,39.464886]]]}},
+{"type":"Feature","id":"51071","properties":{"name":"Giles"},"geometry":{"type":"Polygon","coordinates":[[[-80.474782,37.421987],[-80.430967,37.312448],[-80.606229,37.246725],[-80.852691,37.14814],[-80.978661,37.290541],[-80.858168,37.427464],[-80.858168,37.427464],[-80.474782,37.421987]]]}},
+{"type":"Feature","id":"51073","properties":{"name":"Gloucester"},"geometry":{"type":"Polygon","coordinates":[[[-76.62997,37.591772],[-76.438277,37.515095],[-76.405416,37.400079],[-76.498524,37.241248],[-76.657355,37.378172],[-76.712124,37.432941],[-76.651878,37.602726],[-76.62997,37.591772]]]}},
+{"type":"Feature","id":"51075","properties":{"name":"Goochland"},"geometry":{"type":"Polygon","coordinates":[[[-78.064929,37.903958],[-77.796559,37.728696],[-77.63225,37.706788],[-77.654158,37.564388],[-78.015636,37.641065],[-78.070406,37.657496],[-78.158037,37.750604],[-78.064929,37.903958]]]}},
+{"type":"Feature","id":"51077","properties":{"name":"Grayson"},"geometry":{"type":"Polygon","coordinates":[[[-81.044384,36.80857],[-80.934845,36.671646],[-80.912938,36.649739],[-80.83626,36.556631],[-80.901984,36.562108],[-80.978661,36.562108],[-81.351093,36.573061],[-81.679709,36.589492],[-81.646848,36.6114],[-81.608509,36.638785],[-81.263462,36.764754],[-81.044384,36.80857]]]}},
+{"type":"Feature","id":"51079","properties":{"name":"Greene"},"geometry":{"type":"Polygon","coordinates":[[[-78.459268,38.468083],[-78.453791,38.47356],[-78.289483,38.270913],[-78.371637,38.183282],[-78.661915,38.27639],[-78.486653,38.41879],[-78.459268,38.468083]]]}},
+{"type":"Feature","id":"51081","properties":{"name":"Greensville"},"geometry":{"type":"Polygon","coordinates":[[[-77.621296,36.87977],[-77.429604,36.709985],[-77.298157,36.545677],[-77.769174,36.545677],[-77.659635,36.896201],[-77.621296,36.87977]]]}},
+{"type":"Feature","id":"51083","properties":{"name":"Halifax"},"geometry":{"type":"Polygon","coordinates":[[[-78.974101,37.049555],[-78.9029,37.022171],[-78.650961,36.699031],[-78.733115,36.5402],[-78.798839,36.5402],[-79.138409,36.5402],[-79.220563,36.5402],[-79.094593,37.060509],[-78.974101,37.049555]]]}},
+{"type":"Feature","id":"51085","properties":{"name":"Hanover"},"geometry":{"type":"Polygon","coordinates":[[[-77.68702,38.00802],[-77.643204,37.991589],[-77.347449,37.788942],[-77.122895,37.624634],[-77.226957,37.537003],[-77.63225,37.706788],[-77.796559,37.728696],[-77.68702,38.00802]]]}},
+{"type":"Feature","id":"51087","properties":{"name":"Henrico"},"geometry":{"type":"Polygon","coordinates":[[[-77.63225,37.706788],[-77.226957,37.537003],[-77.177664,37.493187],[-77.248864,37.383649],[-77.41865,37.449372],[-77.473419,37.597249],[-77.593912,37.553434],[-77.654158,37.564388],[-77.63225,37.706788]]]}},
+{"type":"Feature","id":"51089","properties":{"name":"Henry"},"geometry":{"type":"Polygon","coordinates":[[[-79.647764,36.852385],[-79.642287,36.857862],[-79.713488,36.5402],[-79.965427,36.5402],[-80.025673,36.5402],[-80.053058,36.5402],[-80.042104,36.792139],[-79.647764,36.852385]]]}},
+{"type":"Feature","id":"51091","properties":{"name":"Highland"},"geometry":{"type":"Polygon","coordinates":[[[-79.647764,38.594052],[-79.313671,38.413313],[-79.510841,38.177805],[-79.795642,38.265436],[-79.647764,38.594052]]]}},
+{"type":"Feature","id":"51093","properties":{"name":"Isle of Wight"},"geometry":{"type":"Polygon","coordinates":[[[-76.482093,36.929063],[-76.89834,36.644262],[-76.909294,36.649739],[-76.925725,36.709985],[-76.860002,36.961924],[-76.849048,36.994786],[-76.673786,37.142663],[-76.482093,36.929063]]]}},
+{"type":"Feature","id":"51095","properties":{"name":"James City"},"geometry":{"type":"Polygon","coordinates":[[[-76.739509,37.465803],[-76.712124,37.432941],[-76.657355,37.378172],[-76.728555,37.306971],[-76.679263,37.268633],[-76.591632,37.213863],[-76.613539,37.164571],[-76.794278,37.208387],[-76.881909,37.224817],[-76.903817,37.378172],[-76.739509,37.465803]]]}},
+{"type":"Feature","id":"51097","properties":{"name":"King and Queen"},"geometry":{"type":"Polygon","coordinates":[[[-77.073602,37.964204],[-77.068125,37.964204],[-76.750463,37.728696],[-76.651878,37.602726],[-76.712124,37.432941],[-76.739509,37.465803],[-76.794278,37.515095],[-77.177664,37.893004],[-77.183141,37.893004],[-77.073602,37.964204]]]}},
+{"type":"Feature","id":"51099","properties":{"name":"King George"},"geometry":{"type":"Polygon","coordinates":[[[-76.996925,38.27639],[-77.062649,38.161374],[-77.117418,38.15042],[-77.325542,38.243528],[-77.287203,38.34759],[-76.996925,38.27639]]]}},
+{"type":"Feature","id":"51101","properties":{"name":"King William"},"geometry":{"type":"Polygon","coordinates":[[[-77.177664,37.893004],[-76.794278,37.515095],[-77.122895,37.624634],[-77.347449,37.788942],[-77.183141,37.893004],[-77.177664,37.893004]]]}},
+{"type":"Feature","id":"51103","properties":{"name":"Lancaster"},"geometry":{"type":"Polygon","coordinates":[[[-76.48757,37.838235],[-76.317785,37.679403],[-76.640924,37.794419],[-76.509478,37.838235],[-76.48757,37.838235]]]}},
+{"type":"Feature","id":"51105","properties":{"name":"Lee"},"geometry":{"type":"Polygon","coordinates":[[[-82.868205,36.885247],[-82.76962,36.797616],[-82.983221,36.594969],[-83.470669,36.594969],[-83.673316,36.600446],[-83.459715,36.666169],[-82.879159,36.890724],[-82.868205,36.885247]]]}},
+{"type":"Feature","id":"51107","properties":{"name":"Loudoun"},"geometry":{"type":"Polygon","coordinates":[[[-77.719881,39.322485],[-77.676066,39.322485],[-77.456988,39.218424],[-77.331019,39.059592],[-77.533665,38.845992],[-77.654158,38.944577],[-77.960867,39.015777],[-77.82942,39.130793],[-77.719881,39.322485]]]}},
+{"type":"Feature","id":"51109","properties":{"name":"Louisa"},"geometry":{"type":"Polygon","coordinates":[[[-77.95539,38.117559],[-77.68702,38.00802],[-77.796559,37.728696],[-78.064929,37.903958],[-78.305914,38.00802],[-78.207329,38.133989],[-77.95539,38.117559]]]}},
+{"type":"Feature","id":"51111","properties":{"name":"Lunenburg"},"geometry":{"type":"Polygon","coordinates":[[[-78.399022,37.087894],[-78.240191,37.120755],[-78.004682,37.022171],[-78.02659,36.775708],[-78.475699,36.885247],[-78.49213,36.890724],[-78.442837,37.07694],[-78.399022,37.087894]]]}},
+{"type":"Feature","id":"51113","properties":{"name":"Madison"},"geometry":{"type":"Polygon","coordinates":[[[-78.448314,38.500944],[-78.338776,38.626914],[-78.229237,38.533806],[-78.092313,38.309252],[-78.289483,38.270913],[-78.453791,38.47356],[-78.448314,38.500944]]]}},
+{"type":"Feature","id":"51115","properties":{"name":"Mathews"},"geometry":{"type":"Polygon","coordinates":[[[-76.356123,37.526049],[-76.356123,37.526049],[-76.405416,37.400079],[-76.438277,37.515095],[-76.356123,37.526049]]]}},
+{"type":"Feature","id":"51117","properties":{"name":"Mecklenburg"},"geometry":{"type":"Polygon","coordinates":[[[-78.475699,36.885247],[-78.02659,36.775708],[-78.048498,36.545677],[-78.322345,36.545677],[-78.459268,36.5402],[-78.470222,36.5402],[-78.733115,36.5402],[-78.650961,36.699031],[-78.49213,36.890724],[-78.475699,36.885247]]]}},
+{"type":"Feature","id":"51119","properties":{"name":"Middlesex"},"geometry":{"type":"Polygon","coordinates":[[[-76.356123,37.526049],[-76.356123,37.526049],[-76.438277,37.515095],[-76.62997,37.591772],[-76.651878,37.602726],[-76.750463,37.728696],[-76.68474,37.772511],[-76.356123,37.526049]]]}},
+{"type":"Feature","id":"51121","properties":{"name":"Montgomery"},"geometry":{"type":"Polygon","coordinates":[[[-80.261182,37.339833],[-80.179028,37.115279],[-80.545983,36.983832],[-80.578844,37.087894],[-80.529552,37.131709],[-80.606229,37.246725],[-80.430967,37.312448],[-80.261182,37.339833]]]}},
+{"type":"Feature","id":"51125","properties":{"name":"Nelson"},"geometry":{"type":"Polygon","coordinates":[[[-78.859085,38.029928],[-78.837177,38.046358],[-78.645484,37.734173],[-78.826223,37.553434],[-78.870039,37.54248],[-79.171271,37.805373],[-79.15484,37.893004],[-78.859085,38.029928]]]}},
+{"type":"Feature","id":"51127","properties":{"name":"New Kent"},"geometry":{"type":"Polygon","coordinates":[[[-77.122895,37.624634],[-76.794278,37.515095],[-76.739509,37.465803],[-76.903817,37.378172],[-77.040741,37.427464],[-77.177664,37.493187],[-77.226957,37.537003],[-77.122895,37.624634]]]}},
+{"type":"Feature","id":"51133","properties":{"name":"Northumberland"},"geometry":{"type":"Polygon","coordinates":[[[-76.317785,37.679403],[-76.48757,37.838235],[-76.509478,37.838235],[-76.635447,37.964204],[-76.520431,38.035405],[-76.317785,37.679403]]]}},
+{"type":"Feature","id":"51135","properties":{"name":"Nottoway"},"geometry":{"type":"Polygon","coordinates":[[[-78.229237,37.296018],[-77.796559,37.191956],[-77.889666,36.989309],[-78.004682,37.022171],[-78.240191,37.120755],[-78.229237,37.296018]]]}},
+{"type":"Feature","id":"51137","properties":{"name":"Orange"},"geometry":{"type":"Polygon","coordinates":[[[-77.895143,38.391406],[-77.703451,38.358544],[-77.95539,38.117559],[-78.207329,38.133989],[-78.371637,38.183282],[-78.289483,38.270913],[-78.092313,38.309252],[-77.895143,38.391406]]]}},
+{"type":"Feature","id":"51139","properties":{"name":"Page"},"geometry":{"type":"Polygon","coordinates":[[[-78.388068,38.829561],[-78.284006,38.758361],[-78.338776,38.626914],[-78.448314,38.500944],[-78.453791,38.47356],[-78.459268,38.468083],[-78.486653,38.41879],[-78.640007,38.605006],[-78.388068,38.829561]]]}},
+{"type":"Feature","id":"51141","properties":{"name":"Patrick"},"geometry":{"type":"Polygon","coordinates":[[[-80.233797,36.874293],[-80.042104,36.792139],[-80.053058,36.5402],[-80.441921,36.551154],[-80.611706,36.556631],[-80.463828,36.709985],[-80.233797,36.874293]]]}},
+{"type":"Feature","id":"51143","properties":{"name":"Pittsylvania"},"geometry":{"type":"Polygon","coordinates":[[[-79.302717,37.109802],[-79.094593,37.060509],[-79.220563,36.5402],[-79.341056,36.5402],[-79.401302,36.638785],[-79.472502,36.5402],[-79.510841,36.5402],[-79.713488,36.5402],[-79.642287,36.857862],[-79.592995,37.044078],[-79.445118,37.055032],[-79.302717,37.109802]]]}},
+{"type":"Feature","id":"51145","properties":{"name":"Powhatan"},"geometry":{"type":"Polygon","coordinates":[[[-78.015636,37.641065],[-77.654158,37.564388],[-77.856805,37.41651],[-77.988251,37.48771],[-78.130652,37.454849],[-78.070406,37.657496],[-78.015636,37.641065]]]}},
+{"type":"Feature","id":"51147","properties":{"name":"Prince Edward"},"geometry":{"type":"Polygon","coordinates":[[[-78.262098,37.34531],[-78.234714,37.367218],[-78.229237,37.296018],[-78.240191,37.120755],[-78.399022,37.087894],[-78.442837,37.07694],[-78.683823,37.246725],[-78.596192,37.400079],[-78.464745,37.339833],[-78.262098,37.34531]]]}},
+{"type":"Feature","id":"51149","properties":{"name":"Prince George"},"geometry":{"type":"Polygon","coordinates":[[[-77.281726,37.312448],[-77.270772,37.323402],[-76.975017,37.246725],[-77.155756,37.109802],[-77.396742,36.994786],[-77.396742,37.170048],[-77.374834,37.246725],[-77.336496,37.312448],[-77.281726,37.312448]]]}},
+{"type":"Feature","id":"51153","properties":{"name":"Prince William"},"geometry":{"type":"Polygon","coordinates":[[[-77.654158,38.944577],[-77.533665,38.845992],[-77.22148,38.637868],[-77.303634,38.506421],[-77.533665,38.555714],[-77.654158,38.944577]]]}},
+{"type":"Feature","id":"51155","properties":{"name":"Pulaski"},"geometry":{"type":"Polygon","coordinates":[[[-80.606229,37.246725],[-80.529552,37.131709],[-80.578844,37.087894],[-80.545983,36.983832],[-80.633614,36.929063],[-80.743152,36.87977],[-80.912938,37.071463],[-80.852691,37.14814],[-80.606229,37.246725]]]}},
+{"type":"Feature","id":"51157","properties":{"name":"Rappahannock"},"geometry":{"type":"Polygon","coordinates":[[[-78.256622,38.758361],[-78.130652,38.862422],[-77.933482,38.698114],[-78.229237,38.533806],[-78.338776,38.626914],[-78.284006,38.758361],[-78.256622,38.758361]]]}},
+{"type":"Feature","id":"51159","properties":{"name":"Richmond"},"geometry":{"type":"Polygon","coordinates":[[[-76.914771,38.095651],[-76.635447,37.964204],[-76.509478,37.838235],[-76.640924,37.794419],[-76.777848,37.876573],[-76.936679,38.07922],[-76.914771,38.095651]]]}},
+{"type":"Feature","id":"51161","properties":{"name":"Roanoke"},"geometry":{"type":"Polygon","coordinates":[[[-80.173551,37.378172],[-80.074966,37.421987],[-79.844934,37.306971],[-79.844934,37.224817],[-80.129735,37.120755],[-80.179028,37.115279],[-80.261182,37.339833],[-80.173551,37.378172]],[[-79.981858,37.328879],[-80.020196,37.306971],[-80.03115,37.263156],[-79.981858,37.328879]]]}},
+{"type":"Feature","id":"51163","properties":{"name":"Rockbridge"},"geometry":{"type":"Polygon","coordinates":[[[-79.483456,38.084697],[-79.15484,37.893004],[-79.171271,37.805373],[-79.439641,37.619157],[-79.499887,37.531526],[-79.675149,37.761557],[-79.653241,37.871096],[-79.483456,38.084697]]]}},
+{"type":"Feature","id":"51165","properties":{"name":"Rockingham"},"geometry":{"type":"Polygon","coordinates":[[[-78.990532,38.845992],[-78.870039,38.763838],[-78.640007,38.605006],[-78.486653,38.41879],[-78.661915,38.27639],[-78.749546,38.20519],[-79.22604,38.479037],[-79.056255,38.763838],[-78.990532,38.845992]]]}},
+{"type":"Feature","id":"51167","properties":{"name":"Russell"},"geometry":{"type":"Polygon","coordinates":[[[-81.898787,37.142663],[-81.778294,36.956447],[-81.838541,36.929063],[-82.331465,36.709985],[-82.408142,36.874293],[-82.325988,36.972878],[-82.150726,37.044078],[-81.898787,37.142663]]]}},
+{"type":"Feature","id":"51169","properties":{"name":"Scott"},"geometry":{"type":"Polygon","coordinates":[[[-82.479343,36.885247],[-82.408142,36.874293],[-82.331465,36.709985],[-82.293127,36.594969],[-82.610789,36.594969],[-82.654605,36.594969],[-82.829867,36.594969],[-82.983221,36.594969],[-82.76962,36.797616],[-82.479343,36.885247]]]}},
+{"type":"Feature","id":"51171","properties":{"name":"Shenandoah"},"geometry":{"type":"Polygon","coordinates":[[[-78.338776,39.103408],[-78.311391,39.0103],[-78.388068,38.829561],[-78.640007,38.605006],[-78.870039,38.763838],[-78.541422,39.054115],[-78.338776,39.103408]]]}},
+{"type":"Feature","id":"51173","properties":{"name":"Smyth"},"geometry":{"type":"Polygon","coordinates":[[[-81.477062,36.989309],[-81.438724,37.011217],[-81.378478,36.95097],[-81.263462,36.764754],[-81.608509,36.638785],[-81.838541,36.929063],[-81.778294,36.956447],[-81.477062,36.989309]]]}},
+{"type":"Feature","id":"51175","properties":{"name":"Southampton"},"geometry":{"type":"Polygon","coordinates":[[[-76.860002,36.961924],[-76.925725,36.709985],[-76.909294,36.649739],[-76.89834,36.644262],[-76.914771,36.551154],[-76.914771,36.545677],[-77.16671,36.545677],[-77.298157,36.545677],[-77.429604,36.709985],[-76.95311,36.945493],[-76.849048,36.994786],[-76.860002,36.961924]]]}},
+{"type":"Feature","id":"51177","properties":{"name":"Spotsylvania"},"geometry":{"type":"Polygon","coordinates":[[[-77.621296,38.369498],[-77.528188,38.309252],[-77.446034,38.281867],[-77.369357,38.249005],[-77.643204,37.991589],[-77.68702,38.00802],[-77.95539,38.117559],[-77.703451,38.358544],[-77.621296,38.369498]]]}},
+{"type":"Feature","id":"51179","properties":{"name":"Stafford"},"geometry":{"type":"Polygon","coordinates":[[[-77.533665,38.555714],[-77.303634,38.506421],[-77.287203,38.34759],[-77.325542,38.243528],[-77.369357,38.249005],[-77.446034,38.281867],[-77.528188,38.309252],[-77.621296,38.369498],[-77.637727,38.407836],[-77.533665,38.555714]]]}},
+{"type":"Feature","id":"51181","properties":{"name":"Surry"},"geometry":{"type":"Polygon","coordinates":[[[-76.975017,37.246725],[-76.881909,37.224817],[-76.794278,37.208387],[-76.673786,37.142663],[-76.849048,36.994786],[-76.95311,36.945493],[-77.155756,37.109802],[-76.975017,37.246725]]]}},
+{"type":"Feature","id":"51183","properties":{"name":"Sussex"},"geometry":{"type":"Polygon","coordinates":[[[-77.155756,37.109802],[-76.95311,36.945493],[-77.429604,36.709985],[-77.621296,36.87977],[-77.396742,36.994786],[-77.155756,37.109802]]]}},
+{"type":"Feature","id":"51185","properties":{"name":"Tazewell"},"geometry":{"type":"Polygon","coordinates":[[[-81.373001,37.323402],[-81.362047,37.339833],[-81.225123,37.235771],[-81.438724,37.011217],[-81.477062,36.989309],[-81.778294,36.956447],[-81.898787,37.142663],[-81.739956,37.241248],[-81.373001,37.323402]]]}},
+{"type":"Feature","id":"51187","properties":{"name":"Warren"},"geometry":{"type":"Polygon","coordinates":[[[-78.15256,39.037685],[-78.004682,38.977438],[-78.130652,38.862422],[-78.256622,38.758361],[-78.284006,38.758361],[-78.388068,38.829561],[-78.311391,39.0103],[-78.15256,39.037685]]]}},
+{"type":"Feature","id":"51191","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-81.838541,36.929063],[-81.608509,36.638785],[-81.646848,36.6114],[-81.827587,36.616877],[-82.145249,36.594969],[-82.145249,36.671646],[-82.243834,36.594969],[-82.293127,36.594969],[-82.331465,36.709985],[-81.838541,36.929063]]]}},
+{"type":"Feature","id":"51193","properties":{"name":"Westmoreland"},"geometry":{"type":"Polygon","coordinates":[[[-76.520431,38.035405],[-76.635447,37.964204],[-76.914771,38.095651],[-76.936679,38.07922],[-77.062649,38.161374],[-76.996925,38.27639],[-76.520431,38.035405]]]}},
+{"type":"Feature","id":"51195","properties":{"name":"Wise"},"geometry":{"type":"Polygon","coordinates":[[[-82.55602,37.20291],[-82.325988,36.972878],[-82.408142,36.874293],[-82.479343,36.885247],[-82.76962,36.797616],[-82.868205,36.885247],[-82.879159,36.890724],[-82.868205,36.972878],[-82.566974,37.197433],[-82.55602,37.20291]]]}},
+{"type":"Feature","id":"51197","properties":{"name":"Wythe"},"geometry":{"type":"Polygon","coordinates":[[[-80.912938,37.071463],[-80.743152,36.87977],[-81.044384,36.80857],[-81.263462,36.764754],[-81.378478,36.95097],[-80.912938,37.071463]]]}},
+{"type":"Feature","id":"51199","properties":{"name":"York"},"geometry":{"type":"Polygon","coordinates":[[[-76.657355,37.378172],[-76.498524,37.241248],[-76.399939,37.164571],[-76.394462,37.104325],[-76.4328,37.093371],[-76.55877,37.213863],[-76.591632,37.213863],[-76.679263,37.268633],[-76.728555,37.306971],[-76.657355,37.378172]]]}},
+{"type":"Feature","id":"51510","properties":{"name":"Alexandria"},"geometry":{"type":"Polygon","coordinates":[[[-77.084556,38.845992],[-77.046218,38.840515],[-77.040741,38.791222],[-77.040741,38.785745],[-77.111941,38.845992],[-77.084556,38.845992]]]}},
+{"type":"Feature","id":"51520","properties":{"name":"Bristol"},"geometry":{"type":"Polygon","coordinates":[[[-82.145249,36.671646],[-82.145249,36.594969],[-82.243834,36.594969],[-82.145249,36.671646]]]}},
+{"type":"Feature","id":"51550","properties":{"name":"Chesapeake"},"geometry":{"type":"Polygon","coordinates":[[[-76.405416,36.868816],[-76.2904,36.819524],[-76.224677,36.841432],[-76.120615,36.551154],[-76.312308,36.551154],[-76.493047,36.551154],[-76.421846,36.868816],[-76.405416,36.868816]]]}},
+{"type":"Feature","id":"51590","properties":{"name":"Danville"},"geometry":{"type":"Polygon","coordinates":[[[-79.401302,36.638785],[-79.341056,36.5402],[-79.472502,36.5402],[-79.401302,36.638785]]]}},
+{"type":"Feature","id":"51650","properties":{"name":"Hampton"},"geometry":{"type":"Polygon","coordinates":[[[-76.394462,37.104325],[-76.284923,37.115279],[-76.388985,36.989309],[-76.4328,37.093371],[-76.394462,37.104325]]]}},
+{"type":"Feature","id":"51670","properties":{"name":"Hopewell"},"geometry":{"type":"Polygon","coordinates":[[[-77.298157,37.312448],[-77.281726,37.312448],[-77.336496,37.312448],[-77.298157,37.312448],[-77.298157,37.312448]]]}},
+{"type":"Feature","id":"51680","properties":{"name":"Lynchburg"},"geometry":{"type":"Polygon","coordinates":[[[-79.187701,37.465803],[-79.187701,37.465803],[-79.083639,37.394602],[-79.258902,37.356264],[-79.187701,37.465803]]]}},
+{"type":"Feature","id":"51700","properties":{"name":"Newport News"},"geometry":{"type":"Polygon","coordinates":[[[-76.55877,37.213863],[-76.4328,37.093371],[-76.388985,36.989309],[-76.613539,37.164571],[-76.591632,37.213863],[-76.55877,37.213863]]]}},
+{"type":"Feature","id":"51710","properties":{"name":"Norfolk"},"geometry":{"type":"Polygon","coordinates":[[[-76.175384,36.929063],[-76.180861,36.923586],[-76.224677,36.841432],[-76.2904,36.819524],[-76.345169,36.918109],[-76.175384,36.929063]]]}},
+{"type":"Feature","id":"51730","properties":{"name":"Petersburg"},"geometry":{"type":"Polygon","coordinates":[[[-77.402219,37.241248],[-77.374834,37.246725],[-77.396742,37.170048],[-77.446034,37.224817],[-77.41865,37.235771],[-77.402219,37.235771],[-77.402219,37.241248]]]}},
+{"type":"Feature","id":"51735","properties":{"name":"Poquoson"},"geometry":{"type":"Polygon","coordinates":[[[-76.394462,37.104325],[-76.399939,37.164571],[-76.284923,37.115279],[-76.394462,37.104325]]]}},
+{"type":"Feature","id":"51740","properties":{"name":"Portsmouth"},"geometry":{"type":"Polygon","coordinates":[[[-76.345169,36.918109],[-76.2904,36.819524],[-76.405416,36.868816],[-76.421846,36.868816],[-76.405416,36.896201],[-76.345169,36.918109]]]}},
+{"type":"Feature","id":"51760","properties":{"name":"Richmond"},"geometry":{"type":"Polygon","coordinates":[[[-77.473419,37.597249],[-77.41865,37.449372],[-77.593912,37.553434],[-77.473419,37.597249]]]}},
+{"type":"Feature","id":"51770","properties":{"name":"Roanoke"},"geometry":{"type":"Polygon","coordinates":[[[-79.981858,37.328879],[-80.03115,37.263156],[-80.020196,37.306971],[-79.981858,37.328879]]]}},
+{"type":"Feature","id":"51800","properties":{"name":"Suffolk"},"geometry":{"type":"Polygon","coordinates":[[[-76.405416,36.896201],[-76.421846,36.868816],[-76.493047,36.551154],[-76.542339,36.551154],[-76.914771,36.551154],[-76.89834,36.644262],[-76.482093,36.929063],[-76.405416,36.896201]]]}},
+{"type":"Feature","id":"51810","properties":{"name":"Virginia Beach"},"geometry":{"type":"Polygon","coordinates":[[[-76.180861,36.923586],[-76.175384,36.929063],[-75.868676,36.551154],[-75.901537,36.551154],[-76.120615,36.551154],[-76.224677,36.841432],[-76.180861,36.923586]]]}},
+{"type":"Feature","id":"53001","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-118.950288,47.264049],[-117.958962,47.258572],[-118.210901,46.738263],[-119.213182,46.738263],[-119.372013,46.738263],[-118.977673,47.264049],[-118.950288,47.264049]]]}},
+{"type":"Feature","id":"53003","properties":{"name":"Asotin"},"geometry":{"type":"Polygon","coordinates":[[[-117.038836,46.426077],[-116.918344,45.993399],[-117.482468,45.998876],[-117.230529,46.464416],[-117.038836,46.426077]]]}},
+{"type":"Feature","id":"53005","properties":{"name":"Benton"},"geometry":{"type":"Polygon","coordinates":[[[-119.875891,46.628724],[-119.454167,46.678016],[-119.043396,46.190569],[-118.988627,45.998876],[-119.432259,45.916722],[-119.870414,45.834568],[-119.864937,46.042691],[-119.875891,46.628724],[-119.875891,46.628724]]]}},
+{"type":"Feature","id":"53007","properties":{"name":"Chelan"},"geometry":{"type":"Polygon","coordinates":[[[-120.702909,48.529222],[-119.870414,47.95962],[-120.319524,47.455742],[-120.094969,47.264049],[-121.11368,47.598142],[-121.119157,47.778881],[-121.004141,48.293714],[-120.702909,48.529222]]]}},
+{"type":"Feature","id":"53009","properties":{"name":"Clallam"},"geometry":{"type":"Polygon","coordinates":[[[-122.926547,48.063682],[-122.948455,47.866512],[-124.613445,47.882943],[-124.597014,48.381345],[-123.983597,48.162267],[-122.926547,48.063682]]]}},
+{"type":"Feature","id":"53011","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-122.433623,45.976968],[-122.247407,46.053645],[-122.247407,45.549767],[-122.762239,45.730506],[-122.784147,45.850998],[-122.433623,45.976968]]]}},
+{"type":"Feature","id":"53013","properties":{"name":"Columbia"},"geometry":{"type":"Polygon","coordinates":[[[-118.227332,46.595862],[-118.216378,46.590385],[-117.849423,46.623247],[-117.602961,45.998876],[-117.975393,45.998876],[-117.997301,45.998876],[-118.227332,46.595862]]]}},
+{"type":"Feature","id":"53015","properties":{"name":"Cowlitz"},"geometry":{"type":"Polygon","coordinates":[[[-123.216825,46.387739],[-122.24193,46.387739],[-122.247407,46.053645],[-122.433623,45.976968],[-122.784147,45.850998],[-123.211348,46.174138],[-123.216825,46.387739]]]}},
+{"type":"Feature","id":"53017","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-119.021489,48.069159],[-118.98315,47.95962],[-119.213182,47.861036],[-120.007338,47.220233],[-120.094969,47.264049],[-120.319524,47.455742],[-119.870414,47.95962],[-119.021489,48.069159]]]}},
+{"type":"Feature","id":"53019","properties":{"name":"Ferry"},"geometry":{"type":"Polygon","coordinates":[[[-118.194471,49.000239],[-118.139701,48.266329],[-118.342348,47.893897],[-118.851704,47.95962],[-118.835273,49.000239],[-118.194471,49.000239]]]}},
+{"type":"Feature","id":"53021","properties":{"name":"Franklin"},"geometry":{"type":"Polygon","coordinates":[[[-119.213182,46.738263],[-118.210901,46.738263],[-118.216378,46.590385],[-118.227332,46.595862],[-118.698349,46.371308],[-119.043396,46.190569],[-119.454167,46.678016],[-119.372013,46.738263],[-119.213182,46.738263]]]}},
+{"type":"Feature","id":"53023","properties":{"name":"Garfield"},"geometry":{"type":"Polygon","coordinates":[[[-117.849423,46.623247],[-117.230529,46.464416],[-117.482468,45.998876],[-117.602961,45.998876],[-117.849423,46.623247]]]}},
+{"type":"Feature","id":"53025","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-119.213182,47.861036],[-118.98315,47.95962],[-118.972196,47.94319],[-118.977673,47.264049],[-119.372013,46.738263],[-119.454167,46.678016],[-119.875891,46.628724],[-119.875891,46.628724],[-119.974476,46.738263],[-120.007338,47.220233],[-119.213182,47.861036]]]}},
+{"type":"Feature","id":"53027","properties":{"name":"Grays Harbor"},"geometry":{"type":"Polygon","coordinates":[[[-124.323167,47.532419],[-123.507103,47.515988],[-123.200394,47.08331],[-123.162056,46.793032],[-123.183963,46.793032],[-123.370179,46.793032],[-124.098612,46.793032],[-124.356029,47.532419],[-124.323167,47.532419]]]}},
+{"type":"Feature","id":"53031","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-122.751285,47.740543],[-122.948455,47.603619],[-123.507103,47.515988],[-124.323167,47.532419],[-124.356029,47.532419],[-124.613445,47.882943],[-122.948455,47.866512],[-122.926547,48.063682],[-122.751285,47.740543]]]}},
+{"type":"Feature","id":"53033","properties":{"name":"King"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-121.234173,47.778881],[-121.119157,47.778881],[-121.11368,47.598142],[-121.11368,47.598142],[-121.38205,47.088787],[-122.417192,47.318818],[-122.395284,47.778881],[-121.234173,47.778881]]],[[[-122.537684,47.357157],[-122.537684,47.400973],[-122.482915,47.510511],[-122.537684,47.357157]]]]}},
+{"type":"Feature","id":"53035","properties":{"name":"Kitsap"},"geometry":{"type":"Polygon","coordinates":[[[-122.482915,47.510511],[-122.537684,47.400973],[-122.800578,47.406449],[-122.948455,47.603619],[-122.751285,47.740543],[-122.482915,47.510511]]]}},
+{"type":"Feature","id":"53037","properties":{"name":"Kittitas"},"geometry":{"type":"Polygon","coordinates":[[[-121.11368,47.598142],[-121.11368,47.598142],[-120.094969,47.264049],[-120.007338,47.220233],[-119.974476,46.738263],[-120.511216,46.738263],[-121.38205,47.088787],[-121.11368,47.598142]]]}},
+{"type":"Feature","id":"53039","properties":{"name":"Klickitat"},"geometry":{"type":"Polygon","coordinates":[[[-119.990907,46.042691],[-119.864937,46.042691],[-119.870414,45.834568],[-120.001861,45.81266],[-120.653617,45.735983],[-120.834356,45.675736],[-120.91651,45.642875],[-121.442296,45.697644],[-121.52445,45.725029],[-121.52445,46.042691],[-119.990907,46.042691]]]}},
+{"type":"Feature","id":"53041","properties":{"name":"Lewis"},"geometry":{"type":"Polygon","coordinates":[[[-123.183963,46.793032],[-123.162056,46.793032],[-122.203591,46.760171],[-121.45325,46.782078],[-121.52445,46.387739],[-122.24193,46.387739],[-123.216825,46.387739],[-123.359225,46.382262],[-123.370179,46.793032],[-123.183963,46.793032]]]}},
+{"type":"Feature","id":"53043","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-118.972196,47.94319],[-118.851704,47.95962],[-118.342348,47.893897],[-117.822039,47.822697],[-117.822039,47.258572],[-117.958962,47.258572],[-118.950288,47.264049],[-118.977673,47.264049],[-118.972196,47.94319]]]}},
+{"type":"Feature","id":"53045","properties":{"name":"Mason"},"geometry":{"type":"Polygon","coordinates":[[[-123.507103,47.515988],[-122.948455,47.603619],[-122.800578,47.406449],[-122.822485,47.192849],[-122.904639,47.15451],[-123.200394,47.08331],[-123.507103,47.515988]]]}},
+{"type":"Feature","id":"53047","properties":{"name":"Okanogan"},"geometry":{"type":"Polygon","coordinates":[[[-118.835273,49.000239],[-118.851704,47.95962],[-118.972196,47.94319],[-118.98315,47.95962],[-119.021489,48.069159],[-119.870414,47.95962],[-120.702909,48.529222],[-120.752202,48.655192],[-120.850787,49.000239],[-118.835273,49.000239]]]}},
+{"type":"Feature","id":"53049","properties":{"name":"Pacific"},"geometry":{"type":"Polygon","coordinates":[[[-124.098612,46.793032],[-123.370179,46.793032],[-123.359225,46.382262],[-123.72618,46.289154],[-124.098612,46.793032]]]}},
+{"type":"Feature","id":"53051","properties":{"name":"Pend Oreille"},"geometry":{"type":"Polygon","coordinates":[[[-117.033359,49.000239],[-117.033359,48.846885],[-117.044313,48.047251],[-117.438653,48.047251],[-117.427699,49.000239],[-117.033359,49.000239]]]}},
+{"type":"Feature","id":"53053","properties":{"name":"Pierce"},"geometry":{"type":"Polygon","coordinates":[[[-122.800578,47.406449],[-122.537684,47.400973],[-122.537684,47.357157],[-122.417192,47.318818],[-121.38205,47.088787],[-121.45325,46.782078],[-122.203591,46.760171],[-122.822485,47.192849],[-122.800578,47.406449]]]}},
+{"type":"Feature","id":"53057","properties":{"name":"Skagit"},"geometry":{"type":"Polygon","coordinates":[[[-122.329561,48.644238],[-120.752202,48.655192],[-120.702909,48.529222],[-121.004141,48.293714],[-121.836636,48.299191],[-122.378853,48.299191],[-122.488392,48.644238],[-122.329561,48.644238]]]}},
+{"type":"Feature","id":"53059","properties":{"name":"Skamania"},"geometry":{"type":"Polygon","coordinates":[[[-121.52445,46.387739],[-121.52445,46.042691],[-121.52445,45.725029],[-121.924267,45.648352],[-122.247407,45.549767],[-122.247407,46.053645],[-122.24193,46.387739],[-121.52445,46.387739]]]}},
+{"type":"Feature","id":"53061","properties":{"name":"Snohomish"},"geometry":{"type":"Polygon","coordinates":[[[-121.836636,48.299191],[-121.004141,48.293714],[-121.119157,47.778881],[-121.234173,47.778881],[-122.395284,47.778881],[-122.395284,48.227991],[-122.406238,48.249898],[-122.378853,48.299191],[-121.836636,48.299191]]]}},
+{"type":"Feature","id":"53063","properties":{"name":"Spokane"},"geometry":{"type":"Polygon","coordinates":[[[-117.537238,48.047251],[-117.438653,48.047251],[-117.044313,48.047251],[-117.044313,47.976051],[-117.038836,47.368111],[-117.038836,47.258572],[-117.822039,47.258572],[-117.822039,47.822697],[-117.537238,48.047251]]]}},
+{"type":"Feature","id":"53065","properties":{"name":"Stevens"},"geometry":{"type":"Polygon","coordinates":[[[-117.427699,49.000239],[-117.438653,48.047251],[-117.537238,48.047251],[-117.822039,47.822697],[-118.342348,47.893897],[-118.139701,48.266329],[-118.194471,49.000239],[-117.427699,49.000239]]]}},
+{"type":"Feature","id":"53067","properties":{"name":"Thurston"},"geometry":{"type":"Polygon","coordinates":[[[-122.904639,47.15451],[-122.822485,47.192849],[-122.203591,46.760171],[-123.162056,46.793032],[-123.200394,47.08331],[-122.904639,47.15451]]]}},
+{"type":"Feature","id":"53069","properties":{"name":"Wahkiakum"},"geometry":{"type":"Polygon","coordinates":[[[-123.359225,46.382262],[-123.216825,46.387739],[-123.211348,46.174138],[-123.364702,46.146753],[-123.545441,46.261769],[-123.72618,46.289154],[-123.359225,46.382262]]]}},
+{"type":"Feature","id":"53071","properties":{"name":"Walla Walla"},"geometry":{"type":"Polygon","coordinates":[[[-118.698349,46.371308],[-118.227332,46.595862],[-117.997301,45.998876],[-118.58881,45.998876],[-118.988627,45.998876],[-119.043396,46.190569],[-118.698349,46.371308]]]}},
+{"type":"Feature","id":"53073","properties":{"name":"Whatcom"},"geometry":{"type":"Polygon","coordinates":[[[-120.850787,49.000239],[-120.752202,48.655192],[-122.329561,48.644238],[-122.488392,48.644238],[-122.756762,49.000239],[-120.850787,49.000239]]]}},
+{"type":"Feature","id":"53075","properties":{"name":"Whitman"},"geometry":{"type":"Polygon","coordinates":[[[-117.822039,47.258572],[-117.038836,47.258572],[-117.038836,47.127126],[-117.038836,46.541093],[-117.038836,46.426077],[-117.230529,46.464416],[-117.849423,46.623247],[-118.216378,46.590385],[-118.210901,46.738263],[-117.958962,47.258572],[-117.822039,47.258572]]]}},
+{"type":"Feature","id":"53077","properties":{"name":"Yakima"},"geometry":{"type":"Polygon","coordinates":[[[-121.38205,47.088787],[-120.511216,46.738263],[-119.974476,46.738263],[-119.875891,46.628724],[-119.864937,46.042691],[-119.990907,46.042691],[-121.52445,46.042691],[-121.52445,46.387739],[-121.45325,46.782078],[-121.38205,47.088787]]]}},
+{"type":"Feature","id":"54001","properties":{"name":"Barbour"},"geometry":{"type":"Polygon","coordinates":[[[-79.976381,39.262239],[-79.894227,39.300578],[-79.812073,39.229378],[-79.823026,39.114362],[-80.08592,38.944577],[-80.22832,39.114362],[-80.168074,39.240331],[-79.976381,39.262239]]]}},
+{"type":"Feature","id":"54003","properties":{"name":"Berkeley"},"geometry":{"type":"Polygon","coordinates":[[[-78.021113,39.61824],[-77.823943,39.492271],[-77.823943,39.492271],[-78.032067,39.262239],[-78.229237,39.393686],[-78.021113,39.61824]]]}},
+{"type":"Feature","id":"54005","properties":{"name":"Boone"},"geometry":{"type":"Polygon","coordinates":[[[-81.756386,38.20519],[-81.455155,37.986112],[-81.564693,37.931343],[-81.515401,37.788942],[-81.608509,37.788942],[-81.931648,38.024451],[-81.833064,38.210667],[-81.756386,38.20519]]]}},
+{"type":"Feature","id":"54007","properties":{"name":"Braxton"},"geometry":{"type":"Polygon","coordinates":[[[-80.606229,38.906238],[-80.458352,38.74193],[-80.650044,38.528329],[-80.677429,38.533806],[-80.880076,38.506421],[-81.03343,38.665253],[-80.984138,38.720022],[-80.606229,38.906238]]]}},
+{"type":"Feature","id":"54009","properties":{"name":"Brooke"},"geometry":{"type":"Polygon","coordinates":[[[-80.518598,40.401443],[-80.518598,40.160457],[-80.682906,40.187842],[-80.633614,40.395966],[-80.518598,40.401443]]]}},
+{"type":"Feature","id":"54011","properties":{"name":"Cabell"},"geometry":{"type":"Polygon","coordinates":[[[-82.265742,38.599529],[-82.216449,38.594052],[-82.057618,38.47356],[-82.046664,38.374975],[-82.265742,38.227097],[-82.506727,38.413313],[-82.28765,38.583099],[-82.265742,38.599529]]]}},
+{"type":"Feature","id":"54013","properties":{"name":"Calhoun"},"geometry":{"type":"Polygon","coordinates":[[[-81.115584,39.037685],[-81.03343,39.0103],[-80.984138,38.720022],[-81.03343,38.665253],[-81.055338,38.643345],[-81.082723,38.610483],[-81.279893,38.917192],[-81.164877,39.032208],[-81.115584,39.037685]]]}},
+{"type":"Feature","id":"54015","properties":{"name":"Clay"},"geometry":{"type":"Polygon","coordinates":[[[-81.055338,38.643345],[-81.03343,38.665253],[-80.880076,38.506421],[-81.2306,38.265436],[-81.192262,38.528329],[-81.082723,38.610483],[-81.055338,38.643345]]]}},
+{"type":"Feature","id":"54017","properties":{"name":"Doddridge"},"geometry":{"type":"Polygon","coordinates":[[[-80.617183,39.448455],[-80.545983,39.426547],[-80.595275,39.169131],[-80.726722,39.097931],[-80.814353,39.108885],[-80.89103,39.295101],[-80.617183,39.448455]]]}},
+{"type":"Feature","id":"54019","properties":{"name":"Fayette"},"geometry":{"type":"Polygon","coordinates":[[[-81.192262,38.232574],[-80.880076,38.101128],[-80.808876,37.871096],[-80.945799,37.821804],[-81.378478,37.969681],[-81.2306,38.265436],[-81.192262,38.232574]]]}},
+{"type":"Feature","id":"54021","properties":{"name":"Gilmer"},"geometry":{"type":"Polygon","coordinates":[[[-80.726722,39.097931],[-80.606229,38.906238],[-80.984138,38.720022],[-81.03343,39.0103],[-80.814353,39.108885],[-80.726722,39.097931]]]}},
+{"type":"Feature","id":"54023","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-78.979578,39.240331],[-79.132932,38.81313],[-79.35201,38.95553],[-79.357487,38.966484],[-79.488933,39.196516],[-79.488933,39.20747],[-79.275332,39.327962],[-78.979578,39.240331]]]}},
+{"type":"Feature","id":"54025","properties":{"name":"Greenbrier"},"geometry":{"type":"Polygon","coordinates":[[[-80.414536,38.254482],[-80.359767,38.227097],[-79.95995,38.062789],[-80.058535,37.95325],[-80.294043,37.690357],[-80.660998,37.734173],[-80.808876,37.871096],[-80.880076,38.101128],[-80.436444,38.265436],[-80.414536,38.254482]]]}},
+{"type":"Feature","id":"54027","properties":{"name":"Hampshire"},"geometry":{"type":"Polygon","coordinates":[[[-78.656438,39.536086],[-78.470222,39.514178],[-78.349729,39.464886],[-78.508561,39.086977],[-78.979578,39.240331],[-78.656438,39.536086]]]}},
+{"type":"Feature","id":"54029","properties":{"name":"Hancock"},"geometry":{"type":"Polygon","coordinates":[[[-80.518598,40.636951],[-80.518598,40.47812],[-80.518598,40.401443],[-80.633614,40.395966],[-80.666475,40.582182],[-80.518598,40.636951]]]}},
+{"type":"Feature","id":"54031","properties":{"name":"Hardy"},"geometry":{"type":"Polygon","coordinates":[[[-78.979578,39.240331],[-78.508561,39.086977],[-78.541422,39.054115],[-78.870039,38.763838],[-78.990532,38.845992],[-79.056255,38.763838],[-79.132932,38.81313],[-78.979578,39.240331]]]}},
+{"type":"Feature","id":"54033","properties":{"name":"Harrison"},"geometry":{"type":"Polygon","coordinates":[[[-80.49669,39.470363],[-80.195458,39.393686],[-80.168074,39.240331],[-80.22832,39.114362],[-80.29952,39.103408],[-80.452875,39.141746],[-80.595275,39.169131],[-80.545983,39.426547],[-80.49669,39.470363]]]}},
+{"type":"Feature","id":"54035","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-81.739956,39.092454],[-81.581124,39.026731],[-81.504447,38.917192],[-81.520878,38.610483],[-81.69614,38.626914],[-81.772817,38.681683],[-81.909741,38.878853],[-81.745433,39.097931],[-81.739956,39.092454]]]}},
+{"type":"Feature","id":"54037","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-77.823943,39.492271],[-77.823943,39.492271],[-77.719881,39.322485],[-77.82942,39.130793],[-78.032067,39.262239],[-77.823943,39.492271]]]}},
+{"type":"Feature","id":"54039","properties":{"name":"Kanawha"},"geometry":{"type":"Polygon","coordinates":[[[-81.69614,38.626914],[-81.69614,38.626914],[-81.520878,38.610483],[-81.192262,38.528329],[-81.2306,38.265436],[-81.2306,38.265436],[-81.378478,37.969681],[-81.455155,37.986112],[-81.756386,38.20519],[-81.833064,38.210667],[-81.915218,38.325682],[-81.69614,38.626914]]]}},
+{"type":"Feature","id":"54041","properties":{"name":"Lewis"},"geometry":{"type":"Polygon","coordinates":[[[-80.452875,39.141746],[-80.29952,39.103408],[-80.392628,38.725499],[-80.458352,38.74193],[-80.606229,38.906238],[-80.726722,39.097931],[-80.595275,39.169131],[-80.452875,39.141746]]]}},
+{"type":"Feature","id":"54043","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-82.046664,38.374975],[-81.915218,38.325682],[-81.833064,38.210667],[-81.931648,38.024451],[-82.189065,37.975158],[-82.30408,37.942297],[-82.265742,38.227097],[-82.046664,38.374975]]]}},
+{"type":"Feature","id":"54045","properties":{"name":"Logan"},"geometry":{"type":"Polygon","coordinates":[[[-81.931648,38.024451],[-81.608509,37.788942],[-81.800202,37.662973],[-82.189065,37.975158],[-81.931648,38.024451]]]}},
+{"type":"Feature","id":"54047","properties":{"name":"McDowell"},"geometry":{"type":"Polygon","coordinates":[[[-81.838541,37.547957],[-81.312754,37.421987],[-81.362047,37.339833],[-81.373001,37.323402],[-81.739956,37.241248],[-81.926172,37.509618],[-81.854971,37.547957],[-81.838541,37.547957]]]}},
+{"type":"Feature","id":"54049","properties":{"name":"Marion"},"geometry":{"type":"Polygon","coordinates":[[[-80.398105,39.634671],[-79.938042,39.453932],[-80.195458,39.393686],[-80.49669,39.470363],[-80.398105,39.634671]]]}},
+{"type":"Feature","id":"54051","properties":{"name":"Marshall"},"geometry":{"type":"Polygon","coordinates":[[[-80.726722,40.034488],[-80.518598,40.018057],[-80.518598,39.963288],[-80.518598,39.722302],[-80.830783,39.722302],[-80.81983,39.848272],[-80.732199,40.034488],[-80.726722,40.034488]]]}},
+{"type":"Feature","id":"54053","properties":{"name":"Mason"},"geometry":{"type":"Polygon","coordinates":[[[-81.909741,38.878853],[-81.772817,38.681683],[-82.057618,38.47356],[-82.216449,38.594052],[-82.101434,38.95553],[-81.909741,38.878853]]]}},
+{"type":"Feature","id":"54055","properties":{"name":"Mercer"},"geometry":{"type":"Polygon","coordinates":[[[-81.126538,37.591772],[-81.093677,37.586295],[-80.858168,37.427464],[-80.978661,37.290541],[-81.225123,37.235771],[-81.362047,37.339833],[-81.312754,37.421987],[-81.219646,37.509618],[-81.126538,37.591772]]]}},
+{"type":"Feature","id":"54057","properties":{"name":"Mineral"},"geometry":{"type":"Polygon","coordinates":[[[-78.738592,39.623717],[-78.656438,39.536086],[-78.979578,39.240331],[-79.275332,39.327962],[-79.067209,39.47584],[-78.738592,39.623717]]]}},
+{"type":"Feature","id":"54059","properties":{"name":"Mingo"},"geometry":{"type":"Polygon","coordinates":[[[-82.30408,37.942297],[-82.189065,37.975158],[-81.800202,37.662973],[-81.854971,37.547957],[-81.926172,37.509618],[-81.969987,37.537003],[-82.145249,37.569865],[-82.331465,37.73965],[-82.413619,37.854665],[-82.30408,37.942297]]]}},
+{"type":"Feature","id":"54061","properties":{"name":"Monongalia"},"geometry":{"type":"Polygon","coordinates":[[[-79.916134,39.722302],[-79.76278,39.722302],[-79.894227,39.437501],[-79.938042,39.453932],[-80.398105,39.634671],[-80.420013,39.722302],[-79.916134,39.722302]]]}},
+{"type":"Feature","id":"54063","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-80.660998,37.734173],[-80.294043,37.690357],[-80.222843,37.630111],[-80.474782,37.421987],[-80.858168,37.427464],[-80.660998,37.734173]]]}},
+{"type":"Feature","id":"54065","properties":{"name":"Morgan"},"geometry":{"type":"Polygon","coordinates":[[[-78.185421,39.694917],[-78.021113,39.61824],[-78.229237,39.393686],[-78.349729,39.464886],[-78.470222,39.514178],[-78.333299,39.634671],[-78.185421,39.694917]]]}},
+{"type":"Feature","id":"54067","properties":{"name":"Nicholas"},"geometry":{"type":"Polygon","coordinates":[[[-80.677429,38.533806],[-80.650044,38.528329],[-80.436444,38.265436],[-80.880076,38.101128],[-81.192262,38.232574],[-81.2306,38.265436],[-81.2306,38.265436],[-80.880076,38.506421],[-80.677429,38.533806]]]}},
+{"type":"Feature","id":"54069","properties":{"name":"Ohio"},"geometry":{"type":"Polygon","coordinates":[[[-80.682906,40.187842],[-80.518598,40.160457],[-80.518598,40.018057],[-80.726722,40.034488],[-80.732199,40.034488],[-80.704814,40.15498],[-80.682906,40.187842]]]}},
+{"type":"Feature","id":"54071","properties":{"name":"Pendleton"},"geometry":{"type":"Polygon","coordinates":[[[-79.35201,38.95553],[-79.132932,38.81313],[-79.056255,38.763838],[-79.22604,38.479037],[-79.313671,38.413313],[-79.647764,38.594052],[-79.625857,38.665253],[-79.35201,38.95553]]]}},
+{"type":"Feature","id":"54073","properties":{"name":"Pleasants"},"geometry":{"type":"Polygon","coordinates":[[[-81.038907,39.470363],[-81.006046,39.34987],[-81.016999,39.34987],[-81.241554,39.267716],[-81.373001,39.344393],[-81.121061,39.459409],[-81.038907,39.470363]]]}},
+{"type":"Feature","id":"54075","properties":{"name":"Pocahontas"},"geometry":{"type":"Polygon","coordinates":[[[-79.625857,38.665253],[-79.647764,38.594052],[-79.795642,38.265436],[-79.95995,38.062789],[-80.359767,38.227097],[-80.244751,38.385929],[-79.625857,38.665253]]]}},
+{"type":"Feature","id":"54077","properties":{"name":"Preston"},"geometry":{"type":"Polygon","coordinates":[[[-79.609426,39.722302],[-79.477979,39.722302],[-79.488933,39.20747],[-79.488933,39.196516],[-79.812073,39.229378],[-79.894227,39.300578],[-79.894227,39.437501],[-79.76278,39.722302],[-79.609426,39.722302]]]}},
+{"type":"Feature","id":"54079","properties":{"name":"Putnam"},"geometry":{"type":"Polygon","coordinates":[[[-81.69614,38.626914],[-81.69614,38.626914],[-81.915218,38.325682],[-82.046664,38.374975],[-82.057618,38.47356],[-81.772817,38.681683],[-81.69614,38.626914]]]}},
+{"type":"Feature","id":"54081","properties":{"name":"Raleigh"},"geometry":{"type":"Polygon","coordinates":[[[-81.564693,37.931343],[-81.455155,37.986112],[-81.378478,37.969681],[-80.945799,37.821804],[-81.093677,37.586295],[-81.126538,37.591772],[-81.219646,37.509618],[-81.515401,37.788942],[-81.564693,37.931343]]]}},
+{"type":"Feature","id":"54083","properties":{"name":"Randolph"},"geometry":{"type":"Polygon","coordinates":[[[-79.757303,39.032208],[-79.357487,38.966484],[-79.35201,38.95553],[-79.625857,38.665253],[-80.244751,38.385929],[-80.277612,38.692637],[-80.08592,38.944577],[-79.823026,39.114362],[-79.757303,39.032208]]]}},
+{"type":"Feature","id":"54085","properties":{"name":"Ritchie"},"geometry":{"type":"Polygon","coordinates":[[[-81.016999,39.34987],[-81.006046,39.34987],[-80.89103,39.295101],[-80.814353,39.108885],[-81.03343,39.0103],[-81.115584,39.037685],[-81.164877,39.032208],[-81.296323,39.185562],[-81.241554,39.267716],[-81.016999,39.34987]]]}},
+{"type":"Feature","id":"54087","properties":{"name":"Roane"},"geometry":{"type":"Polygon","coordinates":[[[-81.433247,38.933623],[-81.279893,38.917192],[-81.082723,38.610483],[-81.192262,38.528329],[-81.520878,38.610483],[-81.504447,38.917192],[-81.433247,38.933623]]]}},
+{"type":"Feature","id":"54089","properties":{"name":"Summers"},"geometry":{"type":"Polygon","coordinates":[[[-80.808876,37.871096],[-80.660998,37.734173],[-80.858168,37.427464],[-80.858168,37.427464],[-81.093677,37.586295],[-80.945799,37.821804],[-80.808876,37.871096]]]}},
+{"type":"Feature","id":"54091","properties":{"name":"Taylor"},"geometry":{"type":"Polygon","coordinates":[[[-79.938042,39.453932],[-79.894227,39.437501],[-79.894227,39.300578],[-79.976381,39.262239],[-80.168074,39.240331],[-80.195458,39.393686],[-79.938042,39.453932]]]}},
+{"type":"Feature","id":"54093","properties":{"name":"Tucker"},"geometry":{"type":"Polygon","coordinates":[[[-79.812073,39.229378],[-79.488933,39.196516],[-79.357487,38.966484],[-79.757303,39.032208],[-79.823026,39.114362],[-79.812073,39.229378]]]}},
+{"type":"Feature","id":"54095","properties":{"name":"Tyler"},"geometry":{"type":"Polygon","coordinates":[[[-80.945799,39.607286],[-80.617183,39.448455],[-80.89103,39.295101],[-81.006046,39.34987],[-81.038907,39.470363],[-81.121061,39.459409],[-81.038907,39.541563],[-80.945799,39.607286]]]}},
+{"type":"Feature","id":"54097","properties":{"name":"Upshur"},"geometry":{"type":"Polygon","coordinates":[[[-80.22832,39.114362],[-80.08592,38.944577],[-80.277612,38.692637],[-80.392628,38.725499],[-80.29952,39.103408],[-80.22832,39.114362]]]}},
+{"type":"Feature","id":"54099","properties":{"name":"Wayne"},"geometry":{"type":"Polygon","coordinates":[[[-82.561497,38.40236],[-82.506727,38.413313],[-82.265742,38.227097],[-82.30408,37.942297],[-82.413619,37.854665],[-82.495773,37.947773],[-82.605312,38.249005],[-82.594358,38.424267],[-82.561497,38.40236]]]}},
+{"type":"Feature","id":"54101","properties":{"name":"Webster"},"geometry":{"type":"Polygon","coordinates":[[[-80.458352,38.74193],[-80.392628,38.725499],[-80.277612,38.692637],[-80.244751,38.385929],[-80.359767,38.227097],[-80.414536,38.254482],[-80.436444,38.265436],[-80.650044,38.528329],[-80.458352,38.74193]]]}},
+{"type":"Feature","id":"54103","properties":{"name":"Wetzel"},"geometry":{"type":"Polygon","coordinates":[[[-80.830783,39.722302],[-80.518598,39.722302],[-80.420013,39.722302],[-80.398105,39.634671],[-80.49669,39.470363],[-80.545983,39.426547],[-80.617183,39.448455],[-80.945799,39.607286],[-80.830783,39.722302]]]}},
+{"type":"Feature","id":"54105","properties":{"name":"Wirt"},"geometry":{"type":"Polygon","coordinates":[[[-81.42777,39.13627],[-81.296323,39.185562],[-81.164877,39.032208],[-81.279893,38.917192],[-81.433247,38.933623],[-81.504447,38.917192],[-81.581124,39.026731],[-81.42777,39.13627]]]}},
+{"type":"Feature","id":"54107","properties":{"name":"Wood"},"geometry":{"type":"Polygon","coordinates":[[[-81.373001,39.344393],[-81.241554,39.267716],[-81.296323,39.185562],[-81.42777,39.13627],[-81.581124,39.026731],[-81.739956,39.092454],[-81.745433,39.097931],[-81.756386,39.180085],[-81.723525,39.218424],[-81.373001,39.344393]]]}},
+{"type":"Feature","id":"54109","properties":{"name":"Wyoming"},"geometry":{"type":"Polygon","coordinates":[[[-81.515401,37.788942],[-81.219646,37.509618],[-81.312754,37.421987],[-81.838541,37.547957],[-81.854971,37.547957],[-81.800202,37.662973],[-81.608509,37.788942],[-81.515401,37.788942]]]}},
+{"type":"Feature","id":"55001","properties":{"name":"Adams"},"geometry":{"type":"Polygon","coordinates":[[[-89.818443,44.251732],[-89.725335,44.246255],[-89.599365,44.246255],[-89.599365,43.983362],[-89.599365,43.643791],[-89.785581,43.638314],[-89.900597,44.251732],[-89.818443,44.251732]]]}},
+{"type":"Feature","id":"55003","properties":{"name":"Ashland"},"geometry":{"type":"Polygon","coordinates":[[[-90.546876,46.584908],[-90.300413,45.982445],[-90.678322,45.982445],[-90.924785,46.15223],[-90.924785,46.584908],[-90.546876,46.584908]]]}},
+{"type":"Feature","id":"55005","properties":{"name":"Barron"},"geometry":{"type":"Polygon","coordinates":[[[-92.157096,45.637398],[-92.031127,45.637398],[-91.538202,45.637398],[-91.543679,45.29235],[-91.664172,45.210196],[-92.157096,45.210196],[-92.157096,45.637398]]]}},
+{"type":"Feature","id":"55007","properties":{"name":"Bayfield"},"geometry":{"type":"Polygon","coordinates":[[[-90.924785,46.584908],[-90.924785,46.15223],[-91.302693,46.157707],[-91.549156,46.157707],[-91.549156,46.754694],[-90.870015,46.962817],[-90.924785,46.584908]]]}},
+{"type":"Feature","id":"55009","properties":{"name":"Brown"},"geometry":{"type":"Polygon","coordinates":[[[-88.235607,44.678933],[-87.989145,44.678933],[-87.76459,44.646072],[-87.76459,44.328409],[-87.885083,44.328409],[-88.043914,44.240778],[-88.191791,44.240778],[-88.246561,44.585825],[-88.241084,44.678933],[-88.235607,44.678933]]]}},
+{"type":"Feature","id":"55011","properties":{"name":"Buffalo"},"geometry":{"type":"Polygon","coordinates":[[[-91.647741,44.596779],[-91.527248,44.596779],[-91.56011,44.027177],[-91.855864,44.191485],[-92.085896,44.405086],[-91.647741,44.596779]]]}},
+{"type":"Feature","id":"55013","properties":{"name":"Burnett"},"geometry":{"type":"Polygon","coordinates":[[[-92.29402,46.157707],[-92.047557,46.157707],[-92.031127,45.637398],[-92.157096,45.637398],[-92.529528,45.730506],[-92.885529,45.642875],[-92.841714,45.730506],[-92.29402,46.157707]]]}},
+{"type":"Feature","id":"55015","properties":{"name":"Calumet"},"geometry":{"type":"Polygon","coordinates":[[[-88.405392,44.246255],[-88.191791,44.240778],[-88.043914,44.240778],[-88.043914,43.890254],[-88.164407,43.890254],[-88.405392,43.939546],[-88.405392,44.246255]]]}},
+{"type":"Feature","id":"55017","properties":{"name":"Chippewa"},"geometry":{"type":"Polygon","coordinates":[[[-91.089093,45.29235],[-90.924785,45.29235],[-90.924785,45.029457],[-90.924785,44.859672],[-91.499863,44.859672],[-91.653218,44.854195],[-91.664172,45.210196],[-91.543679,45.29235],[-91.089093,45.29235]]]}},
+{"type":"Feature","id":"55019","properties":{"name":"Clark"},"geometry":{"type":"Polygon","coordinates":[[[-90.815246,45.029457],[-90.316844,45.034934],[-90.316844,44.68441],[-90.316844,44.426994],[-90.924785,44.596779],[-90.924785,44.859672],[-90.924785,45.029457],[-90.815246,45.029457]]]}},
+{"type":"Feature","id":"55021","properties":{"name":"Columbia"},"geometry":{"type":"Polygon","coordinates":[[[-89.243364,43.643791],[-89.007855,43.632838],[-89.007855,43.282313],[-89.413149,43.293267],[-89.719858,43.293267],[-89.785581,43.638314],[-89.599365,43.643791],[-89.243364,43.643791]]]}},
+{"type":"Feature","id":"55023","properties":{"name":"Crawford"},"geometry":{"type":"Polygon","coordinates":[[[-90.9686,43.424714],[-90.667368,43.424714],[-90.667368,43.172775],[-91.154816,42.986559],[-91.176724,43.079667],[-91.204109,43.424714],[-90.9686,43.424714]]]}},
+{"type":"Feature","id":"55025","properties":{"name":"Dane"},"geometry":{"type":"Polygon","coordinates":[[[-89.413149,43.293267],[-89.007855,43.282313],[-89.007855,43.200159],[-89.013332,42.849635],[-89.051671,42.849635],[-89.369334,42.844158],[-89.84035,42.855112],[-89.84035,43.205636],[-89.719858,43.293267],[-89.413149,43.293267]]]}},
+{"type":"Feature","id":"55027","properties":{"name":"Dodge"},"geometry":{"type":"Polygon","coordinates":[[[-88.887363,43.632838],[-88.399915,43.545207],[-88.416346,43.194682],[-88.536839,43.194682],[-88.991425,43.200159],[-89.007855,43.200159],[-89.007855,43.282313],[-89.007855,43.632838],[-88.887363,43.632838]]]}},
+{"type":"Feature","id":"55029","properties":{"name":"Door"},"geometry":{"type":"Polygon","coordinates":[[[-87.375727,44.673456],[-87.737205,44.678933],[-86.981388,45.297827],[-87.375727,44.673456]]]}},
+{"type":"Feature","id":"55031","properties":{"name":"Douglas"},"geometry":{"type":"Polygon","coordinates":[[[-91.549156,46.754694],[-91.549156,46.157707],[-92.020173,46.157707],[-92.047557,46.157707],[-92.29402,46.157707],[-92.29402,46.415123],[-92.29402,46.661586],[-92.014696,46.705401],[-91.549156,46.754694]]]}},
+{"type":"Feature","id":"55033","properties":{"name":"Dunn"},"geometry":{"type":"Polygon","coordinates":[[[-92.157096,45.210196],[-91.664172,45.210196],[-91.653218,44.854195],[-91.647741,44.68441],[-91.894203,44.68441],[-92.135188,44.68441],[-92.135188,44.859672],[-92.157096,45.210196]]]}},
+{"type":"Feature","id":"55035","properties":{"name":"Eau Claire"},"geometry":{"type":"Polygon","coordinates":[[[-91.499863,44.859672],[-90.924785,44.859672],[-90.924785,44.596779],[-91.16577,44.596779],[-91.286263,44.596779],[-91.527248,44.596779],[-91.647741,44.596779],[-91.647741,44.68441],[-91.653218,44.854195],[-91.499863,44.859672]]]}},
+{"type":"Feature","id":"55037","properties":{"name":"Florence"},"geometry":{"type":"Polygon","coordinates":[[[-88.493023,45.993399],[-88.115114,45.922199],[-88.060345,45.779798],[-88.4273,45.725029],[-88.684716,46.015307],[-88.493023,45.993399]]]}},
+{"type":"Feature","id":"55039","properties":{"name":"Fond du Lac"},"geometry":{"type":"Polygon","coordinates":[[[-88.405392,43.939546],[-88.164407,43.890254],[-88.15893,43.545207],[-88.399915,43.545207],[-88.887363,43.632838],[-88.887363,43.895731],[-88.405392,43.939546]]]}},
+{"type":"Feature","id":"55041","properties":{"name":"Forest"},"geometry":{"type":"Polygon","coordinates":[[[-88.931178,46.075553],[-88.684716,46.015307],[-88.4273,45.725029],[-88.4273,45.374505],[-88.679239,45.379982],[-89.046194,45.462136],[-89.046194,45.894814],[-88.931178,46.075553]]]}},
+{"type":"Feature","id":"55043","properties":{"name":"Grant"},"geometry":{"type":"Polygon","coordinates":[[[-90.552353,43.205636],[-90.43186,43.200159],[-90.426383,42.811297],[-90.426383,42.504588],[-90.639984,42.510065],[-90.8974,42.674373],[-91.154816,42.986559],[-90.667368,43.172775],[-90.552353,43.205636]]]}},
+{"type":"Feature","id":"55045","properties":{"name":"Green"},"geometry":{"type":"Polygon","coordinates":[[[-89.84035,42.855112],[-89.369334,42.844158],[-89.363857,42.499111],[-89.402195,42.499111],[-89.84035,42.504588],[-89.84035,42.811297],[-89.84035,42.855112]]]}},
+{"type":"Feature","id":"55047","properties":{"name":"Green Lake"},"geometry":{"type":"Polygon","coordinates":[[[-88.936655,43.983362],[-88.887363,43.983362],[-88.887363,43.895731],[-88.887363,43.632838],[-89.007855,43.632838],[-89.243364,43.643791],[-89.166687,43.983362],[-88.936655,43.983362]]]}},
+{"type":"Feature","id":"55049","properties":{"name":"Iowa"},"geometry":{"type":"Polygon","coordinates":[[[-90.294936,43.205636],[-90.196352,43.161821],[-89.84035,43.205636],[-89.84035,42.855112],[-89.84035,42.811297],[-90.30589,42.816773],[-90.426383,42.811297],[-90.43186,43.200159],[-90.294936,43.205636]]]}},
+{"type":"Feature","id":"55051","properties":{"name":"Iron"},"geometry":{"type":"Polygon","coordinates":[[[-90.415429,46.568478],[-89.927981,46.300108],[-90.042997,45.982445],[-90.300413,45.982445],[-90.546876,46.584908],[-90.415429,46.568478]]]}},
+{"type":"Feature","id":"55053","properties":{"name":"Jackson"},"geometry":{"type":"Polygon","coordinates":[[[-91.16577,44.596779],[-90.924785,44.596779],[-90.316844,44.426994],[-90.311367,44.246255],[-90.311367,44.153147],[-90.492106,44.158624],[-90.974077,44.070993],[-91.149339,44.081947],[-91.16577,44.596779]]]}},
+{"type":"Feature","id":"55055","properties":{"name":"Jefferson"},"geometry":{"type":"Polygon","coordinates":[[[-88.991425,43.200159],[-88.536839,43.194682],[-88.542316,42.844158],[-88.547792,42.844158],[-88.777824,42.844158],[-89.013332,42.849635],[-89.007855,43.200159],[-88.991425,43.200159]]]}},
+{"type":"Feature","id":"55057","properties":{"name":"Juneau"},"geometry":{"type":"Polygon","coordinates":[[[-90.081336,44.246255],[-89.900597,44.251732],[-89.785581,43.638314],[-90.294936,43.643791],[-90.311367,43.638314],[-90.311367,43.731422],[-90.311367,44.153147],[-90.311367,44.246255],[-90.081336,44.246255]]]}},
+{"type":"Feature","id":"55059","properties":{"name":"Kenosha"},"geometry":{"type":"Polygon","coordinates":[[[-88.027483,42.668896],[-87.808406,42.668896],[-87.802929,42.493634],[-88.202745,42.493634],[-88.219176,42.493634],[-88.306807,42.493634],[-88.306807,42.60865],[-88.027483,42.668896]]]}},
+{"type":"Feature","id":"55061","properties":{"name":"Kewaunee"},"geometry":{"type":"Polygon","coordinates":[[[-87.737205,44.678933],[-87.375727,44.673456],[-87.545512,44.328409],[-87.76459,44.328409],[-87.76459,44.646072],[-87.737205,44.678933]]]}},
+{"type":"Feature","id":"55063","properties":{"name":"La Crosse"},"geometry":{"type":"Polygon","coordinates":[[[-91.176724,44.087424],[-91.149339,44.081947],[-90.974077,44.070993],[-90.908354,43.725946],[-91.258878,43.725946],[-91.286263,43.846438],[-91.423186,43.983362],[-91.176724,44.087424]]]}},
+{"type":"Feature","id":"55065","properties":{"name":"Lafayette"},"geometry":{"type":"Polygon","coordinates":[[[-90.30589,42.816773],[-89.84035,42.811297],[-89.84035,42.504588],[-89.927981,42.504588],[-90.426383,42.504588],[-90.426383,42.811297],[-90.30589,42.816773]]]}},
+{"type":"Feature","id":"55067","properties":{"name":"Langlade"},"geometry":{"type":"Polygon","coordinates":[[[-89.237887,45.467613],[-89.046194,45.462136],[-88.679239,45.379982],[-88.6409,45.117088],[-88.974994,45.117088],[-88.980471,45.029457],[-88.991425,45.029457],[-89.221456,45.029457],[-89.424103,45.117088],[-89.424103,45.467613],[-89.237887,45.467613]]]}},
+{"type":"Feature","id":"55069","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-89.424103,45.467613],[-89.424103,45.117088],[-90.042997,45.122565],[-90.042997,45.379982],[-90.042997,45.555244],[-89.424103,45.467613]]]}},
+{"type":"Feature","id":"55071","properties":{"name":"Manitowoc"},"geometry":{"type":"Polygon","coordinates":[[[-87.885083,44.328409],[-87.76459,44.328409],[-87.545512,44.328409],[-87.731728,43.890254],[-87.770067,43.890254],[-88.043914,43.890254],[-88.043914,44.240778],[-87.885083,44.328409]]]}},
+{"type":"Feature","id":"55073","properties":{"name":"Marathon"},"geometry":{"type":"Polygon","coordinates":[[[-90.196352,45.122565],[-90.042997,45.122565],[-89.424103,45.117088],[-89.221456,45.029457],[-89.221456,44.678933],[-89.347426,44.678933],[-89.845827,44.68441],[-90.207305,44.68441],[-90.316844,44.68441],[-90.316844,45.034934],[-90.196352,45.122565]]]}},
+{"type":"Feature","id":"55075","properties":{"name":"Marinette"},"geometry":{"type":"Polygon","coordinates":[[[-88.060345,45.779798],[-87.846744,45.725029],[-87.589328,45.095181],[-87.76459,44.963734],[-88.4273,45.374505],[-88.4273,45.725029],[-88.060345,45.779798]]]}},
+{"type":"Feature","id":"55077","properties":{"name":"Marquette"},"geometry":{"type":"Polygon","coordinates":[[[-89.166687,43.983362],[-89.243364,43.643791],[-89.599365,43.643791],[-89.599365,43.983362],[-89.166687,43.983362]]]}},
+{"type":"Feature","id":"55078","properties":{"name":"Menominee"},"geometry":{"type":"Polygon","coordinates":[[[-88.974994,45.117088],[-88.6409,45.117088],[-88.487546,44.854195],[-88.980471,45.029457],[-88.974994,45.117088]]]}},
+{"type":"Feature","id":"55079","properties":{"name":"Milwaukee"},"geometry":{"type":"Polygon","coordinates":[[[-87.972714,43.194682],[-87.89056,43.194682],[-87.824836,42.844158],[-87.956283,42.844158],[-88.071299,42.844158],[-88.065822,43.194682],[-87.972714,43.194682]]]}},
+{"type":"Feature","id":"55081","properties":{"name":"Monroe"},"geometry":{"type":"Polygon","coordinates":[[[-90.492106,44.158624],[-90.311367,44.153147],[-90.311367,43.731422],[-90.908354,43.725946],[-90.974077,44.070993],[-90.492106,44.158624]]]}},
+{"type":"Feature","id":"55083","properties":{"name":"Oconto"},"geometry":{"type":"Polygon","coordinates":[[[-88.4273,45.374505],[-87.76459,44.963734],[-87.989145,44.678933],[-88.235607,44.678933],[-88.241084,44.678933],[-88.487546,44.854195],[-88.6409,45.117088],[-88.679239,45.379982],[-88.4273,45.374505]]]}},
+{"type":"Feature","id":"55085","properties":{"name":"Oneida"},"geometry":{"type":"Polygon","coordinates":[[[-89.298133,45.872906],[-89.046194,45.894814],[-89.046194,45.462136],[-89.237887,45.467613],[-89.424103,45.467613],[-90.042997,45.555244],[-90.042997,45.894814],[-89.298133,45.872906]]]}},
+{"type":"Feature","id":"55087","properties":{"name":"Outagamie"},"geometry":{"type":"Polygon","coordinates":[[[-88.575177,44.591302],[-88.246561,44.585825],[-88.191791,44.240778],[-88.405392,44.246255],[-88.471115,44.246255],[-88.739485,44.240778],[-88.608039,44.591302],[-88.575177,44.591302]]]}},
+{"type":"Feature","id":"55089","properties":{"name":"Ozaukee"},"geometry":{"type":"Polygon","coordinates":[[[-87.923421,43.545207],[-87.791975,43.545207],[-87.89056,43.194682],[-87.972714,43.194682],[-88.065822,43.194682],[-88.038437,43.53973],[-87.923421,43.545207]]]}},
+{"type":"Feature","id":"55091","properties":{"name":"Pepin"},"geometry":{"type":"Polygon","coordinates":[[[-91.894203,44.68441],[-91.647741,44.68441],[-91.647741,44.596779],[-92.085896,44.405086],[-92.244727,44.454379],[-92.315927,44.54201],[-92.135188,44.68441],[-91.894203,44.68441]]]}},
+{"type":"Feature","id":"55093","properties":{"name":"Pierce"},"geometry":{"type":"Polygon","coordinates":[[[-92.600728,44.865149],[-92.135188,44.859672],[-92.135188,44.68441],[-92.315927,44.54201],[-92.732175,44.711795],[-92.803375,44.744656],[-92.770513,44.859672],[-92.600728,44.865149]]]}},
+{"type":"Feature","id":"55095","properties":{"name":"Polk"},"geometry":{"type":"Polygon","coordinates":[[[-92.529528,45.730506],[-92.157096,45.637398],[-92.157096,45.210196],[-92.650021,45.210196],[-92.75956,45.210196],[-92.743129,45.297827],[-92.885529,45.642875],[-92.529528,45.730506]]]}},
+{"type":"Feature","id":"55097","properties":{"name":"Portage"},"geometry":{"type":"Polygon","coordinates":[[[-89.347426,44.678933],[-89.221456,44.678933],[-89.226933,44.246255],[-89.599365,44.246255],[-89.725335,44.246255],[-89.845827,44.68441],[-89.347426,44.678933]]]}},
+{"type":"Feature","id":"55099","properties":{"name":"Price"},"geometry":{"type":"Polygon","coordinates":[[[-90.300413,45.982445],[-90.042997,45.982445],[-90.042997,45.894814],[-90.042997,45.555244],[-90.042997,45.379982],[-90.168967,45.379982],[-90.678322,45.379982],[-90.678322,45.637398],[-90.678322,45.982445],[-90.300413,45.982445]]]}},
+{"type":"Feature","id":"55101","properties":{"name":"Racine"},"geometry":{"type":"Polygon","coordinates":[[[-87.956283,42.844158],[-87.824836,42.844158],[-87.808406,42.668896],[-88.027483,42.668896],[-88.306807,42.60865],[-88.306807,42.844158],[-88.071299,42.844158],[-87.956283,42.844158]]]}},
+{"type":"Feature","id":"55103","properties":{"name":"Richland"},"geometry":{"type":"Polygon","coordinates":[[[-90.190875,43.55616],[-90.196352,43.161821],[-90.294936,43.205636],[-90.43186,43.200159],[-90.552353,43.205636],[-90.667368,43.172775],[-90.667368,43.424714],[-90.311367,43.55616],[-90.190875,43.55616]]]}},
+{"type":"Feature","id":"55105","properties":{"name":"Rock"},"geometry":{"type":"Polygon","coordinates":[[[-89.051671,42.849635],[-89.013332,42.849635],[-88.777824,42.844158],[-88.777824,42.493634],[-88.942132,42.493634],[-89.363857,42.499111],[-89.369334,42.844158],[-89.051671,42.849635]]]}},
+{"type":"Feature","id":"55107","properties":{"name":"Rusk"},"geometry":{"type":"Polygon","coordinates":[[[-90.678322,45.637398],[-90.678322,45.379982],[-90.924785,45.29235],[-91.089093,45.29235],[-91.543679,45.29235],[-91.538202,45.637398],[-90.678322,45.637398]]]}},
+{"type":"Feature","id":"55109","properties":{"name":"St. Croix"},"geometry":{"type":"Polygon","coordinates":[[[-92.650021,45.210196],[-92.157096,45.210196],[-92.135188,44.859672],[-92.600728,44.865149],[-92.770513,44.859672],[-92.75956,45.210196],[-92.650021,45.210196]]]}},
+{"type":"Feature","id":"55111","properties":{"name":"Sauk"},"geometry":{"type":"Polygon","coordinates":[[[-90.294936,43.643791],[-89.785581,43.638314],[-89.719858,43.293267],[-89.84035,43.205636],[-90.196352,43.161821],[-90.190875,43.55616],[-90.311367,43.55616],[-90.311367,43.638314],[-90.294936,43.643791]]]}},
+{"type":"Feature","id":"55113","properties":{"name":"Sawyer"},"geometry":{"type":"Polygon","coordinates":[[[-91.302693,46.157707],[-90.924785,46.15223],[-90.678322,45.982445],[-90.678322,45.637398],[-91.538202,45.637398],[-91.549156,46.157707],[-91.302693,46.157707]]]}},
+{"type":"Feature","id":"55115","properties":{"name":"Shawano"},"geometry":{"type":"Polygon","coordinates":[[[-88.991425,45.029457],[-88.980471,45.029457],[-88.487546,44.854195],[-88.241084,44.678933],[-88.246561,44.585825],[-88.575177,44.591302],[-88.608039,44.591302],[-89.221456,44.678933],[-89.221456,45.029457],[-88.991425,45.029457]]]}},
+{"type":"Feature","id":"55117","properties":{"name":"Sheboygan"},"geometry":{"type":"Polygon","coordinates":[[[-87.770067,43.890254],[-87.731728,43.890254],[-87.791975,43.545207],[-87.923421,43.545207],[-88.038437,43.53973],[-88.15893,43.545207],[-88.164407,43.890254],[-88.043914,43.890254],[-87.770067,43.890254]]]}},
+{"type":"Feature","id":"55119","properties":{"name":"Taylor"},"geometry":{"type":"Polygon","coordinates":[[[-90.168967,45.379982],[-90.042997,45.379982],[-90.042997,45.122565],[-90.196352,45.122565],[-90.316844,45.034934],[-90.815246,45.029457],[-90.924785,45.029457],[-90.924785,45.29235],[-90.678322,45.379982],[-90.168967,45.379982]]]}},
+{"type":"Feature","id":"55121","properties":{"name":"Trempealeau"},"geometry":{"type":"Polygon","coordinates":[[[-91.286263,44.596779],[-91.16577,44.596779],[-91.149339,44.081947],[-91.176724,44.087424],[-91.423186,43.983362],[-91.56011,44.027177],[-91.527248,44.596779],[-91.286263,44.596779]]]}},
+{"type":"Feature","id":"55123","properties":{"name":"Vernon"},"geometry":{"type":"Polygon","coordinates":[[[-90.311367,43.731422],[-90.311367,43.638314],[-90.311367,43.55616],[-90.667368,43.424714],[-90.9686,43.424714],[-91.204109,43.424714],[-91.215062,43.501391],[-91.258878,43.725946],[-90.908354,43.725946],[-90.311367,43.731422]]]}},
+{"type":"Feature","id":"55125","properties":{"name":"Vilas"},"geometry":{"type":"Polygon","coordinates":[[[-89.927981,46.300108],[-88.991425,46.097461],[-88.931178,46.075553],[-89.046194,45.894814],[-89.298133,45.872906],[-90.042997,45.894814],[-90.042997,45.982445],[-89.927981,46.300108]]]}},
+{"type":"Feature","id":"55127","properties":{"name":"Walworth"},"geometry":{"type":"Polygon","coordinates":[[[-88.547792,42.844158],[-88.542316,42.844158],[-88.306807,42.844158],[-88.306807,42.60865],[-88.306807,42.493634],[-88.706624,42.493634],[-88.777824,42.493634],[-88.777824,42.844158],[-88.547792,42.844158]]]}},
+{"type":"Feature","id":"55129","properties":{"name":"Washburn"},"geometry":{"type":"Polygon","coordinates":[[[-92.020173,46.157707],[-91.549156,46.157707],[-91.538202,45.637398],[-92.031127,45.637398],[-92.047557,46.157707],[-92.020173,46.157707]]]}},
+{"type":"Feature","id":"55131","properties":{"name":"Washington"},"geometry":{"type":"Polygon","coordinates":[[[-88.399915,43.545207],[-88.15893,43.545207],[-88.038437,43.53973],[-88.065822,43.194682],[-88.416346,43.194682],[-88.399915,43.545207]]]}},
+{"type":"Feature","id":"55133","properties":{"name":"Waukesha"},"geometry":{"type":"Polygon","coordinates":[[[-88.536839,43.194682],[-88.416346,43.194682],[-88.065822,43.194682],[-88.071299,42.844158],[-88.306807,42.844158],[-88.542316,42.844158],[-88.536839,43.194682]]]}},
+{"type":"Feature","id":"55135","properties":{"name":"Waupaca"},"geometry":{"type":"Polygon","coordinates":[[[-89.221456,44.678933],[-88.608039,44.591302],[-88.739485,44.240778],[-88.887363,44.240778],[-89.226933,44.246255],[-89.221456,44.678933]]]}},
+{"type":"Feature","id":"55137","properties":{"name":"Waushara"},"geometry":{"type":"Polygon","coordinates":[[[-89.599365,44.246255],[-89.226933,44.246255],[-88.887363,44.240778],[-88.887363,43.983362],[-88.936655,43.983362],[-89.166687,43.983362],[-89.599365,43.983362],[-89.599365,44.246255]]]}},
+{"type":"Feature","id":"55139","properties":{"name":"Winnebago"},"geometry":{"type":"Polygon","coordinates":[[[-88.471115,44.246255],[-88.405392,44.246255],[-88.405392,43.939546],[-88.887363,43.895731],[-88.887363,43.983362],[-88.887363,44.240778],[-88.739485,44.240778],[-88.471115,44.246255]]]}},
+{"type":"Feature","id":"55141","properties":{"name":"Wood"},"geometry":{"type":"Polygon","coordinates":[[[-90.207305,44.68441],[-89.845827,44.68441],[-89.725335,44.246255],[-89.818443,44.251732],[-89.900597,44.251732],[-90.081336,44.246255],[-90.311367,44.246255],[-90.316844,44.426994],[-90.316844,44.68441],[-90.207305,44.68441]]]}},
+{"type":"Feature","id":"56001","properties":{"name":"Albany"},"geometry":{"type":"Polygon","coordinates":[[[-106.074002,42.433388],[-105.285322,42.433388],[-105.279845,41.655662],[-105.279845,40.998429],[-106.189017,40.998429],[-106.320464,40.998429],[-106.068525,41.392769],[-106.074002,42.433388]]]}},
+{"type":"Feature","id":"56003","properties":{"name":"Big Horn"},"geometry":{"type":"Polygon","coordinates":[[[-107.914254,45.002073],[-107.372036,44.55844],[-107.147482,44.164101],[-108.549579,44.169578],[-108.620779,45.002073],[-108.248347,45.002073],[-107.914254,45.002073]]]}},
+{"type":"Feature","id":"56005","properties":{"name":"Campbell"},"geometry":{"type":"Polygon","coordinates":[[[-106.024709,44.991119],[-105.088152,45.002073],[-105.077198,44.175055],[-105.077198,43.495914],[-106.019232,43.495914],[-106.008278,44.563917],[-106.024709,44.991119]]]}},
+{"type":"Feature","id":"56007","properties":{"name":"Carbon"},"geometry":{"type":"Polygon","coordinates":[[[-107.037943,42.433388],[-106.074002,42.433388],[-106.074002,42.433388],[-106.068525,41.392769],[-106.320464,40.998429],[-106.857204,41.003906],[-107.317267,41.003906],[-107.919731,41.003906],[-107.930684,41.661139],[-107.50896,41.655662],[-107.525391,42.263602],[-107.525391,42.433388],[-107.037943,42.433388]]]}},
+{"type":"Feature","id":"56009","properties":{"name":"Converse"},"geometry":{"type":"Polygon","coordinates":[[[-104.901936,43.501391],[-104.890983,42.60865],[-105.285322,42.433388],[-106.074002,42.433388],[-106.074002,42.433388],[-106.079479,43.495914],[-106.019232,43.495914],[-105.077198,43.495914],[-104.901936,43.501391]]]}},
+{"type":"Feature","id":"56011","properties":{"name":"Crook"},"geometry":{"type":"Polygon","coordinates":[[[-105.088152,45.002073],[-105.03886,45.002073],[-104.058488,44.996596],[-104.058488,44.569394],[-104.053011,44.180532],[-104.392581,44.180532],[-105.077198,44.175055],[-105.088152,45.002073]]]}},
+{"type":"Feature","id":"56013","properties":{"name":"Fremont"},"geometry":{"type":"Polygon","coordinates":[[[-110.055737,44.010746],[-109.310873,43.813577],[-108.335978,43.457575],[-107.596591,43.501391],[-107.536345,43.501391],[-107.525391,42.433388],[-107.525391,42.263602],[-109.042503,42.263602],[-109.075365,42.690804],[-110.05026,43.463052],[-110.055737,44.010746]]]}},
+{"type":"Feature","id":"56015","properties":{"name":"Goshen"},"geometry":{"type":"Polygon","coordinates":[[[-104.053011,42.614127],[-104.053011,42.000709],[-104.053011,41.699478],[-104.053011,41.562554],[-104.655474,41.655662],[-104.655474,42.60865],[-104.053011,42.614127]]]}},
+{"type":"Feature","id":"56017","properties":{"name":"Hot Springs"},"geometry":{"type":"Polygon","coordinates":[[[-108.527671,44.081947],[-107.596591,43.501391],[-108.335978,43.457575],[-109.310873,43.813577],[-108.549579,44.081947],[-108.527671,44.081947]]]}},
+{"type":"Feature","id":"56019","properties":{"name":"Johnson"},"geometry":{"type":"Polygon","coordinates":[[[-106.008278,44.563917],[-106.019232,43.495914],[-106.079479,43.495914],[-107.109143,43.501391],[-107.147482,44.164101],[-107.372036,44.55844],[-106.008278,44.563917]]]}},
+{"type":"Feature","id":"56021","properties":{"name":"Laramie"},"geometry":{"type":"Polygon","coordinates":[[[-105.279845,41.655662],[-104.655474,41.655662],[-104.053011,41.562554],[-104.053011,41.392769],[-104.053011,41.003906],[-104.945752,40.998429],[-105.279845,40.998429],[-105.279845,41.655662]]]}},
+{"type":"Feature","id":"56023","properties":{"name":"Lincoln"},"geometry":{"type":"Polygon","coordinates":[[[-111.047063,43.315175],[-110.576047,43.233021],[-110.543185,42.280033],[-110.055737,42.269079],[-110.05026,41.578985],[-111.047063,41.578985],[-111.047063,42.000709],[-111.047063,42.515542],[-111.041587,43.01942],[-111.047063,43.315175]]]}},
+{"type":"Feature","id":"56025","properties":{"name":"Natrona"},"geometry":{"type":"Polygon","coordinates":[[[-107.536345,43.501391],[-107.109143,43.501391],[-106.079479,43.495914],[-106.074002,42.433388],[-107.037943,42.433388],[-107.525391,42.433388],[-107.536345,43.501391]]]}},
+{"type":"Feature","id":"56027","properties":{"name":"Niobrara"},"geometry":{"type":"Polygon","coordinates":[[[-104.053011,43.501391],[-104.053011,43.479483],[-104.053011,43.002989],[-104.053011,42.614127],[-104.655474,42.60865],[-104.890983,42.60865],[-104.901936,43.501391],[-104.053011,43.501391]]]}},
+{"type":"Feature","id":"56029","properties":{"name":"Park"},"geometry":{"type":"Polygon","coordinates":[[[-109.798321,45.002073],[-108.620779,45.002073],[-108.549579,44.169578],[-108.549579,44.081947],[-109.310873,43.813577],[-110.055737,44.010746],[-110.3734,44.580348],[-111.058017,44.667979],[-111.041587,45.002073],[-109.798321,45.002073]]]}},
+{"type":"Feature","id":"56031","properties":{"name":"Platte"},"geometry":{"type":"Polygon","coordinates":[[[-104.655474,42.60865],[-104.655474,41.655662],[-105.279845,41.655662],[-105.285322,42.433388],[-104.890983,42.60865],[-104.655474,42.60865]]]}},
+{"type":"Feature","id":"56033","properties":{"name":"Sheridan"},"geometry":{"type":"Polygon","coordinates":[[[-107.914254,45.002073],[-106.265695,44.991119],[-106.024709,44.991119],[-106.008278,44.563917],[-107.372036,44.55844],[-107.914254,45.002073]]]}},
+{"type":"Feature","id":"56035","properties":{"name":"Sublette"},"geometry":{"type":"Polygon","coordinates":[[[-110.05026,43.463052],[-109.075365,42.690804],[-109.042503,42.263602],[-110.055737,42.269079],[-110.543185,42.280033],[-110.576047,43.233021],[-110.05026,43.463052]]]}},
+{"type":"Feature","id":"56037","properties":{"name":"Sweetwater"},"geometry":{"type":"Polygon","coordinates":[[[-110.055737,42.269079],[-109.042503,42.263602],[-107.525391,42.263602],[-107.50896,41.655662],[-107.930684,41.661139],[-107.919731,41.003906],[-109.04798,40.998429],[-109.677828,40.998429],[-110.000968,40.998429],[-110.05026,40.998429],[-110.05026,41.578985],[-110.055737,42.269079]]]}},
+{"type":"Feature","id":"56039","properties":{"name":"Teton"},"geometry":{"type":"Polygon","coordinates":[[[-111.058017,44.667979],[-110.3734,44.580348],[-110.055737,44.010746],[-110.05026,43.463052],[-110.576047,43.233021],[-111.047063,43.315175],[-111.047063,43.501391],[-111.047063,43.983362],[-111.047063,44.476286],[-111.058017,44.667979]]]}},
+{"type":"Feature","id":"56041","properties":{"name":"Uinta"},"geometry":{"type":"Polygon","coordinates":[[[-111.047063,41.578985],[-110.05026,41.578985],[-110.05026,40.998429],[-111.047063,40.998429],[-111.047063,41.250368],[-111.047063,41.578985]]]}},
+{"type":"Feature","id":"56043","properties":{"name":"Washakie"},"geometry":{"type":"Polygon","coordinates":[[[-107.147482,44.164101],[-107.109143,43.501391],[-107.536345,43.501391],[-107.596591,43.501391],[-108.527671,44.081947],[-108.549579,44.081947],[-108.549579,44.169578],[-107.147482,44.164101]]]}},
+{"type":"Feature","id":"56045","properties":{"name":"Weston"},"geometry":{"type":"Polygon","coordinates":[[[-104.392581,44.180532],[-104.053011,44.180532],[-104.053011,44.142193],[-104.053011,43.851915],[-104.053011,43.501391],[-104.901936,43.501391],[-105.077198,43.495914],[-105.077198,44.175055],[-104.392581,44.180532]]]}},
+{"type":"Feature","id":"72001","properties":{"name":"Adjuntas"},"geometry":{"type":"Polygon","coordinates":[[[-66.722185,18.219834],[-66.672893,18.154111],[-66.6948,18.132203],[-66.716708,18.132203],[-66.771478,18.13768],[-66.798862,18.132203],[-66.826247,18.170542],[-66.815293,18.230788],[-66.722185,18.219834]]]}},
+{"type":"Feature","id":"72003","properties":{"name":"Aguada"},"geometry":{"type":"Polygon","coordinates":[[[-67.16034,18.417004],[-67.132956,18.389619],[-67.127479,18.318419],[-67.182248,18.312942],[-67.237017,18.373189],[-67.16034,18.417004]]]}},
+{"type":"Feature","id":"72005","properties":{"name":"Aguadilla"},"geometry":{"type":"Polygon","coordinates":[[[-67.105571,18.515589],[-67.056278,18.46082],[-67.132956,18.389619],[-67.16034,18.417004],[-67.105571,18.515589],[-67.105571,18.515589]]]}},
+{"type":"Feature","id":"72007","properties":{"name":"Aguas Buenas"},"geometry":{"type":"Polygon","coordinates":[[[-66.064952,18.301988],[-66.119722,18.20888],[-66.147106,18.230788],[-66.169014,18.225311],[-66.190922,18.258173],[-66.141629,18.280081],[-66.081383,18.296511],[-66.064952,18.301988]]]}},
+{"type":"Feature","id":"72009","properties":{"name":"Aibonito"},"geometry":{"type":"Polygon","coordinates":[[[-66.278553,18.176019],[-66.240214,18.181496],[-66.218307,18.143157],[-66.223784,18.093865],[-66.256645,18.077434],[-66.316892,18.154111],[-66.278553,18.176019]]]}},
+{"type":"Feature","id":"72011","properties":{"name":"Añasco"},"geometry":{"type":"Polygon","coordinates":[[[-67.122002,18.323896],[-67.050802,18.307465],[-67.039848,18.291034],[-67.083663,18.252696],[-67.16034,18.274604],[-67.187725,18.269127],[-67.226064,18.296511],[-67.182248,18.312942],[-67.127479,18.318419],[-67.122002,18.323896]]]}},
+{"type":"Feature","id":"72013","properties":{"name":"Arecibo"},"geometry":{"type":"Polygon","coordinates":[[[-66.585262,18.482727],[-66.585262,18.482727],[-66.590739,18.389619],[-66.590739,18.340327],[-66.607169,18.329373],[-66.711231,18.312942],[-66.771478,18.323896],[-66.766001,18.482727],[-66.585262,18.482727]]]}},
+{"type":"Feature","id":"72015","properties":{"name":"Arroyo"},"geometry":{"type":"Polygon","coordinates":[[[-66.059475,18.039095],[-66.021137,17.978849],[-66.070429,17.967895],[-66.081383,18.033618],[-66.059475,18.039095]]]}},
+{"type":"Feature","id":"72017","properties":{"name":"Barceloneta"},"geometry":{"type":"Polygon","coordinates":[[[-66.585262,18.482727],[-66.585262,18.482727],[-66.535969,18.482727],[-66.541446,18.40605],[-66.590739,18.389619],[-66.585262,18.482727]]]}},
+{"type":"Feature","id":"72019","properties":{"name":"Barranquitas"},"geometry":{"type":"Polygon","coordinates":[[[-66.311415,18.247219],[-66.267599,18.247219],[-66.240214,18.186973],[-66.240214,18.181496],[-66.278553,18.176019],[-66.316892,18.154111],[-66.371661,18.176019],[-66.349753,18.241742],[-66.311415,18.247219]]]}},
+{"type":"Feature","id":"72021","properties":{"name":"Bayamón"},"geometry":{"type":"Polygon","coordinates":[[[-66.169014,18.433435],[-66.130676,18.422481],[-66.141629,18.280081],[-66.190922,18.258173],[-66.207353,18.274604],[-66.207353,18.318419],[-66.196399,18.389619],[-66.169014,18.433435]]]}},
+{"type":"Feature","id":"72023","properties":{"name":"Cabo Rojo"},"geometry":{"type":"Polygon","coordinates":[[[-67.182248,18.170542],[-67.16034,18.154111],[-67.100094,18.104819],[-67.111048,18.055526],[-67.111048,17.945987],[-67.182248,18.170542]]]}},
+{"type":"Feature","id":"72025","properties":{"name":"Caguas"},"geometry":{"type":"Polygon","coordinates":[[[-66.021137,18.307465],[-65.999229,18.20888],[-66.053998,18.115772],[-66.097814,18.170542],[-66.119722,18.20888],[-66.064952,18.301988],[-66.043044,18.312942],[-66.021137,18.307465]]]}},
+{"type":"Feature","id":"72027","properties":{"name":"Camuy"},"geometry":{"type":"Polygon","coordinates":[[[-66.837201,18.488204],[-66.826247,18.340327],[-66.89197,18.367712],[-66.897447,18.367712],[-66.902924,18.482727],[-66.837201,18.488204]]]}},
+{"type":"Feature","id":"72029","properties":{"name":"Canóvanas"},"geometry":{"type":"Polygon","coordinates":[[[-65.911598,18.400573],[-65.867782,18.378666],[-65.834921,18.274604],[-65.851352,18.252696],[-65.917075,18.269127],[-65.917075,18.400573],[-65.911598,18.400573]]]}},
+{"type":"Feature","id":"72031","properties":{"name":"Carolina"},"geometry":{"type":"Polygon","coordinates":[[[-65.993752,18.46082],[-65.917075,18.400573],[-65.917075,18.269127],[-65.94446,18.291034],[-65.999229,18.378666],[-66.037568,18.449866],[-65.993752,18.46082]]]}},
+{"type":"Feature","id":"72033","properties":{"name":"Cataño"},"geometry":{"type":"Polygon","coordinates":[[[-66.125199,18.46082],[-66.108768,18.438912],[-66.130676,18.422481],[-66.130676,18.422481],[-66.169014,18.433435],[-66.141629,18.46082],[-66.125199,18.46082]]]}},
+{"type":"Feature","id":"72035","properties":{"name":"Cayey"},"geometry":{"type":"Polygon","coordinates":[[[-66.097814,18.159588],[-66.097814,18.170542],[-66.053998,18.115772],[-66.053998,18.110295],[-66.053998,18.104819],[-66.075906,18.104819],[-66.163537,18.050049],[-66.223784,18.093865],[-66.218307,18.143157],[-66.097814,18.159588]]]}},
+{"type":"Feature","id":"72037","properties":{"name":"Ceiba"},"geometry":{"type":"Polygon","coordinates":[[[-65.752767,18.296511],[-65.632274,18.285558],[-65.659659,18.20888],[-65.769197,18.280081],[-65.758244,18.291034],[-65.752767,18.296511]]]}},
+{"type":"Feature","id":"72039","properties":{"name":"Ciales"},"geometry":{"type":"Polygon","coordinates":[[[-66.475723,18.367712],[-66.464769,18.373189],[-66.453815,18.258173],[-66.541446,18.165065],[-66.568831,18.296511],[-66.607169,18.329373],[-66.590739,18.340327],[-66.535969,18.351281],[-66.475723,18.367712]]]}},
+{"type":"Feature","id":"72041","properties":{"name":"Cidra"},"geometry":{"type":"Polygon","coordinates":[[[-66.147106,18.230788],[-66.119722,18.20888],[-66.097814,18.170542],[-66.097814,18.159588],[-66.218307,18.143157],[-66.240214,18.181496],[-66.240214,18.186973],[-66.169014,18.225311],[-66.147106,18.230788]]]}},
+{"type":"Feature","id":"72043","properties":{"name":"Coamo"},"geometry":{"type":"Polygon","coordinates":[[[-66.371661,18.176019],[-66.316892,18.154111],[-66.256645,18.077434],[-66.333322,18.017187],[-66.382615,18.039095],[-66.42643,18.044572],[-66.431907,18.082911],[-66.442861,18.176019],[-66.371661,18.176019]]]}},
+{"type":"Feature","id":"72045","properties":{"name":"Comerío"},"geometry":{"type":"Polygon","coordinates":[[[-66.207353,18.274604],[-66.190922,18.258173],[-66.169014,18.225311],[-66.240214,18.186973],[-66.267599,18.247219],[-66.207353,18.274604]]]}},
+{"type":"Feature","id":"72047","properties":{"name":"Corozal"},"geometry":{"type":"Polygon","coordinates":[[[-66.305938,18.367712],[-66.278553,18.329373],[-66.311415,18.247219],[-66.349753,18.241742],[-66.377138,18.296511],[-66.366184,18.33485],[-66.316892,18.367712],[-66.305938,18.367712]]]}},
+{"type":"Feature","id":"72051","properties":{"name":"Dorado"},"geometry":{"type":"Polygon","coordinates":[[[-66.196399,18.466297],[-66.251168,18.395096],[-66.305938,18.384142],[-66.316892,18.47725],[-66.196399,18.466297]]]}},
+{"type":"Feature","id":"72053","properties":{"name":"Fajardo"},"geometry":{"type":"Polygon","coordinates":[[[-65.632274,18.285558],[-65.752767,18.296511],[-65.670613,18.362235],[-65.632274,18.285558]]]}},
+{"type":"Feature","id":"72054","properties":{"name":"Florida"},"geometry":{"type":"Polygon","coordinates":[[[-66.541446,18.400573],[-66.535969,18.351281],[-66.590739,18.340327],[-66.590739,18.389619],[-66.541446,18.40605],[-66.541446,18.400573]]]}},
+{"type":"Feature","id":"72055","properties":{"name":"Guánica"},"geometry":{"type":"Polygon","coordinates":[[[-66.957694,18.033618],[-66.886493,18.022664],[-66.859109,17.956941],[-66.979601,17.951464],[-66.957694,18.033618]]]}},
+{"type":"Feature","id":"72057","properties":{"name":"Guayama"},"geometry":{"type":"Polygon","coordinates":[[[-66.075906,18.104819],[-66.053998,18.104819],[-66.081383,18.033618],[-66.070429,17.967895],[-66.207353,17.962418],[-66.163537,18.050049],[-66.075906,18.104819]]]}},
+{"type":"Feature","id":"72059","properties":{"name":"Guayanilla"},"geometry":{"type":"Polygon","coordinates":[[[-66.798862,18.132203],[-66.771478,18.13768],[-66.755047,18.000757],[-66.853632,17.956941],[-66.798862,18.132203]]]}},
+{"type":"Feature","id":"72061","properties":{"name":"Guaynabo"},"geometry":{"type":"Polygon","coordinates":[[[-66.130676,18.422481],[-66.108768,18.438912],[-66.081383,18.296511],[-66.141629,18.280081],[-66.130676,18.422481],[-66.130676,18.422481]]]}},
+{"type":"Feature","id":"72063","properties":{"name":"Gurabo"},"geometry":{"type":"Polygon","coordinates":[[[-65.982798,18.312942],[-65.94446,18.291034],[-65.917075,18.269127],[-65.949936,18.230788],[-65.966367,18.230788],[-65.999229,18.20888],[-66.021137,18.307465],[-65.982798,18.312942]]]}},
+{"type":"Feature","id":"72065","properties":{"name":"Hatillo"},"geometry":{"type":"Polygon","coordinates":[[[-66.766001,18.482727],[-66.771478,18.323896],[-66.826247,18.323896],[-66.826247,18.340327],[-66.837201,18.488204],[-66.766001,18.482727]]]}},
+{"type":"Feature","id":"72067","properties":{"name":"Hormigueros"},"geometry":{"type":"Polygon","coordinates":[[[-67.116525,18.159588],[-67.083663,18.148634],[-67.100094,18.104819],[-67.16034,18.154111],[-67.116525,18.159588]]]}},
+{"type":"Feature","id":"72069","properties":{"name":"Humacao"},"geometry":{"type":"Polygon","coordinates":[[[-65.823967,18.197926],[-65.741813,18.176019],[-65.796582,18.071957],[-65.878736,18.115772],[-65.823967,18.197926]]]}},
+{"type":"Feature","id":"72071","properties":{"name":"Isabela"},"geometry":{"type":"Polygon","coordinates":[[[-67.105571,18.515589],[-67.105571,18.515589],[-66.957694,18.488204],[-66.919355,18.395096],[-67.012463,18.395096],[-67.028894,18.395096],[-67.056278,18.46082],[-67.105571,18.515589]]]}},
+{"type":"Feature","id":"72073","properties":{"name":"Jayuya"},"geometry":{"type":"Polygon","coordinates":[[[-66.568831,18.296511],[-66.541446,18.165065],[-66.546923,18.154111],[-66.5524,18.154111],[-66.650985,18.159588],[-66.568831,18.296511]]]}},
+{"type":"Feature","id":"72075","properties":{"name":"Juana Díaz"},"geometry":{"type":"Polygon","coordinates":[[[-66.546923,18.154111],[-66.519538,18.154111],[-66.431907,18.082911],[-66.42643,18.044572],[-66.448338,17.984326],[-66.535969,17.978849],[-66.5524,18.154111],[-66.546923,18.154111]]]}},
+{"type":"Feature","id":"72077","properties":{"name":"Juncos"},"geometry":{"type":"Polygon","coordinates":[[[-65.917075,18.269127],[-65.851352,18.252696],[-65.928029,18.143157],[-65.949936,18.230788],[-65.917075,18.269127]]]}},
+{"type":"Feature","id":"72079","properties":{"name":"Lajas"},"geometry":{"type":"Polygon","coordinates":[[[-67.067232,18.06648],[-66.985078,18.050049],[-66.957694,18.033618],[-66.979601,17.951464],[-67.111048,17.945987],[-67.111048,18.055526],[-67.067232,18.06648]]]}},
+{"type":"Feature","id":"72081","properties":{"name":"Lares"},"geometry":{"type":"Polygon","coordinates":[[[-66.89197,18.367712],[-66.826247,18.340327],[-66.826247,18.323896],[-66.815293,18.230788],[-66.826247,18.170542],[-66.837201,18.170542],[-66.897447,18.186973],[-66.908401,18.252696],[-66.89197,18.367712]]]}},
+{"type":"Feature","id":"72083","properties":{"name":"Las Marías"},"geometry":{"type":"Polygon","coordinates":[[[-67.039848,18.291034],[-66.908401,18.252696],[-66.897447,18.186973],[-66.913878,18.19245],[-67.01794,18.197926],[-67.083663,18.252696],[-67.039848,18.291034]]]}},
+{"type":"Feature","id":"72085","properties":{"name":"Las Piedras"},"geometry":{"type":"Polygon","coordinates":[[[-65.823967,18.274604],[-65.823967,18.197926],[-65.878736,18.115772],[-65.906121,18.126726],[-65.928029,18.121249],[-65.928029,18.143157],[-65.851352,18.252696],[-65.834921,18.274604],[-65.823967,18.274604]]]}},
+{"type":"Feature","id":"72087","properties":{"name":"Loíza"},"geometry":{"type":"Polygon","coordinates":[[[-65.829444,18.422481],[-65.867782,18.378666],[-65.911598,18.400573],[-65.917075,18.400573],[-65.993752,18.46082],[-65.829444,18.422481]]]}},
+{"type":"Feature","id":"72089","properties":{"name":"Luquillo"},"geometry":{"type":"Polygon","coordinates":[[[-65.758244,18.291034],[-65.752767,18.384142],[-65.670613,18.362235],[-65.752767,18.296511],[-65.758244,18.291034]]]}},
+{"type":"Feature","id":"72091","properties":{"name":"Manatí"},"geometry":{"type":"Polygon","coordinates":[[[-66.437384,18.482727],[-66.442861,18.373189],[-66.464769,18.373189],[-66.475723,18.367712],[-66.535969,18.351281],[-66.541446,18.400573],[-66.541446,18.40605],[-66.535969,18.482727],[-66.437384,18.488204],[-66.437384,18.482727]]]}},
+{"type":"Feature","id":"72093","properties":{"name":"Maricao"},"geometry":{"type":"Polygon","coordinates":[[[-66.913878,18.19245],[-66.897447,18.186973],[-66.837201,18.170542],[-66.924832,18.148634],[-66.979601,18.143157],[-67.050802,18.176019],[-67.01794,18.197926],[-66.913878,18.19245]]]}},
+{"type":"Feature","id":"72095","properties":{"name":"Maunabo"},"geometry":{"type":"Polygon","coordinates":[[[-65.988275,18.061003],[-65.851352,18.011711],[-65.911598,17.984326],[-65.988275,18.061003]]]}},
+{"type":"Feature","id":"72097","properties":{"name":"Mayagüez"},"geometry":{"type":"Polygon","coordinates":[[[-67.16034,18.274604],[-67.083663,18.252696],[-67.01794,18.197926],[-67.050802,18.176019],[-67.083663,18.148634],[-67.116525,18.159588],[-67.16034,18.154111],[-67.182248,18.170542],[-67.187725,18.269127],[-67.16034,18.274604]]]}},
+{"type":"Feature","id":"72099","properties":{"name":"Moca"},"geometry":{"type":"Polygon","coordinates":[[[-67.056278,18.46082],[-67.028894,18.395096],[-67.050802,18.307465],[-67.122002,18.323896],[-67.127479,18.318419],[-67.132956,18.389619],[-67.056278,18.46082]]]}},
+{"type":"Feature","id":"72101","properties":{"name":"Morovis"},"geometry":{"type":"Polygon","coordinates":[[[-66.442861,18.373189],[-66.377138,18.345804],[-66.366184,18.33485],[-66.377138,18.296511],[-66.453815,18.258173],[-66.464769,18.373189],[-66.442861,18.373189]]]}},
+{"type":"Feature","id":"72103","properties":{"name":"Naguabo"},"geometry":{"type":"Polygon","coordinates":[[[-65.823967,18.274604],[-65.769197,18.280081],[-65.659659,18.20888],[-65.741813,18.176019],[-65.823967,18.197926],[-65.823967,18.274604]]]}},
+{"type":"Feature","id":"72105","properties":{"name":"Naranjito"},"geometry":{"type":"Polygon","coordinates":[[[-66.256645,18.329373],[-66.207353,18.318419],[-66.207353,18.274604],[-66.267599,18.247219],[-66.311415,18.247219],[-66.278553,18.329373],[-66.256645,18.329373]]]}},
+{"type":"Feature","id":"72107","properties":{"name":"Orocovis"},"geometry":{"type":"Polygon","coordinates":[[[-66.377138,18.296511],[-66.349753,18.241742],[-66.371661,18.176019],[-66.442861,18.176019],[-66.453815,18.176019],[-66.519538,18.154111],[-66.546923,18.154111],[-66.541446,18.165065],[-66.453815,18.258173],[-66.377138,18.296511]]]}},
+{"type":"Feature","id":"72109","properties":{"name":"Patillas"},"geometry":{"type":"Polygon","coordinates":[[[-66.053998,18.104819],[-66.053998,18.110295],[-66.010183,18.077434],[-65.988275,18.061003],[-65.911598,17.984326],[-66.021137,17.978849],[-66.059475,18.039095],[-66.081383,18.033618],[-66.053998,18.104819]]]}},
+{"type":"Feature","id":"72111","properties":{"name":"Peñuelas"},"geometry":{"type":"Polygon","coordinates":[[[-66.716708,18.132203],[-66.6948,18.132203],[-66.700277,17.978849],[-66.755047,18.000757],[-66.771478,18.13768],[-66.716708,18.132203]]]}},
+{"type":"Feature","id":"72113","properties":{"name":"Ponce"},"geometry":{"type":"Polygon","coordinates":[[[-66.650985,18.159588],[-66.5524,18.154111],[-66.535969,17.978849],[-66.700277,17.978849],[-66.6948,18.132203],[-66.672893,18.154111],[-66.650985,18.159588]]]}},
+{"type":"Feature","id":"72115","properties":{"name":"Quebradillas"},"geometry":{"type":"Polygon","coordinates":[[[-66.902924,18.482727],[-66.897447,18.367712],[-66.919355,18.395096],[-66.957694,18.488204],[-66.902924,18.482727]]]}},
+{"type":"Feature","id":"72117","properties":{"name":"Rincón"},"geometry":{"type":"Polygon","coordinates":[[[-67.237017,18.373189],[-67.182248,18.312942],[-67.226064,18.296511],[-67.237017,18.373189]]]}},
+{"type":"Feature","id":"72119","properties":{"name":"Río Grande"},"geometry":{"type":"Polygon","coordinates":[[[-65.752767,18.384142],[-65.758244,18.291034],[-65.769197,18.280081],[-65.823967,18.274604],[-65.834921,18.274604],[-65.867782,18.378666],[-65.829444,18.422481],[-65.752767,18.384142]]]}},
+{"type":"Feature","id":"72121","properties":{"name":"Sabana Grande"},"geometry":{"type":"Polygon","coordinates":[[[-66.924832,18.148634],[-66.886493,18.022664],[-66.957694,18.033618],[-66.985078,18.050049],[-66.979601,18.143157],[-66.924832,18.148634]]]}},
+{"type":"Feature","id":"72123","properties":{"name":"Salinas"},"geometry":{"type":"Polygon","coordinates":[[[-66.223784,18.093865],[-66.163537,18.050049],[-66.207353,17.962418],[-66.338799,17.978849],[-66.333322,18.017187],[-66.256645,18.077434],[-66.223784,18.093865]]]}},
+{"type":"Feature","id":"72125","properties":{"name":"San Germán"},"geometry":{"type":"Polygon","coordinates":[[[-67.050802,18.176019],[-66.979601,18.143157],[-66.985078,18.050049],[-67.067232,18.06648],[-67.111048,18.055526],[-67.100094,18.104819],[-67.083663,18.148634],[-67.050802,18.176019]]]}},
+{"type":"Feature","id":"72127","properties":{"name":"San Juan"},"geometry":{"type":"Polygon","coordinates":[[[-66.037568,18.449866],[-65.999229,18.378666],[-66.043044,18.312942],[-66.064952,18.301988],[-66.081383,18.296511],[-66.108768,18.438912],[-66.125199,18.46082],[-66.037568,18.449866]]]}},
+{"type":"Feature","id":"72129","properties":{"name":"San Lorenzo"},"geometry":{"type":"Polygon","coordinates":[[[-65.966367,18.230788],[-65.949936,18.230788],[-65.928029,18.143157],[-65.928029,18.121249],[-66.010183,18.077434],[-66.053998,18.110295],[-66.053998,18.115772],[-65.999229,18.20888],[-65.966367,18.230788]]]}},
+{"type":"Feature","id":"72131","properties":{"name":"San Sebastián"},"geometry":{"type":"Polygon","coordinates":[[[-67.012463,18.395096],[-66.919355,18.395096],[-66.897447,18.367712],[-66.89197,18.367712],[-66.908401,18.252696],[-67.039848,18.291034],[-67.050802,18.307465],[-67.028894,18.395096],[-67.012463,18.395096]]]}},
+{"type":"Feature","id":"72133","properties":{"name":"Santa Isabel"},"geometry":{"type":"Polygon","coordinates":[[[-66.382615,18.039095],[-66.333322,18.017187],[-66.338799,17.978849],[-66.448338,17.984326],[-66.42643,18.044572],[-66.382615,18.039095]]]}},
+{"type":"Feature","id":"72135","properties":{"name":"Toa Alta"},"geometry":{"type":"Polygon","coordinates":[[[-66.218307,18.395096],[-66.196399,18.389619],[-66.207353,18.318419],[-66.256645,18.329373],[-66.278553,18.329373],[-66.305938,18.367712],[-66.316892,18.367712],[-66.305938,18.384142],[-66.251168,18.395096],[-66.218307,18.395096]]]}},
+{"type":"Feature","id":"72137","properties":{"name":"Toa Baja"},"geometry":{"type":"Polygon","coordinates":[[[-66.141629,18.46082],[-66.169014,18.433435],[-66.196399,18.389619],[-66.218307,18.395096],[-66.251168,18.395096],[-66.196399,18.466297],[-66.141629,18.46082]]]}},
+{"type":"Feature","id":"72139","properties":{"name":"Trujillo Alto"},"geometry":{"type":"Polygon","coordinates":[[[-65.999229,18.378666],[-65.94446,18.291034],[-65.982798,18.312942],[-66.021137,18.307465],[-66.043044,18.312942],[-65.999229,18.378666]]]}},
+{"type":"Feature","id":"72141","properties":{"name":"Utuado"},"geometry":{"type":"Polygon","coordinates":[[[-66.711231,18.312942],[-66.607169,18.329373],[-66.568831,18.296511],[-66.650985,18.159588],[-66.672893,18.154111],[-66.722185,18.219834],[-66.815293,18.230788],[-66.826247,18.323896],[-66.771478,18.323896],[-66.711231,18.312942]]]}},
+{"type":"Feature","id":"72143","properties":{"name":"Vega Alta"},"geometry":{"type":"Polygon","coordinates":[[[-66.316892,18.47725],[-66.305938,18.384142],[-66.316892,18.367712],[-66.366184,18.33485],[-66.377138,18.345804],[-66.349753,18.488204],[-66.316892,18.47725]]]}},
+{"type":"Feature","id":"72145","properties":{"name":"Vega Baja"},"geometry":{"type":"Polygon","coordinates":[[[-66.349753,18.488204],[-66.377138,18.345804],[-66.442861,18.373189],[-66.437384,18.482727],[-66.437384,18.488204],[-66.349753,18.488204]]]}},
+{"type":"Feature","id":"72149","properties":{"name":"Villalba"},"geometry":{"type":"Polygon","coordinates":[[[-66.453815,18.176019],[-66.442861,18.176019],[-66.431907,18.082911],[-66.519538,18.154111],[-66.453815,18.176019]]]}},
+{"type":"Feature","id":"72151","properties":{"name":"Yabucoa"},"geometry":{"type":"Polygon","coordinates":[[[-65.906121,18.126726],[-65.878736,18.115772],[-65.796582,18.071957],[-65.851352,18.011711],[-65.988275,18.061003],[-66.010183,18.077434],[-65.928029,18.121249],[-65.906121,18.126726]]]}},
+{"type":"Feature","id":"72153","properties":{"name":"Yauco"},"geometry":{"type":"Polygon","coordinates":[[[-66.826247,18.170542],[-66.798862,18.132203],[-66.853632,17.956941],[-66.859109,17.956941],[-66.886493,18.022664],[-66.924832,18.148634],[-66.837201,18.170542],[-66.826247,18.170542]]]}}
+]}
diff --git a/static/demo/components/d3/test/dsv/csv-test.js b/static/demo/components/d3/test/dsv/csv-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..b258ce7457bb1dda0cfa9ae79e7f5285b3f9eea4
--- /dev/null
+++ b/static/demo/components/d3/test/dsv/csv-test.js
@@ -0,0 +1,152 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.csv");
+
+suite.addBatch({
+  "csv": {
+    topic: function() {
+      var cb = this.callback;
+      d3.csv("test/data/sample.csv", function(error, csv) {
+        cb(null, csv);
+      });
+    },
+    "invokes the callback with the parsed CSV": function(csv) {
+      assert.deepEqual(csv, [{"Hello":42,"World":"\"fish\""}]);
+    },
+    "overrides the mime type to text/csv": function(csv) {
+      assert.equal(XMLHttpRequest._last._info.mimeType, "text/csv");
+    },
+    "": {
+      topic: function() {
+        var cb = this.callback;
+        d3.csv("//does/not/exist.csv", function(error, csv) {
+          cb(null, csv);
+        });
+      },
+      "invokes the callback with undefined when an error occurs": function(csv) {
+        assert.isUndefined(csv);
+      }
+    }
+  },
+
+  "parse": {
+    topic: function() {
+      return d3.csv.parse;
+    },
+    "returns an array of objects": function(parse) {
+      assert.deepEqual(parse("a,b,c\n1,2,3\n"), [{a: "1", b: "2", c: "3"}]);
+    },
+    "does not strip whitespace": function(parse) {
+      assert.deepEqual(parse("a,b,c\n 1, 2,3\n"), [{a: " 1", b: " 2", c: "3"}]);
+    },
+    "parses quoted values": function(parse) {
+      assert.deepEqual(parse("a,b,c\n\"1\",2,3"), [{a: "1", b: "2", c: "3"}]);
+      assert.deepEqual(parse("a,b,c\n\"1\",2,3\n"), [{a: "1", b: "2", c: "3"}]);
+    },
+    "parses quoted values with quotes": function(parse) {
+      assert.deepEqual(parse("a\n\"\"\"hello\"\"\""), [{a: "\"hello\""}]);
+    },
+    "parses quoted values with newlines": function(parse) {
+      assert.deepEqual(parse("a\n\"new\nline\""), [{a: "new\nline"}]);
+      assert.deepEqual(parse("a\n\"new\rline\""), [{a: "new\rline"}]);
+      assert.deepEqual(parse("a\n\"new\r\nline\""), [{a: "new\r\nline"}]);
+    },
+    "parses unix newlines": function(parse) {
+      assert.deepEqual(parse("a,b,c\n1,2,3\n4,5,\"6\"\n7,8,9"), [
+        {a: "1", b: "2", c: "3"},
+        {a: "4", b: "5", c: "6"},
+        {a: "7", b: "8", c: "9"}
+      ]);
+    },
+    "parses mac newlines": function(parse) {
+      assert.deepEqual(parse("a,b,c\r1,2,3\r4,5,\"6\"\r7,8,9"), [
+        {a: "1", b: "2", c: "3"},
+        {a: "4", b: "5", c: "6"},
+        {a: "7", b: "8", c: "9"}
+      ]);
+    },
+    "parses dos newlines": function(parse) {
+      assert.deepEqual(parse("a,b,c\r\n1,2,3\r\n4,5,\"6\"\r\n7,8,9"), [
+        {a: "1", b: "2", c: "3"},
+        {a: "4", b: "5", c: "6"},
+        {a: "7", b: "8", c: "9"}
+      ]);
+    }
+  },
+  "parseRows": {
+    topic: function() {
+      return d3.csv.parseRows;
+    },
+    "returns an array of arrays": function(parse) {
+      assert.deepEqual(parse("a,b,c\n"), [["a", "b", "c"]]);
+    },
+    "parses quoted values": function(parse) {
+      assert.deepEqual(parse("\"1\",2,3\n"), [["1", "2", "3"]]);
+      assert.deepEqual(parse("\"hello\""), [["hello"]]);
+    },
+    "parses quoted values with quotes": function(parse) {
+      assert.deepEqual(parse("\"\"\"hello\"\"\""), [["\"hello\""]]);
+    },
+    "parses quoted values with newlines": function(parse) {
+      assert.deepEqual(parse("\"new\nline\""), [["new\nline"]]);
+      assert.deepEqual(parse("\"new\rline\""), [["new\rline"]]);
+      assert.deepEqual(parse("\"new\r\nline\""), [["new\r\nline"]]);
+    },
+    "parses unix newlines": function(parse) {
+      assert.deepEqual(parse("a,b,c\n1,2,3\n4,5,\"6\"\n7,8,9"), [
+        ["a", "b", "c"],
+        ["1", "2", "3"],
+        ["4", "5", "6"],
+        ["7", "8", "9"]
+      ]);
+    },
+    "parses mac newlines": function(parse) {
+      assert.deepEqual(parse("a,b,c\r1,2,3\r4,5,\"6\"\r7,8,9"), [
+        ["a", "b", "c"],
+        ["1", "2", "3"],
+        ["4", "5", "6"],
+        ["7", "8", "9"]
+      ]);
+    },
+    "parses dos newlines": function(parse) {
+      assert.deepEqual(parse("a,b,c\r\n1,2,3\r\n4,5,\"6\"\r\n7,8,9"), [
+        ["a", "b", "c"],
+        ["1", "2", "3"],
+        ["4", "5", "6"],
+        ["7", "8", "9"]
+      ]);
+    }
+  },
+
+  "format": {
+    topic: function() {
+      return d3.csv.format;
+    },
+    "takes an array of arrays as input": function(format) {
+      assert.equal(format([["a", "b", "c"], ["1", "2", "3"]]), "a,b,c\n1,2,3");
+    },
+    "separates lines using unix newline": function(format) {
+      assert.equal(format([[], []]), "\n");
+    },
+    "does not strip whitespace": function(format) {
+      assert.equal(format([["a ", " b", "c"], ["1", "2", "3 "]]), "a , b,c\n1,2,3 ");
+    },
+    "does not quote simple values": function(format) {
+      assert.equal(format([["a"], [1]]), "a\n1");
+    },
+    "escapes double quotes": function(format) {
+      assert.equal(format([["\"fish\""]]), "\"\"\"fish\"\"\"");
+    },
+    "escapes unix newlines": function(format) {
+      assert.equal(format([["new\nline"]]), "\"new\nline\"");
+    },
+    "escapes commas": function(format) {
+      assert.equal(format([["oxford,comma"]]), "\"oxford,comma\"");
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/dsv/tsv-test.js b/static/demo/components/d3/test/dsv/tsv-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..ea88691cb19917f7b4f92e0e50b929e52204baf1
--- /dev/null
+++ b/static/demo/components/d3/test/dsv/tsv-test.js
@@ -0,0 +1,155 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.tsv");
+
+suite.addBatch({
+  "tsv": {
+    topic: function() {
+      var cb = this.callback;
+      d3.tsv("test/data/sample.tsv", function(error, tsv) {
+        cb(null, tsv);
+      });
+    },
+    "invokes the callback with the parsed tsv": function(tsv) {
+      assert.deepEqual(tsv, [{"Hello":42,"World":"\"fish\""}]);
+    },
+    "overrides the mime type to text/tab-separated-values": function(tsv) {
+      assert.equal(XMLHttpRequest._last._info.mimeType, "text/tab-separated-values");
+    },
+    "": {
+      topic: function() {
+        var cb = this.callback;
+        d3.tsv("//does/not/exist.tsv", function(error, tsv) {
+          cb(null, tsv);
+        });
+      },
+      "invokes the callback with undefined when an error occurs": function(tsv) {
+        assert.isUndefined(tsv);
+      }
+    }
+  },
+
+  "parse": {
+    topic: function() {
+      return d3.tsv.parse;
+    },
+    "returns an array of objects": function(parse) {
+      assert.deepEqual(parse("a\tb\tc\n1\t2\t3\n"), [{a: "1", b: "2", c: "3"}]);
+    },
+    "does not strip whitespace": function(parse) {
+      assert.deepEqual(parse("a\tb\tc\n 1\t 2\t3\n"), [{a: " 1", b: " 2", c: "3"}]);
+    },
+    "parses quoted values": function(parse) {
+      assert.deepEqual(parse("a\tb\tc\n\"1\"\t2\t3"), [{a: "1", b: "2", c: "3"}]);
+      assert.deepEqual(parse("a\tb\tc\n\"1\"\t2\t3\n"), [{a: "1", b: "2", c: "3"}]);
+    },
+    "parses quoted values with quotes": function(parse) {
+      assert.deepEqual(parse("a\n\"\"\"hello\"\"\""), [{a: "\"hello\""}]);
+    },
+    "parses quoted values with newlines": function(parse) {
+      assert.deepEqual(parse("a\n\"new\nline\""), [{a: "new\nline"}]);
+      assert.deepEqual(parse("a\n\"new\rline\""), [{a: "new\rline"}]);
+      assert.deepEqual(parse("a\n\"new\r\nline\""), [{a: "new\r\nline"}]);
+    },
+    "parses unix newlines": function(parse) {
+      assert.deepEqual(parse("a\tb\tc\n1\t2\t3\n4\t5\t\"6\"\n7\t8\t9"), [
+        {a: "1", b: "2", c: "3"},
+        {a: "4", b: "5", c: "6"},
+        {a: "7", b: "8", c: "9"}
+      ]);
+    },
+    "parses mac newlines": function(parse) {
+      assert.deepEqual(parse("a\tb\tc\r1\t2\t3\r4\t5\t\"6\"\r7\t8\t9"), [
+        {a: "1", b: "2", c: "3"},
+        {a: "4", b: "5", c: "6"},
+        {a: "7", b: "8", c: "9"}
+      ]);
+    },
+    "parses dos newlines": function(parse) {
+      assert.deepEqual(parse("a\tb\tc\r\n1\t2\t3\r\n4\t5\t\"6\"\r\n7\t8\t9"), [
+        {a: "1", b: "2", c: "3"},
+        {a: "4", b: "5", c: "6"},
+        {a: "7", b: "8", c: "9"}
+      ]);
+    }
+  },
+  "parseRows": {
+    topic: function() {
+      return d3.tsv.parseRows;
+    },
+    "returns an array of arrays": function(parse) {
+      assert.deepEqual(parse("a\tb\tc\n"), [["a", "b", "c"]]);
+    },
+    "parses quoted values": function(parse) {
+      assert.deepEqual(parse("\"1\"\t2\t3\n"), [["1", "2", "3"]]);
+      assert.deepEqual(parse("\"hello\""), [["hello"]]);
+    },
+    "parses quoted values with quotes": function(parse) {
+      assert.deepEqual(parse("\"\"\"hello\"\"\""), [["\"hello\""]]);
+    },
+    "parses quoted values with newlines": function(parse) {
+      assert.deepEqual(parse("\"new\nline\""), [["new\nline"]]);
+      assert.deepEqual(parse("\"new\rline\""), [["new\rline"]]);
+      assert.deepEqual(parse("\"new\r\nline\""), [["new\r\nline"]]);
+    },
+    "parses unix newlines": function(parse) {
+      assert.deepEqual(parse("a\tb\tc\n1\t2\t3\n4\t5\t\"6\"\n7\t8\t9"), [
+        ["a", "b", "c"],
+        ["1", "2", "3"],
+        ["4", "5", "6"],
+        ["7", "8", "9"]
+      ]);
+    },
+    "parses mac newlines": function(parse) {
+      assert.deepEqual(parse("a\tb\tc\r1\t2\t3\r4\t5\t\"6\"\r7\t8\t9"), [
+        ["a", "b", "c"],
+        ["1", "2", "3"],
+        ["4", "5", "6"],
+        ["7", "8", "9"]
+      ]);
+    },
+    "parses dos newlines": function(parse) {
+      assert.deepEqual(parse("a\tb\tc\r\n1\t2\t3\r\n4\t5\t\"6\"\r\n7\t8\t9"), [
+        ["a", "b", "c"],
+        ["1", "2", "3"],
+        ["4", "5", "6"],
+        ["7", "8", "9"]
+      ]);
+    }
+  },
+
+  "format": {
+    topic: function() {
+      return d3.tsv.format;
+    },
+    "takes an array of arrays as input": function(format) {
+      assert.equal(format([["a", "b", "c"], ["1", "2", "3"]]), "a\tb\tc\n1\t2\t3");
+    },
+    "separates lines using unix newline": function(format) {
+      assert.equal(format([[], []]), "\n");
+    },
+    "does not strip whitespace": function(format) {
+      assert.equal(format([["a ", " b", "c"], ["1", "2", "3 "]]), "a \t b\tc\n1\t2\t3 ");
+    },
+    "does not quote simple values": function(format) {
+      assert.equal(format([["a"], [1]]), "a\n1");
+    },
+    "escapes double quotes": function(format) {
+      assert.equal(format([["\"fish\""]]), "\"\"\"fish\"\"\"");
+    },
+    "escapes unix newlines": function(format) {
+      assert.equal(format([["new\nline"]]), "\"new\nline\"");
+    },
+    "escapes tabs": function(format) {
+      assert.equal(format([["oxford\tcomma"]]), "\"oxford\tcomma\"");
+    },
+    "does not escape commas": function(format) {
+      assert.equal(format([["oxford,comma"]]), "oxford,comma");
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/env-assert.js b/static/demo/components/d3/test/env-assert.js
new file mode 100644
index 0000000000000000000000000000000000000000..3133fd78de4184f24fe4e71d003c83025e063193
--- /dev/null
+++ b/static/demo/components/d3/test/env-assert.js
@@ -0,0 +1,96 @@
+var assert = require("assert");
+
+assert.inDelta = function(actual, expected, delta, message) {
+  if (!inDelta(actual, expected, delta)) {
+    assert.fail(actual, expected, message || "expected {actual} to be in within *" + delta + "* of {expected}", null, assert.inDelta);
+  }
+};
+
+assert.domNull = function(actual, message) {
+  if (actual != null) {
+    assert.fail(actual+"", null, message || "expected null, got {actual}", "===", assert.domNull);
+  }
+};
+
+assert.domEqual = function(actual, expected, message) {
+  if (actual !== expected) {
+    assert.fail(actual+"", expected+"", message || "expected {expected}, got {actual}", "===", assert.domEqual);
+  }
+};
+
+assert.rgbEqual = function(actual, r, g, b, message) {
+  if (actual.r !== r || actual.g !== g || actual.b !== b) {
+    assert.fail("rgb(" + actual.r + "," + actual.g + "," + actual.b + ")", "rgb(" + r + ", " + g + ", " + b + ")", message || "expected {expected}, got {actual}", "===", assert.rgbEqual);
+  }
+};
+
+assert.hslEqual = function(actual, h, s, l, message) {
+  if (Math.abs(actual.h - h) > 1e-6 || Math.abs(actual.s - s) > 1e-6 || Math.abs(actual.l - l) > 1e-6) {
+    assert.fail("hsl(" + actual.h + "," + (actual.s * 100) + "%," + (actual.l * 100) + "%)", "hsl(" + h + "," + (s * 100) + "%," + (l * 100) + "%)", message || "expected {expected}, got {actual}", null, assert.hslEqual);
+  }
+};
+
+assert.pathEqual = function(actual, expected, message) {
+  if (!pathEqual(actual, expected)) {
+    assert.fail(formatPath(actual), formatPath(expected), message || "expected {expected}, got {actual}", null, assert.pathEqual);
+  }
+};
+
+function inDelta(actual, expected, delta) {
+  return (Array.isArray(expected) ? inDeltaArray : inDeltaNumber)(actual, expected, delta);
+}
+
+function inDeltaArray(actual, expected, delta) {
+  var n = expected.length, i = -1;
+  if (actual.length !== n) return false;
+  while (++i < n) if (!inDelta(actual[i], expected[i], delta)) return false;
+  return true;
+}
+
+function inDeltaNumber(actual, expected, delta) {
+  return actual >= expected - delta && actual <= expected + delta;
+}
+
+function pathEqual(a, b) {
+  a = parsePath(a);
+  b = parsePath(b);
+  var n = a.length, i = -1, x, y;
+  if (n !== b.length) return false;
+  while (++i < n) {
+    x = a[i];
+    y = b[i];
+    if (typeof x === "string") {
+      if (x !== y) return false;
+    } else if (typeof y !== "number") {
+      return false;
+    } else if (Math.abs(x - y) > 1e-6) {
+      return false;
+    }
+  }
+  return true;
+}
+
+var reNumber = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g;
+
+function parsePath(path) {
+  var parts = [];
+  reNumber.lastIndex = 0;
+  for (var i = 0, s0 = 0, s1, m; m = reNumber.exec(path); ++i) {
+    if (m.index) {
+      var part = path.substring(s0, s1 = m.index);
+      if (!/^[, ]$/.test(part)) parts.push(part);
+    }
+    parts.push(parseFloat(m[0]));
+    s0 = reNumber.lastIndex;
+  }
+  if (s0 < path.length) parts.push(path.substring(s0));
+  return parts;
+}
+
+function formatPath(path) {
+  return path.replace(reNumber, formatNumber);
+}
+
+function formatNumber(s) {
+  return Math.abs((s = +s) - Math.floor(s)) < 1e-6 ? Math.floor(s) : s.toFixed(6);
+}
diff --git a/static/demo/components/d3/test/env-fragment.js b/static/demo/components/d3/test/env-fragment.js
new file mode 100644
index 0000000000000000000000000000000000000000..eeec42b1bf9f8f788eb5bb4d1f0416d97c254cd5
--- /dev/null
+++ b/static/demo/components/d3/test/env-fragment.js
@@ -0,0 +1,8 @@
+var jsdom = require("jsdom");
+
+document.createRange = function() {
+  return {
+    selectNode: function() {},
+    createContextualFragment: function(html) { return jsdom.jsdom(html); }
+  };
+};
diff --git a/static/demo/components/d3/test/env-xhr.js b/static/demo/components/d3/test/env-xhr.js
new file mode 100644
index 0000000000000000000000000000000000000000..209c77861998c213d5183f796ba1e7375fabd4f1
--- /dev/null
+++ b/static/demo/components/d3/test/env-xhr.js
@@ -0,0 +1,55 @@
+var fs = require("fs");
+
+XMLHttpRequest = function() {
+  var self = this,
+      info = self._info = {},
+      headers = {},
+      url;
+
+  // TODO handle file system errors?
+
+  self.open = function(m, u, a) {
+    info.url = u;
+    info.async = a;
+    self.send = a ? read : readSync;
+  };
+
+  self.setRequestHeader = function(n, v) {
+    if (/^Accept$/i.test(n)) info.mimeType = v.split(/,/g)[0];
+  };
+
+  function read() {
+    fs.readFile(info.url, "binary", function(e, d) {
+      if (e) {
+        self.status = 404; // assumed
+      } else {
+        self.status = 200;
+        self.responseText = d;
+        self.responseXML = {_xml: d};
+        headers["Content-Length"] = d.length;
+      }
+      self.readyState = 4;
+      XMLHttpRequest._last = self;
+      if (self.onreadystatechange) self.onreadystatechange();
+    });
+  }
+
+  function readSync() {
+    try {
+      var d = fs.readFileSync(info.url, "binary");
+      self.status = 200;
+      self.responseText = d;
+      self.responseXML = {_xml: d};
+      headers["Content-Length"] = d.length;
+    } catch (e) {
+      self.status = 404; // assumed
+    }
+    self.readyState = 4;
+    XMLHttpRequest._last = self;
+    if (self.onreadystatechange) self.onreadystatechange();
+  }
+
+  self.getResponseHeader = function(n) {
+    return headers[n];
+  };
+};
diff --git a/static/demo/components/d3/test/env.js b/static/demo/components/d3/test/env.js
new file mode 100644
index 0000000000000000000000000000000000000000..1d1eb29c3080d939e97b07e2b984d46588da5df9
--- /dev/null
+++ b/static/demo/components/d3/test/env.js
@@ -0,0 +1,9 @@
+process.env.TZ = "America/Los_Angeles";
+
+require("../globals");
+
+require("./env-assert");
+require("./env-xhr");
+require("./env-fragment");
+
+require("../d3");
diff --git a/static/demo/components/d3/test/geo/albers-test.js b/static/demo/components/d3/test/geo/albers-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..1f0aafb944deed7c4acb854c3e9240d4ba61753c
--- /dev/null
+++ b/static/demo/components/d3/test/geo/albers-test.js
@@ -0,0 +1,55 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.albers");
+
+suite.addBatch({
+  "albers": {
+    topic: function() {
+      return d3.geo.albers();
+    },
+    "Arctic": function(albers) {
+      var coords = albers([0, 85]);
+      assert.inDelta(coords[0], 1031.393796, 1e-6);
+      assert.inDelta(coords[1], -714.160436, 1e-6);
+      var lonlat = albers.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    },
+    "Antarctic": function(albers) {
+      var coords = albers([0, -85]);
+      assert.inDelta(coords[0], 2753.458335, 1e-6);
+      assert.inDelta(coords[1],  317.371122, 1e-6);
+      var lonlat = albers.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], -85, 1e-6);
+    },
+    "Hawaii": function(albers) {
+      var coords = albers([-180, 0]);
+      assert.inDelta(coords[0], -984.779405, 1e-6);
+      assert.inDelta(coords[1],  209.571197, 1e-6);
+      var lonlat = albers.invert(coords);
+      assert.inDelta(lonlat[0], -180, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Phillipines": function(albers) {
+      var coords = albers([180, 0]);
+      assert.inDelta(coords[0],  -984.779405, 1e-6);
+      assert.inDelta(coords[1],   209.571197, 1e-6);
+      var lonlat = albers.invert(coords);
+      assert.inDelta(lonlat[0], -180, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Inversion works for non-zero translation": function() {
+      var albers = d3.geo.albers().translate([123, 99]).scale(100),
+          coords = albers([0, 85]),
+          lonlat = albers.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/area-benchmark.js b/static/demo/components/d3/test/geo/area-benchmark.js
new file mode 100644
index 0000000000000000000000000000000000000000..45e95487ce3c8a6f9ce324e55f7208b823663e95
--- /dev/null
+++ b/static/demo/components/d3/test/geo/area-benchmark.js
@@ -0,0 +1,12 @@
+require("../env");
+
+var formatNumber = d3.format(",.02r"),
+    o = d3.geo.circle().angle(30).precision(.1)(),
+    n = 1e3,
+    then = Date.now();
+
+for (var i = 0; i < n; i++) {
+  d3.geo.area(o);
+}
+
+console.log("circle.angle(30°): " + formatNumber((Date.now() - then) / i) + "ms/op.");
diff --git a/static/demo/components/d3/test/geo/area-test.js b/static/demo/components/d3/test/geo/area-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a5c2614732f44a97b3970a513aeda7f041a571f7
--- /dev/null
+++ b/static/demo/components/d3/test/geo/area-test.js
@@ -0,0 +1,175 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.area");
+
+var π = Math.PI;
+
+suite.addBatch({
+  "area": {
+    topic: function() {
+      return d3.geo.area;
+    },
+    "Point": function(area) {
+      assert.equal(area({type: "Point", coordinates: [0, 0]}), 0);
+    },
+    "MultiPoint": function(area) {
+      assert.equal(area({type: "MultiPoint", coordinates: [[0, 1], [2, 3]]}), 0);
+    },
+    "LineString": function(area) {
+      assert.equal(area({type: "LineString", coordinates: [[0, 1], [2, 3]]}), 0);
+    },
+    "MultiLineString": function(area) {
+      assert.equal(area({type: "MultiLineString", coordinates: [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]}), 0);
+    },
+    "Polygon": {
+      "tiny": function(area) {
+        assert.inDelta(area({type: "Polygon", coordinates: [[
+          [-64.66070178517852, 18.33986913231323],
+          [-64.66079715091509, 18.33994007490749],
+          [-64.66074946804680, 18.33994007490749],
+          [-64.66070178517852, 18.33986913231323]
+        ]]}), 4.890516e-13, 1e-13);
+      },
+      "semilune": function(area) {
+        assert.inDelta(area({type: "Polygon", coordinates: [[[0, 0], [0, 90], [90, 0], [0, 0]]]}), π / 2, 1e-6);
+      },
+      "lune": function(area) {
+        assert.equal(area({type: "Polygon", coordinates: [[[0, 0], [0, 90], [90, 0], [0, -90], [0, 0]]]}), π);
+      },
+      "hemispheres": {
+        "North": function(area) {
+          assert.inDelta(area({type: "Polygon", coordinates: [[[0, 0], [-90, 0], [180, 0], [90, 0], [0, 0]]]}), 2 * π, 1e-6);
+        },
+        "South": function(area) {
+          assert.inDelta(area({type: "Polygon", coordinates: [[[0, 0], [90, 0], [180, 0], [-90, 0], [0, 0]]]}), 2 * π, 1e-6);
+        },
+        "East": function(area) {
+          assert.equal(area({type: "Polygon", coordinates: [[[0, 0], [0, 90], [180, 0], [0, -90], [0, 0]]]}), 2 * π);
+        },
+        "West": function(area) {
+          assert.equal(area({type: "Polygon", coordinates: [[[0, 0], [0, -90], [180, 0], [0, 90], [0, 0]]]}), 2 * π);
+        }
+      },
+      "graticule outline": {
+        "sphere": function(area) {
+          assert.inDelta(area(d3.geo.graticule().extent([[-180, -90], [180, 90]]).outline()), 4 * π, 1e-5);
+        },
+        "hemisphere": function(area) {
+          assert.inDelta(area(d3.geo.graticule().extent([[-180, 0], [180, 90]]).outline()), 2 * π, 1e-5);
+        },
+        "semilune": function(area) {
+          assert.inDelta(area(d3.geo.graticule().extent([[0, 0], [90, 90]]).outline()), π / 2, 1e-5);
+        }
+      },
+      "circles": {
+        "hemisphere": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(90)()), 2 * π, 1e-5);
+        },
+        "60°": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(60).precision(.1)()), π, 1e-5);
+        },
+        "60° North": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(60).precision(.1).origin([0, 90])()), π, 1e-5);
+        },
+        "45°": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(45).precision(.1)()), π * (2 - Math.SQRT2), 1e-5);
+        },
+        "45° North": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(45).precision(.1).origin([0, 90])()), π * (2 - Math.SQRT2), 1e-5);
+        },
+        "45° South": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(45).precision(.1).origin([0, -90])()), π * (2 - Math.SQRT2), 1e-5);
+        },
+        "135°": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(135).precision(.1)()), π * (2 + Math.SQRT2), 1e-5);
+        },
+        "135° North": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(135).precision(.1).origin([0, 90])()), π * (2 + Math.SQRT2), 1e-5);
+        },
+        "135° South": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(135).precision(.1).origin([0, -90])()), π * (2 + Math.SQRT2), 1e-5);
+        },
+        "tiny": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(1e-6).precision(.1)()), 0, 1e-6);
+        },
+        "huge": function(area) {
+          assert.inDelta(area(d3.geo.circle().angle(180 - 1e-6).precision(.1)()), 4 * π, 1e-6);
+        },
+        "60° with 45° hole": function(area) {
+          var circle = d3.geo.circle().precision(.1);
+          assert.inDelta(area({
+            type: "Polygon",
+            coordinates: [
+              circle.angle(60)().coordinates[0],
+              circle.angle(45)().coordinates[0].reverse()
+            ]
+          }), π * (Math.SQRT2 - 1), 1e-5);
+        },
+        "45° holes at [0°, 0°] and [0°, 90°]": function(area) {
+          var circle = d3.geo.circle().precision(.1).angle(45);
+          assert.inDelta(area({
+            type: "Polygon",
+            coordinates: [
+              circle.origin([0, 0])().coordinates[0].reverse(),
+              circle.origin([0, 90])().coordinates[0].reverse()
+            ]
+          }), π * 2 * Math.SQRT2, 1e-5);
+        },
+        "45° holes at [0°, 90°] and [0°, 0°]": function(area) {
+          var circle = d3.geo.circle().precision(.1).angle(45);
+          assert.inDelta(area({
+            type: "Polygon",
+            coordinates: [
+              circle.origin([0, 90])().coordinates[0].reverse(),
+              circle.origin([0, 0])().coordinates[0].reverse()
+            ]
+          }), π * 2 * Math.SQRT2, 1e-5);
+        }
+      },
+      "stripes": {
+        "45°, -45°": function(area) {
+          assert.inDelta(area(stripes(45, -45)), π * 2 * Math.SQRT2, 1e-5);
+        },
+        "-45°, 45°": function(area) {
+          assert.inDelta(area(stripes(-45, 45)), π * 2 * (2 - Math.SQRT2), 1e-5);
+        },
+        "45°, 30°": function(area) {
+          assert.inDelta(area(stripes(45, 30)), π * (Math.SQRT2 - 1), 1e-5);
+        }
+      }
+    },
+    "MultiPolygon": {
+      "two hemispheres": function(area) {
+        assert.equal(area({type: "MultiPolygon", coordinates: [
+          [[[0, 0], [-90, 0], [180, 0], [90, 0], [0, 0]]],
+          [[[0, 0], [90, 0], [180, 0], [-90, 0], [0, 0]]]
+        ]}), 4 * π);
+      }
+    },
+    "Sphere": function(area) {
+      assert.equal(area({type: "Sphere"}), 4 * π);
+    },
+    "GeometryCollection": function(area) {
+      assert.equal(area({type: "GeometryCollection", geometries: [{type: "Sphere"}]}), 4 * π);
+    },
+    "FeatureCollection": function(area) {
+      assert.equal(area({type: "FeatureCollection", features: [{type: "Feature", geometry: {type: "Sphere"}}]}), 4 * π);
+    },
+    "Feature": function(area) {
+      assert.equal(area({type: "Feature", geometry: {type: "Sphere"}}), 4 * π);
+    }
+  }
+});
+
+suite.export(module);
+
+function stripes(a, b) {
+  return {type: "Polygon", coordinates: [a, b].map(function(d, i) {
+    var stripe = d3.range(-180, 180, .1).map(function(x) { return [x, d]; });
+    stripe.push(stripe[0]);
+    return i ? stripe.reverse() : stripe;
+  })};
+}
diff --git a/static/demo/components/d3/test/geo/azimuthal-equal-area-test.js b/static/demo/components/d3/test/geo/azimuthal-equal-area-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..9ddaed2529da2250cf5491e79a5108f97ee7ad70
--- /dev/null
+++ b/static/demo/components/d3/test/geo/azimuthal-equal-area-test.js
@@ -0,0 +1,57 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.azimuthalEqualArea");
+
+suite.addBatch({
+  "azimuthalEqualArea": {
+    topic: function() {
+      return d3.geo.azimuthalEqualArea().translate([0, 0]).scale(100);
+    },
+    "origin": function(projection) {
+      var coords = projection([0, 0]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Arctic": function(projection) {
+      var coords = projection([0, 85]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], -135.118041, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    },
+    "Antarctic": function(projection) {
+      var coords = projection([0, -90]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 141.421356, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 180, 1e-6);
+      assert.inDelta(lonlat[1], -90, 1e-6);
+    },
+    "Hawaii": function(projection) {
+      var coords = projection([-180, 0]);
+      assert.equal(coords[0], -Infinity);
+      assert.isTrue(isNaN(coords[1]));
+    },
+    "Phillipines": function(projection) {
+      var coords = projection([180, 0]);
+      assert.equal(coords[0], Infinity);
+      assert.isTrue(isNaN(coords[1]));
+    },
+    "Inversion works for non-zero translation": function() {
+      var projection = d3.geo.azimuthalEqualArea().translate([123, 99]).scale(100),
+          coords = projection([0, 85]),
+          lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/azimuthal-equidistant-test.js b/static/demo/components/d3/test/geo/azimuthal-equidistant-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..fe75beb5d438c7376602e9012afe0820de22649f
--- /dev/null
+++ b/static/demo/components/d3/test/geo/azimuthal-equidistant-test.js
@@ -0,0 +1,63 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.azimuthalEquidistant");
+
+suite.addBatch({
+  "azimuthalEquidistant": {
+    topic: function() {
+      return d3.geo.azimuthalEquidistant().translate([0, 0]).scale(100);
+    },
+    "origin": function(projection) {
+      var coords = projection([0, 0]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Arctic": function(projection) {
+      var coords = projection([0, 85]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], -148.352986, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    },
+    "Antarctic": function(projection) {
+      var coords = projection([0, -90]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 157.079632, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], -90, 1e-6);
+    },
+    "Hawaii": function(projection) {
+      var coords = projection([-180, 0]);
+      assert.inDelta(coords[0], -314.159265, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], -180, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Phillipines": function(projection) {
+      var coords = projection([180, 0]);
+      assert.inDelta(coords[0], 314.159265, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 180, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Inversion works for non-zero translation": function() {
+      var projection = d3.geo.azimuthalEquidistant().translate([123, 99]).scale(100),
+          coords = projection([0, 85]),
+          lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/benchmark.js b/static/demo/components/d3/test/geo/benchmark.js
new file mode 100644
index 0000000000000000000000000000000000000000..2442e34aee368d81331f41cd979487c20ef4c056
--- /dev/null
+++ b/static/demo/components/d3/test/geo/benchmark.js
@@ -0,0 +1,64 @@
+require("../env");
+
+var fs = require("fs");
+
+var formatNumber = d3.format(",.02r"),
+    projection = d3.geo.stereographic().clipAngle(150),
+    path = d3.geo.path().projection(projection),
+    graticule = d3.geo.graticule().step([1, 1]),
+    circle = d3.geo.circle().angle(30),
+    n = 10,
+    o,
+    then;
+
+o = JSON.parse(fs.readFileSync("./test/data/us-counties.json"));
+then = Date.now();
+
+for (var i = 0, k = 0; i < n; i++, k++) {
+  path(o);
+}
+
+console.log("U.S. counties: " + formatNumber((Date.now() - then) / k) + "ms/op.");
+
+o = graticule();
+then = Date.now();
+
+for (var i = 0, k = 0; i < n; i++, k++) {
+  path(o);
+}
+
+console.log("Dense graticule: " + formatNumber((Date.now() - then) / k) + "ms/op.");
+
+o = {type: "GeometryCollection", geometries: d3.range(-180, 180, 1).map(function(x) {
+  return circle.origin([x, 0])();
+})};
+then = Date.now();
+
+for (var i = 0, k = 0; i < n; i++, k++) {
+  path(o);
+}
+
+console.log("Circle polygons: " + formatNumber((Date.now() - then) / k) + "ms/op.");
+
+o = spiral();
+then = Date.now();
+
+for (var i = 0, k = 0; i < n; i++, k++) {
+  path(o);
+}
+
+console.log("Spiral polygons: " + formatNumber((Date.now() - then) / k) + "ms/op.");
+
+function spiral() {
+  var n = 1e4,
+      dy = 5;
+
+  var spiral = d3.range(0, 1 + 1 / n, 1 / n).map(function(t) {
+      return [(360 * 10 * t) % 360 - 180, -90 + dy + (90 - dy) * 2 * t];
+  }).concat(d3.range(1, 0, -1 / n).map(function(t) {
+      return [(360 * 10 * t) % 360 - 180, -90 + (90 - dy) * 2 * t];
+  }));
+  spiral.push(spiral[0]);
+
+  return {type: "Polygon", coordinates: [spiral]};
+}
diff --git a/static/demo/components/d3/test/geo/bounds-test.js b/static/demo/components/d3/test/geo/bounds-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..3f6a027d1f71b7398fa20e02c9959d6242f39163
--- /dev/null
+++ b/static/demo/components/d3/test/geo/bounds-test.js
@@ -0,0 +1,120 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.bounds");
+
+suite.addBatch({
+  "bounds": {
+    topic: function() {
+      return d3.geo.bounds;
+    },
+    "Feature": function(bounds) {
+      assert.deepEqual(bounds({
+        type: "Feature",
+        geometry: {
+          type: "MultiPoint",
+          coordinates: [[-123, 39], [-122, 38]]
+        }
+      }), [[-123, 38], [-122, 39]])
+    },
+    "FeatureCollection": function(bounds) {
+      assert.deepEqual(bounds({
+        type: "FeatureCollection",
+        features: [
+          {
+            type: "Feature",
+            geometry: {
+              type: "Point",
+              coordinates: [-123, 39]
+            }
+          },
+          {
+            type: "Feature",
+            geometry: {
+              type: "Point",
+              coordinates: [-122, 38]
+            }
+          }
+        ]
+      }), [[-123, 38], [-122, 39]])
+    },
+    "GeometryCollection": function(bounds) {
+      assert.deepEqual(bounds({
+        type: "GeometryCollection",
+        geometries: [
+          {
+            type: "Point",
+            coordinates: [-123, 39]
+          },
+          {
+            type: "Point",
+            coordinates: [-122, 38]
+          }
+        ]
+      }), [[-123, 38], [-122, 39]])
+    },
+    "LineString": function(bounds) {
+      assert.deepEqual(bounds({
+        type: "LineString",
+        coordinates: [[-123, 39], [-122, 38]]
+      }), [[-123, 38], [-122, 39]])
+    },
+    "MultiLineString": function(bounds) {
+      assert.deepEqual(bounds({
+        type: "MultiLineString",
+        coordinates: [[[-123, 39], [-122, 38]]]
+      }), [[-123, 38], [-122, 39]])
+    },
+    "MultiPoint": function(bounds) {
+      assert.deepEqual(bounds({
+        type: "MultiPoint",
+        coordinates: [[-123, 39], [-122, 38]]
+      }), [[-123, 38], [-122, 39]])
+    },
+    "MultiPolygon": function(bounds) {
+      assert.deepEqual(bounds({
+        type: "MultiPolygon",
+        coordinates: [[[[-123, 39], [-122, 39], [-122, 38], [-123, 39]], [[10, 20], [20, 20], [20, 10], [10, 10], [10, 20]]]]
+      }), [[-123, 38], [-122, 39]])
+    },
+    "Point": function(bounds) {
+      assert.deepEqual(bounds({
+        type: "Point",
+        coordinates: [-123, 39]
+      }), [[-123, 39], [-123, 39]])
+    },
+    "Polygon": function(bounds) {
+      assert.deepEqual(bounds({
+        type: "Polygon",
+        coordinates: [[[-123, 39], [-122, 39], [-122, 38], [-123, 39]], [[10, 20], [20, 20], [20, 10], [10, 10], [10, 20]]]
+      }), [[-123, 38], [-122, 39]])
+    },
+    "NestedCollection": function (bounds) {
+        assert.deepEqual(bounds({
+        type: "FeatureCollection",
+        features: [
+          {
+            type: "Feature",
+            geometry: {
+              type: "GeometryCollection",
+              geometries: [
+                {
+                  type: "Point",
+                  coordinates: [-120,47]
+                },
+                {
+                  type: "Point",
+                  coordinates: [-119,46]
+                }
+              ]
+            }
+          }
+        ]
+      }), [[-120,46], [-119,47]])
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/centroid-test.js b/static/demo/components/d3/test/geo/centroid-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..017a911b3a40442551a65514ef8b0a53f755d7e3
--- /dev/null
+++ b/static/demo/components/d3/test/geo/centroid-test.js
@@ -0,0 +1,104 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.centroid");
+
+suite.addBatch({
+  "centroid": {
+    topic: function() {
+      return d3.geo.centroid;
+    },
+    "Point": function(centroid) {
+      assert.deepEqual(centroid({type: "Point", coordinates: [0, 0]}), [0, 0]);
+    },
+    "MultiPoint": {
+      "": function(centroid) {
+        assert.inDelta(centroid({type: "MultiPoint", coordinates: [[0, 0], [1, 2]]}), [0.499847, 1.000038], 1e-6);
+      },
+      "antimeridian": function(centroid) {
+        assert.deepEqual(centroid({type: "MultiPoint", coordinates: [[179, 0], [-179, 0]]}), [180, 0]);
+      },
+      "rings": {
+        "equator": function(centroid) {
+          assert.isUndefined(centroid({type: "MultiPoint", coordinates: [[0, 0], [90, 0], [180, 0], [-90, 0]]}));
+        },
+        "polar": function(centroid) {
+          assert.isUndefined(centroid({type: "MultiPoint", coordinates: [[0, 0], [0, 90], [180, 0], [0, -90]]}));
+        }
+      }
+    },
+    "LineString": function(centroid) {
+      assert.inDelta(centroid({type: "LineString", coordinates: [[0, 0], [1, 0]]}), [.5, 0], 1e-6);
+      assert.inDelta(centroid({type: "LineString", coordinates: [[0, 0], [0, 90]]}), [0, 45], 1e-6);
+      assert.inDelta(centroid({type: "LineString", coordinates: [[0, 0], [0, 45], [0, 90]]}), [0, 45], 1e-6);
+      assert.inDelta(centroid({type: "LineString", coordinates: [[-1, -1], [1, 1]]}), [0, 0], 1e-6);
+      assert.inDelta(centroid({type: "LineString", coordinates: [[-60, -1], [60, 1]]}), [0, 0], 1e-6);
+      assert.inDelta(centroid({type: "LineString", coordinates: [[179, -1], [-179, 1]]}), [180, 0], 1e-6);
+      assert.inDelta(centroid({type: "LineString", coordinates: [[-179, 0], [0, 0], [179, 0]]}), [0, 0], 1e-6);
+      assert.inDelta(centroid({type: "LineString", coordinates: [[-180, -90], [0, 0], [0, 90]]}), [0, 0], 1e-6);
+      assert.isUndefined(centroid({type: "LineString", coordinates: [[0, -90], [0, 90]]}));
+    },
+    "MultiLineString": function(centroid) {
+      assert.inDelta(centroid({type: "MultiLineString", coordinates: [[[0, 0], [0, 2]]]}), [0, 1], 1e-6);
+    },
+    "Polygon": function(centroid) {
+      assert.inDelta(centroid({type: "Polygon", coordinates: [[[0, -90], [0, 0], [0, 90], [1, 0], [0, -90]]]}), [.5, 0], 1e-6);
+      //assert.inDelta(centroid(d3.geo.circle().angle(5).origin([0, 45])()), [0, 45], 1e-6);
+      assert.equal(centroid({type: "Polygon", coordinates: [d3.range(-180, 180 + 1 / 2, 1).map(function(x) { return [x, -60]; })]})[1], -90);
+      assert.inDelta(centroid({type: "Polygon", coordinates: [[[0, -10], [0, 10], [10, 10], [10, -10], [0, -10]]]}), [5, 0], 1e-6);
+    },
+    "MultiPolygon": function(centroid) {
+      assert.inDelta(centroid({type: "MultiPolygon", coordinates: [[[[0, -90], [0, 0], [0, 90], [1, 0], [0, -90]]]]}), [.5, 0], 1e-6);
+    },
+    "Sphere": function(centroid) {
+      assert.isUndefined(centroid({type: "Sphere"}));
+    },
+    "Feature": function(centroid) {
+      assert.deepEqual(centroid({type: "Feature", geometry: {type: "Point", coordinates: [0, 0]}}), [0, 0]);
+    },
+    "FeatureCollection": function(centroid) {
+      assert.inDelta(centroid({type: "FeatureCollection", features: [
+        {type: "Feature", geometry: {type: "LineString", coordinates: [[179, 0], [180, 0]]}},
+        {type: "Feature", geometry: {type: "Point", coordinates: [0, 0]}}
+      ]}), [179.5, 0], 1e-6);
+    },
+    "GeometryCollection": {
+      "LineString, Point": function(centroid) {
+        assert.inDelta(centroid({type: "GeometryCollection", geometries: [
+          {type: "LineString", coordinates: [[179, 0], [180, 0]]},
+          {type: "Point", coordinates: [0, 0]}
+        ]}), [179.5, 0], 1e-6);
+      },
+      "Polygon, LineString, Point": function(centroid) {
+        assert.inDelta(centroid({type: "GeometryCollection", geometries: [
+          {type: "Polygon", coordinates: [[[-180, 0], [-180, 1], [-179, 1], [-179, 0], [-180, 0]]]},
+          {type: "LineString", coordinates: [[179, 0], [180, 0]]},
+          {type: "Point", coordinates: [0, 0]}
+        ]}), [-179.5, 0.5], 1e-6);
+      },
+      "Point, LineString, Polygon": function(centroid) {
+        assert.inDelta(centroid({type: "GeometryCollection", geometries: [
+          {type: "Point", coordinates: [0, 0]},
+          {type: "LineString", coordinates: [[179, 0], [180, 0]]},
+          {type: "Polygon", coordinates: [[[-180, 0], [-180, 1], [-179, 1], [-179, 0], [-180, 0]]]}
+        ]}), [-179.5, 0.5], 1e-6);
+      },
+      "Sphere, Point": function(centroid) {
+        assert.isUndefined(centroid({type: "GeometryCollection", geometries: [
+          {type: "Sphere"},
+          {type: "Point", coordinates: [0, 0]}
+        ]}));
+      },
+      "Point, Sphere": function(centroid) {
+        assert.isUndefined(centroid({type: "GeometryCollection", geometries: [
+          {type: "Point", coordinates: [0, 0]},
+          {type: "Sphere"}
+        ]}));
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/circle-test.js b/static/demo/components/d3/test/geo/circle-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..1891bc4cdd71d899d866a59416b444208cd9fea2
--- /dev/null
+++ b/static/demo/components/d3/test/geo/circle-test.js
@@ -0,0 +1,29 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.circle");
+
+suite.addBatch({
+  "circle": {
+    topic: d3.geo.circle,
+    "generates a Polygon": function(circle) {
+      var o = circle();
+      assert.equal(o.type, "Polygon");
+      assert.inDelta(o.coordinates, [[[-78.690067, -90], [-90, -84], [-90, -78], [-90, -72], [-90, -66], [-90, -60], [-90, -54], [-90, -48], [-90, -42], [-90, -36], [-90, -30], [-90, -24], [-90, -18], [-90, -12], [-90, -6], [-90, 0], [-90, 6], [-90, 12], [-90, 18], [-90, 24], [-90, 30], [-90, 36], [-90, 42], [-90, 48], [-90, 54], [-90, 60], [-90, 66], [-90, 72], [-90, 78], [-90, 84], [-89.596672, 90], [90, 84], [90, 78], [90, 72], [90, 66], [90, 60], [90, 54], [90, 48], [90, 42], [90, 36], [90, 30], [90, 24], [90, 18], [90, 12], [90, 6], [90, 0], [90, -6], [90, -12], [90, -18], [90, -24], [90, -30], [90, -36], [90, -42], [90, -48], [90, -54], [90, -60], [90, -66], [90, -72], [90, -78], [90, -84], [89.569782, -90]]], 1e-6);
+    },
+    "origin([0, 90])": function(circle) {
+      var o = circle.origin([0, 90])();
+      assert.equal(o.type, "Polygon");
+      assert.inDelta(o.coordinates, [d3.range(360, -1, -6).map(function(x) { return [x >= 180 ? x - 360 : x, 0]; })], 1e-6);
+    },
+    "origin([45, 45])": function(circle) {
+      var o = circle.origin([45, 45]).angle(0)();
+      assert.equal(o.type, "Polygon");
+      assert.inDelta(o.coordinates[0][0], [45, 45], 1e-6);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/equirectangular-test.js b/static/demo/components/d3/test/geo/equirectangular-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..42db10f64a49f40e7b25fee51c541f83f0668439
--- /dev/null
+++ b/static/demo/components/d3/test/geo/equirectangular-test.js
@@ -0,0 +1,48 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.equirectangular");
+
+suite.addBatch({
+  "equirectangular": {
+    topic: function() {
+      return d3.geo.equirectangular();
+    },
+
+    "scale": {
+      "defaults to 500 / 2Ï€": function(projection) {
+        assert.equal(projection.scale(), 500 / (2 * Math.PI));
+      },
+      "is coerced to a number": function(projection) {
+        assert.strictEqual(projection.scale("400"), projection);
+        assert.strictEqual(projection.scale(), 400);
+        projection.scale(500 / (2 * Math.PI));
+      }
+    },
+
+    "translate": {
+      "defaults to [480, 250]": function(projection) {
+        assert.deepEqual(projection.translate(), [480, 250]);
+      },
+      "is coerced to two numbers": function(projection) {
+        assert.strictEqual(projection.translate(["23", "141"]), projection);
+        assert.strictEqual(projection.translate()[0], 23);
+        assert.strictEqual(projection.translate()[1], 141);
+        projection.translate([480, 250]);
+      }
+    },
+
+    "of San Francisco, CA": {
+      "is at location [-122.446, 37.767]": function(projection) {
+        assert.inDelta(projection.invert([310, 198]), [-122.446, 37.767], .5);
+      },
+      "is at point [310, 198]": function(projection) {
+        assert.inDelta(projection([-122.446, 37.767]), [310, 198], .5);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/gnomonic-test.js b/static/demo/components/d3/test/geo/gnomonic-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..b3214495a35d9bc7d01bb5a56a5a864b68580eca
--- /dev/null
+++ b/static/demo/components/d3/test/geo/gnomonic-test.js
@@ -0,0 +1,63 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.gnomonic");
+
+suite.addBatch({
+  "gnomonic": {
+    topic: function() {
+      return d3.geo.gnomonic().translate([0, 0]).scale(100);
+    },
+    "origin": function(projection) {
+      var coords = projection([0, 0]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Arctic": function(projection) {
+      var coords = projection([0, 85]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], -1143.005230, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    },
+    "Antarctic": function(projection) {
+      var coords = projection([0, -85]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 1143.005230, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], -85, 1e-6);
+    },
+    "Hawaii": function(projection) {
+      var coords = projection([-180, 0]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Phillipines": function(projection) {
+      var coords = projection([180, 0]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Inversion works for non-zero translation": function() {
+      var projection = d3.geo.gnomonic().translate([123, 99]).scale(100),
+          coords = projection([0, 85]),
+          lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/graticule-test.js b/static/demo/components/d3/test/geo/graticule-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..b9f1455a6d83c5ad474a9839c4f87d95b87fcaf8
--- /dev/null
+++ b/static/demo/components/d3/test/geo/graticule-test.js
@@ -0,0 +1,88 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.graticule");
+
+var ε = 1e-6;
+
+suite.addBatch({
+  "graticule": {
+    topic: function() {
+      return d3.geo.graticule()
+          .extent([[-90, -45], [90, 45]])
+          .step([45, 45])
+          .precision(3);
+    },
+
+    "extent": {
+      "defaults to just inside –180°, -90° to +180°, +90°": function() {
+        assert.deepEqual(d3.geo.graticule().extent(), [[-180 + ε, -90 + ε], [180 - ε, 90 - ε]]);
+      },
+      "coerces input values to numbers": function() {
+        var graticule = d3.geo.graticule().extent([["-90", "-45"], ["+90", "+45"]]),
+            extent = graticule.extent();
+        assert.strictEqual(extent[0][0], -90);
+        assert.strictEqual(extent[0][1], -45);
+        assert.strictEqual(extent[1][0], +90);
+        assert.strictEqual(extent[1][1], +45);
+      }
+    },
+
+    "returns a MultiLineString": function(graticule) {
+      assert.deepEqual(graticule(), {
+        type: "MultiLineString",
+        coordinates: [
+          [[-90,-45],[-90,-42],[-90,-39],[-90,-36],[-90,-33],[-90,-30],[-90,-27],[-90,-24],[-90,-21],[-90,-18],[-90,-15],[-90,-12],[-90,-9],[-90,-6],[-90,-3],[-90,0],[-90,3],[-90,6],[-90,9],[-90,12],[-90,15],[-90,18],[-90,21],[-90,24],[-90,27],[-90,30],[-90,33],[-90,36],[-90,39],[-90,42],[-90,45]],
+          [[-45,-45],[-45,-42],[-45,-39],[-45,-36],[-45,-33],[-45,-30],[-45,-27],[-45,-24],[-45,-21],[-45,-18],[-45,-15],[-45,-12],[-45,-9],[-45,-6],[-45,-3],[-45,0],[-45,3],[-45,6],[-45,9],[-45,12],[-45,15],[-45,18],[-45,21],[-45,24],[-45,27],[-45,30],[-45,33],[-45,36],[-45,39],[-45,42],[-45,45]],
+          [[0,-45],[0,-42],[0,-39],[0,-36],[0,-33],[0,-30],[0,-27],[0,-24],[0,-21],[0,-18],[0,-15],[0,-12],[0,-9],[0,-6],[0,-3],[0,0],[0,3],[0,6],[0,9],[0,12],[0,15],[0,18],[0,21],[0,24],[0,27],[0,30],[0,33],[0,36],[0,39],[0,42],[0,45]],
+          [[45,-45],[45,-42],[45,-39],[45,-36],[45,-33],[45,-30],[45,-27],[45,-24],[45,-21],[45,-18],[45,-15],[45,-12],[45,-9],[45,-6],[45,-3],[45,0],[45,3],[45,6],[45,9],[45,12],[45,15],[45,18],[45,21],[45,24],[45,27],[45,30],[45,33],[45,36],[45,39],[45,42],[45,45]],
+          [[-90,-45],[-87,-45],[-84,-45],[-81,-45],[-78,-45],[-75,-45],[-72,-45],[-69,-45],[-66,-45],[-63,-45],[-60,-45],[-57,-45],[-54,-45],[-51,-45],[-48,-45],[-45,-45],[-42,-45],[-39,-45],[-36,-45],[-33,-45],[-30,-45],[-27,-45],[-24,-45],[-21,-45],[-18,-45],[-15,-45],[-12,-45],[-9,-45],[-6,-45],[-3,-45],[0,-45],[3,-45],[6,-45],[9,-45],[12,-45],[15,-45],[18,-45],[21,-45],[24,-45],[27,-45],[30,-45],[33,-45],[36,-45],[39,-45],[42,-45],[45,-45],[48,-45],[51,-45],[54,-45],[57,-45],[60,-45],[63,-45],[66,-45],[69,-45],[72,-45],[75,-45],[78,-45],[81,-45],[84,-45],[87,-45],[90,-45]],
+          [[-90,0],[-87,0],[-84,0],[-81,0],[-78,0],[-75,0],[-72,0],[-69,0],[-66,0],[-63,0],[-60,0],[-57,0],[-54,0],[-51,0],[-48,0],[-45,0],[-42,0],[-39,0],[-36,0],[-33,0],[-30,0],[-27,0],[-24,0],[-21,0],[-18,0],[-15,0],[-12,0],[-9,0],[-6,0],[-3,0],[0,0],[3,0],[6,0],[9,0],[12,0],[15,0],[18,0],[21,0],[24,0],[27,0],[30,0],[33,0],[36,0],[39,0],[42,0],[45,0],[48,0],[51,0],[54,0],[57,0],[60,0],[63,0],[66,0],[69,0],[72,0],[75,0],[78,0],[81,0],[84,0],[87,0],[90,0]]
+        ]
+      });
+    },
+
+    "step": {
+      "defaults to 22.5°, 22.5°": function(graticule) {
+        assert.deepEqual(d3.geo.graticule().step(), [22.5, 22.5]);
+      },
+      "coerces input values to numbers": function() {
+        var graticule = d3.geo.graticule().step(["45", "11.25"]),
+            step = graticule.step();
+        assert.strictEqual(step[0], 45);
+        assert.strictEqual(step[1], 11.25);
+      }
+    },
+
+    "outline": {
+      "returns a Polygon": function(graticule) {
+        assert.deepEqual(graticule.outline(), {
+          type: "Polygon",
+          coordinates: [[
+            [-90,-45],[-90,-42],[-90,-39],[-90,-36],[-90,-33],[-90,-30],[-90,-27],[-90,-24],[-90,-21],[-90,-18],[-90,-15],[-90,-12],[-90,-9],[-90,-6],[-90,-3],[-90,0],[-90,3],[-90,6],[-90,9],[-90,12],[-90,15],[-90,18],[-90,21],[-90,24],[-90,27],[-90,30],[-90,33],[-90,36],[-90,39],[-90,42],[-90,45],
+            [-87,45],[-84,45],[-81,45],[-78,45],[-75,45],[-72,45],[-69,45],[-66,45],[-63,45],[-60,45],[-57,45],[-54,45],[-51,45],[-48,45],[-45,45],[-42,45],[-39,45],[-36,45],[-33,45],[-30,45],[-27,45],[-24,45],[-21,45],[-18,45],[-15,45],[-12,45],[-9,45],[-6,45],[-3,45],[0,45],[3,45],[6,45],[9,45],[12,45],[15,45],[18,45],[21,45],[24,45],[27,45],[30,45],[33,45],[36,45],[39,45],[42,45],[45,45],[48,45],[51,45],[54,45],[57,45],[60,45],[63,45],[66,45],[69,45],[72,45],[75,45],[78,45],[81,45],[84,45],[87,45],[90,45],
+            [90,42],[90,39],[90,36],[90,33],[90,30],[90,27],[90,24],[90,21],[90,18],[90,15],[90,12],[90,9],[90,6],[90,3],[90,0],[90,-3],[90,-6],[90,-9],[90,-12],[90,-15],[90,-18],[90,-21],[90,-24],[90,-27],[90,-30],[90,-33],[90,-36],[90,-39],[90,-42],[90,-45],
+            [87,-45],[84,-45],[81,-45],[78,-45],[75,-45],[72,-45],[69,-45],[66,-45],[63,-45],[60,-45],[57,-45],[54,-45],[51,-45],[48,-45],[45,-45],[42,-45],[39,-45],[36,-45],[33,-45],[30,-45],[27,-45],[24,-45],[21,-45],[18,-45],[15,-45],[12,-45],[9,-45],[6,-45],[3,-45],[0,-45],[-3,-45],[-6,-45],[-9,-45],[-12,-45],[-15,-45],[-18,-45],[-21,-45],[-24,-45],[-27,-45],[-30,-45],[-33,-45],[-36,-45],[-39,-45],[-42,-45],[-45,-45],[-48,-45],[-51,-45],[-54,-45],[-57,-45],[-60,-45],[-63,-45],[-66,-45],[-69,-45],[-72,-45],[-75,-45],[-78,-45],[-81,-45],[-84,-45],[-87,-45],[-90,-45]
+          ]]
+        });
+      }
+    },
+
+    "line": {
+      "returns an array of LineStrings": function(graticule) {
+        assert.deepEqual(graticule.lines(), [
+          {type: "LineString", coordinates: [[-90,-45],[-90,-42],[-90,-39],[-90,-36],[-90,-33],[-90,-30],[-90,-27],[-90,-24],[-90,-21],[-90,-18],[-90,-15],[-90,-12],[-90,-9],[-90,-6],[-90,-3],[-90,0],[-90,3],[-90,6],[-90,9],[-90,12],[-90,15],[-90,18],[-90,21],[-90,24],[-90,27],[-90,30],[-90,33],[-90,36],[-90,39],[-90,42],[-90,45]]},
+          {type: "LineString", coordinates: [[-45,-45],[-45,-42],[-45,-39],[-45,-36],[-45,-33],[-45,-30],[-45,-27],[-45,-24],[-45,-21],[-45,-18],[-45,-15],[-45,-12],[-45,-9],[-45,-6],[-45,-3],[-45,0],[-45,3],[-45,6],[-45,9],[-45,12],[-45,15],[-45,18],[-45,21],[-45,24],[-45,27],[-45,30],[-45,33],[-45,36],[-45,39],[-45,42],[-45,45]]},
+          {type: "LineString", coordinates: [[0,-45],[0,-42],[0,-39],[0,-36],[0,-33],[0,-30],[0,-27],[0,-24],[0,-21],[0,-18],[0,-15],[0,-12],[0,-9],[0,-6],[0,-3],[0,0],[0,3],[0,6],[0,9],[0,12],[0,15],[0,18],[0,21],[0,24],[0,27],[0,30],[0,33],[0,36],[0,39],[0,42],[0,45]]},
+          {type: "LineString", coordinates: [[45,-45],[45,-42],[45,-39],[45,-36],[45,-33],[45,-30],[45,-27],[45,-24],[45,-21],[45,-18],[45,-15],[45,-12],[45,-9],[45,-6],[45,-3],[45,0],[45,3],[45,6],[45,9],[45,12],[45,15],[45,18],[45,21],[45,24],[45,27],[45,30],[45,33],[45,36],[45,39],[45,42],[45,45]]},
+          {type: "LineString", coordinates: [[-90,-45],[-87,-45],[-84,-45],[-81,-45],[-78,-45],[-75,-45],[-72,-45],[-69,-45],[-66,-45],[-63,-45],[-60,-45],[-57,-45],[-54,-45],[-51,-45],[-48,-45],[-45,-45],[-42,-45],[-39,-45],[-36,-45],[-33,-45],[-30,-45],[-27,-45],[-24,-45],[-21,-45],[-18,-45],[-15,-45],[-12,-45],[-9,-45],[-6,-45],[-3,-45],[0,-45],[3,-45],[6,-45],[9,-45],[12,-45],[15,-45],[18,-45],[21,-45],[24,-45],[27,-45],[30,-45],[33,-45],[36,-45],[39,-45],[42,-45],[45,-45],[48,-45],[51,-45],[54,-45],[57,-45],[60,-45],[63,-45],[66,-45],[69,-45],[72,-45],[75,-45],[78,-45],[81,-45],[84,-45],[87,-45],[90,-45]]},
+          {type: "LineString", coordinates: [[-90,0],[-87,0],[-84,0],[-81,0],[-78,0],[-75,0],[-72,0],[-69,0],[-66,0],[-63,0],[-60,0],[-57,0],[-54,0],[-51,0],[-48,0],[-45,0],[-42,0],[-39,0],[-36,0],[-33,0],[-30,0],[-27,0],[-24,0],[-21,0],[-18,0],[-15,0],[-12,0],[-9,0],[-6,0],[-3,0],[0,0],[3,0],[6,0],[9,0],[12,0],[15,0],[18,0],[21,0],[24,0],[27,0],[30,0],[33,0],[36,0],[39,0],[42,0],[45,0],[48,0],[51,0],[54,0],[57,0],[60,0],[63,0],[66,0],[69,0],[72,0],[75,0],[78,0],[81,0],[84,0],[87,0],[90,0]]}
+        ]);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/greatArc-test.js b/static/demo/components/d3/test/geo/greatArc-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..115446bed0e22196ebdfc5b267ee9a5daca8f280
--- /dev/null
+++ b/static/demo/components/d3/test/geo/greatArc-test.js
@@ -0,0 +1,59 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.greatArc");
+
+suite.addBatch({
+  "greatArc": {
+    topic: function() {
+      return d3.geo.greatArc();
+    },
+    "distance": function(arc) {
+      assert.equal(arc.distance({source: [0, 0], target: [0, 0]}), 0);
+      assert.inDelta(arc.distance({
+        source: [118 + 24 / 60, 33 + 57 / 60],
+        target: [ 73 + 47 / 60, 40 + 38 / 60]
+      }), 3973 / 6371, .5);
+    },
+    "source and target can be set as constants": function() {
+      var arc = d3.geo.greatArc()
+          .source([5, 52])
+          .target([-120, 37])
+          .precision(7.2);
+      assert.inDelta(arc().coordinates, [
+        [   5,        52      ],
+        [  -3.805036, 57.05083],
+        [ -15.122869, 61.30118],
+        [ -29.396213, 64.34584],
+        [ -46.132729, 65.72409],
+        [ -63.394401, 65.15597],
+        [ -78.854311, 62.76337],
+        [ -91.401599, 58.96701],
+        [-101.190927, 54.21333],
+        [-108.843633, 48.83586],
+        [-114.961152, 43.05231],
+        [-120,        37      ]
+      ], .5);
+    },
+    "geodesic": function(arc) {
+      assert.inDelta(arc.precision(7.2)({source: [5, 52], target: [-120, 37]}).coordinates, [
+        [   5,        52      ],
+        [  -3.805036, 57.05083],
+        [ -15.122869, 61.30118],
+        [ -29.396213, 64.34584],
+        [ -46.132729, 65.72409],
+        [ -63.394401, 65.15597],
+        [ -78.854311, 62.76337],
+        [ -91.401599, 58.96701],
+        [-101.190927, 54.21333],
+        [-108.843633, 48.83586],
+        [-114.961152, 43.05231],
+        [-120,        37      ]
+      ], .5);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/interpolate-test.js b/static/demo/components/d3/test/geo/interpolate-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..265e99f12a529a2c5a6c650a17ee166da77f0716
--- /dev/null
+++ b/static/demo/components/d3/test/geo/interpolate-test.js
@@ -0,0 +1,25 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.interpolate");
+
+suite.addBatch({
+  "interpolate": {
+    topic: function() {
+      return d3.geo.interpolate;
+    },
+    "zero distance": function(arc) {
+      assert.deepEqual(d3.geo.interpolate([140.63289, -29.95101], [140.63289, -29.95101])(.5), [140.63289, -29.95101]);
+    },
+    "equator": function(arc) {
+      assert.inDelta(d3.geo.interpolate([10, 0], [20, 0])(.5), [15, 0], 1e-6);
+    },
+    "meridian": function(arc) {
+      assert.inDelta(d3.geo.interpolate([10, -20], [10, 40])(.5), [10, 10], 1e-6);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/mercator-test.js b/static/demo/components/d3/test/geo/mercator-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..05c8ee4b5ea6d6036b8c7dc8b407d096d5af400b
--- /dev/null
+++ b/static/demo/components/d3/test/geo/mercator-test.js
@@ -0,0 +1,55 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.mercator");
+
+suite.addBatch({
+  "mercator": {
+    topic: function() {
+      return d3.geo.mercator().translate([0, 0]).scale(100);
+    },
+    "Arctic": function(projection) {
+      var coords = projection([0, 85]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], -49.8362085, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    },
+    "Antarctic": function(projection) {
+      var coords = projection([0, -85]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 49.8362085, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], -85, 1e-6);
+    },
+    "Hawaii": function(projection) {
+      var coords = projection([-180, 0]);
+      assert.inDelta(coords[0], -50, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], -180, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Phillipines": function(projection) {
+      var coords = projection([180, 0]);
+      assert.inDelta(coords[0], 50, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 180, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Inversion works for non-zero translation": function() {
+      var projection = d3.geo.mercator().translate([123, 99]).scale(100),
+          coords = projection([0, 85]),
+          lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/orthographic-test.js b/static/demo/components/d3/test/geo/orthographic-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..d5b07b9e41a417652da8517cf6c3b79a0bc0d5f3
--- /dev/null
+++ b/static/demo/components/d3/test/geo/orthographic-test.js
@@ -0,0 +1,63 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.orthographic");
+
+suite.addBatch({
+  "orthographic": {
+    topic: function() {
+      return d3.geo.orthographic().translate([0, 0]).scale(100);
+    },
+    "origin": function(projection) {
+      var coords = projection([0, 0]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Arctic": function(projection) {
+      var coords = projection([0, 85]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], -99.619469, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    },
+    "Antarctic": function(projection) {
+      var coords = projection([0, -85]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 99.619469, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], -85, 1e-6);
+    },
+    "Hawaii": function(projection) {
+      var coords = projection([-180, 0]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Phillipines": function(projection) {
+      var coords = projection([180, 0]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Inversion works for non-zero translation": function() {
+      var projection = d3.geo.orthographic().translate([123, 99]).scale(100),
+          coords = projection([0, 85]),
+          lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/path-test.js b/static/demo/components/d3/test/geo/path-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..c546e5556b627982b70bfdd137d1101f005bdd07
--- /dev/null
+++ b/static/demo/components/d3/test/geo/path-test.js
@@ -0,0 +1,743 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.path");
+
+suite.addBatch({
+  "path": {
+    topic: function() {
+      return d3.geo.path()
+          .context(testContext)
+          .projection(d3.geo.equirectangular()
+            .scale(900 / Math.PI)
+            .precision(0));
+    },
+
+    "Point": function(path) {
+      path({
+        type: "Point",
+        coordinates: [-63, 18]
+      });
+      assert.deepEqual(testContext.buffer(), [
+        {type: "moveTo", x: 165, y: 160},
+        {type: "arc", x: 165, y: 160, r: 4.5}
+      ]);
+    },
+
+    "MultiPoint": function(path) {
+      path({
+        type: "MultiPoint",
+        coordinates: [[-63, 18], [-62, 18], [-62, 17]]
+      });
+      assert.deepEqual(testContext.buffer(), [
+        {type: "moveTo", x: 165, y: 160}, {type: "arc", x: 165, y: 160, r: 4.5},
+        {type: "moveTo", x: 170, y: 160}, {type: "arc", x: 170, y: 160, r: 4.5},
+        {type: "moveTo", x: 170, y: 165}, {type: "arc", x: 170, y: 165, r: 4.5}
+      ]);
+    },
+
+    "LineString": function(path) {
+      path({
+        type: "Feature",
+        geometry: {
+          type: "LineString",
+          coordinates: [[-63, 18], [-62, 18], [-62, 17]]
+        },
+      });
+      assert.deepEqual(testContext.buffer(), [
+        {type: "moveTo", x: 165, y: 160},
+        {type: "lineTo", x: 170, y: 160},
+        {type: "lineTo", x: 170, y: 165}
+      ]);
+    },
+
+    "Polygon": function(path) {
+      path({
+        type: "Feature",
+        geometry: {
+          type: "Polygon",
+          coordinates: [[[-63, 18], [-62, 18], [-62, 17], [-63, 18]]]
+        },
+      });
+      assert.deepEqual(testContext.buffer(), [
+        {type: "moveTo", x: 165, y: 160},
+        {type: "lineTo", x: 170, y: 160},
+        {type: "lineTo", x: 170, y: 165},
+        {type: "closePath"}
+      ]);
+    },
+
+    "GeometryCollection": function(path) {
+      path({
+        type: "GeometryCollection",
+        geometries: [{type: "Point", coordinates: [0, 0]}]
+      });
+      assert.deepEqual(testContext.buffer(), [
+        {type: "moveTo", x: 480, y: 250}, {type: "arc", x: 480, y: 250, r: 4.5}
+      ]);
+    },
+
+    "FeatureCollection": function(path) {
+      path({
+        type: "FeatureCollection",
+        features: [{type: "Feature", geometry: {type: "Point", coordinates: [0, 0]}}]
+      });
+      assert.deepEqual(testContext.buffer(), [
+        {type: "moveTo", x: 480, y: 250}, {type: "arc", x: 480, y: 250, r: 4.5}
+      ]);
+    },
+
+    "with a null projection": {
+      topic: function() {
+        return d3.geo.path().context(testContext).projection(null);
+      },
+      "Polygon": function(path) {
+        path({
+          type: "Feature",
+          geometry: {
+            type: "Polygon",
+            coordinates: [[[-63, 18], [-62, 18], [-62, 17], [-63, 18]]]
+          },
+        });
+        assert.deepEqual(testContext.buffer(), [
+          {type: "moveTo", x: -63, y: 18},
+          {type: "lineTo", x: -62, y: 18},
+          {type: "lineTo", x: -62, y: 17},
+          {type: "closePath"}
+        ]);
+      }
+    },
+
+    "winding order": {
+      "tiny polygon": function(path) {
+        path({type: "Polygon", coordinates: [[
+          [-0.06904102953339501, 0.346043661846373],
+          [-6.725674252975136e-15, 0.3981303360336475],
+          [-6.742247658534323e-15, -0.08812465346531581],
+          [-0.17301258217724075, -0.12278150669440671],
+          [-0.06904102953339501, 0.346043661846373]]]});
+        assert.equal(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }).length, 1);
+      }
+    },
+
+    "with no context": {
+      topic: function(path) {
+        return d3.geo.path().projection(path.projection());
+      },
+      "returns null when passed null or undefined": function(path) {
+        assert.equal(path(null), null);
+        assert.equal(path(undefined), null);
+        assert.equal(path(), null);
+      },
+      "returns null with bogus type name": function(path) {
+        assert.equal(path({
+          type: "Feature",
+          geometry: {
+            type: "__proto__",
+            coordinates: [[[-63.03, 18.02], [-63.14, 18.06], [-63.01, 18.07], [-63.03, 18.02]]]
+          },
+        }), null);
+      }
+    },
+
+    "projection": {
+      "returns the current projection when called with no arguments": function() {
+        var path = d3.geo.path(), projection = d3.geo.albers();
+        path.projection(projection);
+        assert.strictEqual(path.projection(), projection);
+      }
+    },
+
+    "pointRadius": {
+      "returns the current point radius when called with no arguments": function() {
+        var path = d3.geo.path(), radius = function() { return 5; };
+        assert.strictEqual(path.pointRadius(), 4.5);
+        assert.strictEqual(path.pointRadius(radius).pointRadius(), radius);
+      },
+      "coerces point radius to a number": {
+        "constant": function() {
+          var path = d3.geo.path();
+          assert.strictEqual(path.pointRadius("6").pointRadius(), 6);
+        },
+        "function": function(path) {
+          var radius = path.pointRadius();
+          try {
+            path.pointRadius(function() { return "6"; })({type: "Point", coordinates: [0, 0]});
+            assert.strictEqual(testContext.buffer().filter(function(d) { return d.type === "arc"; })[0].r, 6);
+          } finally {
+            path.pointRadius(radius);
+          }
+        }
+      }
+    },
+
+    "area": {
+      topic: function(path) {
+        return path.area;
+      },
+      "no holes": function(area) {
+        assert.strictEqual(area({type: "Polygon", coordinates: [[[100, 0], [100, 1], [101, 1], [101, 0], [100, 0]]]}), 25);
+      },
+      "holes": function(area) {
+        assert.strictEqual(area({type: "Polygon", coordinates: [[[100, 0], [100, 1], [101, 1], [101, 0], [100, 0]],
+                                                                [[100.2, .2], [100.8, .2], [100.8, .8], [100.2, .8], [100.2, .2]]]}), 16);
+      },
+      "Sphere": function(area) {
+        assert.strictEqual(area({type: "Sphere"}), 1620000);
+      },
+      "supports fallback stream": function() {
+        var path = d3.geo.path(),
+            area = path.area({type: "Polygon", coordinates: [[[-122, 37], [-71, 42], [-80, 25], [-122, 37]]]});
+        assert.inDelta(area, 109021.503, 1e-3);
+      }
+    },
+
+    "bounds": {
+      "supports fallback stream": function() {
+        var path = d3.geo.path(),
+            bounds = path.bounds({type: "LineString", coordinates: [[-122, 37], [-74, 40], [-100, 0]]});
+        assert.inDelta(bounds[0][0], -5.1214, 1e-3);
+        assert.inDelta(bounds[0][1], 174.825, 1e-3);
+        assert.inDelta(bounds[1][0], 794.602, 1e-3);
+        assert.inDelta(bounds[1][1], 856.501, 1e-3);
+      }
+    },
+
+    "centroid": {
+      topic: function(path) {
+        return path.centroid;
+      },
+      "Point": function(centroid) {
+        assert.deepEqual(centroid({type: "Point", coordinates: [0, 0]}), [480, 250]);
+      },
+      "MultiPoint": {
+        "empty": function(centroid) {
+          assert.isUndefined(centroid({type: "MultiPoint", coordinates: []}));
+        },
+        "single point": function(centroid) {
+          assert.deepEqual(centroid({type: "MultiPoint", coordinates: [[0, 0]]}), [480, 250]);
+        },
+        "two points": function(centroid) {
+          assert.deepEqual(centroid({type: "MultiPoint", coordinates: [[-122, 37], [-74, 40]]}), [-10, 57.5]);
+        }
+      },
+      "LineString": {
+        "empty": function(centroid) {
+          assert.isUndefined(centroid({type: "LineString", coordinates: []}));
+        },
+        "two points": function(centroid) {
+          assert.deepEqual(centroid({type: "LineString", coordinates: [[100, 0], [0, 0]]}), [730, 250]);
+          assert.deepEqual(centroid({type: "LineString", coordinates: [[0, 0], [100, 0], [101, 0]]}), [732.5, 250]);
+        },
+        "two points, one unique": function(centroid) {
+          assert.isUndefined(centroid({type: "LineString", coordinates: [[-122, 37], [-122, 37]]}));
+          assert.isUndefined(centroid({type: "LineString", coordinates: [[ -74, 40], [ -74, 40]]}));
+        },
+        "three points; two unique": function(centroid) {
+          assert.deepEqual(centroid({type: "LineString", coordinates: [[-122, 37], [-74, 40], [-74, 40]]}), [-10, 57.5]);
+        },
+        "three points": function(centroid) {
+          assert.inDelta(centroid({type: "LineString", coordinates: [[-122, 37], [-74, 40], [-100, 0]]}), [17.389135, 103.563545], 1e-6);
+        }
+      },
+      "MultiLineString": function(centroid) {
+        assert.deepEqual(centroid({type: "MultiLineString", coordinates: [[[100, 0], [0, 0]], [[-10, 0], [0, 0]]]}), [705, 250]);
+      },
+      "Polygon": {
+        "single ring": function(centroid) {
+          assert.deepEqual(centroid({type: "Polygon", coordinates: [[[100, 0], [100, 1], [101, 1], [101, 0], [100, 0]]]}), [982.5, 247.5]);
+        },
+        "zero area": function(centroid) {
+          assert.isUndefined(centroid({type: "Polygon", coordinates: [[[1, 0], [2, 0], [3, 0], [1, 0]]]}));
+        },
+        "two rings, one zero area": function(centroid) {
+          assert.deepEqual(centroid({type: "Polygon", coordinates: [
+            [[100,   0], [100,   1], [101,   1], [101,   0], [100, 0]],
+            [[100.1, 0], [100.2, 0], [100.3, 0], [100.1, 0]
+          ]]}), [982.5, 247.5]);
+        },
+        "clockwise exterior, anticlockwise interior": function(centroid) {
+          assert.inDelta(centroid({
+            type: "Polygon",
+            coordinates: [
+              [[-2, -2], [2, -2], [2, 2], [-2, 2], [-2, -2]].reverse(),
+              [[ 0, -1], [1, -1], [1, 1], [ 0, 1], [ 0, -1]]
+            ]
+          }), [479.642857, 250], 1e-6);
+        }
+      },
+      "MultiPolygon": {
+        "empty": function(centroid) {
+          assert.isUndefined(centroid({type: "MultiPolygon", coordinates: []}));
+        },
+        "single polygon": function(centroid) {
+          assert.deepEqual(centroid({type: "MultiPolygon", coordinates: [[[[100, 0], [100, 1], [101, 1], [101, 0], [100, 0]]]]}), [982.5, 247.5]);
+        },
+        "two polygons": function(centroid) {
+          assert.deepEqual(centroid({type: "MultiPolygon", coordinates: [
+            [[[100, 0], [100, 1], [101, 1], [101, 0], [100, 0]]],
+            [[[0, 0], [1, 0], [1, -1], [0, -1], [0, 0]]]
+          ]}), [732.5, 250]);
+        },
+        "two polygons, one zero area": function(centroid) {
+          assert.deepEqual(centroid({type: "MultiPolygon", coordinates: [
+            [[[100, 0], [100, 1], [101, 1], [101, 0], [100, 0]]],
+            [[[0, 0], [1, 0], [2, 0], [0, 0]]]
+          ]}), [982.5, 247.5]);
+        }
+      },
+      "GeometryCollection": {
+        "Point": function(centroid) {
+          assert.deepEqual(centroid({type: "GeometryCollection", geometries: [{type: "Point", coordinates: [0, 0]}]}), [480, 250]);
+        },
+        "Point and LineString": function(centroid) {
+          assert.deepEqual(centroid({type: "GeometryCollection", geometries: [
+            {type: "LineString", coordinates: [[179, 0], [180, 0]]},
+            {type: "Point", coordinates: [0, 0]}
+          ]}), [1377.5, 250]);
+        },
+        "Point, LineString and Polygon": function(centroid) {
+          assert.deepEqual(centroid({type: "GeometryCollection", geometries: [
+            {type: "Polygon", coordinates: [[[-180, 0], [-180, 1], [-179, 1], [-179, 0], [-180, 0]]]},
+            {type: "LineString", coordinates: [[179, 0], [180, 0]]},
+            {type: "Point", coordinates: [0, 0]}
+          ]}), [-417.5, 247.5]);
+        }
+      },
+      "FeatureCollection": {
+        "Point": function(centroid) {
+          assert.deepEqual(centroid({type: "FeatureCollection", features: [{type: "Feature", geometry: {type: "Point", coordinates: [0, 0]}}]}), [480, 250]);
+        },
+        "Point and LineString": function(centroid) {
+          assert.deepEqual(centroid({type: "FeatureCollection", features: [
+            {type: "Feature", geometry: {type: "LineString", coordinates: [[179, 0], [180, 0]]}},
+            {type: "Feature", geometry: {type: "Point", coordinates: [0, 0]}}
+          ]}), [1377.5, 250]);
+        },
+        "Point, LineString and Polygon": function(centroid) {
+          assert.deepEqual(centroid({type: "FeatureCollection", features: [
+            {type: "Feature", geometry: {type: "Polygon", coordinates: [[[-180, 0], [-180, 1], [-179, 1], [-179, 0], [-180, 0]]]}},
+            {type: "Feature", geometry: {type: "LineString", coordinates: [[179, 0], [180, 0]]}},
+            {type: "Feature", geometry: {type: "Point", coordinates: [0, 0]}}
+          ]}), [-417.5, 247.5]);
+        }
+      },
+      "Sphere": function(centroid) {
+        assert.deepEqual(centroid({type: "Sphere"}), [480, 250]);
+      },
+      "rotate([180, -248])": function() {
+        d3.geo.path()
+            .context(testContext)
+            .projection(d3.geo.equirectangular()
+              .rotate([-180, -248])
+              .scale(900 / Math.PI)
+              .precision(0))({type: "Polygon",  coordinates: [[[-175.03150315031502, 66.57410661866186], [-174.34743474347434, 66.33097912391239], [-174.5994599459946, 67.0603616081608], [-171.86318631863185, 66.90406536153614], [-169.9189918991899, 65.96628788178816], [-170.89108910891088, 65.53213164116411], [-172.54725472547256, 65.42793414341432], [-172.5832583258326, 64.45542416441643], [-172.97929792979298, 64.2470291689169], [-173.91539153915392, 64.28176166816681], [-174.67146714671466, 64.62908666066605], [-176.003600360036, 64.90694665466546], [-176.21962196219621, 65.34110289528951], [-177.22772277227722, 65.51476539153916], [-178.37983798379838, 65.37583539453945], [-178.91989198919893, 65.72316038703869], [-178.7038703870387, 66.10521787878787], [-179.8919891989199, 65.8620903840384], [-179.45994599459945, 65.3932016441644], [-180, 64.97641165316531], [-180, 68.95328281728172], [-177.55175517551754, 68.18916783378336], [-174.95949594959495, 67.19929160516051], [-175.03150315031502, 66.57410661866186]]]});
+        assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+          {type: "moveTo", x: 1370, y: 243}
+        ]);
+      },
+      "supports fallback stream": function() {
+        var path = d3.geo.path(),
+            centroid = path.centroid({type: "LineString", coordinates: [[-122, 37], [-74, 40], [-100, 0]]});
+        assert.inDelta(centroid[0], 434.655, 1e-3);
+        assert.inDelta(centroid[1], 397.940, 1e-3);
+      }
+    },
+
+    "clipAngle(90)": {
+      topic: function() {
+        return d3.geo.path()
+            .context(testContext)
+            .projection(d3.geo.equirectangular()
+              .scale(900 / Math.PI)
+              .precision(0)
+              .clipAngle(90));
+      },
+      "Point": function(path) {
+        path({
+          type: "Point",
+          coordinates: [-63, 18]
+        });
+        assert.deepEqual(testContext.buffer(), [
+          {type: "moveTo", x: 165, y: 160}, {type: "arc", x: 165, y: 160, r: 4.5}
+        ]);
+      },
+      "MultiPoint": function(path) {
+        path({
+          type: "MultiPoint",
+          coordinates: [[-63, 18], [-62, 18], [-62, 17]]
+        });
+        assert.deepEqual(testContext.buffer(), [
+          {type: "moveTo", x: 165, y: 160}, {type: "arc", x: 165, y: 160, r: 4.5},
+          {type: "moveTo", x: 170, y: 160}, {type: "arc", x: 170, y: 160, r: 4.5},
+          {type: "moveTo", x: 170, y: 165}, {type: "arc", x: 170, y: 165, r: 4.5}
+        ]);
+      },
+      "Polygon": {
+        "inserts exterior along clip edge if polygon interior surrounds it": function(path) {
+          path({type: "Polygon", coordinates: [[[80, -80], [80, 80], [-80, 80], [-80, -80], [80, -80]]]});
+          assert.equal(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }).length, 2);
+        },
+        "inserts exterior along clip edge if polygon exterior surrounds it": function(path) {
+          path({type: "Polygon", coordinates: [[[100, -80], [-100, -80], [-100, 80], [100, 80], [100, -80]]]});
+          assert.equal(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }).length, 1);
+        }
+      },
+      "rotate([-17, -451])": function() {
+        var pole = d3.range(-180, 180, 10).map(function(x) { return [x, 70]; });
+        pole.push(pole[0]);
+        d3.geo.path()
+            .context(testContext)
+            .projection(d3.geo.equirectangular()
+              .rotate([-17, -451])
+              .scale(900 / Math.PI)
+              .precision(0)
+              .clipAngle(90))({type: "Polygon", coordinates: [pole]});
+        assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+          {type: "moveTo", x: 510, y: 160},
+          {type: "moveTo", x:  87, y: 700}
+        ]);
+      },
+      "rotate([71.03, 42.37])": {
+        topic: function() {
+          return d3.geo.path()
+              .context(testContext)
+              .projection(d3.geo.equirectangular()
+                .rotate([71.03, 42.37])
+                .scale(900 / Math.PI)
+                .precision(0)
+                .clipAngle(90));
+        },
+        /*
+        "grid component": function(path) {
+          var yStepsBig = d3.range(-90, 90, 10);
+          path({type: "LineString", coordinates: yStepsBig.map(function(y) { return [110, y]; })});
+          assert.inDelta(testContext.buffer(), [[
+            [109.538009, -90],
+            [110, -80],
+            [110, -70],
+            [110, -60],
+            [110, -50],
+            [110, -47.625390]
+          ]], 1e-6);
+        },
+        */
+        "can completely clip a LineString": function(path) {
+          path({type: "LineString", coordinates: [[90.0, -42.37], [95.0, -42.37], [90.0, -42.37]]});
+          assert.deepEqual(testContext.buffer(), []);
+        },
+        "doesn't insert a duplicate point": function(path) {
+          path({type: "LineString", coordinates: [[0, 0]]});
+          assert.deepEqual(testContext.buffer(), [{type: "moveTo", x: 859, y: 187}]);
+        },
+        "Point": {
+          "visible": function(path) {
+            path({type: "Point", coordinates: [0, 0]});
+            assert.deepEqual(testContext.buffer(), [{type: "moveTo", x: 859, y: 187}, {type: "arc", x: 859, y: 187, r: 4.5}]);
+          },
+          "invisible": function(path) {
+            path({type: "Point", coordinates: [-180, 0]});
+            assert.deepEqual(testContext.buffer(), []);
+          }
+        },
+        "MultiPoint": function(path) {
+          path({type: "MultiPoint", coordinates: [[0, 0], [-180, 0]]});
+          assert.deepEqual(testContext.buffer(), [{type: "moveTo", x: 859, y: 187}, {type: "arc", x: 859, y: 187, r: 4.5}]);
+        }
+      },
+      "rotate(-24, -175.5])": {
+        topic: function() {
+          return d3.geo.path()
+              .context(testContext)
+              .projection(d3.geo.equirectangular()
+                .rotate([-24, -175.5])
+                .scale(900 / Math.PI)
+                .precision(0)
+                .clipAngle(90));
+        },
+        "Antarctica": function(path) {
+          path(antarctica);
+          assert.equal(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }).length, 2);
+        }
+      },
+      "circle.angle(60)": {
+        "rotate([0, 0])": function(path) {
+          path(d3.geo.circle().angle(60)());
+          assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+            {type: "moveTo", x: 276, y: 493}]);
+        },
+        "rotate([90, 0])": function(path) {
+          try {
+            path.projection().rotate([90, 0]);
+            path(d3.geo.circle().angle(60)());
+            assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+              {type: "moveTo", x: 930, y: 550}]);
+          } finally {
+            path.projection().rotate([0, 0]);
+          }
+        },
+        "rotate([180, 0])": function(path) {
+          try {
+            path.projection().rotate([180, 0]);
+            path(d3.geo.circle().angle(60)());
+            assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), []);
+          } finally {
+            path.projection().rotate([0, 0]);
+          }
+        },
+        "rotate([270, 0])": function(path) {
+          try {
+            path.projection().rotate([270, 0]);
+            path(d3.geo.circle().angle(60)());
+            assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+              {type: "moveTo", x: 30, y: -50}]);
+          } finally {
+            path.projection().rotate([0, 0]);
+          }
+        }
+      },
+      "circle.angle(120)": {
+        "rotate([0, 0])": function(path) {
+          path(d3.geo.circle().angle(120)());
+          assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+            {type: "moveTo", x: 87, y: 700}]);
+        },
+        "rotate([90, 0])": function(path) {
+          try {
+            path.projection().rotate([90, 0]);
+            path(d3.geo.circle().angle(120)());
+            assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+              {type: "moveTo", x: 30, y: 550}]);
+          } finally {
+            path.projection().rotate([0, 0]);
+          }
+        },
+        "rotate([180, 0])": function(path) {
+          try {
+            path.projection().rotate([180, 0]);
+            path(d3.geo.circle().angle(120)());
+            assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+              {type: "moveTo", x: 276, y: 493},
+              {type: "moveTo", x:  87, y: 700}]);
+          } finally {
+            path.projection().rotate([0, 0]);
+          }
+        },
+        "rotate([270, 0])": function(path) {
+          try {
+            path.projection().rotate([270, 0]);
+            path(d3.geo.circle().angle(120)());
+            assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+              {type: "moveTo", x: 930, y: -50}]);
+          } finally {
+            path.projection().rotate([0, 0]);
+          }
+        },
+        "rotate([210, 1])": function(path) {
+          try {
+            path.projection().rotate([210, 1]);
+            path(d3.geo.circle().angle(120)());
+            assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [{type: "moveTo", x: 930, y: 250}]);
+          } finally {
+            path.projection().rotate([0, 0]);
+          }
+        },
+        "rotate([-150, 60])": function(path) {
+          try {
+            path.projection().rotate([-150, 60]);
+            path(d3.geo.circle().angle(120)());
+            assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [{type: "moveTo", x: 30, y: -87}]);
+          } finally {
+            path.projection().rotate([0, 0]);
+          }
+        }
+      },
+      "Sphere": function(path) {
+        path({type: "Sphere"});
+        assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [{type: "moveTo", x: 87, y: 700}]);
+      }
+    },
+    "clipAngle(170)": {
+      topic: function() {
+        return d3.geo.path()
+            .context(testContext)
+            .projection(d3.geo.equirectangular()
+              .scale(900 / Math.PI)
+              .precision(0)
+              .clipAngle(170));
+      },
+      "stripes": {
+        "rotate([0, 0])": function(path) {
+          path(stripes(80, -80));
+          assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+            {type: "moveTo", x: -420, y: -150},
+            {type: "moveTo", x: -420, y:  650},
+            {type: "moveTo", x: 1331, y:  259}]);
+        },
+        "rotate([0, -90])": function(path) {
+          try {
+            path.projection().rotate([0, -90]);
+            path(stripes(80, -80));
+            assert.deepEqual(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }), [
+              {type: "moveTo", x:  480, y: 200},
+              {type: "moveTo", x: 1350, y: 210}]);
+          } finally {
+            path.projection().rotate([0, 0]);
+          }
+        }
+      }
+    },
+
+    "antimeridian cutting": {
+      "rotate([98, 0])": {
+        topic: function() {
+          return d3.geo.path()
+              .context(testContext)
+              .projection(d3.geo.equirectangular()
+                .scale(900 / Math.PI)
+                .rotate([98, 0])
+                .precision(0));
+        },
+        "small U.S. county polygons": {
+          "Keweenaw": function(path) {
+            path({
+              type: "Polygon",
+              coordinates: [[[-88.23013, 47.198326], [-88.514931, 47.285957], [-88.383484, 47.285957], [-88.23013, 47.198326]]]
+            });
+            assert.equal(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }).length, 1);
+          },
+          "Accomack": function(path) {
+            path({
+              type: "MultiPolygon",
+              coordinates: [
+                [[[-75.397659, 38.013497], [-75.244304, 38.029928], [-75.666029, 37.465803], [-75.939876, 37.547957], [-75.671506, 37.95325], [-75.622213, 37.991589], [-75.397659, 38.013497]]],
+                [[[-76.016553, 37.95325], [-76.043938, 37.95325], [-75.994645, 37.95325], [-76.016553, 37.95325]]]
+              ]
+            });
+            assert.equal(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }).length, 2);
+          },
+          "Hopewell": function(path) {
+            path({
+              type: "Polygon",
+              coordinates: [[[-77.298157, 37.312448], [-77.298157, 37.312448], [-77.336496, 37.312448], [-77.281726, 37.312448], [-77.298157, 37.312448]]]
+            });
+            assert.equal(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }).length, 1);
+          }
+        }
+      },
+      "rotate([330, 232])": {
+        topic: function() {
+          return d3.geo.path()
+              .context(testContext)
+              .projection(d3.geo.equirectangular()
+                .rotate([330, 232])
+                .scale(900 / Math.PI)
+                .precision(0));
+        },
+        "degenerate points": function(path) {
+          path(d3.geo.circle().angle(30)());
+          assert.equal(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }).length, 2);
+        }
+      },
+      "rotate([34.5, 90])": {
+        topic: function() {
+          return d3.geo.path()
+              .context(testContext)
+              .projection(d3.geo.equirectangular()
+                .rotate([34.5, 90])
+                .scale(900 / Math.PI)
+                .precision(0));
+        },
+        "clip point ordering": function(path) {
+          var line = d3.range(-90,  180,  10).map(function(x) { return [x, 20]; })
+             .concat(d3.range(170, -100, -10).map(function(x) { return [x,  0]; }))
+             .concat([[-90, 20]]);
+          path({type: "Polygon", coordinates: [line]});
+          assert.equal(testContext.buffer().filter(function(d) { return d.type === "moveTo"; }).length, 3);
+        }
+      }
+    },
+
+    "stereographic.precision(1)": {
+      topic: function() {
+        return d3.geo.path()
+            .context(testContext)
+            .projection(d3.geo.stereographic()
+              .precision(1));
+      },
+      "correctly resamples points on antimeridian": function(path) {
+        path({type: "LineString", coordinates: [[0, 90], [90, 0]]});
+        assert.deepEqual(testContext.buffer(), [
+          {type: "moveTo", x: 480, y: 100},
+          {type: "lineTo", x: 509, y: 103},
+          {type: "lineTo", x: 537, y: 111},
+          {type: "lineTo", x: 563, y: 125},
+          {type: "lineTo", x: 586, y: 144},
+          {type: "lineTo", x: 605, y: 167},
+          {type: "lineTo", x: 619, y: 193},
+          {type: "lineTo", x: 627, y: 221},
+          {type: "lineTo", x: 630, y: 250}
+        ]);
+      }
+    },
+    "resampling near poles": {
+      topic: function() {
+        return d3.geo.path()
+            .context(testContext)
+            .projection(d3.geo.albers()
+              .scale(140)
+              .rotate([0, 0])
+              .precision(1));
+      },
+      "rotate([0, 0])": function(path) {
+        path({type: "LineString", coordinates: [[0, 88], [180, 89]]});
+        assert.isTrue(testContext.buffer().filter(function(d) { return d.type === "lineTo"; }).length > 1);
+        path({type: "LineString", coordinates: [[180, 90], [1, 89.5]]});
+        assert.isTrue(testContext.buffer().filter(function(d) { return d.type === "lineTo"; }).length > 1);
+      },
+      "rotate([11.5, 285])": function(path) {
+        try {
+          path.projection().rotate([11.5, 285]);
+          path({type: "LineString", coordinates: [[170, 20], [170, 0]]});
+          assert.isTrue(testContext.buffer().filter(function(d) { return d.type === "lineTo"; }).length > 1);
+        } finally {
+          path.projection().rotate([0, 0]);
+        }
+      }
+    },
+    "rotate([0, 0, 0])": {
+      "longitudes wrap at ±180°": function(path) {
+        path({type: "Point", coordinates: [180 + 1e-6, 0]});
+        assert.deepEqual(testContext.buffer(), [{type: "moveTo", x: -420, y: 250}, {type: "arc", x: -420, y: 250, r: 4.5}]);
+      }
+    }
+  }
+});
+
+var testBuffer = [];
+
+var testContext = {
+  arc: function(x, y, r, a0, a1) { testBuffer.push({type: "arc", x: Math.round(x), y: Math.round(y), r: r}); },
+  moveTo: function(x, y) { testBuffer.push({type: "moveTo", x: Math.round(x), y: Math.round(y)}); },
+  lineTo: function(x, y) { testBuffer.push({type: "lineTo", x: Math.round(x), y: Math.round(y)}); },
+  closePath: function() { testBuffer.push({type: "closePath"}); },
+  buffer: function() { var result = testBuffer; testBuffer = []; return result; }
+};
+
+function feature(o) {
+  return {type: "Feature", geometry: o};
+}
+
+function stripes(a, b) {
+  return {type: "Polygon", coordinates: [a, b].map(function(d, i) {
+    var stripe = d3.range(-180, 180, 1).map(function(x) { return [x, d]; });
+    stripe.push(stripe[0]);
+    return i ? stripe.reverse() : stripe;
+  })};
+}
+
+var antarctica = {type: "Polygon", coordinates: [[[-58.61414,-64.15246],[-59.04507,-64.36800],[-59.78934,-64.21122],[-60.61192,-64.30920],[-61.29741,-64.54432],[-62.02210,-64.79909],[-62.51176,-65.09302],[-62.64885,-65.48494],[-62.59012,-65.85721],[-62.12007,-66.19032],[-62.80556,-66.42550],[-63.74569,-66.50384],[-64.29410,-66.83700],[-64.88169,-67.15047],[-65.50842,-67.58161],[-65.66508,-67.95388],[-65.31254,-68.36533],[-64.78371,-68.67890],[-63.96110,-68.91398],[-63.19729,-69.22755],[-62.78595,-69.61941],[-62.57051,-69.99174],[-62.27673,-70.38366],[-61.80666,-70.71676],[-61.51290,-71.08904],[-61.37580,-72.01007],[-61.08197,-72.38235],[-61.00366,-72.77426],[-60.69026,-73.16617],[-60.82736,-73.69524],[-61.37580,-74.10674],[-61.96336,-74.43984],[-63.29520,-74.57699],[-63.74569,-74.92974],[-64.35283,-75.26284],[-65.86098,-75.63512],[-67.19281,-75.79191],[-68.44628,-76.00745],[-69.79772,-76.22299],[-70.60072,-76.63449],[-72.20677,-76.67366],[-73.96953,-76.63449],[-75.55597,-76.71288],[-77.24037,-76.71288],[-76.92697,-77.10480],[-75.39929,-77.28106],[-74.28287,-77.55542],[-73.65611,-77.90811],[-74.77253,-78.22163],[-76.49610,-78.12365],[-77.92585,-78.37841],[-77.98466,-78.78991],[-78.02378,-79.18183],[-76.84863,-79.51493],[-76.63322,-79.88721],[-75.36009,-80.25954],[-73.24485,-80.41633],[-71.44294,-80.69062],[-70.01316,-81.00415],[-68.19164,-81.31767],[-65.70427,-81.47445],[-63.25603,-81.74875],[-61.55202,-82.04269],[-59.69141,-82.37585],[-58.71212,-82.84610],[-58.22248,-83.21843],[-57.00811,-82.86569],[-55.36289,-82.57175],[-53.61977,-82.25823],[-51.54364,-82.00352],[-49.76134,-81.72917],[-47.27393,-81.70958],[-44.82570,-81.84673],[-42.80836,-82.08191],[-42.16202,-81.65082],[-40.77143,-81.35689],[-38.24481,-81.33730],[-36.26666,-81.12171],[-34.38639,-80.90617],[-32.31029,-80.76902],[-30.09709,-80.59265],[-28.54980,-80.33793],[-29.25490,-79.98519],[-29.68580,-79.63250],[-29.68580,-79.26022],[-31.62480,-79.29939],[-33.68132,-79.45613],[-35.63991,-79.45613],[-35.91410,-79.08385],[-35.77700,-78.33924],[-35.32654,-78.12365],[-33.89676,-77.88852],[-32.21236,-77.65345],[-30.99805,-77.35951],[-29.78373,-77.06557],[-28.88277,-76.67366],[-27.51175,-76.49734],[-26.16033,-76.36014],[-25.47482,-76.28180],[-23.92755,-76.24258],[-22.45859,-76.10543],[-21.22469,-75.90947],[-20.01037,-75.67434],[-18.91354,-75.43921],[-17.52298,-75.12569],[-16.64158,-74.79253],[-15.70149,-74.49860],[-15.40771,-74.10674],[-16.46532,-73.87161],[-16.11278,-73.46011],[-15.44685,-73.14654],[-14.40880,-72.95058],[-13.31197,-72.71545],[-12.29350,-72.40193],[-11.51006,-72.01007],[-11.02043,-71.53976],[-10.29577,-71.26541],[-9.10101,-71.32422],[-8.61138,-71.65733],[-7.41662,-71.69650],[-7.37745,-71.32422],[-6.86823,-70.93231],[-5.79098,-71.03028],[-5.53637,-71.40261],[-4.34166,-71.46137],[-3.04898,-71.28505],[-1.79549,-71.16743],[-0.65948,-71.22624],[-0.22863,-71.63774],[0.86819,-71.30463],[1.88668,-71.12826],[3.02263,-70.99111],[4.13905,-70.85391],[5.15754,-70.61878],[6.27391,-70.46205],[7.13571,-70.24651],[7.74286,-69.89376],[8.48711,-70.14853],[9.52513,-70.01133],[10.24984,-70.48163],[10.81782,-70.83433],[11.95382,-70.63837],[12.40428,-70.24651],[13.42277,-69.97216],[14.73499,-70.03091],[15.12675,-70.40324],[15.94934,-70.03091],[17.02658,-69.91335],[18.20171,-69.87418],[19.25937,-69.89376],[20.37573,-70.01133],[21.45298,-70.07014],[21.92303,-70.40324],[22.56940,-70.69718],[23.66618,-70.52081],[24.84135,-70.48163],[25.97730,-70.48163],[27.09372,-70.46205],[28.09258,-70.32485],[29.15024,-70.20728],[30.03158,-69.93293],[30.97173,-69.75661],[31.99017,-69.65864],[32.75405,-69.38429],[33.30244,-68.83564],[33.87041,-68.50258],[34.90849,-68.65927],[35.30020,-69.01201],[36.16201,-69.24714],[37.20003,-69.16874],[37.90510,-69.52144],[38.64940,-69.77620],[39.66789,-69.54107],[40.02043,-69.10994],[40.92135,-68.93362],[41.95943,-68.60051],[42.93870,-68.46331],[44.11387,-68.26740],[44.89729,-68.05186],[45.71992,-67.81673],[46.50334,-67.60119],[47.44344,-67.71875],[48.34441,-67.36606],[48.99073,-67.09171],[49.93088,-67.11130],[50.75347,-66.87617],[50.94932,-66.52348],[51.79154,-66.24913],[52.61413,-66.05317],[53.61303,-65.89639],[54.53355,-65.81804],[55.41494,-65.87680],[56.35504,-65.97478],[57.15809,-66.24913],[57.25596,-66.68021],[58.13736,-67.01332],[58.74450,-67.28767],[59.93931,-67.40523],[60.60522,-67.67958],[61.42780,-67.95388],[62.38748,-68.01269],[63.19048,-67.81673],[64.05234,-67.40523],[64.99244,-67.62072],[65.97171,-67.73834],[66.91186,-67.85590],[67.89113,-67.93430],[68.89003,-67.93430],[69.71262,-68.97279],[69.67345,-69.22755],[69.55594,-69.67822],[68.59625,-69.93293],[67.81273,-70.30526],[67.94988,-70.69718],[69.06630,-70.67754],[68.92915,-71.06945],[68.41998,-71.44178],[67.94988,-71.85328],[68.71376,-72.16680],[69.86930,-72.26478],[71.02489,-72.08841],[71.57328,-71.69650],[71.90628,-71.32422],[72.45462,-71.01070],[73.08141,-70.71676],[73.33602,-70.36402],[73.86487,-69.87418],[74.49155,-69.77620],[75.62755,-69.73703],[76.62646,-69.61941],[77.64490,-69.46268],[78.13453,-69.07076],[78.42837,-68.69844],[79.11385,-68.32621],[80.09312,-68.07150],[80.93534,-67.87554],[81.48379,-67.54238],[82.05176,-67.36606],[82.77642,-67.20928],[83.77533,-67.30726],[84.67620,-67.20928],[85.65552,-67.09171],[86.75235,-67.15047],[87.47701,-66.87617],[87.98628,-66.20991],[88.35841,-66.48426],[88.82840,-66.95456],[89.67063,-67.15047],[90.63036,-67.22886],[91.59009,-67.11130],[92.60853,-67.18969],[93.54863,-67.20928],[94.17541,-67.11130],[95.01759,-67.17011],[95.78147,-67.38565],[96.68239,-67.24850],[97.75964,-67.24850],[98.68020,-67.11130],[99.71818,-67.24850],[100.38418,-66.91534],[100.89335,-66.58223],[101.57889,-66.30788],[102.83241,-65.56328],[103.47867,-65.70048],[104.24255,-65.97478],[104.90845,-66.32752],[106.18156,-66.93493],[107.16088,-66.95456],[108.08139,-66.95456],[109.15863,-66.83700],[110.23583,-66.69980],[111.05847,-66.42550],[111.74395,-66.13156],[112.86037,-66.09234],[113.60467,-65.87680],[114.38808,-66.07276],[114.89730,-66.38628],[115.60238,-66.69980],[116.69916,-66.66063],[117.38470,-66.91534],[118.57946,-67.17011],[119.83292,-67.26808],[120.87099,-67.18969],[121.65441,-66.87617],[122.32036,-66.56265],[123.22129,-66.48426],[124.12227,-66.62146],[125.16024,-66.71938],[126.10039,-66.56265],[127.00142,-66.56265],[127.88276,-66.66063],[128.80328,-66.75861],[129.70425,-66.58223],[130.78145,-66.42550],[131.79994,-66.38628],[132.93589,-66.38628],[133.85646,-66.28830],[134.75738,-66.20996],[135.03158,-65.72007],[135.07075,-65.30857],[135.69748,-65.58286],[135.87380,-66.03359],[136.20670,-66.44509],[136.61804,-66.77819],[137.46027,-66.95456],[138.59622,-66.89576],[139.90844,-66.87617],[140.80942,-66.81736],[142.12169,-66.81736],[143.06184,-66.79778],[144.37406,-66.83700],[145.49042,-66.91534],[146.19555,-67.22886],[145.99969,-67.60119],[146.64606,-67.89513],[147.72326,-68.13025],[148.83962,-68.38502],[150.13231,-68.56129],[151.48370,-68.71812],[152.50224,-68.87481],[153.63819,-68.89450],[154.28456,-68.56129],[155.16585,-68.83564],[155.92979,-69.14921],[156.81113,-69.38429],[158.02552,-69.48226],[159.18101,-69.59983],[159.67069,-69.99174],[160.80665,-70.22687],[161.57047,-70.57961],[162.68689,-70.73635],[163.84243,-70.71676],[164.91968,-70.77552],[166.11443,-70.75593],[167.30909,-70.83433],[168.42561,-70.97148],[169.46358,-71.20666],[170.50166,-71.40261],[171.20679,-71.69650],[171.08922,-72.08841],[170.56042,-72.44115],[170.10995,-72.89182],[169.75736,-73.24452],[169.28732,-73.65601],[167.97510,-73.81280],[167.38748,-74.16549],[166.09480,-74.38104],[165.64439,-74.77295],[164.95885,-75.14528],[164.23419,-75.45880],[163.82279,-75.87030],[163.56823,-76.24258],[163.47026,-76.69330],[163.48989,-77.06557],[164.05787,-77.45744],[164.27336,-77.82977],[164.74346,-78.18251],[166.60412,-78.31961],[166.99578,-78.75074],[165.19387,-78.90748],[163.66621,-79.12302],[161.76638,-79.16224],[160.92416,-79.73048],[160.74789,-80.20073],[160.31696,-80.57306],[159.78821,-80.94539],[161.12001,-81.27850],[161.62928,-81.69000],[162.49099,-82.06227],[163.70533,-82.39543],[165.09594,-82.70895],[166.60412,-83.02247],[168.89566,-83.33599],[169.40478,-83.82589],[172.28393,-84.04143],[172.47704,-84.11791],[173.22408,-84.41371],[175.98567,-84.15899],[178.27721,-84.47251],[180.00000,-84.71338],[180.00000,-90.0],[-180.0,-90.0],[-180.0,-84.71338],[-179.94249,-84.72144],[-179.05867,-84.13941],[-177.25677,-84.45293],[-177.14080,-84.41794],[-176.86199,-84.33381],[-176.52395,-84.23181],[-176.23030,-84.14320],[-176.08467,-84.09925],[-175.93410,-84.10159],[-175.82988,-84.11791],[-174.38250,-84.53432],[-173.11655,-84.11791],[-172.88910,-84.06101],[-169.95122,-83.88464],[-168.99998,-84.11791],[-168.53019,-84.23739],[-167.02209,-84.57049],[-164.18214,-84.82520],[-161.92977,-85.13873],[-158.07137,-85.37391],[-155.19225,-85.09955],[-150.94209,-85.29551],[-148.53307,-85.60903],[-145.88891,-85.31510],[-143.10771,-85.04075],[-142.89227,-84.57049],[-146.82906,-84.53127],[-150.06073,-84.29614],[-150.90292,-83.90423],[-153.58620,-83.68868],[-153.40990,-83.23801],[-153.03775,-82.82652],[-152.66563,-82.45419],[-152.86151,-82.04269],[-154.52629,-81.76839],[-155.29017,-81.41565],[-156.83744,-81.10212],[-154.40878,-81.16093],[-152.09766,-81.00415],[-150.64829,-81.33730],[-148.86599,-81.04337],[-147.22074,-80.67104],[-146.41774,-80.33793],[-146.77028,-79.92643],[-148.06294,-79.65208],[-149.53190,-79.35820],[-151.58841,-79.29939],[-153.39032,-79.16224],[-155.32937,-79.06426],[-155.97566,-78.69193],[-157.26830,-78.37841],[-158.05176,-78.02567],[-158.36513,-76.88920],[-157.87547,-76.98723],[-156.97457,-77.30075],[-155.32937,-77.20272],[-153.74283,-77.06557],[-152.92024,-77.49666],[-151.33378,-77.39873],[-150.00194,-77.18314],[-148.74848,-76.90884],[-147.61248,-76.57573],[-146.10440,-76.47775],[-146.14352,-76.10543],[-146.49609,-75.73315],[-146.20230,-75.38041],[-144.90962,-75.20403],[-144.32203,-75.53719],[-142.79435,-75.34123],[-141.63876,-75.08647],[-140.20900,-75.06688],[-138.85759,-74.96891],[-137.50619,-74.73378],[-136.42890,-74.51824],[-135.21458,-74.30269],[-134.43119,-74.36145],[-133.74565,-74.43984],[-132.25716,-74.30269],[-130.92531,-74.47901],[-129.55428,-74.45943],[-128.24203,-74.32228],[-126.89062,-74.42026],[-125.40208,-74.51824],[-124.01149,-74.47901],[-122.56215,-74.49860],[-121.07361,-74.51824],[-119.70255,-74.47901],[-118.68414,-74.18508],[-117.46980,-74.02834],[-116.21631,-74.24389],[-115.02155,-74.06751],[-113.94433,-73.71482],[-113.29798,-74.02834],[-112.94545,-74.38104],[-112.29908,-74.71419],[-111.26105,-74.42026],[-110.06632,-74.79253],[-108.71490,-74.91010],[-107.55934,-75.18445],[-106.14914,-75.12569],[-104.87607,-74.94932],[-103.36794,-74.98849],[-102.01650,-75.12569],[-100.64553,-75.30201],[-100.11669,-74.87093],[-100.76304,-74.53782],[-101.25270,-74.18508],[-102.54533,-74.10674],[-103.11331,-73.73441],[-103.32875,-73.36208],[-103.68128,-72.61753],[-102.91748,-72.75467],[-101.60523,-72.81343],[-100.31252,-72.75467],[-99.13737,-72.91141],[-98.11888,-73.20534],[-97.68803,-73.55804],[-96.33659,-73.61684],[-95.04396,-73.47969],[-93.67290,-73.28374],[-92.43900,-73.16617],[-91.42056,-73.40130],[-90.08873,-73.32291],[-89.22695,-72.55872],[-88.42395,-73.00939],[-87.26833,-73.18576],[-86.01482,-73.08778],[-85.19223,-73.47969],[-83.87999,-73.51887],[-82.66564,-73.63643],[-81.47091,-73.85197],[-80.68744,-73.47969],[-80.29579,-73.12695],[-79.29688,-73.51887],[-77.92585,-73.42089],[-76.90736,-73.63643],[-76.22187,-73.96954],[-74.89004,-73.87161],[-73.85202,-73.65601],[-72.83353,-73.40130],[-71.61921,-73.26415],[-70.20904,-73.14654],[-68.93591,-73.00939],[-67.95662,-72.79385],[-67.36906,-72.48032],[-67.13403,-72.04924],[-67.25154,-71.63774],[-67.56494,-71.24583],[-67.91747,-70.85391],[-68.23084,-70.46205],[-68.48545,-70.10931],[-68.54420,-69.71739],[-68.44628,-69.32553],[-67.97623,-68.95320],[-67.58449,-68.54170],[-67.42784,-68.14984],[-67.62367,-67.71875],[-67.74118,-67.32684],[-67.25154,-66.87617],[-66.70318,-66.58223],[-66.05681,-66.20996],[-65.37132,-65.89639],[-64.56827,-65.60250],[-64.17654,-65.17142],[-63.62815,-64.89707],[-63.00139,-64.64230],[-62.04168,-64.58355],[-61.41492,-64.27003],[-60.70985,-64.07407],[-59.88726,-63.95651],[-59.16258,-63.70174],[-58.59455,-63.38822],[-57.81114,-63.27066],[-57.22358,-63.52542],[-57.59572,-63.85853],[-58.61414,-64.15246]]]};
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/projection-test.js b/static/demo/components/d3/test/geo/projection-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..3875d1a3a67fcd506920d74e5f76857c5d9398c5
--- /dev/null
+++ b/static/demo/components/d3/test/geo/projection-test.js
@@ -0,0 +1,21 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.projection");
+
+suite.addBatch({
+  "projection": {
+    topic: function() {
+      function forward(λ, φ) { return [λ, φ]; }
+      forward.invert = function(x, y) {}
+      return d3.geo.projection(forward);
+    },
+    "non-existent inverse": function(projection) {
+      assert.isUndefined(projection.invert([0, 0]));
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/stereographic-test.js b/static/demo/components/d3/test/geo/stereographic-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..4fb17dd8517350be3a18c2fdd650fd411cb574f1
--- /dev/null
+++ b/static/demo/components/d3/test/geo/stereographic-test.js
@@ -0,0 +1,57 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.stereographic");
+
+suite.addBatch({
+  "stereographic": {
+    topic: function() {
+      return d3.geo.stereographic().translate([0, 0]).scale(100);
+    },
+    "origin": function(projection) {
+      var coords = projection([0, 0]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 0, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 0, 1e-6);
+    },
+    "Arctic": function(projection) {
+      var coords = projection([0, 85]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], -91.633117, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    },
+    "Antarctic": function(projection) {
+      var coords = projection([0, -85]);
+      assert.inDelta(coords[0], 0, 1e-6);
+      assert.inDelta(coords[1], 91.633117, 1e-6);
+      var lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], -85, 1e-6);
+    },
+    "Hawaii": function(projection) {
+      var coords = projection([-180, 0]);
+      assert.equal(coords[0], -Infinity);
+      assert.isTrue(isNaN(coords[1]));
+    },
+    "Phillipines": function(projection) {
+      var coords = projection([180, 0]);
+      assert.equal(coords[0], Infinity);
+      assert.isTrue(isNaN(coords[1]));
+    },
+    "Inversion works for non-zero translation": function() {
+      var projection = d3.geo.stereographic().translate([123, 99]).scale(100),
+          coords = projection([0, 85]),
+          lonlat = projection.invert(coords);
+      assert.inDelta(lonlat[0], 0, 1e-6);
+      assert.inDelta(lonlat[1], 85, 1e-6);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geo/stream-test.js b/static/demo/components/d3/test/geo/stream-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..d0db3fb5a3e25e97e950b7f82b20e2936e24b258
--- /dev/null
+++ b/static/demo/components/d3/test/geo/stream-test.js
@@ -0,0 +1,261 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geo.stream");
+
+suite.addBatch({
+  "stream": {
+    topic: function() {
+      return d3.geo.stream;
+    },
+    "does not allow null input": function(stream) {
+      try {
+        stream(null);
+        assert.fail("expected error");
+      } catch (expected) {}
+    },
+    "ignores unknown types": function(stream) {
+      stream({type: "Unknown"}, {});
+      stream({type: "Feature", geometry: {type: "Unknown"}}, {});
+      stream({type: "FeatureCollection", features: [{type: "Feature", geometry: {type: "Unknown"}}]}, {});
+      stream({type: "GeometryCollection", geometries: [{type: "Unknown"}]}, {});
+    },
+    "returns void": function(stream) {
+      assert.isUndefined(stream({type: "Point", coordinates: [1, 2]}, {point: function() { return true; }}));
+    },
+    "allows empty multi-geometries": function(stream) {
+      stream({type: "MultiPoint", coordinates: []}, {});
+      stream({type: "MultiLineString", coordinates: []}, {});
+      stream({type: "MultiPolygon", coordinates: []}, {});
+    },
+    "Sphere ↦ sphere": function(stream) {
+      var calls = 0;
+      stream({type: "Sphere"}, {
+        sphere: function() {
+          ++calls;
+          assert.equal(arguments.length, 0);
+        }
+      });
+      assert.equal(calls, 1);
+    },
+    "Point ↦ point": function(stream) {
+      var calls = 0;
+      stream({type: "Point", coordinates: [1, 2]}, {
+        point: function(x, y) {
+          ++calls;
+          assert.equal(arguments.length, 2);
+          assert.equal(x, 1);
+          assert.equal(y, 2);
+        }
+      });
+      assert.equal(calls, 1);
+    },
+    "MultiPoint ↦ point*": function(stream) {
+      var calls = 0;
+      stream({type: "MultiPoint", coordinates: [[1, 2], [3, 4]]}, {
+        point: function(x, y) {
+          assert.equal(arguments.length, 2);
+          if (++calls === 1) {
+            assert.equal(x, 1);
+            assert.equal(y, 2);
+          } else {
+            assert.equal(x, 3);
+            assert.equal(y, 4);
+          }
+        }
+      });
+      assert.equal(calls, 2);
+    },
+    "LineString ↦ lineStart, point{2,}, lineEnd": function(stream) {
+      var calls = 0;
+      stream({type: "LineString", coordinates: [[1, 2], [3, 4]]}, {
+        lineStart: function() {
+          assert.equal(++calls, 1);
+          assert.equal(arguments.length, 0);
+        },
+        point: function(x, y) {
+          assert.equal(arguments.length, 2);
+          if (++calls === 2) {
+            assert.equal(x, 1);
+            assert.equal(y, 2);
+          } else if (calls === 3) {
+            assert.equal(x, 3);
+            assert.equal(y, 4);
+          } else {
+            assert.fail("too many points");
+          }
+        },
+        lineEnd: function() {
+          assert.equal(++calls, 4);
+          assert.equal(arguments.length, 0);
+        }
+      });
+      assert.equal(calls, 4);
+    },
+    "MultiLineString ↦ (lineStart, point{2,}, lineEnd)*": function(stream) {
+      var calls = 0;
+      stream({type: "MultiLineString", coordinates: [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]}, {
+        lineStart: function() {
+          ++calls;
+          assert.isTrue(calls === 1 || calls === 5);
+          assert.equal(arguments.length, 0);
+        },
+        point: function(x, y) {
+          ++calls;
+          assert.equal(arguments.length, 2);
+          if (calls === 2) {
+            assert.equal(x, 1);
+            assert.equal(y, 2);
+          } else if (calls === 3) {
+            assert.equal(x, 3);
+            assert.equal(y, 4);
+          } else if (calls === 6) {
+            assert.equal(x, 5);
+            assert.equal(y, 6);
+          } else if (calls === 7) {
+            assert.equal(x, 7);
+            assert.equal(y, 8);
+          } else {
+            assert.fail("too many points");
+          }
+        },
+        lineEnd: function() {
+          ++calls;
+          assert.isTrue(calls === 4 || calls === 8);
+          assert.equal(arguments.length, 0);
+        }
+      });
+      assert.equal(calls, 8);
+    },
+    "Polygon ↦ polygonStart, lineStart, point{2,}, lineEnd, polygonEnd": function(stream) {
+      var calls = 0;
+      stream({type: "Polygon", coordinates: [[[1, 2], [3, 4], [1, 2]], [[5, 6], [7, 8], [5, 6]]]}, {
+        polygonStart: function() {
+          ++calls;
+          assert.isTrue(calls === 1);
+          assert.equal(arguments.length, 0);
+        },
+        lineStart: function() {
+          ++calls;
+          assert.isTrue(calls === 2 || calls === 6);
+          assert.equal(arguments.length, 0);
+        },
+        point: function(x, y) {
+          ++calls;
+          assert.equal(arguments.length, 2);
+          if (calls === 3) {
+            assert.equal(x, 1);
+            assert.equal(y, 2);
+          } else if (calls === 4) {
+            assert.equal(x, 3);
+            assert.equal(y, 4);
+          } else if (calls === 7) {
+            assert.equal(x, 5);
+            assert.equal(y, 6);
+          } else if (calls === 8) {
+            assert.equal(x, 7);
+            assert.equal(y, 8);
+          } else {
+            assert.fail("too many points");
+          }
+        },
+        lineEnd: function() {
+          ++calls;
+          assert.isTrue(calls === 5 || calls === 9);
+          assert.equal(arguments.length, 0);
+        },
+        polygonEnd: function() {
+          ++calls;
+          assert.isTrue(calls === 10);
+          assert.equal(arguments.length, 0);
+        }
+      });
+      assert.equal(calls, 10);
+    },
+    "MultiPolygon ↦ (polygonStart, lineStart, point{2,}, lineEnd, polygonEnd)*": function(stream) {
+      var calls = 0;
+      stream({type: "MultiPolygon", coordinates: [[[[1, 2], [3, 4], [1, 2]]], [[[5, 6], [7, 8], [5, 6]]]]}, {
+        polygonStart: function() {
+          ++calls;
+          assert.isTrue(calls === 1 || calls === 7);
+          assert.equal(arguments.length, 0);
+        },
+        lineStart: function() {
+          ++calls;
+          assert.isTrue(calls === 2 || calls === 8);
+          assert.equal(arguments.length, 0);
+        },
+        point: function(x, y) {
+          ++calls;
+          assert.equal(arguments.length, 2);
+          if (calls === 3) {
+            assert.equal(x, 1);
+            assert.equal(y, 2);
+          } else if (calls === 4) {
+            assert.equal(x, 3);
+            assert.equal(y, 4);
+          } else if (calls === 9) {
+            assert.equal(x, 5);
+            assert.equal(y, 6);
+          } else if (calls === 10) {
+            assert.equal(x, 7);
+            assert.equal(y, 8);
+          } else {
+            assert.fail("too many points");
+          }
+        },
+        lineEnd: function() {
+          ++calls;
+          assert.isTrue(calls === 5 || calls === 11);
+          assert.equal(arguments.length, 0);
+        },
+        polygonEnd: function() {
+          ++calls;
+          assert.isTrue(calls === 6 || calls === 12);
+          assert.equal(arguments.length, 0);
+        }
+      });
+      assert.equal(calls, 12);
+    },
+    "Feature ↦ .*": function(stream) {
+      var calls = 0;
+      stream({type: "Feature", geometry: {type: "Point", coordinates: [1, 2]}}, {
+        point: function(x, y) {
+          ++calls;
+          assert.equal(arguments.length, 2);
+          assert.equal(x, 1);
+          assert.equal(y, 2);
+        }
+      });
+      assert.equal(calls, 1);
+    },
+    "FeatureCollection ↦ .*": function(stream) {
+      var calls = 0;
+      stream({type: "FeatureCollection", features: [{type: "Feature", geometry: {type: "Point", coordinates: [1, 2]}}]}, {
+        point: function(x, y) {
+          ++calls;
+          assert.equal(arguments.length, 2);
+          assert.equal(x, 1);
+          assert.equal(y, 2);
+        }
+      });
+      assert.equal(calls, 1);
+    },
+    "GeometryCollection ↦ .*": function(stream) {
+      var calls = 0;
+      stream({type: "GeometryCollection", geometries: [{type: "Point", coordinates: [1, 2]}]}, {
+        point: function(x, y) {
+          ++calls;
+          assert.equal(arguments.length, 2);
+          assert.equal(x, 1);
+          assert.equal(y, 2);
+        }
+      });
+      assert.equal(calls, 1);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geom/polygon-test.js b/static/demo/components/d3/test/geom/polygon-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..2e5963f2dd1d70c5d99dde0727c3a20b5d3c0847
--- /dev/null
+++ b/static/demo/components/d3/test/geom/polygon-test.js
@@ -0,0 +1,95 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geom.polygon");
+
+suite.addBatch({
+  "closed counterclockwise unit square": {
+    topic: function() {
+      return d3.geom.polygon([[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]);
+    },
+    "has area 1": function(polygon) {
+      assert.equal(polygon.area(), 1);
+    },
+    "has centroid ⟨.5,.5⟩": function(polygon) {
+      assert.deepEqual(polygon.centroid(), [.5, .5]);
+    }
+  },
+  "closed clockwise unit square": {
+    topic: function() {
+      return d3.geom.polygon([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]);
+    },
+    "has area 1": function(polygon) {
+      assert.equal(polygon.area(), -1);
+    },
+    "has centroid ⟨.5,.5⟩": function(polygon) {
+      assert.deepEqual(polygon.centroid(), [.5, .5]);
+    }
+  },
+  "closed clockwise triangle": {
+    topic: function() {
+      return d3.geom.polygon([[1, 1], [3, 2], [2, 3], [1, 1]]);
+    },
+    "has area 1.5": function(polygon) {
+      assert.equal(polygon.area(), -1.5);
+    },
+    "has centroid ⟨2,2⟩": function(polygon) {
+      var centroid = polygon.centroid();
+      assert.inDelta(centroid[0], 2, 1e-6);
+      assert.inDelta(centroid[1], 2, 1e-6);
+    }
+  },
+  "open counterclockwise unit square": {
+    topic: function() {
+      return d3.geom.polygon([[0, 0], [0, 1], [1, 1], [1, 0]]);
+    },
+    "has area 1": function(polygon) {
+      assert.equal(polygon.area(), 1);
+    },
+    "has centroid ⟨.5,.5⟩": function(polygon) {
+      assert.deepEqual(polygon.centroid(), [.5, .5]);
+    }
+  },
+  "open clockwise unit square": {
+    topic: function() {
+      return d3.geom.polygon([[0, 0], [1, 0], [1, 1], [0, 1]]);
+    },
+    "has area 1": function(polygon) {
+      assert.equal(polygon.area(), -1);
+    },
+    "has centroid ⟨.5,.5⟩": function(polygon) {
+      assert.deepEqual(polygon.centroid(), [.5, .5]);
+    }
+  },
+  "open clockwise triangle": {
+    topic: function() {
+      return d3.geom.polygon([[1, 1], [3, 2], [2, 3]]);
+    },
+    "has area 1.5": function(polygon) {
+      assert.equal(polygon.area(), -1.5);
+    },
+    "has centroid ⟨2,2⟩": function(polygon) {
+      var centroid = polygon.centroid();
+      assert.inDelta(centroid[0], 2, 1e-6);
+      assert.inDelta(centroid[1], 2, 1e-6);
+    }
+  },
+  "large square": {
+    topic: function() {
+      var r = 1e8,
+          d = d3.range(0, r, r / 1e4);
+      return d3.geom.polygon(
+          d.map(function(y) { return [0, y]; }).concat(
+          d.map(function(x) { return [x, r]; })).concat(
+          d.map(function(y) { return [r, y]; }).reverse()).concat(
+          d.map(function(x) { return [x, 0]; }).reverse()));
+    },
+    "has area 1e16 - 5e7": function(polygon) {
+      assert.equal(polygon.area(), 1e16 - 5e7);
+    }
+  },
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geom/quadtree-test.js b/static/demo/components/d3/test/geom/quadtree-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..b76c856174e4c7686770e337b19047cc9ac28b6f
--- /dev/null
+++ b/static/demo/components/d3/test/geom/quadtree-test.js
@@ -0,0 +1,88 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geom.quadtree");
+
+suite.addBatch({
+  "can create an empty quadtree": function() {
+    var q = d3.geom.quadtree([], 8, 10, 56, 47),
+        n = 0;
+    q.visit(function(node, x1, y1, x2, y2) {
+      assert.isNull(node.point);
+      assert.isUndefined(node[0]);
+      assert.isUndefined(node[1]);
+      assert.isUndefined(node[2]);
+      assert.isUndefined(node[3]);
+      assert.isTrue(node.leaf);
+      ++n;
+    });
+    assert.strictEqual(n, 1, "number of visits");
+  },
+  "squarifies the input dimensions": function() {
+    var ox1 = 8,
+        oy1 = 10,
+        ox2 = 56,
+        oy2 = 47,
+        q = d3.geom.quadtree([], ox1, oy1, ox2, oy2),
+        n = 0;
+    q.visit(function(node, x1, y1, x2, y2) {
+      assert.strictEqual(x1, ox1);
+      assert.strictEqual(y1, oy1);
+      assert.strictEqual(x2, Math.max(ox2 - ox1, oy2 - oy1) + x1);
+      assert.strictEqual(y2, Math.max(ox2 - ox1, oy2 - oy1) + y1);
+      ++n;
+    });
+    assert.strictEqual(n, 1, "number of visits");
+  },
+  "with three arguments, x1 and y1 are 0,0": function() {
+    var dx = 56,
+        dy = 47,
+        q = d3.geom.quadtree([], dx, dy),
+        n = 0;
+    q.visit(function(node, x1, y1, x2, y2) {
+      assert.strictEqual(x1, 0);
+      assert.strictEqual(y1, 0);
+      assert.strictEqual(x2, Math.max(dx, dy));
+      assert.strictEqual(y2, Math.max(dx, dy));
+      ++n;
+    });
+    assert.strictEqual(n, 1, "number of visits");
+  },
+  "visit": {
+    "uses pre-order traversal": function() {
+      var a = {x: 100, y: 100},
+          b = {x: 200, y: 200},
+          c = {x: 300, y: 300},
+          q = d3.geom.quadtree([a, b, c], 960, 500),
+          expected = [
+            {point: null, x1:   0, y1:   0, x2: 960, y2: 960},
+            {point: null, x1:   0, y1:   0, x2: 480, y2: 480},
+            {point: null, x1:   0, y1:   0, x2: 240, y2: 240},
+            {point:    a, x1:   0, y1:   0, x2: 120, y2: 120},
+            {point:    b, x1: 120, y1: 120, x2: 240, y2: 240},
+            {point:    c, x1: 240, y1: 240, x2: 480, y2: 480}
+          ];
+      q.visit(function(node, x1, y1, x2, y2) {
+        assert.deepEqual({point: node.point, x1: x1, y1: y1, x2: x2, y2: y2}, expected.shift());
+        assert.equal(!!node.point, node.leaf);
+      });
+      assert.isEmpty(expected);
+    },
+    "does not recurse if the callback returns truthy": function() {
+      var a = {x: 100, y: 100},
+          b = {x: 700, y: 700},
+          c = {x: 800, y: 800},
+          q = d3.geom.quadtree([a, b, c], 960, 500),
+          n = 0;
+      q.visit(function(node, x1, y1, x2, y2) {
+        ++n;
+        return x1 > 0;
+      });
+      assert.equal(n, 3);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/geom/voronoi-test.js b/static/demo/components/d3/test/geom/voronoi-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..8aae1ad5cd493a759263a15194cf67ddac728d17
--- /dev/null
+++ b/static/demo/components/d3/test/geom/voronoi-test.js
@@ -0,0 +1,46 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.geom.voronoi");
+
+suite.addBatch({
+  "voronoi": {
+    "with zero points": {
+      "returns the empty array": function() {
+        assert.deepEqual(d3.geom.voronoi([]), []);
+      }
+    },
+    "with one point": {
+      "returns the semi-infinite bounding box": function() {
+        assert.deepEqual(d3.geom.voronoi([[50, 50]], 100, 100), [[[-1000000,-1000000],[-1000000,1000000],[1000000,1000000],[1000000,-1000000]]]);
+      }
+    },
+    "with two points": {
+      "separated by a line at 90° (vertical)": function() {
+        assert.deepEqual(d3.geom.voronoi([[50, 25], [50, 75]], 100, 100), [[[-1000000,50],[1000000,50],[-1000000,-1000000],[1000000,-1000000]],[[-1000000,50],[1000000,50],[-1000000,1000000],[1000000,1000000]]]);
+        assert.deepEqual(d3.geom.voronoi([[50, 75], [50, 25]], 100, 100), [[[-1000000,50],[1000000,50],[-1000000,1000000],[1000000,1000000]],[[-1000000,50],[1000000,50],[-1000000,-1000000],[1000000,-1000000]]]);
+      },
+      "separated by a line at 0° (horizontal)": function() {
+        assert.deepEqual(d3.geom.voronoi([[25, 50], [75, 50]], 100, 100), [[[50,1000000],[50,-1000000],[-1000000,-1000000],[-1000000,1000000]],[[50,-1000000],[50,1000000],[1000000,-1000000],[1000000,1000000]]]);
+        assert.deepEqual(d3.geom.voronoi([[75, 50], [25, 50]], 100, 100), [[[50,-1000000],[50,1000000],[1000000,-1000000],[1000000,1000000]],[[50,1000000],[50,-1000000],[-1000000,-1000000],[-1000000,1000000]]]);
+      },
+      "separated by a line at 45° (diagonal)": function() {
+        assert.deepEqual(d3.geom.voronoi([[25, 25], [75, 75]], 100, 100), [[[-999900,1000000],[1000100,-1000000],[-1000000,-1000000]],[[-999900,1000000],[1000100,-1000000],[1000000,1000000]]]);
+        assert.deepEqual(d3.geom.voronoi([[75, 25], [25, 75]], 100, 100), [[[-1000000,-1000000],[1000000,1000000],[1000000,-1000000]],[[-1000000,-1000000],[1000000,1000000],[-1000000,1000000]]]);
+      },
+      "separated by an arbitrary diagonal": function() {
+        assert.deepEqual(d3.geom.voronoi([[25, 25], [50, 75]], 100, 100), [[[-1000000,500068.75],[1000000,-499931.25],[-1000000,-1000000],[1000000,-1000000]],[[-1000000,500068.75],[1000000,-499931.25],[-1000000,1000000],[1000000,1000000]]]);
+        assert.deepEqual(d3.geom.voronoi([[25, 25], [75, 50]], 100, 100), [[[-499931.25,1000000],[500068.75,-1000000],[-1000000,1000000],[1000000,1000000]], [[-499931.25,1000000],[500068.75,-1000000],[-1000000,-1000000],[1000000,-1000000]]]);
+      }
+    },
+    "with three points": {
+      "collinear": function() {
+        assert.deepEqual(d3.geom.voronoi([[25, 25], [50, 50], [75, 75]], 100, 100), [[[-999925,1000000],[1000075,-1000000],[-1000000,-1000000]],[[-999925,1000000],[-999875,1000000],[1000125,-1000000],[1000075,-1000000]],[[-999875,1000000],[1000125,-1000000],[1000000,1000000]]]);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/layout/cluster-test.js b/static/demo/components/d3/test/layout/cluster-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..dd3d36a1fd2f371ea93ff8d36174dea7708290e9
--- /dev/null
+++ b/static/demo/components/d3/test/layout/cluster-test.js
@@ -0,0 +1,42 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.layout.cluster");
+
+suite.addBatch({
+  "cluster": {
+    topic: d3.layout.cluster,
+    "can handle an empty children array": function(cluster) {
+      assert.deepEqual(cluster.nodes({value: 1, children: [{value: 1, children: []}, {value: 1}]}).map(layout), [
+        {value: 1, depth: 0, x: 0.5,  y: 0},
+        {value: 1, depth: 1, x: 0.25, y: 1},
+        {value: 1, depth: 1, x: 0.75, y: 1}
+      ]);
+    },
+    "can handle zero-valued nodes": function(cluster) {
+      assert.deepEqual(cluster.nodes({value: 0, children: [{value: 0}, {value: 1}]}).map(layout), [
+        {value: 0, depth: 0, x: 0.5,  y: 0},
+        {value: 0, depth: 1, x: 0.25, y: 1},
+        {value: 1, depth: 1, x: 0.75, y: 1}
+      ]);
+    },
+    "can handle a single node": function(cluster) {
+      assert.deepEqual(cluster.nodes({value: 0}).map(layout), [
+        {value: 0, depth: 0, x: 0.5,  y: 0}
+      ]);
+    }
+  }
+});
+
+function layout(node) {
+  return {
+    value: node.value,
+    depth: node.depth,
+    x: node.x,
+    y: node.y
+  };
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/layout/force-test.js b/static/demo/components/d3/test/layout/force-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..f911cc1b7a682148f0be494bbfdfbc75f36ba882
--- /dev/null
+++ b/static/demo/components/d3/test/layout/force-test.js
@@ -0,0 +1,114 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.layout.force");
+
+suite.addBatch({
+  "force": {
+    topic: d3.layout.force,
+
+    "friction": {
+      "defaults to .9": function(force) {
+        assert.equal(force.friction(), .9);
+      },
+      "can be a number": function(force) {
+        force.friction(.5);
+        assert.equal(force.friction(), .5);
+      },
+      "coerces to a number": function(force) {
+        force.friction(".5");
+        assert.strictEqual(force.friction(), .5);
+      }
+    },
+
+    "gravity": {
+      "defaults to .1": function(force) {
+        assert.equal(force.gravity(), .1);
+      },
+      "can be a number": function(force) {
+        force.gravity(.5);
+        assert.equal(force.gravity(), .5);
+      },
+      "coerces to a number": function(force) {
+        force.gravity(".5");
+        assert.strictEqual(force.gravity(), .5);
+      }
+    },
+
+    "theta": {
+      "defaults to .8": function(force) {
+        assert.equal(force.theta(), .8);
+      },
+      "can be a number": function(force) {
+        force.theta(.5);
+        assert.equal(force.theta(), .5);
+      },
+      "coerces to a number": function(force) {
+        force.theta(".5");
+        assert.strictEqual(force.theta(), .5);
+      }
+    },
+
+    "charge": {
+      "defaults to -30": function(force) {
+        assert.equal(force.charge(), -30);
+      },
+      "can be a number": function(force) {
+        force.charge(-40);
+        assert.equal(force.charge(), -40);
+      },
+      "can be a function": function(force) { // TODO expose the computed value?
+        force.charge(foo);
+        assert.equal(force.charge(), foo);
+      },
+      "coerces to a number": function(force) {
+        force.charge("-40");
+        assert.strictEqual(force.charge(), -40);
+      }
+    },
+
+    "linkDistance": {
+      "defaults to 20": function(force) {
+        assert.equal(force.linkDistance(), 20);
+      },
+      "can be a number": function(force) {
+        force.linkDistance(40);
+        assert.equal(force.linkDistance(), 40);
+      },
+      "can be a function": function(force) { // TODO expose the computed value?
+        force.linkDistance(foo);
+        assert.equal(force.linkDistance(), foo);
+      },
+      "coerces to a number": function(force) {
+        force.linkDistance("40");
+        assert.strictEqual(force.linkDistance(), 40);
+      }
+    },
+
+    "linkStrength": {
+      "defaults to 1": function(force) {
+        assert.equal(force.linkStrength(), 1);
+      },
+      "can be a number": function(force) {
+        force.linkStrength(.5);
+        assert.equal(force.linkStrength(), .5);
+      },
+      "can be a function": function(force) { // TODO expose the computed value?
+        force.linkStrength(foo);
+        assert.equal(force.linkStrength(), foo);
+      },
+      "coerces to a number": function(force) {
+        force.linkStrength(".5");
+        assert.strictEqual(force.linkStrength(), .5);
+      }
+    }
+  }
+});
+
+function foo(d) {
+  return d.foo;
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/layout/hierarchy-test.js b/static/demo/components/d3/test/layout/hierarchy-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..9680a81fc9bbf05ab2c4f9c041b4135ae12058c6
--- /dev/null
+++ b/static/demo/components/d3/test/layout/hierarchy-test.js
@@ -0,0 +1,28 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.layout.hierarchy");
+
+suite.addBatch({
+  "hierarchy": {
+    topic: function() {
+      return d3.layout.treemap(); // hierarchy is abstract, so test a subclass
+    },
+    "doesn't overwrite the value of a node that has an empty children array": function(hierarchy) {
+      var nodes = hierarchy.sticky(true).nodes({value: 1, children: []});
+      assert.equal(nodes[0].value, 1);
+      hierarchy.nodes(nodes[0]);
+      assert.equal(nodes[0].value, 1);
+    },
+    "a valueless node that has an empty children array gets a value of 0": function(hierarchy) {
+      var nodes = hierarchy.sticky(true).nodes({children: []});
+      assert.equal(nodes[0].value, 0);
+      hierarchy.nodes(nodes[0]);
+      assert.equal(nodes[0].value, 0);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/layout/histogram-test.js b/static/demo/components/d3/test/layout/histogram-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..ee92855630a3afc44de532b148503a9d53fb7f40
--- /dev/null
+++ b/static/demo/components/d3/test/layout/histogram-test.js
@@ -0,0 +1,95 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.layout.histogram");
+
+suite.addBatch({
+  "histogram": {
+    topic: function() {
+      return d3.layout.histogram;
+    },
+    "defaults to frequencies": function(histogram) {
+      var h = histogram();
+      assert.deepEqual(h([0,0,0,1,2,2]).map(elements), [[0, 0, 0], [], [1], [2, 2]]);
+    },
+    "each bin contains the matching source elements": function(histogram) {
+      var h = histogram();
+      assert.deepEqual(h([0,0,0,1,2,2]).map(elements), [[0, 0, 0], [], [1], [2, 2]]);
+    },
+    "each bin also has defined x, y and dx properties": function(histogram) {
+      var h = histogram();
+      assert.deepEqual(h([0,0,0,1,2,2]).map(metadata), [
+        {x:   0, y: 3, dx: 0.5},
+        {x: 0.5, y: 0, dx: 0.5},
+        {x:   1, y: 1, dx: 0.5},
+        {x: 1.5, y: 2, dx: 0.5}
+      ]);
+    },
+    "can output frequencies": function(histogram) {
+      var h = histogram().frequency(true);
+      assert.deepEqual(h([0,0,0,1,2,2]).map(metadata), [
+        {x:   0, y: 3, dx: 0.5},
+        {x: 0.5, y: 0, dx: 0.5},
+        {x:   1, y: 1, dx: 0.5},
+        {x: 1.5, y: 2, dx: 0.5}
+      ]);
+    },
+    "can output probabilities": function(histogram) {
+      var h = histogram().frequency(false);
+      assert.deepEqual(h([0,0,0,1,2,2]).map(metadata), [
+        {x:   0, y: 3/6, dx: 0.5},
+        {x: 0.5, y:   0, dx: 0.5},
+        {x:   1, y: 1/6, dx: 0.5},
+        {x: 1.5, y: 2/6, dx: 0.5}
+      ]);
+    },
+    "can specify number of bins": function(histogram) {
+      var h = histogram().bins(2);
+      assert.deepEqual(h([0,0,0,1,2,2]).map(elements), [
+        [0, 0, 0],
+        [1, 2, 2]
+      ]);
+      assert.deepEqual(h([0,0,0,1,2,2]).map(metadata), [
+        {x: 0, y: 3, dx: 1},
+        {x: 1, y: 3, dx: 1}
+      ]);
+    },
+    "can specify bin thresholds": function(histogram) {
+      var h = histogram().bins([0,1,2,3]);
+      assert.deepEqual(h([0,0,0,1,2,2]).map(elements), [
+        [0, 0, 0],
+        [1],
+        [2, 2]
+      ]);
+      assert.deepEqual(h([0,0,0,1,2,2]).map(metadata), [
+        {x: 0, y: 3, dx: 1},
+        {x: 1, y: 1, dx: 1},
+        {x: 2, y: 2, dx: 1}
+      ]);
+    },
+    "returns the empty array with fewer than two bins": function(histogram) {
+      var h = histogram().bins([1]);
+      assert.deepEqual(h([0]), []);
+      var h = histogram().bins([]);
+      assert.deepEqual(h([0]), []);
+    }
+  }
+});
+
+function elements(bin) {
+  var array = [], i = -1, n = bin.length;
+  while (++i < n) array.push(bin[i]);
+  return array;
+}
+
+function metadata(bin) {
+  var metadata = {};
+  if ("x" in bin) metadata.x = bin.x;
+  if ("y" in bin) metadata.y = bin.y;
+  if ("dx" in bin) metadata.dx = bin.dx;
+  return metadata;
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/layout/pack-test.js b/static/demo/components/d3/test/layout/pack-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..f30898e0c638bc8b18b20938faf4dfa0c2329afa
--- /dev/null
+++ b/static/demo/components/d3/test/layout/pack-test.js
@@ -0,0 +1,91 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.layout.pack");
+
+suite.addBatch({
+  "pack": {
+    topic: d3.layout.pack,
+    "can handle an empty children array": function(pack) {
+      assert.deepEqual(pack.nodes({children: [{children: []}, {value: 1}]}).map(layout), [
+        {value: 1, depth: 0, x: 0.5, y: 0.5, r: 0.5},
+        {value: 0, depth: 1, x: 0.0, y: 0.5, r: 0.0},
+        {value: 1, depth: 1, x: 0.5, y: 0.5, r: 0.5}
+      ]);
+    },
+    "can handle zero-valued nodes": function(pack) {
+      assert.deepEqual(pack.nodes({children: [{value: 0}, {value: 1}]}).map(layout), [
+        {value: 1, depth: 0, x: 0.5, y: 0.5, r: 0.5},
+        {value: 0, depth: 1, x: 0.0, y: 0.5, r: 0.0},
+        {value: 1, depth: 1, x: 0.5, y: 0.5, r: 0.5}
+      ]);
+    },
+    "can handle small nodes": function() {
+      assert.deepEqual(d3.layout.pack().sort(null).nodes({children: [
+        {value: .01},
+        {value: 2},
+        {value: 2},
+        {value: 1}
+      ]}).map(layout), [
+        {y: 0.5, x: 0.5, value: 5.01, r: 0.5, depth: 0},
+        {y: 0.5084543199854831, x: 0.4682608366855136, value: 0.01, r: 0.016411496513964046, depth: 1},
+        {y: 0.5084543199854831, x: 0.7167659426883449, value: 2, r: 0.23209360948886723, depth: 1},
+        {y: 0.34256315498862167, x: 0.2832340573116551, value: 2, r: 0.23209360948886723, depth: 1},
+        {y: 0.7254154893606051, x: 0.38524055061025186, value: 1, r: 0.16411496513964044, depth: 1}
+      ]);
+      assert.deepEqual(d3.layout.pack().sort(null).nodes({children: [
+        {value: 2},
+        {value: 2},
+        {value: 1},
+        {value: .01}
+      ]}).map(layout), [
+        {y: 0.5, x: 0.5, value: 5.01, r: 0.5, depth: 0},
+        {y: 0.6274712284943809, x: 0.26624891409386664, value: 2, r: 0.23375108590613333, depth: 1},
+        {y: 0.6274712284943809, x: 0.7337510859061334, value: 2, r: 0.23375108590613333, depth: 1},
+        {y: 0.30406466355343187, x: 0.5, value: 1, r: 0.1652869779539461, depth: 1},
+        {y: 0.3878967195987758, x: 0.3386645534068854, value: 0.01, r: 0.01652869779539461, depth: 1}
+      ]);
+    },
+    "can handle residual floating point error": function(pack) {
+      var result = pack.nodes({children: [
+        {value: 0.005348322447389364},
+        {value: 0.8065882022492588},
+        {value: 0}
+      ]}).map(layout);
+      assert.isFalse(result.map(function(d) { return d.depth; }).some(isNaN));
+      assert.isFalse(result.map(function(d) { return d.value; }).some(isNaN));
+      assert.isFalse(result.map(function(d) { return d.x; }).some(isNaN));
+      assert.isFalse(result.map(function(d) { return d.y; }).some(isNaN));
+      assert.isFalse(result.map(function(d) { return d.r; }).some(isNaN));
+    },
+    "avoids coincident circles": function(pack) {
+      var result = pack({children: [
+        {children: [{value: 17010}, {value: 5842}, {value: 0}, {value: 0}]},
+        {children: [
+          {children: [{value: 721}, {value: 4294}, {value: 9800}, {value: 1314}, {value: 2220}]},
+          {value: 1759}, {value: 2165}, {value: 586}, {value: 3331}, {value: 772}, {value: 3322}
+        ]}
+      ]}).map(layout);
+      result.sort(function(a, b) {
+        return a.x < b.x && a.y < b.y ? -1 : 1;
+      });
+      assert.isFalse(result.slice(1).some(function(d, i) {
+        return d.x === result[i].x && d.y === result[i].y && d.value > 0;
+      }));
+    }
+  }
+});
+
+function layout(node) {
+  return {
+    value: node.value,
+    depth: node.depth,
+    r: node.r,
+    x: node.x,
+    y: node.y
+  };
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/layout/partition-test.js b/static/demo/components/d3/test/layout/partition-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..efdcccc508c9f3a5be7367d274a744c93f5a68a0
--- /dev/null
+++ b/static/demo/components/d3/test/layout/partition-test.js
@@ -0,0 +1,48 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.layout.partition");
+
+suite.addBatch({
+  "partition": {
+    topic: function() {
+      return d3.layout.partition;
+    },
+    "ignores zero values": function(partition) {
+      var p = partition().size([3, 3]);
+      assert.deepEqual(p.nodes({children: [{value: 1}, {value: 0}, {value: 2}, {children: [{value: 0}, {value: 0}]}]}).map(metadata), [
+        {x: 0, y: 0, dx: 3, dy: 1},
+        {x: 2, y: 1, dx: 1, dy: 1},
+        {x: 3, y: 1, dx: 0, dy: 1},
+        {x: 0, y: 1, dx: 2, dy: 1},
+        {x: 3, y: 1, dx: 0, dy: 1},
+        {x: 3, y: 2, dx: 0, dy: 1},
+        {x: 3, y: 2, dx: 0, dy: 1}
+      ]);
+    },
+    "can handle an empty children array": function(partition) {
+      var p = partition();
+      assert.deepEqual(p.nodes({children: []}).map(metadata), [
+        {x: 0, y: 0, dx: 1, dy: 1}
+      ]);
+      assert.deepEqual(p.nodes({children: [{children: []}, {value: 1}]}).map(metadata), [
+        {x: 0, y: 0,   dx: 1, dy: 0.5},
+        {x: 1, y: 0.5, dx: 0, dy: 0.5},
+        {x: 0, y: 0.5, dx: 1, dy: 0.5}
+      ]);
+    }
+  }
+});
+
+function metadata(node) {
+  var metadata = {};
+  if ("x" in node) metadata.x = node.x;
+  if ("y" in node) metadata.y = node.y;
+  if ("dx" in node) metadata.dx = node.dx;
+  if ("dy" in node) metadata.dy = node.dy;
+  return metadata;
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/layout/pie-test.js b/static/demo/components/d3/test/layout/pie-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..b6de069466d9bccd8ded6b958d1444332aeabadb
--- /dev/null
+++ b/static/demo/components/d3/test/layout/pie-test.js
@@ -0,0 +1,24 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.layout.pie");
+
+suite.addBatch({
+  "pie": {
+    topic: d3.layout.pie,
+    "arcs are in same order as original data": function(pie) {
+      assert.deepEqual(pie([5, 30, 15]).map(function(d) { return d.data; }), [
+        5, 30, 15
+      ]);
+      assert.deepEqual(pie([
+        84, 90, 48, 61, 58, 8, 6, 31, 45, 18
+      ]).map(function(d) { return d.data; }), [
+        84, 90, 48, 61, 58, 8, 6, 31, 45, 18
+      ]);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/layout/tree-test.js b/static/demo/components/d3/test/layout/tree-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..ad4c14b9de2bc38cf3f23316796abd2e9fd0281a
--- /dev/null
+++ b/static/demo/components/d3/test/layout/tree-test.js
@@ -0,0 +1,44 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.layout.tree");
+
+suite.addBatch({
+  "tree": {
+    topic: d3.layout.tree,
+    "can handle an empty children array": function(tree) {
+      assert.deepEqual(tree.nodes({children: []}).map(layout), [
+        {depth: 0, x: 0.5, y: 0}
+      ]);
+      assert.deepEqual(tree.nodes({children: [
+        {children: []},
+        {children: [{}]},
+        {children: [{}]}
+      ]}).map(layout), [
+        {depth: 0, x: .5,   y: 0},
+        {depth: 1, x: .125, y: 0.5},
+        {depth: 1, x: .375, y: 0.5},
+        {depth: 2, x: .375, y: 1},
+        {depth: 1, x: .875, y: 0.5},
+        {depth: 2, x: .875, y: 1}
+      ]);
+    },
+    "can handle a single node": function(tree) {
+      assert.deepEqual(tree.nodes({value: 0}).map(layout), [
+        {depth: 0, x: 0.5, y: 0}
+      ]);
+    }
+  }
+});
+
+function layout(node) {
+  return {
+    depth: node.depth,
+    x: node.x,
+    y: node.y
+  };
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/layout/treemap-test.js b/static/demo/components/d3/test/layout/treemap-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..01eadcfda71119af8c19e177f283299a019f7230
--- /dev/null
+++ b/static/demo/components/d3/test/layout/treemap-test.js
@@ -0,0 +1,184 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.layout.treemap");
+
+suite.addBatch({
+  "treemap": {
+    topic: function() {
+      return d3.layout.treemap;
+    },
+    "outputs a squarified treemap": function(treemap) {
+      var t = treemap().size([1000, 1000]).sort(null);
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 1000, dy: 1000},
+        {x: 0, y: 833, dx: 1000, dy: 167},
+        {x: 600, y: 0, dx: 400, dy: 833},
+        {x: 0, y: 0, dx: 600, dy: 833},
+        {x: 0, y: 555, dx: 600, dy: 278},
+        {x: 0, y: 0, dx: 600, dy: 555}
+      ]);
+    },
+    "sorts by value by default": function(treemap) {
+      var t = treemap().size([1000, 1000]);
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 1000, dy: 1000},
+        {x: 0, y: 0, dx: 333, dy: 500},
+        {x: 333, y: 0, dx: 667, dy: 500},
+        {x: 0, y: 500, dx: 1000, dy: 500},
+        {x: 0, y: 500, dx: 333, dy: 500},
+        {x: 333, y: 500, dx: 667, dy: 500}
+      ]);
+    },
+    "ignores zero values": function(treemap) {
+      var t = treemap().size([1000, 1000]).sort(null);
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: 0}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 1000, dy: 1000},
+        {x: 0, y: 833, dx: 1000, dy: 167},
+        {x: 1000, y: 0, dx: 0, dy: 833},
+        {x: 600, y: 0, dx: 400, dy: 833},
+        {x: 0, y: 0, dx: 600, dy: 833},
+        {x: 0, y: 555, dx: 600, dy: 278},
+        {x: 0, y: 0, dx: 600, dy: 555}
+      ]);
+    },
+    "ignores NaN values": function(treemap) {
+      var t = treemap().size([1000, 1000]).sort(null);
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: NaN}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 1000, dy: 1000},
+        {x: 0, y: 833, dx: 1000, dy: 167},
+        {x: 1000, y: 0, dx: 0, dy: 833},
+        {x: 600, y: 0, dx: 400, dy: 833},
+        {x: 0, y: 0, dx: 600, dy: 833},
+        {x: 0, y: 555, dx: 600, dy: 278},
+        {x: 0, y: 0, dx: 600, dy: 555}
+      ]);
+    },
+    "does not overflow empty size": function(treemap) {
+      var t = treemap().size([0, 0]).sort(null);
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 0, dy: 0},
+        {x: 0, y: 0, dx: 0, dy: 0},
+        {x: 0, y: 0, dx: 0, dy: 0},
+        {x: 0, y: 0, dx: 0, dy: 0},
+        {x: 0, y: 0, dx: 0, dy: 0},
+        {x: 0, y: 0, dx: 0, dy: 0}
+      ]);
+    },
+    "can specify padding as a number": function(treemap) {
+      var t = treemap().size([1000, 1000]).sort(null).padding(1);
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 1000, dy: 1000},
+        {x: 1, y: 833, dx: 998, dy: 166},
+        {x: 600, y: 1, dx: 399, dy: 832},
+        {x: 1, y: 1, dx: 599, dy: 832},
+        {x: 2, y: 555, dx: 597, dy: 277},
+        {x: 2, y: 2, dx: 597, dy: 553}
+      ]);
+    },
+    "can specify padding as an array": function(treemap) {
+      var t = treemap().size([1000, 1000]).sort(null).padding([1,2,3,4]);
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 1000, dy: 1000},
+        {x: 4, y: 831, dx: 994, dy: 166},
+        {x: 600, y: 1, dx: 398, dy: 830},
+        {x: 4, y: 1, dx: 596, dy: 830},
+        {x: 8, y: 553, dx: 590, dy: 275},
+        {x: 8, y: 2, dx: 590, dy: 551}
+      ]);
+    },
+    "can specify padding as null": function(treemap) {
+      var t = treemap().size([1000, 1000]).sort(null).padding(null);
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 1000, dy: 1000},
+        {x: 0, y: 833, dx: 1000, dy: 167},
+        {x: 600, y: 0, dx: 400, dy: 833},
+        {x: 0, y: 0, dx: 600, dy: 833},
+        {x: 0, y: 555, dx: 600, dy: 278},
+        {x: 0, y: 0, dx: 600, dy: 555}
+      ]);
+    },
+    "can specify padding as a function that returns a number": function(treemap) {
+      var t = treemap().size([1000, 1000]).sort(null).padding(function(d) { return d.depth; });
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 1000, dy: 1000},
+        {x: 0, y: 833, dx: 1000, dy: 167},
+        {x: 600, y: 0, dx: 400, dy: 833},
+        {x: 0, y: 0, dx: 600, dy: 833},
+        {x: 1, y: 555, dx: 598, dy: 277},
+        {x: 1, y: 1, dx: 598, dy: 554}
+      ]);
+    },
+    "can specify padding as a function that returns an array": function(treemap) {
+      var t = treemap().size([1000, 1000]).sort(null).padding(function(d) { return [d.depth,2,3,4]; });
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 1000, dy: 1000},
+        {x: 4, y: 831, dx: 994, dy: 166},
+        {x: 600, y: 0, dx: 398, dy: 831},
+        {x: 4, y: 0, dx: 596, dy: 831},
+        {x: 8, y: 552, dx: 590, dy: 276},
+        {x: 8, y: 1, dx: 590, dy: 551}
+      ]);
+    },
+    "can specify padding as a function that returns null": function(treemap) {
+      var t = treemap().size([1000, 1000]).sort(null).padding(function(d) { return d.depth & 1 ? null : 1; });
+      assert.deepEqual(t.nodes({children: [{value: 1}, {value: 2}, {children: [{value: 1}, {value: 2}]}]}).map(layout), [
+        {x: 0, y: 0, dx: 1000, dy: 1000},
+        {x: 1, y: 833, dx: 998, dy: 166},
+        {x: 600, y: 1, dx: 399, dy: 832},
+        {x: 1, y: 1, dx: 599, dy: 832},
+        {x: 1, y: 556, dx: 599, dy: 277},
+        {x: 1, y: 1, dx: 599, dy: 555}
+      ]);
+    },
+    "no negatively sized rectangles": function(treemap) {
+      var t = treemap().size([615, 500]).sort(function(a, b) { return a.value - b.value; }).padding(29),
+          data = [1, 9, 3, 15, 44, 28, 32, 41, 50, 60, 64, 75, 76, 84, 88, 100, 140, 142, 363, 657, 670, 822, 1173, 1189],
+          nodes = t.nodes({children: data.map(function(d) { return {value: d}; })}).map(layout);
+      assert.equal(nodes.filter(function(n) { return n.dx < 0 || n.dy < 0; }).length, 0);
+    },
+    "no overhanging rectangles": function(treemap) {
+      var t = treemap().size([100, 100]).sort(function(a, b) { return a.value - b.value; }),
+          data = [0, 0, 81681.85, 370881.9, 0, 0, 0, 255381.59, 0, 0, 0, 0, 0, 0, 0, 125323.95, 0, 0, 0, 186975.07, 185707.05, 267370.93, 0]
+          nodes = t.nodes({children: data.map(function(d) { return {value: d}; })}).map(layout);
+      assert.equal(nodes.filter(function(n) { return n.dx < 0 || n.dy < 0 || n.x + n.dx > 100 || n.y + n.dy > 100; }).length, 0);
+    },
+    "can handle an empty children array": function(treemap) {
+      assert.deepEqual(treemap().nodes({children: []}).map(layout), [
+        {x: 0, y: 0, dx: 1, dy: 1}
+      ]);
+      assert.deepEqual(treemap().nodes({children: [{children: []}, {value: 1}]}).map(layout), [
+        {x: 0, y: 0, dx: 1, dy: 1},
+        {x: 0, y: 0, dx: 0, dy: 1},
+        {x: 0, y: 0, dx: 1, dy: 1}
+      ]);
+    },
+    "slice-dice": function(treemap) {
+      assert.deepEqual(treemap().size([100, 10]).mode("slice-dice").nodes({children: [
+        {children: [{value: 1}, {value: 1}]},
+        {children: [{value: 1}, {value: 1}]}
+      ]}).map(layout), [
+        {x: 0, y: 0, dx: 100, dy: 10},
+        {x: 50, y: 0, dx: 50, dy: 10},
+        {x: 50, y: 5, dx: 50, dy: 5},
+        {x: 50, y: 0, dx: 50, dy: 5},
+        {x: 0, y: 0, dx: 50, dy: 10},
+        {x: 0, y: 5, dx: 50, dy: 5},
+        {x: 0, y: 0, dx: 50, dy: 5}
+      ]);
+    }
+  }
+});
+
+function layout(node) {
+  return {
+    x: node.x,
+    y: node.y,
+    dx: node.dx,
+    dy: node.dy
+  };
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/scale/category-test.js b/static/demo/components/d3/test/scale/category-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a07d5424619324784cd19f1db1ce60d0790a2469
--- /dev/null
+++ b/static/demo/components/d3/test/scale/category-test.js
@@ -0,0 +1,73 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.scale.category");
+
+suite.addBatch({
+  "category10": category(d3.scale.category10, 10),
+  "category20": category(d3.scale.category20, 20),
+  "category20b": category(d3.scale.category20b, 20),
+  "category20c": category(d3.scale.category20c, 20)
+});
+
+function category(category, n) {
+  return {
+    "is an ordinal scale": function() {
+      var x = category(), colors = x.range();
+      assert.lengthOf(x.domain(), 0);
+      assert.lengthOf(x.range(), n);
+      assert.equal(x(1), colors[0]);
+      assert.equal(x(2), colors[1]);
+      assert.equal(x(1), colors[0]);
+      var y = x.copy();
+      assert.deepEqual(y.domain(), x.domain());
+      assert.deepEqual(y.range(), x.range());
+      x.domain(d3.range(n));
+      for (var i = 0; i < n; ++i) assert.equal(x(i + n), x(i));
+      assert.equal(y(1), colors[0]);
+      assert.equal(y(2), colors[1]);
+    },
+    "each instance is isolated": function() {
+      var a = category(), b = category(), colors = a.range();
+      assert.equal(a(1), colors[0]);
+      assert.equal(b(2), colors[0]);
+      assert.equal(b(1), colors[1]);
+      assert.equal(a(1), colors[0]);
+    },
+    "contains the expected number of values in the range": function() {
+      var x = category();
+      assert.lengthOf(x.range(), n);
+    },
+    "each range value is distinct": function() {
+      var map = {}, count = 0, x = category();
+      x.range().forEach(function(v) {
+        if (!(v in map)) {
+          map[v] = ++count;
+        }
+      });
+      assert.equal(count, x.range().length);
+    },
+    "each range value is a hexadecimal color": function() {
+      var x = category();
+      x.range().forEach(function(v) {
+        assert.match(v, /#[0-9a-f]{6}/);
+        v = d3.rgb(v);
+        assert.isFalse(isNaN(v.r));
+        assert.isFalse(isNaN(v.g));
+        assert.isFalse(isNaN(v.b));
+      });
+    },
+    "no range values are very dark or very light": function() {
+      var x = category();
+      x.range().forEach(function(v) {
+        var c = d3.hsl(v);
+        assert.isTrue(c.l >= .34, "expected " + v + " to be lighter (l = " + c.l + ")");
+        assert.isTrue(c.l <= .89, "expected " + v + " to be darker (l = " + c.l + ")");
+      });
+    }
+  };
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/scale/identity-test.js b/static/demo/components/d3/test/scale/identity-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..866cba14b3f8d05dbc1220661a3e200e29970fa1
--- /dev/null
+++ b/static/demo/components/d3/test/scale/identity-test.js
@@ -0,0 +1,166 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.scale.identity");
+
+suite.addBatch({
+  "identity": {
+    topic: function() {
+      return d3.scale.identity;
+    },
+
+    "domain and range": {
+      "are identical": function(identity) {
+        var x = identity();
+        assert.strictEqual(x.domain, x.range);
+        assert.strictEqual(x.domain(), x.range());
+        var x = identity().domain([-10, 0, 100]);
+        assert.deepEqual(x.range(), [-10, 0, 100]);
+        var x = identity().range([-10, 0, 100]);
+        assert.deepEqual(x.domain(), [-10, 0, 100]);
+      },
+      "default to [0, 1]": function(identity) {
+        var x = identity();
+        assert.deepEqual(x.domain(), [0, 1]);
+        assert.deepEqual(x.range(), [0, 1]);
+        assert.strictEqual(x(.5), .5);
+      },
+      "coerce values to numbers": function(identity) {
+        var x = identity().domain([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.typeOf(x.domain()[0], "number");
+        assert.typeOf(x.domain()[1], "number");
+        assert.strictEqual(x.domain()[0], +new Date(1990, 0, 1));
+        assert.strictEqual(x.domain()[1], +new Date(1991, 0, 1));
+        assert.typeOf(x(new Date(1989, 09, 20)), "number");
+        assert.strictEqual(x(new Date(1989, 09, 20)), +new Date(1989, 09, 20));
+        var x = identity().domain(["0", "1"]);
+        assert.typeOf(x.domain()[0], "number");
+        assert.typeOf(x.domain()[1], "number");
+        assert.strictEqual(x(.5), .5);
+        var x = identity().domain([new Number(0), new Number(1)]);
+        assert.typeOf(x.domain()[0], "number");
+        assert.typeOf(x.domain()[1], "number");
+        assert.strictEqual(x(.5), .5);
+
+        var x = identity().range([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.typeOf(x.range()[0], "number");
+        assert.typeOf(x.range()[1], "number");
+        assert.strictEqual(x.range()[0], +new Date(1990, 0, 1));
+        assert.strictEqual(x.range()[1], +new Date(1991, 0, 1));
+        assert.typeOf(x(new Date(1989, 09, 20)), "number");
+        assert.strictEqual(x(new Date(1989, 09, 20)), +new Date(1989, 09, 20));
+        var x = identity().range(["0", "1"]);
+        assert.typeOf(x.range()[0], "number");
+        assert.typeOf(x.range()[1], "number");
+        assert.strictEqual(x(.5), .5);
+        var x = identity().range([new Number(0), new Number(1)]);
+        assert.typeOf(x.range()[0], "number");
+        assert.typeOf(x.range()[1], "number");
+        assert.strictEqual(x(.5), .5);
+      },
+      "can specify a polyidentity domain and range": function(identity) {
+        var x = identity().domain([-10, 0, 100]);
+        assert.deepEqual(x.domain(), [-10, 0, 100]);
+        assert.strictEqual(x(-5), -5);
+        assert.strictEqual(x(50), 50);
+        assert.strictEqual(x(75), 75);
+
+        var x = identity().range([-10, 0, 100]);
+        assert.deepEqual(x.range(), [-10, 0, 100]);
+        assert.strictEqual(x(-5), -5);
+        assert.strictEqual(x(50), 50);
+        assert.strictEqual(x(75), 75);
+      },
+      "do not affect the identity function": function(identity) {
+        var x = identity().domain([Infinity, NaN]);
+        assert.strictEqual(x(42), 42);
+        assert.strictEqual(x.invert(-42), -42);
+      }
+    },
+
+    "is the identity function": function(identity) {
+      var x = identity().domain([1, 2]);
+      assert.strictEqual(x(.5), .5);
+      assert.strictEqual(x(1), 1);
+      assert.strictEqual(x(1.5), 1.5);
+      assert.strictEqual(x(2), 2);
+      assert.strictEqual(x(2.5), 2.5);
+    },
+    "coerces input to a number": function(identity) {
+      var x = identity().domain([1, 2]);
+      assert.strictEqual(x("2"), 2);
+    },
+
+    "invert": {
+      "is the identity function": function(identity) {
+        var x = identity().domain([1, 2]);
+        assert.strictEqual(x.invert(.5), .5);
+        assert.strictEqual(x.invert(1), 1);
+        assert.strictEqual(x.invert(1.5), 1.5);
+        assert.strictEqual(x.invert(2), 2);
+        assert.strictEqual(x.invert(2.5), 2.5);
+      },
+      "coerces range value to numbers": function(identity) {
+        var x = identity().range(["0", "2"]);
+        assert.strictEqual(x.invert("1"), 1);
+        var x = identity().range([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.strictEqual(x.invert(new Date(1990, 6, 2, 13)), +new Date(1990, 6, 2, 13));
+        var x = identity().range(["#000", "#fff"]);
+        assert.isNaN(x.invert("#999"));
+      },
+      "coerces input to a number": function(identity) {
+        var x = identity().domain([1, 2]);
+        assert.strictEqual(x.invert("2"), 2);
+      }
+    },
+
+    "ticks": {
+      "generates ticks of varying degree": function(identity) {
+        var x = identity();
+        assert.deepEqual(x.ticks(1).map(x.tickFormat(1)), [0, 1]);
+        assert.deepEqual(x.ticks(2).map(x.tickFormat(2)), [0, .5, 1]);
+        assert.deepEqual(x.ticks(5).map(x.tickFormat(5)), [0, .2, .4, .6, .8, 1]);
+        assert.deepEqual(x.ticks(10).map(x.tickFormat(10)), [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]);
+        var x = identity().domain([1, 0]);
+        assert.deepEqual(x.ticks(1).map(x.tickFormat(1)), [0, 1]);
+        assert.deepEqual(x.ticks(2).map(x.tickFormat(2)), [0, .5, 1]);
+        assert.deepEqual(x.ticks(5).map(x.tickFormat(5)), [0, .2, .4, .6, .8, 1]);
+        assert.deepEqual(x.ticks(10).map(x.tickFormat(10)), [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]);
+      },
+      "formats ticks with the appropriate precision": function(identity) {
+        var x = identity().domain([.123456789, 1.23456789]);
+        assert.strictEqual(x.tickFormat(1)(x.ticks(1)[0]), "1");
+        assert.strictEqual(x.tickFormat(2)(x.ticks(2)[0]), "0.5");
+        assert.strictEqual(x.tickFormat(4)(x.ticks(4)[0]), "0.2");
+        assert.strictEqual(x.tickFormat(8)(x.ticks(8)[0]), "0.2");
+        assert.strictEqual(x.tickFormat(16)(x.ticks(16)[0]), "0.2");
+        assert.strictEqual(x.tickFormat(32)(x.ticks(32)[0]), "0.15");
+        assert.strictEqual(x.tickFormat(64)(x.ticks(64)[0]), "0.14");
+        assert.strictEqual(x.tickFormat(128)(x.ticks(128)[0]), "0.13");
+        assert.strictEqual(x.tickFormat(256)(x.ticks(256)[0]), "0.125");
+      }
+    },
+
+    "copy": {
+      "changes to the domain or range are isolated": function(identity) {
+        var x = identity(), y = x.copy();
+        x.domain([1, 2]);
+        assert.deepEqual(y.domain(), [0, 1]);
+        y.domain([2, 3]);
+        assert.deepEqual(x.domain(), [1, 2]);
+        assert.deepEqual(y.domain(), [2, 3]);
+
+        var x = identity(), y = x.copy();
+        x.range([1, 2]);
+        assert.deepEqual(y.range(), [0, 1]);
+        y.range([2, 3]);
+        assert.deepEqual(x.range(), [1, 2]);
+        assert.deepEqual(y.range(), [2, 3]);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/scale/linear-test.js b/static/demo/components/d3/test/scale/linear-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..ef20aa5cbd2bf54194364c775db8c4e89dfc7de6
--- /dev/null
+++ b/static/demo/components/d3/test/scale/linear-test.js
@@ -0,0 +1,276 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.scale.linear");
+
+suite.addBatch({
+  "linear": {
+    topic: function() {
+      return d3.scale.linear;
+    },
+
+    "domain": {
+      "defaults to [0, 1]": function(linear) {
+        var x = linear();
+        assert.deepEqual(x.domain(), [0, 1]);
+        assert.inDelta(x(.5), .5, 1e-6);
+      },
+      "coerces domain values to numbers": function(linear) {
+        var x = linear().domain([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(new Date(1989, 09, 20)), -.2, 1e-2);
+        assert.inDelta(x(new Date(1990, 00, 01)), 0, 1e-2);
+        assert.inDelta(x(new Date(1990, 02, 15)), .2, 1e-2);
+        assert.inDelta(x(new Date(1990, 04, 27)), .4, 1e-2);
+        assert.inDelta(x(new Date(1991, 00, 01)), 1, 1e-2);
+        assert.inDelta(x(new Date(1991, 02, 15)), 1.2, 1e-2);
+        var x = linear().domain(["0", "1"]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(.5), .5, 1e-6);
+        var x = linear().domain([new Number(0), new Number(1)]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(.5), .5, 1e-6);
+      },
+      "can specify a polylinear domain and range": function(linear) {
+        var x = linear().domain([-10, 0, 100]).range(["red", "white", "green"]);
+        assert.equal(x(-5), "#ff8080");
+        assert.equal(x(50), "#80c080");
+        assert.equal(x(75), "#40a040");
+      },
+      "the smaller of the domain or range is observed": function(linear) {
+        var x = linear().domain([-10, 0]).range(["red", "white", "green"]).clamp(true);
+        assert.equal(x(-5), "#ff8080");
+        assert.equal(x(50), "#ffffff");
+        var x = linear().domain([-10, 0, 100]).range(["red", "white"]).clamp(true);
+        assert.equal(x(-5), "#ff8080");
+        assert.equal(x(50), "#ffffff");
+      },
+      "an empty domain maps to the range start": function(linear) {
+        var x = linear().domain([0, 0]).range(["red", "green"]);
+        assert.equal(x(0), "#ff0000");
+        assert.equal(x(-1), "#ff0000");
+        assert.equal(x(1), "#ff0000");
+      }
+    },
+
+    "range": {
+      "defaults to [0, 1]": function(linear) {
+        var x = linear();
+        assert.deepEqual(x.range(), [0, 1]);
+        assert.inDelta(x.invert(.5), .5, 1e-6);
+      },
+      "does not coerce range to numbers": function(linear) {
+        var x = linear().range(["0", "2"]);
+        assert.equal(typeof x.range()[0], "string");
+        assert.equal(typeof x.range()[1], "string");
+      },
+      "can specify range values as colors": function(linear) {
+        var x = linear().range(["red", "blue"]);
+        assert.equal(x(.5), "#800080");
+        var x = linear().range(["#ff0000", "#0000ff"]);
+        assert.equal(x(.5), "#800080");
+        var x = linear().range(["#f00", "#00f"]);
+        assert.equal(x(.5), "#800080");
+        var x = linear().range([d3.rgb(255,0,0), d3.hsl(240,1,.5)]);
+        assert.equal(x(.5), "#800080");
+        var x = linear().range(["hsl(0,100%,50%)", "hsl(240,100%,50%)"]);
+        assert.equal(x(.5), "#800080");
+      },
+      "can specify range values as arrays or objects": function(linear) {
+        var x = linear().range([{color: "red"}, {color: "blue"}]);
+        assert.deepEqual(x(.5), {color: "#800080"});
+        var x = linear().range([["red"], ["blue"]]);
+        assert.deepEqual(x(.5), ["#800080"]);
+      }
+    },
+
+    "interpolate": {
+      "defaults to d3.interpolate": function(linear) {
+        var x = linear().range(["red", "blue"]);
+        assert.equal(x.interpolate(), d3.interpolate);
+        assert.equal(x(.5), "#800080");
+      },
+      "can specify a custom interpolator": function(linear) {
+        var x = linear().range(["red", "blue"]).interpolate(d3.interpolateHsl);
+        assert.equal(x(.5), "#ff00ff");
+      }
+    },
+
+    "clamp": {
+      "defaults to false": function(linear) {
+        var x = linear();
+        assert.isFalse(x.clamp());
+        assert.inDelta(x(-.5), -.5, 1e-6);
+        assert.inDelta(x(1.5), 1.5, 1e-6);
+      },
+      "can clamp to the domain": function(linear) {
+        var x = linear().clamp(true);
+        assert.inDelta(x(-.5), 0, 1e-6);
+        assert.inDelta(x(.5), .5, 1e-6);
+        assert.inDelta(x(1.5), 1, 1e-6);
+        var x = linear().domain([1, 0]).clamp(true);
+        assert.inDelta(x(-.5), 1, 1e-6);
+        assert.inDelta(x(.5), .5, 1e-6);
+        assert.inDelta(x(1.5), 0, 1e-6);
+      },
+      "can clamp to the range": function(linear) {
+        var x = linear().clamp(true);
+        assert.inDelta(x.invert(-.5), 0, 1e-6);
+        assert.inDelta(x.invert(.5), .5, 1e-6);
+        assert.inDelta(x.invert(1.5), 1, 1e-6);
+        var x = linear().range([1, 0]).clamp(true);
+        assert.inDelta(x.invert(-.5), 1, 1e-6);
+        assert.inDelta(x.invert(.5), .5, 1e-6);
+        assert.inDelta(x.invert(1.5), 0, 1e-6);
+      }
+    },
+
+    "maps a number to a number": function(linear) {
+      var x = linear().domain([1, 2]);
+      assert.inDelta(x(.5), -.5, 1e-6);
+      assert.inDelta(x(1), 0, 1e-6);
+      assert.inDelta(x(1.5), .5, 1e-6);
+      assert.inDelta(x(2), 1, 1e-6);
+      assert.inDelta(x(2.5), 1.5, 1e-6);
+    },
+
+    "invert": {
+      "maps a number to a number": function(linear) {
+        var x = linear().range([1, 2]);
+        assert.inDelta(x.invert(.5), -.5, 1e-6);
+        assert.inDelta(x.invert(1), 0, 1e-6);
+        assert.inDelta(x.invert(1.5), .5, 1e-6);
+        assert.inDelta(x.invert(2), 1, 1e-6);
+        assert.inDelta(x.invert(2.5), 1.5, 1e-6);
+      },
+      "coerces range value to numbers": function(linear) {
+        var x = linear().range(["0", "2"]);
+        assert.inDelta(x.invert("1"), .5, 1e-6);
+        var x = linear().range([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.inDelta(x.invert(new Date(1990, 6, 2, 13)), .5, 1e-6);
+        var x = linear().range(["#000", "#fff"]);
+        assert.isNaN(x.invert("#999"));
+      },
+      "can invert a polylinear descending domain": function(linear) {
+        var x = linear().domain([4, 2, 1]).range([1, 2, 4]);
+        assert.inDelta(x(1.5), 3, 1e-6);
+        assert.inDelta(x(3), 1.5, 1e-6);
+        assert.inDelta(x.invert(1.5), 3, 1e-6);
+        assert.inDelta(x.invert(3), 1.5, 1e-6);
+      },
+      "can invert a polylinear descending range": function(linear) {
+        var x = linear().domain([1, 2, 4]).range([4, 2, 1]);
+        assert.inDelta(x(1.5), 3, 1e-6);
+        assert.inDelta(x(3), 1.5, 1e-6);
+        assert.inDelta(x.invert(1.5), 3, 1e-6);
+        assert.inDelta(x.invert(3), 1.5, 1e-6);
+      }
+    },
+
+    "ticks": {
+      "generates ticks of varying degree": function(linear) {
+        var x = linear();
+        assert.deepEqual(x.ticks(1).map(x.tickFormat(1)), [0, 1]);
+        assert.deepEqual(x.ticks(2).map(x.tickFormat(2)), [0, .5, 1]);
+        assert.deepEqual(x.ticks(5).map(x.tickFormat(5)), [0, .2, .4, .6, .8, 1]);
+        assert.deepEqual(x.ticks(10).map(x.tickFormat(10)), [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]);
+        var x = linear().domain([1, 0]);
+        assert.deepEqual(x.ticks(1).map(x.tickFormat(1)), [0, 1]);
+        assert.deepEqual(x.ticks(2).map(x.tickFormat(2)), [0, .5, 1]);
+        assert.deepEqual(x.ticks(5).map(x.tickFormat(5)), [0, .2, .4, .6, .8, 1]);
+        assert.deepEqual(x.ticks(10).map(x.tickFormat(10)), [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]);
+      },
+      "formats ticks with the appropriate precision": function(linear) {
+        var x = linear().domain([.123456789, 1.23456789]);
+        assert.strictEqual(x.tickFormat(1)(x.ticks(1)[0]), "1");
+        assert.strictEqual(x.tickFormat(2)(x.ticks(2)[0]), "0.5");
+        assert.strictEqual(x.tickFormat(4)(x.ticks(4)[0]), "0.2");
+        assert.strictEqual(x.tickFormat(8)(x.ticks(8)[0]), "0.2");
+        assert.strictEqual(x.tickFormat(16)(x.ticks(16)[0]), "0.2");
+        assert.strictEqual(x.tickFormat(32)(x.ticks(32)[0]), "0.15");
+        assert.strictEqual(x.tickFormat(64)(x.ticks(64)[0]), "0.14");
+        assert.strictEqual(x.tickFormat(128)(x.ticks(128)[0]), "0.13");
+        assert.strictEqual(x.tickFormat(256)(x.ticks(256)[0]), "0.125");
+      }
+    },
+
+    "nice": {
+      "nices the domain, extending it to round numbers": function(linear) {
+        var x = linear().domain([1.1, 10.9]).nice();
+        assert.deepEqual(x.domain(), [1, 11]);
+        var x = linear().domain([10.9, 1.1]).nice();
+        assert.deepEqual(x.domain(), [11, 1]);
+        var x = linear().domain([.7, 11.001]).nice();
+        assert.deepEqual(x.domain(), [0, 12]);
+        var x = linear().domain([123.1, 6.7]).nice();
+        assert.deepEqual(x.domain(), [130, 0]);
+        var x = linear().domain([0, .49]).nice();
+        assert.deepEqual(x.domain(), [0, .5]);
+      },
+      "has no effect on degenerate domains": function(linear) {
+        var x = linear().domain([0, 0]).nice();
+        assert.deepEqual(x.domain(), [0, 0]);
+        var x = linear().domain([.5, .5]).nice();
+        assert.deepEqual(x.domain(), [.5, .5]);
+      },
+      "nicing a polylinear domain only affects the extent": function(linear) {
+        var x = linear().domain([1.1, 1, 2, 3, 10.9]).nice();
+        assert.deepEqual(x.domain(), [1, 1, 2, 3, 11]);
+        var x = linear().domain([123.1, 1, 2, 3, -.9]).nice();
+        assert.deepEqual(x.domain(), [130, 1, 2, 3, -10]);
+      }
+    },
+
+    "copy": {
+      "changes to the domain are isolated": function(linear) {
+        var x = linear(), y = x.copy();
+        x.domain([1, 2]);
+        assert.deepEqual(y.domain(), [0, 1]);
+        assert.equal(x(1), 0);
+        assert.equal(y(1), 1);
+        y.domain([2, 3]);
+        assert.equal(x(2), 1);
+        assert.equal(y(2), 0);
+        assert.deepEqual(x.domain(), [1, 2]);
+        assert.deepEqual(y.domain(), [2, 3]);
+      },
+      "changes to the range are isolated": function(linear) {
+        var x = linear(), y = x.copy();
+        x.range([1, 2]);
+        assert.equal(x.invert(1), 0);
+        assert.equal(y.invert(1), 1);
+        assert.deepEqual(y.range(), [0, 1]);
+        y.range([2, 3]);
+        assert.equal(x.invert(2), 1);
+        assert.equal(y.invert(2), 0);
+        assert.deepEqual(x.range(), [1, 2]);
+        assert.deepEqual(y.range(), [2, 3]);
+      },
+      "changes to the interpolator are isolated": function(linear) {
+        var x = linear().range(["red", "blue"]), y = x.copy();
+        x.interpolate(d3.interpolateHsl);
+        assert.equal(x(0.5), "#ff00ff");
+        assert.equal(y(0.5), "#800080");
+        assert.equal(y.interpolate(), d3.interpolate);
+      },
+      "changes to clamping are isolated": function(linear) {
+        var x = linear().clamp(true), y = x.copy();
+        x.clamp(false);
+        assert.equal(x(2), 2);
+        assert.equal(y(2), 1);
+        assert.isTrue(y.clamp());
+        y.clamp(false);
+        assert.equal(x(2), 2);
+        assert.equal(y(2), 2);
+        assert.isFalse(x.clamp());
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/scale/log-test.js b/static/demo/components/d3/test/scale/log-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..ed8772388078974bbf5ae36975c3788d5a877bf4
--- /dev/null
+++ b/static/demo/components/d3/test/scale/log-test.js
@@ -0,0 +1,293 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.scale.log");
+
+suite.addBatch({
+  "log": {
+    topic: function() {
+      return d3.scale.log;
+    },
+
+    "domain": {
+      "defaults to [1, 10]": function(log) {
+        var x = log();
+        assert.deepEqual(x.domain(), [1, 10]);
+        assert.inDelta(x(5), 0.69897, 1e-6);
+      },
+      "coerces domain values to numbers": function(log) {
+        var x = log().domain([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(new Date(1989, 09, 20)), -.2, 1e-2);
+        assert.inDelta(x(new Date(1990, 00, 01)), 0, 1e-2);
+        assert.inDelta(x(new Date(1990, 02, 15)), .2, 1e-2);
+        assert.inDelta(x(new Date(1990, 04, 27)), .4, 1e-2);
+        assert.inDelta(x(new Date(1991, 00, 01)), 1, 1e-2);
+        assert.inDelta(x(new Date(1991, 02, 15)), 1.2, 1e-2);
+        var x = log().domain(["1", "10"]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(5), 0.69897, 1e-6);
+        var x = log().domain([new Number(1), new Number(10)]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(5), 0.69897, 1e-6);
+      },
+      "can specify negative domain values": function(log) {
+        var x = log().domain([-100, -1]);
+        assert.deepEqual(x.ticks().map(x.tickFormat()), [
+          "-1e+2",
+          "-9e+1", "-8e+1", "-7e+1", "-6e+1", "-5e+1", "-4e+1", "-3e+1", "-2e+1", "-1e+1",
+          "-9e+0", "-8e+0", "-7e+0", "-6e+0", "-5e+0", "-4e+0", "-3e+0", "-2e+0", "-1e+0"
+        ]);
+        assert.inDelta(x(-50), 0.150515, 1e-6);
+      },
+      "can specify a polylog domain and range": function(log) {
+        var x = log().domain([.1, 1, 100]).range(["red", "white", "green"]);
+        assert.equal(x(.5), "#ffb2b2");
+        assert.equal(x(50), "#269326");
+        assert.equal(x(75), "#108810");
+      }
+    },
+
+    "range": {
+      "defaults to [0, 1]": function(log) {
+        var x = log();
+        assert.deepEqual(x.range(), [0, 1]);
+        assert.inDelta(x.invert(.5), 3.162278, 1e-6);
+      },
+      "does not coerce range to numbers": function(log) {
+        var x = log().range(["0", "2"]);
+        assert.equal(typeof x.range()[0], "string");
+        assert.equal(typeof x.range()[1], "string");
+      },
+      "can specify range values as colors": function(log) {
+        var x = log().range(["red", "blue"]);
+        assert.equal(x(5), "#4d00b2");
+        var x = log().range(["#ff0000", "#0000ff"]);
+        assert.equal(x(5), "#4d00b2");
+        var x = log().range(["#f00", "#00f"]);
+        assert.equal(x(5), "#4d00b2");
+        var x = log().range([d3.rgb(255,0,0), d3.hsl(240,1,.5)]);
+        assert.equal(x(5), "#4d00b2");
+        var x = log().range(["hsl(0,100%,50%)", "hsl(240,100%,50%)"]);
+        assert.equal(x(5), "#4d00b2");
+      },
+      "can specify range values as arrays or objects": function(log) {
+        var x = log().range([{color: "red"}, {color: "blue"}]);
+        assert.deepEqual(x(5), {color: "#4d00b2"});
+        var x = log().range([["red"], ["blue"]]);
+        assert.deepEqual(x(5), ["#4d00b2"]);
+      }
+    },
+
+    "interpolate": {
+      "defaults to d3.interpolate": function(log) {
+        var x = log().range(["red", "blue"]);
+        assert.equal(x.interpolate(), d3.interpolate);
+        assert.equal(x(5), "#4d00b2");
+      },
+      "can specify a custom interpolator": function(log) {
+        var x = log().range(["red", "blue"]).interpolate(d3.interpolateHsl);
+        assert.equal(x(5), "#9a00ff");
+      }
+    },
+
+    "clamp": {
+      "defaults to false": function(log) {
+        var x = log();
+        assert.isFalse(x.clamp());
+        assert.inDelta(x(.5), -0.3010299, 1e-6);
+        assert.inDelta(x(15), 1.1760913, 1e-6);
+      },
+      "can clamp to the domain": function(log) {
+        var x = log().clamp(true);
+        assert.inDelta(x(-1), 0, 1e-6);
+        assert.inDelta(x(5), 0.69897, 1e-6);
+        assert.inDelta(x(15), 1, 1e-6);
+        var x = log().domain([10, 1]).clamp(true);
+        assert.inDelta(x(-1), 1, 1e-6);
+        assert.inDelta(x(5), 0.30103, 1e-6);
+        assert.inDelta(x(15), 0, 1e-6);
+      },
+      "can clamp to the range": function(log) {
+        var x = log().clamp(true);
+        assert.inDelta(x.invert(-.1), 1, 1e-6);
+        assert.inDelta(x.invert(0.69897), 5, 1e-6);
+        assert.inDelta(x.invert(1.5), 10, 1e-6);
+        var x = log().domain([10, 1]).clamp(true);
+        assert.inDelta(x.invert(-.1), 10, 1e-6);
+        assert.inDelta(x.invert(0.30103), 5, 1e-6);
+        assert.inDelta(x.invert(1.5), 1, 1e-6);
+      }
+    },
+
+    "maps a number to a number": function(log) {
+      var x = log().domain([1, 2]);
+      assert.inDelta(x(.5), -1, 1e-6);
+      assert.inDelta(x(1), 0, 1e-6);
+      assert.inDelta(x(1.5), 0.5849625, 1e-6);
+      assert.inDelta(x(2), 1, 1e-6);
+      assert.inDelta(x(2.5), 1.3219281, 1e-6);
+    },
+
+    "invert": {
+      "maps a number to a number": function(log) {
+        var x = log().domain([1, 2]);
+        assert.inDelta(x.invert(-1), .5, 1e-6);
+        assert.inDelta(x.invert(0), 1, 1e-6);
+        assert.inDelta(x.invert(0.5849625), 1.5, 1e-6);
+        assert.inDelta(x.invert(1), 2, 1e-6);
+        assert.inDelta(x.invert(1.3219281), 2.5, 1e-6);
+      },
+      "coerces range value to number on invert": function(log) {
+        var x = log().range(["0", "2"]);
+        assert.inDelta(x.invert("1"), 3.1622777, 1e-6);
+        var x = log().range([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.inDelta(x.invert(new Date(1990, 6, 2, 13)), 3.1622777, 1e-6);
+        var x = log().range(["#000", "#fff"]);
+        assert.isNaN(x.invert("#999"));
+      }
+    },
+
+    "ticks": {
+      "can generate ticks": function(log) {
+        var x = log();
+        assert.deepEqual(x.ticks().map(x.tickFormat()), [
+          "1e+0", "2e+0", "3e+0", "4e+0", "5e+0", "6e+0", "7e+0", "8e+0", "9e+0",
+          "1e+1"
+        ]);
+        var x = log().domain([100, 1]);
+        assert.deepEqual(x.ticks().map(x.tickFormat()), [
+          "1e+0", "2e+0", "3e+0", "4e+0", "5e+0", "6e+0", "7e+0", "8e+0", "9e+0",
+          "1e+1", "2e+1", "3e+1", "4e+1", "5e+1", "6e+1", "7e+1", "8e+1", "9e+1",
+          "1e+2"
+        ]);
+        var x = log().domain([0.49999, 0.006029505943610648]);
+        assert.deepEqual(x.ticks().map(x.tickFormat()), [
+          "7e-3", "8e-3", "9e-3", "1e-2", "2e-2", "3e-2", "4e-2", "5e-2",
+          "6e-2", "7e-2", "8e-2", "9e-2", "1e-1", "2e-1", "3e-1", "4e-1"
+        ]);
+        var x = log().domain([.95, 1.05e8]);
+        assert.deepEqual(x.ticks().map(x.tickFormat(8)).filter(String), [
+          '1e+0', '1e+1', '1e+2', '1e+3', '1e+4', '1e+5', '1e+6', '1e+7', '1e+8'
+        ]);
+      },
+      "can generate fewer ticks, if desired": function(log) {
+        var x = log();
+        assert.deepEqual(x.ticks().map(x.tickFormat(5)), [
+          "1e+0", "2e+0", "3e+0", "4e+0", "5e+0", "", "", "", "",
+          "1e+1"
+        ]);
+        var x = log().domain([100, 1]);
+        assert.deepEqual(x.ticks().map(x.tickFormat(10)), [
+          "1e+0", "2e+0", "3e+0", "4e+0", "5e+0", "", "", "", "",
+          "1e+1", "2e+1", "3e+1", "4e+1", "5e+1", "", "", "", "",
+          "1e+2"
+        ]);
+      },
+      "generates powers-of-ten ticks, even for huge domains": function(log) {
+        var x = log().domain([1e10, 1]);
+        assert.deepEqual(x.ticks().map(x.tickFormat(10)), [
+          "1e+0", "", "", "", "", "", "", "", "",
+          "1e+1", "", "", "", "", "", "", "", "",
+          "1e+2", "", "", "", "", "", "", "", "",
+          "1e+3", "", "", "", "", "", "", "", "",
+          "1e+4", "", "", "", "", "", "", "", "",
+          "1e+5", "", "", "", "", "", "", "", "",
+          "1e+6", "", "", "", "", "", "", "", "",
+          "1e+7", "", "", "", "", "", "", "", "",
+          "1e+8", "", "", "", "", "", "", "", "",
+          "1e+9", "", "", "", "", "", "", "", "",
+          "1e+10"
+        ]);
+      },
+      "can override the tick format": function(log) {
+        var x = log().domain([1000.1, 1]);
+        assert.deepEqual(x.ticks().map(x.tickFormat(10, d3.format("+,d"))), [
+          "+1", "+2", "+3", "", "", "", "", "", "",
+          "+10", "+20", "+30", "", "", "", "", "", "",
+          "+100", "+200", "+300", "", "", "", "", "", "",
+          "+1,000"
+        ]);
+      }
+    },
+
+    "nice": {
+      "can nice the domain, extending it to powers of ten": function(log) {
+        var x = log().domain([1.1, 10.9]).nice();
+        assert.deepEqual(x.domain(), [1, 100]);
+        var x = log().domain([10.9, 1.1]).nice();
+        assert.deepEqual(x.domain(), [100, 1]);
+        var x = log().domain([.7, 11.001]).nice();
+        assert.deepEqual(x.domain(), [.1, 100]);
+        var x = log().domain([123.1, 6.7]).nice();
+        assert.deepEqual(x.domain(), [1000, 1]);
+        var x = log().domain([.01, .49]).nice();
+        assert.deepEqual(x.domain(), [.01, 1]);
+      },
+      "works on degenerate domains": function(log) {
+        var x = log().domain([0, 0]).nice();
+        assert.deepEqual(x.domain(), [0, 0]);
+        var x = log().domain([.5, .5]).nice();
+        assert.inDelta(x.domain(), [.1, 1], 1e-6);
+      },
+      "nicing a polylog domain only affects the extent": function(log) {
+        var x = log().domain([1.1, 1.5, 10.9]).nice();
+        assert.deepEqual(x.domain(), [1, 1.5, 100]);
+        var x = log().domain([-123.1, -1.5, -.5]).nice();
+        assert.deepEqual(x.domain(), [-1000, -1.5, -.1]);
+      }
+    },
+
+    "copy": {
+      "changes to the domain are isolated": function(log) {
+        var x = log(), y = x.copy();
+        x.domain([10, 100]);
+        assert.deepEqual(y.domain(), [1, 10]);
+        assert.equal(x(10), 0);
+        assert.equal(y(1), 0);
+        y.domain([100, 1000]);
+        assert.equal(x(100), 1);
+        assert.equal(y(100), 0);
+        assert.deepEqual(x.domain(), [10, 100]);
+        assert.deepEqual(y.domain().map(Math.round), [100, 1000]);
+      },
+      "changes to the range are isolated": function(log) {
+        var x = log(), y = x.copy();
+        x.range([1, 2]);
+        assert.equal(x.invert(1), 1);
+        assert.equal(y.invert(1), 10);
+        assert.deepEqual(y.range(), [0, 1]);
+        y.range([2, 3]);
+        assert.equal(x.invert(2), 10);
+        assert.equal(y.invert(2), 1);
+        assert.deepEqual(x.range(), [1, 2]);
+        assert.deepEqual(y.range(), [2, 3]);
+      },
+      "changes to the interpolator are isolated": function(log) {
+        var x = log().range(["red", "blue"]), y = x.copy();
+        x.interpolate(d3.interpolateHsl);
+        assert.equal(x(5), "#9a00ff");
+        assert.equal(y(5), "#4d00b2");
+        assert.equal(y.interpolate(), d3.interpolate);
+      },
+      "changes to clamping are isolated": function(log) {
+        var x = log().clamp(true), y = x.copy();
+        x.clamp(false);
+        assert.inDelta(x(.5), -0.30103, 1e-6);
+        assert.equal(y(.5), 0);
+        assert.isTrue(y.clamp());
+        y.clamp(false);
+        assert.inDelta(x(20), 1.30103, 1e-6);
+        assert.inDelta(y(20), 1.30103, 1e-6);
+        assert.isFalse(x.clamp());
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/scale/ordinal-test.js b/static/demo/components/d3/test/scale/ordinal-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..8b1ddee35c94219909fad00ed9ee1a01bbadc059
--- /dev/null
+++ b/static/demo/components/d3/test/scale/ordinal-test.js
@@ -0,0 +1,266 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.scale.ordinal");
+
+suite.addBatch({
+  "ordinal": {
+    topic: function() {
+      return d3.scale.ordinal;
+    },
+
+    "domain": {
+      "defaults to the empty array": function(ordinal) {
+        assert.isEmpty(ordinal().domain());
+      },
+      "new input values are added to the domain": function(ordinal) {
+        var x = ordinal().range(["foo", "bar"]);
+        assert.equal(x(0), "foo");
+        assert.deepEqual(x.domain(), ["0"]);
+        assert.equal(x(1), "bar");
+        assert.deepEqual(x.domain(), ["0", "1"]);
+        assert.equal(x(0), "foo");
+        assert.deepEqual(x.domain(), ["0", "1"]);
+      },
+      "setting the domain forgets previous values": function(ordinal) {
+        var x = ordinal().range(["foo", "bar"]);
+        assert.equal(x(1), "foo");
+        assert.equal(x(0), "bar");
+        assert.deepEqual(x.domain(), [1, 0]);
+        x.domain(["0", "1"]);
+        assert.equal(x(0), "foo"); // it changed!
+        assert.equal(x(1), "bar");
+        assert.deepEqual(x.domain(), ["0", "1"]);
+      },
+      "uniqueness is based on string coercion": function(ordinal) {
+        var x = ordinal().domain(["foo"]).range([42, 43, 44]);
+        assert.equal(x(new String("foo")), 42);
+        assert.equal(x({toString: function() { return "foo"; }}), 42);
+        assert.equal(x({toString: function() { return "bar"; }}), 43);
+      },
+      "orders domain values by the order in which they are seen": function(ordinal) {
+        var x = ordinal();
+        x("foo");
+        x("bar");
+        x("baz");
+        assert.deepEqual(x.domain(), ["foo", "bar", "baz"]);
+        x.domain(["baz", "bar"]);
+        x("foo");
+        assert.deepEqual(x.domain(), ["baz", "bar", "foo"]);
+        x.domain(["baz", "foo"]);
+        assert.deepEqual(x.domain(), ["baz", "foo"]);
+        x.domain([]);
+        x("foo");
+        x("bar");
+        assert.deepEqual(x.domain(), ["foo", "bar"]);
+      },
+      "does not coerce domain values to strings": function(ordinal) {
+        var x = ordinal().domain([0, 1]);
+        assert.deepEqual(x.domain(), [0, 1]);
+        assert.typeOf(x.domain()[0], "number");
+        assert.typeOf(x.domain()[1], "number");
+      },
+      "does not barf on object built-ins": function(ordinal) {
+        var x = ordinal().domain(["__proto__", "hasOwnProperty"]).range([42, 43]);
+        assert.equal(x("__proto__"), 42);
+        assert.equal(x("hasOwnProperty"), 43);
+        assert.deepEqual(x.domain(), ["__proto__", "hasOwnProperty"]);
+      }
+    },
+
+    "range": {
+      "defaults to the empty array": function(ordinal) {
+        var x = ordinal();
+        assert.isEmpty(x.range());
+        assert.isUndefined(x(0));
+      },
+      "setting the range remembers previous values": function(ordinal) {
+        var x = ordinal();
+        assert.isUndefined(x(0));
+        assert.isUndefined(x(1));
+        x.range(["foo", "bar"]);
+        assert.equal(x(0), "foo");
+        assert.equal(x(1), "bar");
+      },
+      "recycles values when exhausted": function(ordinal) {
+        var x = ordinal().range(["a", "b", "c"]);
+        assert.equal(x(0), "a");
+        assert.equal(x(1), "b");
+        assert.equal(x(2), "c");
+        assert.equal(x(3), "a");
+        assert.equal(x(4), "b");
+        assert.equal(x(5), "c");
+        assert.equal(x(2), "c");
+        assert.equal(x(1), "b");
+        assert.equal(x(0), "a");
+      }
+    },
+
+    "maps distinct values to discrete values": function(ordinal) {
+      var x = ordinal().range(["a", "b", "c"]);
+      assert.equal(x(0), "a");
+      assert.equal(x("0"), "a");
+      assert.equal(x([0]), "a");
+      assert.equal(x(1), "b");
+      assert.equal(x(2.0), "c");
+      assert.equal(x(new Number(2)), "c");
+    },
+
+    "rangePoints": {
+      "computes discrete points in a continuous range": function(ordinal) {
+        var x = ordinal().domain(["a", "b", "c"]).rangePoints([0, 120]);
+        assert.deepEqual(x.range(), [0, 60, 120]);
+        assert.equal(x.rangeBand(), 0);
+        var x = ordinal().domain(["a", "b", "c"]).rangePoints([0, 120], 1);
+        assert.deepEqual(x.range(), [20, 60, 100]);
+        assert.equal(x.rangeBand(), 0);
+        var x = ordinal().domain(["a", "b", "c"]).rangePoints([0, 120], 2);
+        assert.deepEqual(x.range(), [30, 60, 90]);
+        assert.equal(x.rangeBand(), 0);
+      },
+      "correctly handles singleton domains": function(ordinal) {
+        var x = ordinal().domain(["a"]).rangePoints([0, 120]);
+        assert.deepEqual(x.range(), [60]);
+        assert.equal(x.rangeBand(), 0);
+      },
+      "can be set to a descending range": function(ordinal) {
+        var x = ordinal().domain(["a", "b", "c"]).rangePoints([120, 0]);
+        assert.deepEqual(x.range(), [120, 60,0]);
+        assert.equal(x.rangeBand(), 0);
+        var x = ordinal().domain(["a", "b", "c"]).rangePoints([120, 0], 1);
+        assert.deepEqual(x.range(), [100, 60, 20]);
+        assert.equal(x.rangeBand(), 0);
+        var x = ordinal().domain(["a", "b", "c"]).rangePoints([120, 0], 2);
+        assert.deepEqual(x.range(), [90, 60, 30]);
+        assert.equal(x.rangeBand(), 0);
+      }
+    },
+
+    "rangeBands": {
+      "computes discrete bands in a continuous range": function(ordinal) {
+        var x = ordinal().domain(["a", "b", "c"]).rangeBands([0, 120]);
+        assert.deepEqual(x.range(), [0, 40, 80]);
+        assert.equal(x.rangeBand(), 40);
+        var x = ordinal().domain(["a", "b", "c"]).rangeBands([0, 120], .2);
+        assert.deepEqual(x.range(), [7.5, 45, 82.5]);
+        assert.equal(x.rangeBand(), 30);
+      },
+      "setting domain recomputes range bands": function(ordinal) {
+        var x = ordinal().rangeRoundBands([0, 100]).domain(["a", "b", "c"]);
+        assert.deepEqual(x.range(), [1, 34, 67]);
+        assert.equal(x.rangeBand(), 33);
+        x.domain(["a", "b", "c", "d"]);
+        assert.deepEqual(x.range(), [0, 25, 50, 75]);
+        assert.equal(x.rangeBand(), 25);
+      },
+      "can be set to a descending range": function(ordinal) {
+        var x = ordinal().domain(["a", "b", "c"]).rangeBands([120, 0]);
+        assert.deepEqual(x.range(), [80, 40, 0]);
+        assert.equal(x.rangeBand(), 40);
+        var x = ordinal().domain(["a", "b", "c"]).rangeBands([120, 0], .2);
+        assert.deepEqual(x.range(), [82.5, 45, 7.5]);
+        assert.equal(x.rangeBand(), 30);
+      },
+      "can specify a different outer padding": function(ordinal) {
+        var x = ordinal().domain(["a", "b", "c"]).rangeBands([120, 0], .2, .1);
+        assert.deepEqual(x.range(), [84, 44, 4]);
+        assert.equal(x.rangeBand(), 32);
+        var x = ordinal().domain(["a", "b", "c"]).rangeBands([120, 0], .2, 1);
+        assert.deepEqual(x.range(), [75, 50, 25]);
+        assert.equal(x.rangeBand(), 20);
+      }
+    },
+
+    "rangeRoundBands": {
+      "computes discrete rounded bands in a continuous range": function(ordinal) {
+        var x = ordinal().domain(["a", "b", "c"]).rangeRoundBands([0, 100]);
+        assert.deepEqual(x.range(), [1, 34, 67]);
+        assert.equal(x.rangeBand(), 33);
+        var x = ordinal().domain(["a", "b", "c"]).rangeRoundBands([0, 100], .2);
+        assert.deepEqual(x.range(), [7, 38, 69]);
+        assert.equal(x.rangeBand(), 25);
+      },
+      "can be set to a descending range": function(ordinal) {
+        var x = ordinal().domain(["a", "b", "c"]).rangeRoundBands([100, 0]);
+        assert.deepEqual(x.range(), [67, 34, 1]);
+        assert.equal(x.rangeBand(), 33);
+        var x = ordinal().domain(["a", "b", "c"]).rangeRoundBands([100, 0], .2);
+        assert.deepEqual(x.range(), [69, 38, 7]);
+        assert.equal(x.rangeBand(), 25);
+      },
+      "can specify a different outer padding": function(ordinal) {
+        var x = ordinal().domain(["a", "b", "c"]).rangeRoundBands([120, 0], .2, .1);
+        assert.deepEqual(x.range(), [84, 44, 4]);
+        assert.equal(x.rangeBand(), 32);
+        var x = ordinal().domain(["a", "b", "c"]).rangeRoundBands([120, 0], .2, 1);
+        assert.deepEqual(x.range(), [75, 50, 25]);
+        assert.equal(x.rangeBand(), 20);
+      }
+    },
+
+    "rangeExtent": {
+      "returns the continuous range": function(ordinal) {
+        var x = ordinal().domain(["a", "b", "c"]).rangePoints([20, 120]);
+        assert.deepEqual(x.rangeExtent(), [20, 120]);
+        var x = ordinal().domain(["a", "b", "c"]).rangeBands([10, 110]);
+        assert.deepEqual(x.rangeExtent(), [10, 110]);
+        var x = ordinal().domain(["a", "b", "c"]).rangeRoundBands([0, 100]);
+        assert.deepEqual(x.rangeExtent(), [0, 100]);
+        var x = ordinal().domain(["a", "b", "c"]).range([0, 20, 100]);
+        assert.deepEqual(x.rangeExtent(), [0, 100]);
+      },
+      "can handle descending ranges": function(ordinal) {
+        var x = ordinal().domain(["a", "b", "c"]).rangeBands([100, 0]);
+        assert.deepEqual(x.rangeExtent(), [0, 100]);
+      }
+    },
+
+    "copy": {
+      "changes to the domain are isolated": function(ordinal) {
+        var x = ordinal().range(["foo", "bar"]), y = x.copy();
+        x.domain([1, 2]);
+        assert.deepEqual(y.domain(), []);
+        assert.equal(x(1), "foo");
+        assert.equal(y(1), "foo");
+        y.domain([2, 3]);
+        assert.equal(x(2), "bar");
+        assert.equal(y(2), "foo");
+        assert.deepEqual(x.domain(), ["1", "2"]);
+        assert.deepEqual(y.domain(), ["2", "3"]);
+      },
+      "changes to the range are isolated": function(ordinal) {
+        var x = ordinal().range(["foo", "bar"]), y = x.copy();
+        x.range(["bar", "foo"]);
+        assert.equal(x(1), "bar");
+        assert.equal(y(1), "foo");
+        assert.deepEqual(y.range(), ["foo", "bar"]);
+        y.range(["foo", "baz"]);
+        assert.equal(x(2), "foo");
+        assert.equal(y(2), "baz");
+        assert.deepEqual(x.range(), ["bar", "foo"]);
+        assert.deepEqual(y.range(), ["foo", "baz"]);
+      },
+      "changes to the range type are isolated": function(ordinal) {
+        var x = ordinal().domain([0, 1]).rangeBands([0, 1], .2), y = x.copy();
+        x.rangePoints([1, 2]);
+        assert.inDelta(x(0), 1, 1e-6);
+        assert.inDelta(x(1), 2, 1e-6);
+        assert.inDelta(x.rangeBand(), 0, 1e-6);
+        assert.inDelta(y(0), 1/11, 1e-6);
+        assert.inDelta(y(1), 6/11, 1e-6);
+        assert.inDelta(y.rangeBand(), 4/11, 1e-6);
+        y.rangeBands([0, 1]);
+        assert.inDelta(x(0), 1, 1e-6);
+        assert.inDelta(x(1), 2, 1e-6);
+        assert.inDelta(x.rangeBand(), 0, 1e-6);
+        assert.inDelta(y(0), 0, 1e-6);
+        assert.inDelta(y(1), 1/2, 1e-6);
+        assert.inDelta(y.rangeBand(), 1/2, 1e-6);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/scale/pow-test.js b/static/demo/components/d3/test/scale/pow-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a39694f60d333f67f62d3978909bcccc27faa30a
--- /dev/null
+++ b/static/demo/components/d3/test/scale/pow-test.js
@@ -0,0 +1,262 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.scale.pow");
+
+suite.addBatch({
+  "pow": {
+    topic: function() {
+      return d3.scale.pow;
+    },
+
+    "domain": {
+      "defaults to [0, 1]": function(pow) {
+        var x = pow();
+        assert.deepEqual(x.domain(), [0, 1]);
+        assert.inDelta(x(.5), .5, 1e-6);
+      },
+      "coerces domain to numbers": function(pow) {
+        var x = pow().domain([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(new Date(1989, 09, 20)), -.2, 1e-2);
+        assert.inDelta(x(new Date(1990, 00, 01)), 0, 1e-2);
+        assert.inDelta(x(new Date(1990, 02, 15)), .2, 1e-2);
+        assert.inDelta(x(new Date(1990, 04, 27)), .4, 1e-2);
+        assert.inDelta(x(new Date(1991, 00, 01)), 1, 1e-2);
+        assert.inDelta(x(new Date(1991, 02, 15)), 1.2, 1e-2);
+        var x = pow().domain(["0", "1"]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(.5), .5, 1e-6);
+        var x = pow().domain([new Number(0), new Number(1)]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(.5), .5, 1e-6);
+      },
+      "can specify a polypower domain and range": function(pow) {
+        var x = pow().domain([-10, 0, 100]).range(["red", "white", "green"]);
+        assert.equal(x(-5), "#ff8080");
+        assert.equal(x(50), "#80c080");
+        assert.equal(x(75), "#40a040");
+      }
+    },
+
+    "range": {
+      "defaults to [0, 1]": function(pow) {
+        var x = pow();
+        assert.deepEqual(x.range(), [0, 1]);
+        assert.inDelta(x.invert(.5), .5, 1e-6);
+      },
+      "does not coerce range values to numbers": function(pow) {
+        var x = pow().range(["0", "2"]);
+        assert.equal(typeof x.range()[0], "string");
+        assert.equal(typeof x.range()[1], "string");
+      },
+      "coerces range values to number on invert": function(pow) {
+        var x = pow().range(["0", "2"]);
+        assert.inDelta(x.invert("1"), .5, 1e-6);
+        var x = pow().range([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.inDelta(x.invert(new Date(1990, 6, 2, 13)), .5, 1e-6);
+        var x = pow().range(["#000", "#fff"]);
+        assert.isNaN(x.invert("#999"));
+      },
+      "can specify range values as colors": function(pow) {
+        var x = pow().range(["red", "blue"]);
+        assert.equal(x(.5), "#800080");
+        var x = pow().range(["#ff0000", "#0000ff"]);
+        assert.equal(x(.5), "#800080");
+        var x = pow().range(["#f00", "#00f"]);
+        assert.equal(x(.5), "#800080");
+        var x = pow().range([d3.rgb(255,0,0), d3.hsl(240,1,.5)]);
+        assert.equal(x(.5), "#800080");
+        var x = pow().range(["hsl(0,100%,50%)", "hsl(240,100%,50%)"]);
+        assert.equal(x(.5), "#800080");
+      },
+      "can specify range values as arrays or objects": function(pow) {
+        var x = pow().range([{color: "red"}, {color: "blue"}]);
+        assert.deepEqual(x(.5), {color: "#800080"});
+        var x = pow().range([["red"], ["blue"]]);
+        assert.deepEqual(x(.5), ["#800080"]);
+      }
+    },
+
+    "exponent": {
+      "defaults to one": function(pow) {
+        var x = pow();
+        assert.equal(x.exponent(), 1);
+      },
+      "observes the specified exponent": function(pow) {
+        var x = pow().exponent(.5).domain([1, 2]);
+        assert.inDelta(x(1), 0, 1e-6);
+        assert.inDelta(x(1.5), 0.5425821, 1e-6);
+        assert.inDelta(x(2), 1, 1e-6);
+        assert.equal(x.exponent(), .5);
+        var x = pow().exponent(2).domain([1, 2]);
+        assert.inDelta(x(1), 0, 1e-6);
+        assert.inDelta(x(1.5), .41666667, 1e-6);
+        assert.inDelta(x(2), 1, 1e-6);
+        assert.equal(x.exponent(), 2);
+        var x = pow().exponent(-1).domain([1, 2]);
+        assert.inDelta(x(1), 0, 1e-6);
+        assert.inDelta(x(1.5), .6666667, 1e-6);
+        assert.inDelta(x(2), 1, 1e-6);
+        assert.equal(x.exponent(), -1);
+      },
+      "changing the exponent does not change the domain or range": function(pow) {
+        var x = pow().domain([1, 2]).range([3, 4]), f = d3.format(".6f");
+        x.exponent(.5);
+        assert.deepEqual(x.domain().map(f), [1, 2]);
+        assert.deepEqual(x.range(), [3, 4]);
+        x.exponent(2);
+        assert.deepEqual(x.domain().map(f), [1, 2]);
+        assert.deepEqual(x.range(), [3, 4]);
+        x.exponent(-1);
+        assert.deepEqual(x.domain().map(f), [1, 2]);
+        assert.deepEqual(x.range(), [3, 4]);
+      }
+    },
+
+    "interpolate": {
+      "defaults to d3.interpolate": function(pow) {
+        var x = pow().range(["red", "blue"]);
+        assert.equal(x.interpolate(), d3.interpolate);
+        assert.equal(x(.5), "#800080");
+      },
+      "can specify a custom interpolator": function(pow) {
+        var x = pow().range(["red", "blue"]).interpolate(d3.interpolateHsl);
+        assert.equal(x(.5), "#ff00ff");
+      }
+    },
+
+    "clamp": {
+      "does not clamp by default": function(pow) {
+        var x = pow();
+        assert.isFalse(x.clamp());
+        assert.inDelta(x(-.5), -.5, 1e-6);
+        assert.inDelta(x(1.5), 1.5, 1e-6);
+      },
+      "can clamp to the domain": function(pow) {
+        var x = pow().clamp(true);
+        assert.inDelta(x(-.5), 0, 1e-6);
+        assert.inDelta(x(.5), .5, 1e-6);
+        assert.inDelta(x(1.5), 1, 1e-6);
+        var x = pow().domain([1, 0]).clamp(true);
+        assert.inDelta(x(-.5), 1, 1e-6);
+        assert.inDelta(x(.5), .5, 1e-6);
+        assert.inDelta(x(1.5), 0, 1e-6);
+      }
+    },
+
+    "maps a number to a number": function(pow) {
+      var x = pow().domain([1, 2]);
+      assert.inDelta(x(.5), -.5, 1e-6);
+      assert.inDelta(x(1), 0, 1e-6);
+      assert.inDelta(x(1.5), .5, 1e-6);
+      assert.inDelta(x(2), 1, 1e-6);
+      assert.inDelta(x(2.5), 1.5, 1e-6);
+    },
+
+    "ticks": {
+      "can generate ticks of varying degree": function(pow) {
+        var x = pow();
+        assert.deepEqual(x.ticks(1).map(x.tickFormat(1)), [0, 1]);
+        assert.deepEqual(x.ticks(2).map(x.tickFormat(2)), [0, .5, 1]);
+        assert.deepEqual(x.ticks(5).map(x.tickFormat(5)), [0, .2, .4, .6, .8, 1]);
+        assert.deepEqual(x.ticks(10).map(x.tickFormat(10)), [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]);
+        var x = pow().domain([1, 0]);
+        assert.deepEqual(x.ticks(1).map(x.tickFormat(1)), [0, 1]);
+        assert.deepEqual(x.ticks(2).map(x.tickFormat(2)), [0, .5, 1]);
+        assert.deepEqual(x.ticks(5).map(x.tickFormat(5)), [0, .2, .4, .6, .8, 1]);
+        assert.deepEqual(x.ticks(10).map(x.tickFormat(10)), [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]);
+      }
+    },
+
+    "nice": {
+      "can nice the domain, extending it to round numbers": function(pow) {
+        var x = pow().domain([1.1, 10.9]).nice();
+        assert.deepEqual(x.domain(), [1, 11]);
+        var x = pow().domain([10.9, 1.1]).nice();
+        assert.deepEqual(x.domain(), [11, 1]);
+        var x = pow().domain([.7, 11.001]).nice();
+        assert.deepEqual(x.domain(), [0, 12]);
+        var x = pow().domain([123.1, 6.7]).nice();
+        assert.deepEqual(x.domain(), [130, 0]);
+        var x = pow().domain([0, .49]).nice();
+        assert.deepEqual(x.domain(), [0, .5]);
+        var x = pow().domain([0, 0]).nice();
+        assert.deepEqual(x.domain(), [0, 0]);
+        var x = pow().domain([.5, .5]).nice();
+        assert.deepEqual(x.domain(), [.5, .5]);
+      },
+      "nicing a polypower domain only affects the extent": function(pow) {
+        var x = pow().domain([1.1, 1, 2, 3, 10.9]).nice();
+        assert.deepEqual(x.domain(), [1, 1, 2, 3, 11]);
+        var x = pow().domain([123.1, 1, 2, 3, -.9]).nice();
+        assert.deepEqual(x.domain(), [130, 1, 2, 3, -10]);
+      }
+    },
+
+    "copy": {
+      "changes to the domain are isolated": function(pow) {
+        var x = pow(), y = x.copy();
+        x.domain([1, 2]);
+        assert.deepEqual(y.domain(), [0, 1]);
+        assert.equal(x(1), 0);
+        assert.equal(y(1), 1);
+        y.domain([2, 3]);
+        assert.equal(x(2), 1);
+        assert.equal(y(2), 0);
+        assert.deepEqual(x.domain(), [1, 2]);
+        assert.deepEqual(y.domain(), [2, 3]);
+      },
+      "changes to the range are isolated": function(pow) {
+        var x = pow(), y = x.copy();
+        x.range([1, 2]);
+        assert.equal(x.invert(1), 0);
+        assert.equal(y.invert(1), 1);
+        assert.deepEqual(y.range(), [0, 1]);
+        y.range([2, 3]);
+        assert.equal(x.invert(2), 1);
+        assert.equal(y.invert(2), 0);
+        assert.deepEqual(x.range(), [1, 2]);
+        assert.deepEqual(y.range(), [2, 3]);
+      },
+      "changes to the exponent are isolated": function(pow) {
+        var x = pow().exponent(2), y = x.copy();
+        x.exponent(.5);
+        assert.inDelta(x(.5), Math.SQRT1_2, 1e-6);
+        assert.inDelta(y(.5), 0.25, 1e-6);
+        assert.equal(x.exponent(), .5);
+        assert.equal(y.exponent(), 2);
+        y.exponent(3);
+        assert.inDelta(x(.5), Math.SQRT1_2, 1e-6);
+        assert.inDelta(y(.5), 0.125, 1e-6);
+        assert.equal(x.exponent(), .5);
+        assert.equal(y.exponent(), 3);
+      },
+      "changes to the interpolator are isolated": function(pow) {
+        var x = pow().range(["red", "blue"]), y = x.copy();
+        x.interpolate(d3.interpolateHsl);
+        assert.equal(x(0.5), "#ff00ff");
+        assert.equal(y(0.5), "#800080");
+        assert.equal(y.interpolate(), d3.interpolate);
+      },
+      "changes to clamping are isolated": function(pow) {
+        var x = pow().clamp(true), y = x.copy();
+        x.clamp(false);
+        assert.equal(x(2), 2);
+        assert.equal(y(2), 1);
+        assert.isTrue(y.clamp());
+        y.clamp(false);
+        assert.equal(x(2), 2);
+        assert.equal(y(2), 2);
+        assert.isFalse(x.clamp());
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/scale/quantile-test.js b/static/demo/components/d3/test/scale/quantile-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..c4d943615971b38cb044d53776f5fa269ab210bb
--- /dev/null
+++ b/static/demo/components/d3/test/scale/quantile-test.js
@@ -0,0 +1,63 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.scale.quantile");
+
+suite.addBatch({
+  "quantile": {
+    topic: function() {
+      return d3.scale.quantile;
+    },
+    "has the empty domain by default": function(quantile) {
+      assert.isEmpty(quantile().domain());
+    },
+    "has the empty range by default": function(quantile) {
+      assert.isEmpty(quantile().range());
+    },
+    "uses the R-7 algorithm to compute quantiles": function(quantile) {
+      var x = d3.scale.quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]).range([0, 1, 2, 3]);
+      assert.deepEqual([3, 6, 6.9, 7, 7.1].map(x), [0, 0, 0, 0, 0]);
+      assert.deepEqual([8, 8.9].map(x), [1, 1]);
+      assert.deepEqual([9, 9.1, 10, 13].map(x), [2, 2, 2, 2]);
+      assert.deepEqual([14.9, 15, 15.1, 16, 20].map(x), [3, 3, 3, 3, 3]);
+      var x = d3.scale.quantile().domain([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20]).range([0, 1, 2, 3]);
+      assert.deepEqual([3, 6, 6.9, 7, 7.1].map(x), [0, 0, 0, 0, 0]);
+      assert.deepEqual([8, 8.9].map(x), [1, 1]);
+      assert.deepEqual([9, 9.1, 10, 13].map(x), [2, 2, 2, 2]);
+      assert.deepEqual([14.9, 15, 15.1, 16, 20].map(x), [3, 3, 3, 3, 3]);
+    },
+    "domain values are sorted in ascending order": function(quantile) {
+      var x = d3.scale.quantile().domain([6, 3, 7, 8, 8, 13, 20, 15, 16, 10]);
+      assert.deepEqual(x.domain(), [3, 6, 7, 8, 8, 10, 13, 15, 16, 20]);
+    },
+    "non-numeric domain values are ignored": function(quantile) {
+      var x = d3.scale.quantile().domain([6, 3, NaN, undefined, 7, 8, 8, 13, 20, 15, 16, 10, NaN]);
+      assert.deepEqual(x.domain(), [3, 6, 7, 8, 8, 10, 13, 15, 16, 20]);
+    },
+    "quantiles returns the inner thresholds": function(quantile) {
+      var x = d3.scale.quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]).range([0, 1, 2, 3]);
+      assert.deepEqual(x.quantiles(), [7.25, 9, 14.5]);
+      var x = d3.scale.quantile().domain([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20]).range([0, 1, 2, 3]);
+      assert.deepEqual(x.quantiles(), [7.5, 9, 14]);
+    },
+    "range cardinality determines the number of quantiles": function(quantile) {
+      var x = d3.scale.quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]);;
+      assert.deepEqual(x.range([0, 1, 2, 3]).quantiles(), [7.25, 9, 14.5]);
+      assert.deepEqual(x.range([0, 1]).quantiles(), [9]);
+      assert.deepEqual(x.range([,,,,,]).quantiles(), [6.8, 8, 11.2, 15.2]);
+      assert.deepEqual(x.range([,,,,,,]).quantiles(), [6.5, 8, 9, 13, 15.5]);
+    },
+    "range values are arbitrary": function(quantile) {
+      var a = new Object(), b = new Object(), c = new Object();
+      var x = d3.scale.quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]).range([a, b, c, a]);
+      assert.deepEqual([3, 6, 6.9, 7, 7.1].map(x), [a, a, a, a, a]);
+      assert.deepEqual([8, 8.9].map(x), [b, b]);
+      assert.deepEqual([9, 9.1, 10, 13].map(x), [c, c, c, c]);
+      assert.deepEqual([14.9, 15, 15.1, 16, 20].map(x), [a, a, a, a, a]);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/scale/quantize-test.js b/static/demo/components/d3/test/scale/quantize-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..8ab7148173e14792fdd36ba8ff782aa56d464eef
--- /dev/null
+++ b/static/demo/components/d3/test/scale/quantize-test.js
@@ -0,0 +1,68 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.scale.quantize");
+
+suite.addBatch({
+  "quantize": {
+    topic: function() {
+      return d3.scale.quantize;
+    },
+    "has the default domain [0, 1]": function(quantize) {
+      var x = quantize();
+      assert.deepEqual(x.domain(), [0, 1]);
+      assert.equal(x(.25), 0);
+    },
+    "has the default range [0, 1]": function(quantize) {
+      var x = quantize();
+      assert.deepEqual(x.range(), [0, 1]);
+      assert.equal(x(.75), 1);
+    },
+    "maps a number to a discrete value in the range": function(quantize) {
+      var x = quantize().range([0, 1, 2]);
+      assert.equal(x(0), 0);
+      assert.equal(x(.2), 0);
+      assert.equal(x(.4), 1);
+      assert.equal(x(.6), 1);
+      assert.equal(x(.8), 2);
+      assert.equal(x(1), 2);
+    },
+    "coerces domain to numbers": function(quantize) {
+      var x = quantize().domain(["0", "100"]);
+      assert.strictEqual(x.domain()[0], 0);
+      assert.strictEqual(x.domain()[1], 100);
+    },
+    "only considers the extent of the domain": function(quantize) {
+      var x = quantize().domain([-1, 0, 100]);
+      assert.deepEqual(x.domain(), [-1, 100]);
+    },
+    "clamps input values to the domain": function(quantize) {
+      var a = {}, b = {}, c = {}, x = quantize().range([a, b, c]);
+      assert.equal(x(-.5), a);
+      assert.equal(x(1.5), c);
+    },
+    "range cardinality determines the degree of quantization": function(quantize) {
+      var x = quantize();
+      assert.inDelta(x.range(d3.range(0, 1.001, .001))(1/3), .333, 1e-6);
+      assert.inDelta(x.range(d3.range(0, 1.01, .01))(1/3), .33, 1e-6);
+      assert.inDelta(x.range(d3.range(0, 1.1, .1))(1/3), .3, 1e-6);
+      assert.inDelta(x.range(d3.range(0, 1.2, .2))(1/3), .4, 1e-6);
+      assert.inDelta(x.range(d3.range(0, 1.25, .25))(1/3), .25, 1e-6);
+      assert.inDelta(x.range(d3.range(0, 1.5, .5))(1/3), .5, 1e-6);
+      assert.inDelta(x.range(d3.range(1))(1/3), 0, 1e-6);
+    },
+    "range values are arbitrary": function(quantize) {
+      var a = {}, b = {}, c = {}, x = quantize().range([a, b, c]);
+      assert.equal(x(0), a);
+      assert.equal(x(.2), a);
+      assert.equal(x(.4), b);
+      assert.equal(x(.6), b);
+      assert.equal(x(.8), c);
+      assert.equal(x(1), c);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/scale/sqrt-test.js b/static/demo/components/d3/test/scale/sqrt-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..d783921d5e3f736aae783007b833f3d767e00c3e
--- /dev/null
+++ b/static/demo/components/d3/test/scale/sqrt-test.js
@@ -0,0 +1,255 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.scale.sqrt");
+
+suite.addBatch({
+  "sqrt": {
+    topic: function() {
+      return d3.scale.sqrt;
+    },
+
+    "domain": {
+      "defaults to [0, 1]": function(sqrt) {
+        var x = sqrt();
+        assert.deepEqual(x.domain(), [0, 1]);
+        assert.inDelta(x(.5), 0.7071068, 1e-6);
+      },
+      "coerces domain to numbers": function(sqrt) {
+        var x = sqrt().domain([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(new Date(1989, 09, 20)), -.2, 1e-2);
+        assert.inDelta(x(new Date(1990, 00, 01)), 0, 1e-2);
+        assert.inDelta(x(new Date(1990, 02, 15)), .2, 1e-2);
+        assert.inDelta(x(new Date(1990, 04, 27)), .4, 1e-2);
+        assert.inDelta(x(new Date(1991, 00, 01)), 1, 1e-2);
+        assert.inDelta(x(new Date(1991, 02, 15)), 1.2, 1e-2);
+        var x = sqrt().domain(["0", "1"]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(.5), 0.7071068, 1e-6);
+        var x = sqrt().domain([new Number(0), new Number(1)]);
+        assert.equal(typeof x.domain()[0], "number");
+        assert.equal(typeof x.domain()[1], "number");
+        assert.inDelta(x(.5), 0.7071068, 1e-6);
+      },
+      "can specify a polypower domain and range": function(sqrt) {
+        var x = sqrt().domain([-10, 0, 100]).range(["red", "white", "green"]);
+        assert.equal(x(-5), "#ff4b4b");
+        assert.equal(x(50), "#4ba54b");
+        assert.equal(x(75), "#229122");
+      }
+    },
+
+    "range": {
+      "defaults to [0, 1]": function(sqrt) {
+        var x = sqrt();
+        assert.deepEqual(x.range(), [0, 1]);
+        assert.inDelta(x.invert(.5), .25, 1e-6);
+      },
+      "does not coerce range to numbers": function(sqrt) {
+        var x = sqrt().range(["0", "2"]);
+        assert.equal(typeof x.range()[0], "string");
+        assert.equal(typeof x.range()[1], "string");
+      },
+      "coerces range value to number on invert": function(sqrt) {
+        var x = sqrt().range(["0", "2"]);
+        assert.inDelta(x.invert("1"), .25, 1e-6);
+        var x = sqrt().range([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
+        assert.inDelta(x.invert(new Date(1990, 6, 2, 13)), .25, 1e-6);
+        var x = sqrt().range(["#000", "#fff"]);
+        assert.isNaN(x.invert("#999"));
+      },
+      "can specify range values as colors": function(sqrt) {
+        var x = sqrt().range(["red", "blue"]);
+        assert.equal(x(.25), "#800080");
+        var x = sqrt().range(["#ff0000", "#0000ff"]);
+        assert.equal(x(.25), "#800080");
+        var x = sqrt().range(["#f00", "#00f"]);
+        assert.equal(x(.25), "#800080");
+        var x = sqrt().range([d3.rgb(255,0,0), d3.hsl(240,1,.5)]);
+        assert.equal(x(.25), "#800080");
+        var x = sqrt().range(["hsl(0,100%,50%)", "hsl(240,100%,50%)"]);
+        assert.equal(x(.25), "#800080");
+      },
+      "can specify range values as arrays or objects": function(sqrt) {
+        var x = sqrt().range([{color: "red"}, {color: "blue"}]);
+        assert.deepEqual(x(.25), {color: "#800080"});
+        var x = sqrt().range([["red"], ["blue"]]);
+        assert.deepEqual(x(.25), ["#800080"]);
+      }
+    },
+
+    "exponent": {
+      "defaults to .5": function(sqrt) {
+        var x = sqrt();
+        assert.equal(x.exponent(), .5);
+      },
+      "observes the specified exponent": function(sqrt) {
+        var x = sqrt().exponent(.5).domain([1, 2]);
+        assert.inDelta(x(1), 0, 1e-6);
+        assert.inDelta(x(1.5), 0.5425821, 1e-6);
+        assert.inDelta(x(2), 1, 1e-6);
+        var x = sqrt().exponent(2).domain([1, 2]);
+        assert.inDelta(x(1), 0, 1e-6);
+        assert.inDelta(x(1.5), .41666667, 1e-6);
+        assert.inDelta(x(2), 1, 1e-6);
+        var x = sqrt().exponent(-1).domain([1, 2]);
+        assert.inDelta(x(1), 0, 1e-6);
+        assert.inDelta(x(1.5), .6666667, 1e-6);
+        assert.inDelta(x(2), 1, 1e-6);
+      },
+      "changing the exponent does not change the domain or range": function(sqrt) {
+        var x = sqrt().domain([1, 2]).range([3, 4]), f = d3.format(".6f");
+        x.exponent(.5);
+        assert.deepEqual(x.domain().map(f), [1, 2]);
+        assert.deepEqual(x.range(), [3, 4]);
+        x.exponent(2);
+        assert.deepEqual(x.domain().map(f), [1, 2]);
+        assert.deepEqual(x.range(), [3, 4]);
+        x.exponent(-1);
+        assert.deepEqual(x.domain().map(f), [1, 2]);
+        assert.deepEqual(x.range(), [3, 4]);
+      }
+    },
+
+    "interpolate": {
+      "defaults to d3.interpolate": function(sqrt) {
+        var x = sqrt().range(["red", "blue"]);
+        assert.equal(x.interpolate(), d3.interpolate);
+        assert.equal(x(.5), "#4b00b4");
+      },
+      "can specify a custom interpolator": function(sqrt) {
+        var x = sqrt().range(["red", "blue"]).interpolate(d3.interpolateHsl);
+        assert.equal(x(.25), "#ff00ff");
+      }
+    },
+
+    "clamp": {
+      "defaults to false": function(sqrt) {
+        var x = sqrt();
+        assert.isFalse(x.clamp());
+        assert.inDelta(x(-.5), -0.7071068, 1e-6);
+        assert.inDelta(x(1.5), 1.22474487, 1e-6);
+      },
+      "can clamp to the domain": function(sqrt) {
+        var x = sqrt().clamp(true);
+        assert.inDelta(x(-.5), 0, 1e-6);
+        assert.inDelta(x(.25), .5, 1e-6);
+        assert.inDelta(x(1.5), 1, 1e-6);
+        var x = sqrt().domain([1, 0]).clamp(true);
+        assert.inDelta(x(-.5), 1, 1e-6);
+        assert.inDelta(x(.25), .5, 1e-6);
+        assert.inDelta(x(1.5), 0, 1e-6);
+      }
+    },
+
+    "maps a number to a number": function(sqrt) {
+      var x = sqrt().domain([1, 2]);
+      assert.inDelta(x(.5), -0.7071068, 1e-6);
+      assert.inDelta(x(1), 0, 1e-6);
+      assert.inDelta(x(1.5), 0.5425821, 1e-6);
+      assert.inDelta(x(2), 1, 1e-6);
+      assert.inDelta(x(2.5), 1.4029932, 1e-6);
+    },
+
+    "ticks": {
+      "can generate ticks of varying degree": function(sqrt) {
+        var x = sqrt();
+        assert.deepEqual(x.ticks(1).map(x.tickFormat(1)), [0, 1]);
+        assert.deepEqual(x.ticks(2).map(x.tickFormat(2)), [0, .5, 1]);
+        assert.deepEqual(x.ticks(5).map(x.tickFormat(5)), [0, .2, .4, .6, .8, 1]);
+        assert.deepEqual(x.ticks(10).map(x.tickFormat(10)), [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]);
+        var x = sqrt().domain([1, 0]);
+        assert.deepEqual(x.ticks(1).map(x.tickFormat(1)), [0, 1]);
+        assert.deepEqual(x.ticks(2).map(x.tickFormat(2)), [0, .5, 1]);
+        assert.deepEqual(x.ticks(5).map(x.tickFormat(5)), [0, .2, .4, .6, .8, 1]);
+        assert.deepEqual(x.ticks(10).map(x.tickFormat(10)), [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]);
+      }
+    },
+
+    "nice": {
+      "can nice the domain, extending it to round numbers": function(sqrt) {
+        var x = sqrt().domain([1.1, 10.9]).nice(), f = d3.format(".6f");
+        assert.deepEqual(x.domain().map(f), [1, 11]);
+        var x = sqrt().domain([10.9, 1.1]).nice();
+        assert.deepEqual(x.domain().map(f), [11, 1]);
+        var x = sqrt().domain([.7, 11.001]).nice();
+        assert.deepEqual(x.domain().map(f), [0, 12]);
+        var x = sqrt().domain([123.1, 6.7]).nice();
+        assert.deepEqual(x.domain().map(f), [130, 0]);
+        var x = sqrt().domain([0, .49]).nice();
+        assert.deepEqual(x.domain().map(f), [0, .5]);
+      },
+      "nicing a polypower domain only affects the extent": function(sqrt) {
+        var x = sqrt().domain([1.1, 1, 2, 3, 10.9]).nice(), f = d3.format(".6f");
+        assert.deepEqual(x.domain().map(f), [1, 1, 2, 3, 11]);
+        var x = sqrt().domain([123.1, 1, 2, 3, -.9]).nice();
+        assert.deepEqual(x.domain().map(f), [130, 1, 2, 3, "-10.000000"]);
+      }
+    },
+
+    "copy": {
+      "changes to the domain are isolated": function(sqrt) {
+        var x = sqrt(), y = x.copy();
+        x.domain([1, 2]);
+        assert.deepEqual(y.domain(), [0, 1]);
+        assert.equal(x(1), 0);
+        assert.equal(y(1), 1);
+        y.domain([2, 3]);
+        assert.equal(x(2), 1);
+        assert.equal(y(2), 0);
+        assert.inDelta(x.domain(), [1, 2], 1e-6);
+        assert.inDelta(y.domain(), [2, 3], 1e-6);
+      },
+      "changes to the range are isolated": function(sqrt) {
+        var x = sqrt(), y = x.copy();
+        x.range([1, 2]);
+        assert.equal(x.invert(1), 0);
+        assert.equal(y.invert(1), 1);
+        assert.deepEqual(y.range(), [0, 1]);
+        y.range([2, 3]);
+        assert.equal(x.invert(2), 1);
+        assert.equal(y.invert(2), 0);
+        assert.deepEqual(x.range(), [1, 2]);
+        assert.deepEqual(y.range(), [2, 3]);
+      },
+      "changes to the exponent are isolated": function(sqrt) {
+        var x = sqrt().exponent(2), y = x.copy();
+        x.exponent(.5);
+        assert.inDelta(x(.5), Math.SQRT1_2, 1e-6);
+        assert.inDelta(y(.5), 0.25, 1e-6);
+        assert.equal(x.exponent(), .5);
+        assert.equal(y.exponent(), 2);
+        y.exponent(3);
+        assert.inDelta(x(.5), Math.SQRT1_2, 1e-6);
+        assert.inDelta(y(.5), 0.125, 1e-6);
+        assert.equal(x.exponent(), .5);
+        assert.equal(y.exponent(), 3);
+      },
+      "changes to the interpolator are isolated": function(sqrt) {
+        var x = sqrt().range(["red", "blue"]), y = x.copy();
+        x.interpolate(d3.interpolateHsl);
+        assert.equal(x(0.5), "#9500ff");
+        assert.equal(y(0.5), "#4b00b4");
+        assert.equal(y.interpolate(), d3.interpolate);
+      },
+      "changes to clamping are isolated": function(sqrt) {
+        var x = sqrt().clamp(true), y = x.copy();
+        x.clamp(false);
+        assert.equal(x(2), Math.SQRT2);
+        assert.equal(y(2), 1);
+        assert.isTrue(y.clamp());
+        y.clamp(false);
+        assert.equal(x(2), Math.SQRT2);
+        assert.equal(y(2), Math.SQRT2);
+        assert.isFalse(x.clamp());
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/scale/threshold-test.js b/static/demo/components/d3/test/scale/threshold-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..abc6df7f0a7adecfa3a89e7f9df329ad16de7e09
--- /dev/null
+++ b/static/demo/components/d3/test/scale/threshold-test.js
@@ -0,0 +1,52 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.scale.threshold");
+
+suite.addBatch({
+  "threshold": {
+    topic: function() {
+      return d3.scale.threshold;
+    },
+    "has the default domain [.5]": function(threshold) {
+      var x = threshold();
+      assert.deepEqual(x.domain(), [.5]);
+      assert.equal(x(.49), 0);
+    },
+    "has the default range [0, 1]": function(threshold) {
+      var x = threshold();
+      assert.deepEqual(x.range(), [0, 1]);
+      assert.equal(x(.50), 1);
+    },
+    "maps a number to a discrete value in the range": function(threshold) {
+      var x = threshold().domain([1/3, 2/3]).range(["a", "b", "c"]);
+      assert.equal(x(0), "a");
+      assert.equal(x(.2), "a");
+      assert.equal(x(.4), "b");
+      assert.equal(x(.6), "b");
+      assert.equal(x(.8), "c");
+      assert.equal(x(1), "c");
+    },
+    "domain values are arbitrary": function(threshold) {
+      var x = threshold().domain(["10", "2"]).range([0, 1, 2]);
+      assert.strictEqual(x.domain()[0], "10");
+      assert.strictEqual(x.domain()[1], "2");
+      assert.equal(x("0"), 0);
+      assert.equal(x("12"), 1);
+      assert.equal(x("3"), 2);
+    },
+    "range values are arbitrary": function(threshold) {
+      var a = {}, b = {}, c = {}, x = threshold().domain([1/3, 2/3]).range([a, b, c]);
+      assert.equal(x(0), a);
+      assert.equal(x(.2), a);
+      assert.equal(x(.4), b);
+      assert.equal(x(.6), b);
+      assert.equal(x(.8), c);
+      assert.equal(x(1), c);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/svg/arc-test.js b/static/demo/components/d3/test/svg/arc-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..8fd725d0c8720b0224988c6673f13baf50cfc10a
--- /dev/null
+++ b/static/demo/components/d3/test/svg/arc-test.js
@@ -0,0 +1,146 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.svg.arc");
+
+suite.addBatch({
+  "arc": {
+    topic: function() {
+      return d3.svg.arc;
+    },
+
+    "innerRadius defaults to a function accessor": function(arc) {
+      var a = arc().outerRadius(100).startAngle(0).endAngle(Math.PI);
+      assert.pathEqual(a({innerRadius: 0}), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+      assert.pathEqual(a({innerRadius: 50}), "M0,-100A100,100 0 1,1 0,100L0,50A50,50 0 1,0 0,-50Z");
+    },
+    "innerRadius can be defined as a constant": function(arc) {
+      var a = arc().outerRadius(100).startAngle(0).endAngle(Math.PI);
+      assert.pathEqual(a.innerRadius(0)(), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+      assert.pathEqual(a.innerRadius(50)(), "M0,-100A100,100 0 1,1 0,100L0,50A50,50 0 1,0 0,-50Z");
+    },
+    "innerRadius can be defined as a function of data or index": function(arc) {
+      var a = arc().innerRadius(f).outerRadius(100).startAngle(0).endAngle(Math.PI), o = {}, t = {}, dd, ii, tt;
+      function f(d, i) { dd = d; ii = i; tt = this; return 42; }
+      assert.pathEqual(a.call(t, o, 2), "M0,-100A100,100 0 1,1 0,100L0,42A42,42 0 1,0 0,-42Z");
+      assert.equal(dd, o, "expected data, got {actual}");
+      assert.equal(ii, 2, "expected index, got {actual}");
+      assert.equal(tt, t, "expected this, got {actual}");
+    },
+
+    "outerRadius defaults to a function accessor": function(arc) {
+      var a = arc().innerRadius(0).startAngle(0).endAngle(Math.PI);
+      assert.pathEqual(a({outerRadius: 50}), "M0,-50A50,50 0 1,1 0,50L0,0Z");
+      assert.pathEqual(a({outerRadius: 100}), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+    },
+    "outerRadius can be defined as a constant": function(arc) {
+      var a = arc().innerRadius(0).startAngle(0).endAngle(Math.PI);
+      assert.pathEqual(a.outerRadius(50)(), "M0,-50A50,50 0 1,1 0,50L0,0Z");
+      assert.pathEqual(a.outerRadius(100)(), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+    },
+    "outerRadius can be defined as a function of data or index": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(f).startAngle(0).endAngle(Math.PI), o = {}, t = {}, dd, ii, tt;
+      function f(d, i) { dd = d; ii = i; tt = this; return 42; }
+      assert.pathEqual(a.call(t, o, 2), "M0,-42A42,42 0 1,1 0,42L0,0Z");
+      assert.equal(dd, o, "expected data, got {actual}");
+      assert.equal(ii, 2, "expected index, got {actual}");
+      assert.equal(tt, t, "expected this, got {actual}");
+    },
+
+    "startAngle defaults to a function accessor": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(100).endAngle(Math.PI);
+      assert.pathEqual(a({startAngle: 0}), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+      assert.pathEqual(a({startAngle: Math.PI / 2}), "M100,0A100,100 0 0,1 0,100L0,0Z");
+    },
+    "startAngle can be defined as a constant": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(100).endAngle(Math.PI);
+      assert.pathEqual(a.startAngle(0)(), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+      assert.pathEqual(a.startAngle(Math.PI / 2)(), "M100,0A100,100 0 0,1 0,100L0,0Z");
+    },
+    "startAngle can be defined as a function of data or index": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(100).startAngle(f).endAngle(Math.PI), o = {}, t = {}, dd, ii, tt;
+      function f(d, i) { dd = d; ii = i; tt = this; return Math.PI; }
+      assert.pathEqual(a.call(t, o, 2), "M0,100A100,100 0 0,1 0,100L0,0Z");
+      assert.equal(dd, o, "expected data, got {actual}");
+      assert.equal(ii, 2, "expected index, got {actual}");
+      assert.equal(tt, t, "expected this, got {actual}");
+    },
+
+    "endAngle defaults to a function accessor": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(100).startAngle(0);
+      assert.pathEqual(a({endAngle: Math.PI / 2}), "M0,-100A100,100 0 0,1 100,0L0,0Z");
+      assert.pathEqual(a({endAngle: Math.PI}), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+    },
+    "endAngle can be defined as a constant": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(100).startAngle(0);
+      assert.pathEqual(a.endAngle(Math.PI / 2)(), "M0,-100A100,100 0 0,1 100,0L0,0Z");
+      assert.pathEqual(a.endAngle(Math.PI)(), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+    },
+    "endAngle can be defined as a function of data or index": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(100).startAngle(0).endAngle(f), o = {}, t = {}, dd, ii, tt;
+      function f(d, i) { dd = d; ii = i; tt = this; return Math.PI; }
+      assert.pathEqual(a.call(t, o, 2), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+      assert.equal(dd, o, "expected data, got {actual}");
+      assert.equal(ii, 2, "expected index, got {actual}");
+      assert.equal(tt, t, "expected this, got {actual}");
+    },
+
+    "startAngle and endAngle are swapped if endAngle is less than startAngle": function(arc) {
+      var a = arc().innerRadius(50).outerRadius(100);
+      assert.pathEqual(a.startAngle(2 * Math.PI).endAngle(Math.PI)(), a.startAngle(Math.PI).endAngle(2 * Math.PI)());
+      assert.pathEqual(a.startAngle(-Math.PI).endAngle(Math.PI)(), a.startAngle(Math.PI).endAngle(-Math.PI)());
+    },
+
+    "angles are defined in radians, with zero at 12 o'clock": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(100);
+      assert.pathEqual(a.startAngle(0).endAngle(Math.PI)(), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+      assert.pathEqual(a.startAngle(Math.PI).endAngle(2 * Math.PI)(), "M0,100A100,100 0 1,1 0,-100L0,0Z");
+    },
+    "radii are defined in local coordinates (typically pixels)": function(arc) {
+      var a = arc().startAngle(0).endAngle(Math.PI);
+      assert.pathEqual(a.innerRadius(0).outerRadius(100)(), "M0,-100A100,100 0 1,1 0,100L0,0Z");
+      assert.pathEqual(a.innerRadius(100).outerRadius(200)(), "M0,-200A200,200 0 1,1 0,200L0,100A100,100 0 1,0 0,-100Z");
+    },
+    "draws a circle when inner radius is zero and angle is approximately 2Ï€": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(100);
+      assert.pathEqual(a.startAngle(0).endAngle(2 * Math.PI - 1e-9)(), "M0,100A100,100 0 1,1 0,-100A100,100 0 1,1 0,100Z");
+      assert.pathEqual(a.startAngle(Math.PI + 1e-9).endAngle(3 * Math.PI - 1e-9)(), "M0,100A100,100 0 1,1 0,-100A100,100 0 1,1 0,100Z");
+    },
+    "draws a circle when inner radius is zero and angle is greater than 2Ï€": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(100);
+      assert.pathEqual(a.startAngle(0).endAngle(7)(), "M0,100A100,100 0 1,1 0,-100A100,100 0 1,1 0,100Z");
+      assert.pathEqual(a.startAngle(1).endAngle(8)(), "M0,100A100,100 0 1,1 0,-100A100,100 0 1,1 0,100Z");
+    },
+    "draws a circular sector when inner radius is zero and angle is less than 2Ï€": function(arc) {
+      var a = arc().innerRadius(0).outerRadius(100);
+      assert.pathEqual(a.startAngle(0).endAngle(Math.PI / 2)(), "M0,-100A100,100 0 0,1 100,0L0,0Z");
+    },
+    "draws an annulus when inner radius is non-zero and angle is approximately 2Ï€": function(arc) {
+      var a = arc().innerRadius(100).outerRadius(200);
+      assert.pathEqual(a.startAngle(0).endAngle(2 * Math.PI - 1e-9)(), "M0,200A200,200 0 1,1 0,-200A200,200 0 1,1 0,200M0,100A100,100 0 1,0 0,-100A100,100 0 1,0 0,100Z");
+      assert.pathEqual(a.startAngle(Math.PI + 1e-9).endAngle(3 * Math.PI - 1e-9)(), "M0,200A200,200 0 1,1 0,-200A200,200 0 1,1 0,200M0,100A100,100 0 1,0 0,-100A100,100 0 1,0 0,100Z");
+    },
+    "draws an annulus when inner radius is non-zero and angle is greater than 2Ï€": function(arc) {
+      var a = arc().innerRadius(100).outerRadius(200);
+      assert.pathEqual(a.startAngle(0).endAngle(7)(), "M0,200A200,200 0 1,1 0,-200A200,200 0 1,1 0,200M0,100A100,100 0 1,0 0,-100A100,100 0 1,0 0,100Z");
+      assert.pathEqual(a.startAngle(-1).endAngle(6)(), "M0,200A200,200 0 1,1 0,-200A200,200 0 1,1 0,200M0,100A100,100 0 1,0 0,-100A100,100 0 1,0 0,100Z");
+    },
+    "draws an annular sector when both radii are non-zero and angle is less than 2Ï€": function(arc) {
+      var a = arc().innerRadius(100).outerRadius(200);
+      assert.pathEqual(a.startAngle(0).endAngle(Math.PI / 2)(), "M0,-200A200,200 0 0,1 200,0L100,0A100,100 0 0,0 0,-100Z");
+    },
+
+    "computes the centroid as mid-radius and mid-angle": function(arc) {
+      var c = arc().innerRadius(0).outerRadius(100).startAngle(0).endAngle(2 * Math.PI).centroid();
+      assert.inDelta(c[0], 0, 1e-6);
+      assert.inDelta(c[1], 50, 1e-6);
+      var c = arc().innerRadius(100).outerRadius(200).startAngle(Math.PI).endAngle(2 * Math.PI).centroid();
+      assert.inDelta(c[0], -150, 1e-6);
+      assert.inDelta(c[1], 0, 1e-6);
+    },
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/svg/area-radial-test.js b/static/demo/components/d3/test/svg/area-radial-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..479e49171395cdc62521cdf8e6dd26443982618c
--- /dev/null
+++ b/static/demo/components/d3/test/svg/area-radial-test.js
@@ -0,0 +1,201 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.svg.area.radial");
+
+suite.addBatch({
+  "area.radial": {
+    topic: function() {
+      return d3.svg.area.radial;
+    },
+
+    "radius is an alias for setting innerRadius and outerRadius": function(area) {
+      var a = area().radius(f);
+      function f() {}
+      assert.equal(a.radius(), f);
+      assert.equal(a.innerRadius(), f);
+      assert.equal(a.outerRadius(), f);
+    },
+    "radius is an alias for getting outerRadius": function(area) {
+      var a = area().outerRadius(f);
+      function f() {}
+      assert.equal(a.radius(), f);
+    },
+
+    "angle is an alias for setting startAngle and endAngle": function(area) {
+      var a = area().angle(f);
+      function f() {}
+      assert.equal(a.angle(), f);
+      assert.equal(a.startAngle(), f);
+      assert.equal(a.endAngle(), f);
+    },
+    "angle is an alias for getting endAngle": function(area) {
+      var a = area().endAngle(f);
+      function f() {}
+      assert.equal(a.angle(), f);
+    },
+
+    "innerRadius defaults to a function accessor": function(area) {
+      var a = area();
+      assert.pathEqual(a([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10L16.829420,-10.806046L18.185949,8.322937L1.411200,9.899925L0,-10L0,-20L0,-20L0,-10Z");
+      assert.typeOf(a.innerRadius(), "function");
+    },
+    "innerRadius can be defined as a constant": function(area) {
+      var a = area().innerRadius(30);
+      assert.pathEqual(a([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10L16.829420,-10.806046L18.185949,8.322937L1.411200,9.899925L0,-30L0,-30L0,-30L0,-30Z");
+      assert.equal(a.innerRadius(), 30);
+    },
+    "innerRadius can be defined as a function": function(area) {
+      var a = area().innerRadius(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 30; }
+      assert.pathEqual(a.call(t, [[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10L16.829420,-10.806046L18.185949,8.322937L1.411200,9.899925L0,-30L0,-30L0,-30L0,-30Z");
+      assert.deepEqual(dd, [[10, 0], [20, 1], [20, 2], [10, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1, 2, 3], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t, t, t], "expected this, got {actual}");
+    },
+
+    "outerRadius defaults to a function accessor": function(area) {
+      var a = area();
+      assert.pathEqual(a([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10L16.829420,-10.806046L18.185949,8.322937L1.411200,9.899925L0,-10L0,-20L0,-20L0,-10Z");
+      assert.typeOf(a.outerRadius(), "function");
+    },
+    "outerRadius can be defined as a constant": function(area) {
+      var a = area().outerRadius(30);
+      assert.pathEqual(a([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-30L25.244130,-16.209069L27.278923,12.484405L4.233600,29.699775L0,-10L0,-20L0,-20L0,-10Z");
+      assert.equal(a.outerRadius(), 30);
+    },
+    "outerRadius can be defined as a function": function(area) {
+      var a = area().outerRadius(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 30; }
+      assert.pathEqual(a.call(t, [[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-30L25.244130,-16.209069L27.278923,12.484405L4.233600,29.699775L0,-10L0,-20L0,-20L0,-10Z");
+      assert.deepEqual(dd, [[10, 0], [20, 1], [20, 2], [10, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1, 2, 3], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t, t, t], "expected this, got {actual}");
+    },
+
+    "startAngle defaults to zero": function(area) {
+      var a = area();
+      assert.pathEqual(a([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10L16.829420,-10.806046L18.185949,8.322937L1.411200,9.899925L0,-10L0,-20L0,-20L0,-10Z");
+      assert.equal(a.startAngle(), 0);
+    },
+    "startAngle can be defined as a constant": function(area) {
+      var a = area().startAngle(Math.PI / 2);
+      assert.pathEqual(a([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10L16.829420,-10.806046L18.185949,8.322937L1.411200,9.899925L10,0L20,0L20,0L10,0Z");
+      assert.equal(a.startAngle(), Math.PI / 2);
+    },
+    "startAngle can be defined as a function": function(area) {
+      var a = area().startAngle(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return Math.PI / 2; }
+      assert.pathEqual(a.call(t, [[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10L16.829420,-10.806046L18.185949,8.322937L1.411200,9.899925L10,0L20,0L20,0L10,0Z");
+      assert.deepEqual(dd, [[10, 0], [20, 1], [20, 2], [10, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1, 2, 3], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t, t, t], "expected this, got {actual}");
+    },
+
+    "endAngle defaults to a function accessor": function(area) {
+      var a = area();
+      assert.pathEqual(a([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10L16.829420,-10.806046L18.185949,8.322937L1.411200,9.899925L0,-10L0,-20L0,-20L0,-10Z");
+      assert.typeOf(a.endAngle(), "function");
+    },
+    "endAngle can be defined as a constant": function(area) {
+      var a = area().endAngle(Math.PI / 2);
+      assert.pathEqual(a([[10, 0], [20, 1], [20, 2], [10, 3]]), "M10,0L20,0L20,0L10,0L0,-10L0,-20L0,-20L0,-10Z");
+      assert.equal(a.endAngle(), Math.PI / 2);
+    },
+    "endAngle can be defined as a function": function(area) {
+      var a = area().endAngle(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return Math.PI / 2; }
+      assert.pathEqual(a.call(t, [[10, 0], [20, 1], [20, 2], [10, 3]]), "M10,0L20,0L20,0L10,0L0,-10L0,-20L0,-20L0,-10Z");
+      assert.deepEqual(dd, [[10, 0], [20, 1], [20, 2], [10, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1, 2, 3], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t, t, t], "expected this, got {actual}");
+    },
+
+    "if innerRadius === outerRadius, radius is only evaluated once per point": function(area) {
+      var a = area().radius(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 30; }
+      assert.pathEqual(a.call(t, [[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-30L25.244130,-16.209069L27.278923,12.484405L4.233600,29.699775L0,-30L0,-30L0,-30L0,-30Z");
+      assert.deepEqual(dd, [[10, 0], [20, 1], [20, 2], [10, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1, 2, 3], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t, t, t], "expected this, got {actual}");
+    },
+    "if startAngle === endAngle, angle is only evaluated once per point": function(area) {
+      var a = area().angle(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return Math.PI / 2; }
+      assert.pathEqual(a.call(t, [[10, 0], [20, 1], [20, 2], [10, 3]]), "M10,0L20,0L20,0L10,0L10,0L20,0L20,0L10,0Z");
+      assert.deepEqual(dd, [[10, 0], [20, 1], [20, 2], [10, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1, 2, 3], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t, t, t], "expected this, got {actual}");
+    },
+
+    "interpolate defaults to linear": function(area) {
+      assert.equal(area().interpolate(), "linear");
+    },
+    "interpolate can be defined as a constant": function(area) {
+      var a = area().interpolate("step-before");
+      assert.pathEqual(a([[0, 0], [1, 1]]), "M0,0V-0.540302H0.841471L0,-1H0V0Z");
+      assert.equal(a.interpolate(), "step-before");
+    },
+
+    "tension defaults to .7": function(area) {
+      assert.equal(area().tension(), .7);
+    },
+    "tension can be specified as a constant": function(area) {
+      var a = area().tension(.5);
+      assert.equal(a.tension(), .5);
+    },
+
+    "returns null if input points array is empty": function(area) {
+      assert.isNull(area()([]));
+    },
+
+    "interpolate(linear)": {
+      "supports linear interpolation": testInterpolation("linear")
+    },
+
+    "interpolate(step)": {
+      "supports step-before interpolation": testInterpolation("step-before"),
+      "supports step-after interpolation": testInterpolation("step-after")
+    },
+
+    "interpolate(basis)": {
+      "supports basis interpolation": testInterpolation("basis"),
+      "supports basis-open interpolation": testInterpolation("basis-open"),
+      "supports basis-closed interpolation": testInterpolation("basis-closed")
+    },
+
+    "interpolate(cardinal)": {
+      "supports cardinal interpolation": testInterpolation("cardinal"),
+      "supports cardinal-open interpolation": testInterpolation("cardinal-open"),
+      "supports cardinal-closed interpolation": testInterpolation("cardinal-closed")
+    },
+
+    "interpolate(monotone)": {
+      "supports monotone interpolation": testInterpolation("monotone")
+    }
+  }
+});
+
+// A radial area is just a transformation of a Cartesian line.
+function testInterpolation(interpolate) {
+  var data = [[10, 0], [20, 1], [20, 2], [10, 3]];
+
+  var radial = d3.svg.area.radial()
+      .innerRadius(function(d) { return d[0]; })
+      .outerRadius(function(d) { return d[0] * 2; })
+      .angle(function(d) { return d[1]; });
+
+  var cartesian = d3.svg.area()
+      .x0(function(d) { return d[0] * Math.cos(d[1] - Math.PI / 2); })
+      .x1(function(d) { return 2 * d[0] * Math.cos(d[1] - Math.PI / 2); })
+      .y0(function(d) { return d[0] * Math.sin(d[1] - Math.PI / 2); })
+      .y1(function(d) { return 2 * d[0] * Math.sin(d[1] - Math.PI / 2); });
+
+  return function() {
+    assert.pathEqual(radial.interpolate(interpolate)(data), cartesian.interpolate(interpolate)(data));
+  };
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/svg/area-test.js b/static/demo/components/d3/test/svg/area-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..d42d9daac4385074a13391ac2ef18320c79d8ab6
--- /dev/null
+++ b/static/demo/components/d3/test/svg/area-test.js
@@ -0,0 +1,194 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.svg.area");
+
+suite.addBatch({
+  "area": {
+    topic: function() {
+      return d3.svg.area;
+    },
+
+    "x is an alias for setting x0 and x1": function(area) {
+      var a = area().x(f);
+      function f() {}
+      assert.equal(a.x(), f);
+      assert.equal(a.x0(), f);
+      assert.equal(a.x1(), f);
+    },
+    "x is an alias for getting x1": function(area) {
+      var a = area().x1(f);
+      function f() {}
+      assert.equal(a.x(), f);
+    },
+
+    "y is an alias for setting y0 and y1": function(area) {
+      var a = area().y(f);
+      function f() {}
+      assert.equal(a.y(), f);
+      assert.equal(a.y0(), f);
+      assert.equal(a.y1(), f);
+    },
+    "y is an alias for getting x1": function(area) {
+      var a = area().y1(f);
+      function f() {}
+      assert.equal(a.y(), f);
+    },
+
+    "x0 defaults to a function accessor": function(area) {
+      var a = area();
+      assert.pathEqual(a([[1, 2], [4, 3]]), "M1,2L4,3L4,0L1,0Z");
+      assert.typeOf(a.x0(), "function");
+    },
+    "x0 can be defined as a constant": function(area) {
+      var a = area().x0(0);
+      assert.pathEqual(a([[1, 2], [4, 3]]), "M1,2L4,3L0,0L0,0Z");
+      assert.equal(a.x0(), 0);
+    },
+    "x0 can be defined as a function": function(area) {
+      var a = area().x0(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 0; }
+      assert.pathEqual(a.call(t, [[1, 2], [4, 3]]), "M1,2L4,3L0,0L0,0Z");
+      assert.deepEqual(dd, [[1, 2], [4, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t], "expected this, got {actual}");
+    },
+
+    "x1 defaults to a function accessor": function(area) {
+      var a = area();
+      assert.pathEqual(a([[1, 2], [4, 3]]), "M1,2L4,3L4,0L1,0Z");
+      assert.typeOf(a.x1(), "function");
+    },
+    "x1 can be defined as a constant": function(area) {
+      var a = area().x1(0);
+      assert.pathEqual(a([[1, 2], [4, 3]]), "M0,2L0,3L4,0L1,0Z");
+      assert.equal(a.x1(), 0);
+    },
+    "x1 can be defined as a function": function(area) {
+      var a = area().x1(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 0; }
+      assert.pathEqual(a.call(t, [[1, 2], [4, 3]]), "M0,2L0,3L4,0L1,0Z");
+      assert.deepEqual(dd, [[1, 2], [4, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t], "expected this, got {actual}");
+    },
+
+    "y0 defaults to zero": function(area) {
+      var a = area();
+      assert.pathEqual(a([[1, 2], [4, 3]]), "M1,2L4,3L4,0L1,0Z");
+      assert.equal(a.y0(), 0);
+    },
+    "y0 can be defined as a constant": function(area) {
+      var a = area().y0(1);
+      assert.pathEqual(a([[1, 2], [4, 3]]), "M1,2L4,3L4,1L1,1Z");
+      assert.equal(a.y0(), 1);
+    },
+    "y0 can be defined as a function": function(area) {
+      var a = area().y0(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 1; }
+      assert.pathEqual(a.call(t, [[1, 2], [4, 3]]), "M1,2L4,3L4,1L1,1Z");
+      assert.deepEqual(dd, [[1, 2], [4, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t], "expected this, got {actual}");
+    },
+
+    "y1 defaults to a function accessor": function(area) {
+      var a = area();
+      assert.pathEqual(a([[1, 2], [4, 3]]), "M1,2L4,3L4,0L1,0Z");
+      assert.typeOf(a.y1(), "function");
+    },
+    "y1 can be defined as a constant": function(area) {
+      var a = area().y1(1);
+      assert.pathEqual(a([[1, 2], [4, 3]]), "M1,1L4,1L4,0L1,0Z");
+      assert.equal(a.y1(), 1);
+    },
+    "y1 can be defined as a function": function(area) {
+      var a = area().y1(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 1; }
+      assert.pathEqual(a.call(t, [[1, 2], [4, 3]]), "M1,1L4,1L4,0L1,0Z");
+      assert.deepEqual(dd, [[1, 2], [4, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t], "expected this, got {actual}");
+    },
+
+    "if x0 === x1, x is only evaluated once per point": function(area) {
+      var a = area().x(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 0; }
+      assert.pathEqual(a.call(t, [[1, 2], [4, 3]]), "M0,2L0,3L0,0L0,0Z");
+      assert.deepEqual(dd, [[1, 2], [4, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t], "expected this, got {actual}");
+    },
+    "if y0 === y1, y is only evaluated once per point": function(area) {
+      var a = area().y(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 1; }
+      assert.pathEqual(a.call(t, [[1, 2], [4, 3]]), "M1,1L4,1L4,1L1,1Z");
+      assert.deepEqual(dd, [[1, 2], [4, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t], "expected this, got {actual}");
+    },
+
+    "interpolate defaults to linear": function(area) {
+      assert.equal(area().interpolate(), "linear");
+    },
+    "interpolate can be defined as a constant": function(area) {
+      var a = area().interpolate("step-before");
+      assert.pathEqual(a([[0, 0], [1, 1]]), "M0,0V1H1L1,0H0V0Z");
+      assert.equal(a.interpolate(), "step-before");
+    },
+    "invalid interpolates fallback to linear": function(area) {
+      assert.equal(area().interpolate("__proto__").interpolate(), "linear");
+    },
+
+    "tension defaults to .7": function(area) {
+      assert.equal(area().tension(), .7);
+    },
+    "tension can be specified as a constant": function(area) {
+      var a = area().tension(.5);
+      assert.equal(a.tension(), .5);
+    },
+
+    "returns null if input points array is empty": function(area) {
+      assert.isNull(area()([]));
+    },
+
+    "interpolate(linear)": {
+      "supports linear interpolation": testInterpolation("linear")
+    },
+
+    "interpolate(step)": {
+      "supports step-before interpolation": testInterpolation("step-before", "step-after"),
+      "supports step-after interpolation": testInterpolation("step-after", "step-before")
+    },
+
+    "interpolate(basis)": {
+      "supports basis interpolation": testInterpolation("basis"),
+      "supports basis-open interpolation": testInterpolation("basis-open")
+    },
+
+    "interpolate(cardinal)": {
+      "supports cardinal interpolation": testInterpolation("cardinal"),
+      "supports cardinal-open interpolation": testInterpolation("cardinal-open")
+    },
+
+    "interpolate(monotone)": {
+      "supports monotone interpolation": testInterpolation("monotone")
+    }
+  }
+});
+
+// An area is just two lines, with one reversed.
+function testInterpolation(i0, i1) {
+  if (arguments.length < 2) i1 = i0;
+  return function(area) {
+    var a = area().interpolate(i0),
+        d = [[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]],
+        l0 = d3.svg.line().interpolate(i1).x(a.x0()).y(a.y0()),
+        l1 = d3.svg.line().interpolate(i0).x(a.x1()).y(a.y1());
+    assert.pathEqual(a(d), l1(d) + "L" + l0(d.reverse()).substring(1) + "Z");
+  };
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/svg/axis-test.js b/static/demo/components/d3/test/svg/axis-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a83a50fec2f8ab715062a0d7fe5eeda1fbebc63c
--- /dev/null
+++ b/static/demo/components/d3/test/svg/axis-test.js
@@ -0,0 +1,406 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.svg.axis");
+
+suite.addBatch({
+  "axis": {
+    topic: function() {
+      return d3.svg.axis;
+    },
+
+    "scale": {
+      "defaults to a linear scale": function(axis) {
+        var a = axis(), x = a.scale();
+        assert.deepEqual(x.domain(), [0, 1]);
+        assert.deepEqual(x.range(), [0, 1]);
+        assert.equal(x(0.5), 0.5);
+      },
+      "can be defined as a scale object": function(axis) {
+        var x = d3.scale.linear(), a = axis().scale(x);
+        assert.equal(a.scale(), x);
+      },
+      "can be a polylinear scale": function(axis) {
+        var a = axis().scale(d3.scale.linear().domain([0, 1, 10]).range([2, 20, 200])),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            path = g.selectAll("path");
+        assert.equal(path.attr("d"), "M2,6V0H200V6");
+      },
+      "can be an ordinal scale": function(axis) {
+        var a = axis().scale(d3.scale.ordinal().domain(["A", "B", "C"]).rangeBands([10, 90])),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            path = g.selectAll("path");
+        assert.equal(path.attr("d"), "M10,6V0H90V6");
+      },
+      "can be an ordinal scale with explicit range": function(axis) {
+        var a = axis().scale(d3.scale.ordinal().domain(["A", "B", "C"]).range([10, 50, 90])),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            path = g.selectAll("path");
+        assert.equal(path.attr("d"), "M10,6V0H90V6");
+      }
+    },
+
+    "orient": {
+      "defaults to bottom": function(axis) {
+        var a = axis();
+        assert.equal(a.orient(), "bottom");
+      },
+      "defaults to bottom when an invalid orientation is specified": function(axis) {
+        var a = axis().orient("invalid");
+        assert.equal(a.orient(), "bottom");
+      },
+      "coerces to a string": function(axis) {
+        var a = axis().orient({toString: function() { return "left"; }});
+        assert.equal(a.orient(), "left");
+      },
+      "supports top orientation": function(axis) {
+        var a = axis().orient("top"),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            tick = g.select("g:nth-child(3)"),
+            text = tick.select("text"),
+            line = tick.select("line"),
+            path = g.select("path.domain");
+        assert.equal(tick.attr("transform"), "translate(0.2,0)");
+        assert.equal(text.attr("y"), -9)
+        assert.equal(text.attr("dy"), "0em");
+        assert.equal(text.style("text-anchor"), "middle");
+        assert.equal(text.text(), "0.2");
+        assert.equal(line.attr("y2"), -6);
+        assert.equal(path.attr("d"), "M0,-6V0H1V-6");
+      },
+      "supports right orientation": function(axis) {
+        var a = axis().orient("right"),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            tick = g.select("g:nth-child(3)"),
+            text = tick.select("text"),
+            line = tick.select("line"),
+            path = g.select("path.domain");
+        assert.equal(tick.attr("transform"), "translate(0,0.2)");
+        assert.equal(text.attr("x"), 9)
+        assert.equal(text.attr("dy"), ".32em");
+        assert.equal(text.style("text-anchor"), "start");
+        assert.equal(text.text(), "0.2");
+        assert.equal(line.attr("x2"), 6);
+        assert.equal(path.attr("d"), "M6,0H0V1H6");
+      },
+      "supports bottom orientation": function(axis) {
+        var a = axis().orient("bottom"),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            tick = g.select("g:nth-child(3)"),
+            text = tick.select("text"),
+            line = tick.select("line"),
+            path = g.select("path.domain");
+        assert.equal(tick.attr("transform"), "translate(0.2,0)");
+        assert.equal(text.attr("y"), 9)
+        assert.equal(text.attr("dy"), ".71em");
+        assert.equal(text.style("text-anchor"), "middle");
+        assert.equal(text.text(), "0.2");
+        assert.equal(line.attr("y2"), 6);
+        assert.equal(path.attr("d"), "M0,6V0H1V6");
+      },
+      "supports left orientation": function(axis) {
+        var a = axis().orient("left"),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            tick = g.select("g:nth-child(3)"),
+            text = tick.select("text"),
+            line = tick.select("line"),
+            path = g.select("path.domain");
+        assert.equal(tick.attr("transform"), "translate(0,0.2)");
+        assert.equal(text.attr("x"), -9)
+        assert.equal(text.attr("dy"), ".32em");
+        assert.equal(text.style("text-anchor"), "end");
+        assert.equal(text.text(), "0.2");
+        assert.equal(line.attr("x2"), -6);
+        assert.equal(path.attr("d"), "M-6,0H0V1H-6");
+      }
+    },
+
+    "tickSize": {
+      "defaults to six pixels": function(axis) {
+        var a = axis();
+        assert.equal(a.tickSize(), 6);
+      },
+      "can be defined as a number": function(axis) {
+        var a = axis().tickSize(3);
+        assert.equal(a.tickSize(), 3);
+      },
+      "coerces input value to a number": function(axis) {
+        var a = axis().tickSize("3");
+        assert.strictEqual(a.tickSize(), 3);
+      },
+      "affects the generated domain path": function(axis) {
+        var a = axis().tickSize(3),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            path = g.select("path.domain");
+        assert.equal(path.attr("d"), "M0,3V0H1V3");
+      },
+      "affects the generated tick lines": function(axis) {
+        var a = axis().tickSize(3),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            line = g.selectAll("g line");
+        line.each(function() {
+          assert.equal(d3.select(this).attr("y2"), 3);
+        });
+      },
+      "if negative, labels are placed on the opposite end": function(axis) {
+        var a = axis().tickSize(-80),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            line = g.selectAll("g line"),
+            text = g.selectAll("g text");
+        line.each(function() {
+          assert.equal(d3.select(this).attr("y2"), -80);
+        });
+        text.each(function() {
+          assert.equal(d3.select(this).attr("y"), 3);
+        });
+      },
+      "with two arguments, specifies end tick size": function(axis) {
+        var a = axis().tickSize(6, 3),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            path = g.selectAll("path");
+        assert.equal(path.attr("d"), "M0,3V0H1V3");
+      },
+      "with three arguments, specifies end and minor tick sizes": function(axis) {
+        var a = axis().tickSubdivide(3).tickSize(6, 3, 9),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            path = g.selectAll("path"),
+            line = g.select(".minor");
+        assert.equal(path.attr("d"), "M0,9V0H1V9");
+        assert.equal(line.attr("y2"), "3");
+      }
+    },
+
+    "tickPadding": {
+      "defaults to three pixels": function(axis) {
+        var a = axis();
+        assert.equal(a.tickPadding(), 3);
+      },
+      "can be defined as a number": function(axis) {
+        var a = axis().tickPadding(6);
+        assert.equal(a.tickPadding(), 6);
+      },
+      "coerces input value to a number": function(axis) {
+        var a = axis().tickPadding("6");
+        assert.strictEqual(a.tickPadding(), 6);
+      },
+      "affects the generated tick labels": function(axis) {
+        var a = axis().tickSize(2).tickPadding(7),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            text = g.selectAll("g text");
+        text.each(function() {
+          assert.equal(d3.select(this).attr("y"), 9);
+        });
+      }
+    },
+
+    "ticks": {
+      "defaults to [10]": function(axis) {
+        var a = axis();
+        assert.deepEqual(a.ticks(), [10]);
+      },
+      "can be defined as any arguments": function(axis) {
+        var b = {}, a = axis().ticks(b, 42), t = a.ticks();
+        assert.equal(t[0], b);
+        assert.equal(t[1], 42);
+        assert.equal(t.length, 2);
+      },
+      "passes any arguments to the scale's ticks function": function(axis) {
+        var x = d3.scale.linear(), b = {}, a = axis().ticks(b, 42).scale(x), aa = [],
+            g = d3.select("body").html("").append("svg:g");
+        x.ticks = function() { aa.push(arguments); return [42]; };
+        g.call(a);
+        assert.equal(aa.length, 1);
+        assert.equal(aa[0].length, 2);
+        assert.equal(aa[0][0], b);
+        assert.equal(aa[0][1], 42);
+      },
+      "passes any arguments to the scale's tickFormat function": function(axis) {
+        var b = {},
+            x = d3.scale.linear(),
+            a = axis().scale(x).ticks(b, 42),
+            g = d3.select("body").html("").append("svg:g"),
+            aa = [];
+
+        x.tickFormat = function() {
+          aa.push(arguments);
+          return String;
+        };
+
+        g.call(a);
+        assert.equal(aa.length, 1);
+        assert.equal(aa[0].length, 2);
+        assert.equal(aa[0][0], b);
+        assert.equal(aa[0][1], 42);
+      },
+      "affects the generated ticks": function(axis) {
+        var a = axis().ticks(20),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            t = g.selectAll("g");
+        assert.equal(t[0].length, 21);
+      }
+    },
+
+    "tickValues": {
+      "defaults to null": function(axis) {
+        var a = axis().tickValues();
+        assert.isNull(a);
+      },
+      "can be given as array of positions": function(axis) {
+        var l = [1, 2.5, 3], a = axis().tickValues(l), t = a.tickValues();
+        assert.equal(t, l);
+        assert.equal(t.length, 3);
+      },
+      "does not change the tick arguments": function(axis) {
+        var b = {}, a = axis().ticks(b, 42).tickValues([10]), t = a.ticks();
+        assert.equal(t[0], b);
+        assert.equal(t[1], 42);
+        assert.equal(t.length, 2);
+      },
+      "does not change the arguments passed to the scale's tickFormat function": function(axis) {
+        var x = d3.scale.linear(),
+            a = axis().scale(x).ticks(10).tickValues([1, 2, 3]),
+            g = d3.select("body").html("").append("svg:g"),
+            aa = [];
+
+        x.tickFormat = function() {
+          aa.push(arguments);
+          return String;
+        };
+
+        g.call(a);
+        assert.equal(aa.length, 1);
+        assert.equal(aa[0].length, 1);
+        assert.equal(aa[0][0], 10);
+      },
+      "affects the generated ticks": function(axis) {
+        var a = axis().ticks(20),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            t = g.selectAll("g");
+        assert.equal(t[0].length, 21);
+      }
+    },
+
+    "tickSubdivide": {
+      "defaults to zero": function(axis) {
+        var a = axis();
+        assert.equal(a.tickSubdivide(), 0);
+      },
+      "coerces input value to a number": function(axis) {
+        var a = axis().tickSubdivide(true);
+        assert.strictEqual(a.tickSubdivide(), 1);
+      },
+      "does not generate minor ticks when zero": function(axis) {
+        var g = d3.select("body").html("").append("svg:g").call(axis());
+        assert.isTrue(g.selectAll(".minor").empty());
+      },
+      "affects the generated minor ticks": function(axis) {
+        var a = axis().tickSubdivide(3),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            t = g.selectAll("line.tick.minor");
+        assert.equal(t[0].length, 30);
+        assert.equal(t[0][1].getAttribute("transform"), "translate(0.05,0)");
+      }
+    },
+
+    "tickFormat": {
+      "defaults to null": function(axis) {
+        var a = axis();
+        assert.isTrue(a.tickFormat() == null);
+      },
+      "when null, uses the scale's tick format": function(axis) {
+        var x = d3.scale.linear(), a = axis().scale(x),
+            g = d3.select("body").html("").append("svg:g");
+
+        x.tickFormat = function() {
+          return function(d) {
+            return "foo-" + d;
+          };
+        };
+
+        g.call(a);
+        var t = g.selectAll("g text");
+        assert.equal(t.text(), "foo-0");
+      },
+      "affects the generated tick labels": function(axis) {
+        var a = axis().tickFormat(d3.format("+.2%")),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            t = g.selectAll("g text");
+        assert.equal(t.text(), "+0.00%");
+      },
+      "can be set to a constant": function(axis) {
+        var a = axis().tickFormat("I'm a tick!"),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            t = g.selectAll("g text");
+        assert.equal(t.text(), "I'm a tick!");
+      },
+      "can be set to a falsey constant": function(axis) {
+        var a = axis().tickFormat(""),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            t = g.selectAll("g text");
+        assert.equal(t.text(), "");
+      }
+    },
+
+    "enter": {
+      "generates a new domain path": function(axis) {
+        var a = axis(),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            path = g.selectAll("path.domain");
+        assert.equal(path[0].length, 1);
+        assert.equal(path.attr("d"), "M0,6V0H1V6");
+        assert.isNull(path.node().nextSibling);
+      },
+      "generates new tick marks with labels": function(axis) {
+        var a = axis(),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            x = d3.scale.linear(),
+            tick = g.selectAll("g"),
+            ticks = x.ticks(10),
+            tickFormat = x.tickFormat(10);
+        assert.equal(tick[0].length, ticks.length);
+        tick.each(function(d, i) {
+          var t = d3.select(this);
+          assert.isFalse(t.select("line").empty());
+          assert.isFalse(t.select("text").empty());
+          assert.equal(t.select("text").text(), tickFormat(ticks[i]));
+        });
+      }
+    },
+
+    "update": {
+      "updates the domain path": function(axis) {
+        var a = axis(),
+            g = d3.select("body").html("").append("svg:g").call(a);
+        a.scale().domain([0, 2]).range([1, 2]);
+        a.tickSize(3);
+        g.call(a);
+        var path = g.selectAll("path.domain");
+        assert.equal(path[0].length, 1);
+        assert.equal(path.attr("d"), "M1,3V0H2V3");
+        assert.domEqual(path.node().nextSibling, null);
+      },
+      "enters, exits and updates tick marks": function(axis) {
+        var a = axis(),
+            g = d3.select("body").html("").append("svg:g").call(a),
+            x = d3.scale.linear().domain([1, 1.5]);
+        a.scale().domain(x.domain());
+        a.tickSize(3).tickPadding(9);
+        g.call(a);
+        var tick = g.selectAll("g"),
+            ticks = x.ticks(10),
+            tickFormat = x.tickFormat(10);
+        assert.equal(tick[0].length, ticks.length);
+        tick.each(function(d, i) {
+          var t = d3.select(this);
+          assert.isFalse(t.select("line").empty());
+          assert.isFalse(t.select("text").empty());
+          assert.equal(t.select("text").text(), tickFormat(ticks[i]));
+        });
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/svg/brush-test.js b/static/demo/components/d3/test/svg/brush-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a5545a08f84c6e4194f5686006d56fc6e858268c
--- /dev/null
+++ b/static/demo/components/d3/test/svg/brush-test.js
@@ -0,0 +1,66 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.svg.brush");
+
+suite.addBatch({
+  "brush": {
+    topic: function() {
+      return d3.svg.brush;
+    },
+
+    "x": {
+      "defaults to null": function(brush) {
+        assert.isNull(brush().x());
+      }
+    },
+
+    "y": {
+      "defaults to null": function(brush) {
+        assert.isNull(brush().y());
+      }
+    },
+
+    "extent": {
+      "returns null when no scales are attached": function(brush) {
+        assert.isNull(brush().extent());
+      },
+      "returns a one-dimensional array if only x is defined": function(brush) {
+        var b = brush().x(d3.scale.linear());
+        assert.deepEqual(b.extent(), [0, 0]);
+      },
+      "takes a one-dimensional array if only x is defined": function(brush) {
+        var b = brush().x(d3.scale.linear()).extent([0.1, 0.4]);
+        assert.deepEqual(b.extent(), [0.1, 0.4]);
+      },
+      "returns a one-dimensional array if only y is defined": function(brush) {
+        var b = brush().y(d3.scale.linear());
+        assert.deepEqual(b.extent(), [0, 0]);
+      },
+      "takes a one-dimensional array if only y is defined": function(brush) {
+        var b = brush().y(d3.scale.linear()).extent([0.1, 0.4]);
+        assert.deepEqual(b.extent(), [0.1, 0.4]);
+      },
+      "returns a two-dimensional array if x and y are defined": function(brush) {
+        var b = brush().x(d3.scale.linear()).y(d3.scale.linear());
+        assert.deepEqual(b.extent(), [[0, 0], [0, 0]]);
+      },
+      "takes a two-dimensional array if x and y are defined": function(brush) {
+        var b = brush().x(d3.scale.linear()).y(d3.scale.linear()).extent([[0.1, 0.2], [0.3, 0.4]]);
+        assert.deepEqual(b.extent(), [[0.1, 0.2], [0.3, 0.4]]);
+      },
+      "preserves the set extent exactly": function(brush) {
+        var lo = new Number(0.1),
+            hi = new Number(0.3),
+            b = brush().x(d3.scale.linear()).extent([lo, hi]),
+            extent = b.extent();
+        assert.strictEqual(extent[0], lo);
+        assert.strictEqual(extent[1], hi);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/svg/line-radial-test.js b/static/demo/components/d3/test/svg/line-radial-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..28ceaaec6a68b296448c10b657f5c6b703dd0166
--- /dev/null
+++ b/static/demo/components/d3/test/svg/line-radial-test.js
@@ -0,0 +1,124 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.svg.line.radial");
+
+suite.addBatch({
+  "line.radial": {
+    topic: function() {
+      return d3.svg.line.radial;
+    },
+
+    "radius defaults to a function accessor": function(line) {
+      var l = line();
+      assert.pathEqual(l([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10L16.82941969615793,-10.806046117362794L18.185948536513635,8.32293673094285L1.4112000805986715,9.899924966004454");
+      assert.typeOf(l.radius(), "function");
+    },
+    "radius can be defined as a constant": function(line) {
+      var l = line().radius(30);
+      assert.pathEqual(l([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-30L25.244129544236895,-16.20906917604419L27.278922804770453,12.484405096414275L4.233600241796014,29.699774898013363");
+      assert.equal(l.radius(), 30);
+    },
+    "radius can be defined as a function": function(line) {
+      var l = line().radius(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 30; }
+      assert.pathEqual(l.call(t, [[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-30L25.244129544236895,-16.20906917604419L27.278922804770453,12.484405096414275L4.233600241796014,29.699774898013363");
+      assert.deepEqual(dd, [[10, 0], [20, 1], [20, 2], [10, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1, 2, 3], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t, t, t], "expected this, got {actual}");
+    },
+
+    "angle defaults to a function accessor": function(line) {
+      var l = line();
+      assert.pathEqual(l([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10L16.82941969615793,-10.806046117362794L18.185948536513635,8.32293673094285L1.4112000805986715,9.899924966004454");
+      assert.typeOf(l.angle(), "function");
+    },
+    "angle can be defined as a constant": function(line) {
+      var l = line().angle(Math.PI / 2);
+      assert.pathEqual(l([[10, 0], [20, 1], [20, 2], [10, 3]]), "M10,0L20,0L20,0L10,0");
+      assert.equal(l.angle(), Math.PI / 2);
+    },
+    "angle can be defined as a function": function(line) {
+      var l = line().angle(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return Math.PI / 2; }
+      assert.pathEqual(l.call(t, [[10, 0], [20, 1], [20, 2], [10, 3]]), "M10,0L20,0L20,0L10,0");
+      assert.deepEqual(dd, [[10, 0], [20, 1], [20, 2], [10, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1, 2, 3], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t, t, t], "expected this, got {actual}");
+    },
+    "angle is defined in radians, with zero at 12 o'clock": function(line) {
+      var l = line().angle(0);
+      assert.pathEqual(l([[10, Math.PI], [20, Math.PI / 3]]), "M0,-10L0,-20");
+      assert.equal(l.angle(), 0);
+    },
+
+    "interpolate defaults to linear": function(line) {
+      assert.equal(line().interpolate(), "linear");
+    },
+    "interpolate can be defined as a constant": function(line) {
+      var l = line().interpolate("cardinal");
+      assert.pathEqual(l([[10, 0], [20, 1], [20, 2], [10, 3]]), "M0,-10Q15.010824842506567,-12.638339790457078,16.82941969615793,-10.806046117362794C19.557311976634978,-8.057605607721365,20.498681478847523,5.217041068437762,18.185948536513635,8.32293673094285Q16.64412657495771,10.393533839279574,1.4112000805986715,9.899924966004454");
+      assert.equal(l.interpolate(), "cardinal");
+    },
+
+    "tension defaults to .7": function(line) {
+      assert.equal(line().tension(), .7);
+    },
+    "tension can be specified as a constant": function(line) {
+      var l = line().tension(.5);
+      assert.equal(l.tension(), .5);
+    },
+
+    "returns null if input points array is empty": function(line) {
+      assert.isNull(line()([]));
+    },
+
+    "interpolate(linear)": {
+      "supports linear interpolation": testInterpolation("linear")
+    },
+
+    "interpolate(step)": {
+      "supports step-before interpolation": testInterpolation("step-before"),
+      "supports step-after interpolation": testInterpolation("step-after")
+    },
+
+    "interpolate(basis)": {
+      "supports basis interpolation": testInterpolation("basis"),
+      "supports basis-open interpolation": testInterpolation("basis-open"),
+      "supports basis-closed interpolation": testInterpolation("basis-closed")
+    },
+
+    "interpolate(bundle)": {
+      "supports bundle interpolation": testInterpolation("bundle")
+    },
+
+    "interpolate(cardinal)": {
+      "supports cardinal interpolation": testInterpolation("cardinal"),
+      "supports cardinal-open interpolation": testInterpolation("cardinal-open"),
+      "supports cardinal-closed interpolation": testInterpolation("cardinal-closed")
+    },
+
+    "interpolate(monotone)": {
+      "supports monotone interpolation": testInterpolation("monotone")
+    }
+  }
+});
+
+// A radial line is just a transformation of a Cartesian line.
+function testInterpolation(interpolate) {
+  var data = [[10, 0], [20, 1], [20, 2], [10, 3]];
+
+  var radial = d3.svg.line.radial();
+
+  var cartesian = d3.svg.line()
+      .x(function(d) { return d[0] * Math.cos(d[1] - Math.PI / 2); })
+      .y(function(d) { return d[0] * Math.sin(d[1] - Math.PI / 2); });
+
+  return function() {
+    assert.pathEqual(radial.interpolate(interpolate)(data), cartesian.interpolate(interpolate)(data));
+  };
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/svg/line-test.js b/static/demo/components/d3/test/svg/line-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..706e22cdf6f325cf09f171783024a43750bc39ed
--- /dev/null
+++ b/static/demo/components/d3/test/svg/line-test.js
@@ -0,0 +1,204 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.svg.line");
+
+suite.addBatch({
+  "line": {
+    topic: function() {
+      return d3.svg.line;
+    },
+
+    "x defaults to a function accessor": function(line) {
+      var l = line();
+      assert.pathEqual(l([[1, 2], [4, 3]]), "M1,2L4,3");
+      assert.typeOf(l.x(), "function");
+    },
+    "x can be defined as a constant": function(line) {
+      var l = line().x(0);
+      assert.pathEqual(l([[1, 2], [4, 3]]), "M0,2L0,3");
+      assert.equal(l.x(), 0);
+    },
+    "x can be defined as a function": function(line) {
+      var l = line().x(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 0; }
+      assert.pathEqual(l.call(t, [[1, 2], [4, 3]]), "M0,2L0,3");
+      assert.deepEqual(dd, [[1, 2], [4, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t], "expected this, got {actual}");
+    },
+
+    "y defaults to a function accessor": function(line) {
+      var l = line();
+      assert.pathEqual(l([[1, 2], [4, 3]]), "M1,2L4,3");
+      assert.typeOf(l.y(), "function");
+    },
+    "y can be defined as a constant": function(line) {
+      var l = line().y(0);
+      assert.pathEqual(l([[1, 2], [4, 3]]), "M1,0L4,0");
+      assert.equal(l.y(), 0);
+    },
+    "y can be defined as a function": function(line) {
+      var l = line().y(f), t = {}, dd = [], ii = [], tt = [];
+      function f(d, i) { dd.push(d); ii.push(i); tt.push(this); return 0; }
+      assert.pathEqual(l.call(t, [[1, 2], [4, 3]]), "M1,0L4,0");
+      assert.deepEqual(dd, [[1, 2], [4, 3]], "expected data, got {actual}");
+      assert.deepEqual(ii, [0, 1], "expected index, got {actual}");
+      assert.deepEqual(tt, [t, t], "expected this, got {actual}");
+    },
+
+    "interpolate defaults to linear": function(line) {
+      assert.equal(line().interpolate(), "linear");
+    },
+    "interpolate can be defined as a constant": function(line) {
+      var l = line().interpolate("step-before");
+      assert.pathEqual(l([[0, 0], [1, 1]]), "M0,0V1H1");
+      assert.equal(l.interpolate(), "step-before");
+    },
+    "interpolate can be defined as a function": function(line) {
+      var l = line().interpolate(interpolate);
+      assert.pathEqual(l([[0, 0], [1, 1]]), "M0,0T1,1");
+      assert.equal(l.interpolate(), interpolate);
+
+      function interpolate(points) {
+        return points.join("T");
+      }
+    },
+    "invalid interpolates fallback to linear": function(line) {
+      assert.equal(line().interpolate("__proto__").interpolate(), "linear");
+    },
+
+    "tension defaults to .7": function(line) {
+      assert.equal(line().tension(), .7);
+    },
+    "tension can be specified as a constant": function(line) {
+      var l = line().tension(.5);
+      assert.equal(l.tension(), .5);
+    },
+
+    "returns null if input points array is empty": function(line) {
+      assert.isNull(line()([]));
+    },
+
+    "interpolate(linear)": {
+      "supports linear interpolation": function(line) {
+        var l = line().interpolate("linear");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M0,0L1,1L2,0L3,1L4,0");
+      }
+    },
+
+    "interpolate(step)": {
+      "supports step-before interpolation": function(line) {
+        var l = line().interpolate("step-before");
+        assert.pathEqual(l([[0, 0]]), "M0,0");
+        assert.pathEqual(l([[0, 0], [1, 1]]), "M0,0V1H1");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0]]), "M0,0V1H1V0H2");
+      },
+      "supports step-after interpolation": function(line) {
+        var l = line().interpolate("step-after");
+        assert.pathEqual(l([[0, 0]]), "M0,0");
+        assert.pathEqual(l([[0, 0], [1, 1]]), "M0,0H1V1");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0]]), "M0,0H1V1H2V0");
+      }
+    },
+
+    "interpolate(basis)": {
+      "supports basis interpolation": function(line) {
+        var l = line().interpolate("basis");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M0,0C0,0,0,0,0.16666666666666666,0.16666666666666666C0.3333333333333333,0.3333333333333333,0.6666666666666666,0.6666666666666666,1,0.6666666666666666C1.3333333333333333,0.6666666666666666,1.6666666666666665,0.3333333333333333,2,0.3333333333333333C2.333333333333333,0.3333333333333333,2.6666666666666665,0.6666666666666666,3,0.6666666666666666C3.333333333333333,0.6666666666666666,3.6666666666666665,0.3333333333333333,3.833333333333333,0.16666666666666666C4,0,4,0,3.9999999999999996,0");
+      },
+      "supports basis-open interpolation": function(line) {
+        var l = line().interpolate("basis-open");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M1,0.6666666666666666C1.3333333333333333,0.6666666666666666,1.6666666666666665,0.3333333333333333,2,0.3333333333333333C2.333333333333333,0.3333333333333333,2.6666666666666665,0.6666666666666666,3,0.6666666666666666");
+      },
+      "supports basis-closed interpolation": function(line) {
+        var l = line().interpolate("basis-closed");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M2,0.3333333333333333C2.333333333333333,0.3333333333333333,2.6666666666666665,0.6666666666666666,3,0.6666666666666666C3.333333333333333,0.6666666666666666,3.6666666666666665,0.3333333333333333,3.1666666666666665,0.16666666666666666C2.6666666666666665,0,1.3333333333333333,0,0.8333333333333333,0.16666666666666666C0.3333333333333333,0.3333333333333333,0.6666666666666666,0.6666666666666666,1,0.6666666666666666C1.3333333333333333,0.6666666666666666,1.6666666666666665,0.3333333333333333,2,0.3333333333333333");
+      },
+      "basis interpolation reverts to linear with fewer than three points": function(line) {
+        var l = line().interpolate("basis"), d = line();
+        assert.pathEqual(l([[0, 0]]), d([[0, 0]]));
+        assert.pathEqual(l([[0, 0], [1, 1]]), d([[0, 0], [1, 1]]));
+      },
+      "basis-open interpolation reverts to linear with fewer than four points": function(line) {
+        var l = line().interpolate("basis-open"), d = line();
+        assert.pathEqual(l([[0, 0]]), d([[0, 0]]));
+        assert.pathEqual(l([[0, 0], [1, 1]]), d([[0, 0], [1, 1]]));
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0]]), d([[0, 0], [1, 1], [2, 0]]));
+      },
+      "basis-closed interpolation reverts to linear with fewer than three points": function(line) {
+        var l = line().interpolate("basis-open"), d = line();
+        assert.pathEqual(l([[0, 0]]), d([[0, 0]]));
+        assert.pathEqual(l([[0, 0], [1, 1]]), d([[0, 0], [1, 1]]));
+      }
+    },
+
+    "interpolate(bundle)": {
+      "supports bundle interpolation": function(line) {
+        var l = line().interpolate("bundle");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M0,0C0,0,0,0,0.16666666666666666,0.11666666666666665C0.3333333333333333,0.2333333333333333,0.6666666666666666,0.4666666666666666,1,0.4666666666666666C1.3333333333333333,0.4666666666666666,1.6666666666666665,0.2333333333333333,2,0.2333333333333333C2.333333333333333,0.2333333333333333,2.6666666666666665,0.4666666666666666,3,0.4666666666666666C3.333333333333333,0.4666666666666666,3.6666666666666665,0.2333333333333333,3.833333333333333,0.11666666666666665C4,0,4,0,4,0");
+      },
+      "observes the specified tension": function(line) {
+        var l = line().interpolate("bundle").tension(1);
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), line().interpolate("basis")([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]));
+      },
+      "supports a single-element array": function(line) {
+        var l = line().interpolate("bundle").tension(1);
+        assert.pathEqual(l([[0, 0]]), "M0,0");
+      }
+    },
+
+    "interpolate(cardinal)": {
+      "supports cardinal interpolation": function(line) {
+        var l = line().interpolate("cardinal");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M0,0Q0.8,1,1,1C1.3,1,1.7,0,2,0S2.7,1,3,1Q3.2,1,4,0");
+      },
+      "supports cardinal-open interpolation": function(line) {
+        var l = line().interpolate("cardinal-open");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M1,1C1.3,1,1.7,0,2,0S2.7,1,3,1");
+      },
+      "supports cardinal-closed interpolation": function(line) {
+        var l = line().interpolate("cardinal-closed");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M0,0C-0.45,0.15,0.7,1,1,1S1.7,0,2,0S2.7,1,3,1S4.45,0.15,4,0S0.45,-0.15,0,0");
+      },
+      "cardinal interpolation reverts to linear with fewer than three points": function(line) {
+        var l = line().interpolate("cardinal"), d = line();
+        assert.pathEqual(l([[0, 0]]), d([[0, 0]]));
+        assert.pathEqual(l([[0, 0], [1, 1]]), d([[0, 0], [1, 1]]));
+      },
+      "cardinal-open interpolation reverts to linear with fewer than four points": function(line) {
+        var l = line().interpolate("cardinal-open"), d = line();
+        assert.pathEqual(l([[0, 0]]), d([[0, 0]]));
+        assert.pathEqual(l([[0, 0], [1, 1]]), d([[0, 0], [1, 1]]));
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 0]]), d([[0, 0], [1, 1], [2, 0]]));
+      },
+      "cardinal-closed interpolation reverts to linear with fewer than three points": function(line) {
+        var l = line().interpolate("cardinal-open"), d = line();
+        assert.pathEqual(l([[0, 0]]), d([[0, 0]]));
+        assert.pathEqual(l([[0, 0], [1, 1]]), d([[0, 0], [1, 1]]));
+      },
+      "observes the specified tension": function(line) {
+        var l = line().tension(.5);
+        assert.pathEqual(l.interpolate("cardinal")([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M0,0Q0.6666666666666667,1,1,1C1.5,1,1.5,0,2,0S2.5,1,3,1Q3.3333333333333335,1,4,0");
+        assert.pathEqual(l.interpolate("cardinal-open")([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M1,1C1.5,1,1.5,0,2,0S2.5,1,3,1");
+        assert.pathEqual(l.interpolate("cardinal-closed")([[0, 0], [1, 1], [2, 0], [3, 1], [4, 0]]), "M0,0C-0.75,0.25,0.5,1,1,1S1.5,0,2,0S2.5,1,3,1S4.75,0.25,4,0S0.75,-0.25,0,0");
+      }
+    },
+
+    "interpolate(monotone)": {
+      "supports monotone interpolation": function(line) {
+        var l = line().interpolate("monotone");
+        assert.pathEqual(l([[0, 0], [1, 1], [2, 1], [3, 0], [4, 0]]), "M0,0C0.08333333333333333,0.08333333333333333,0.6666666666666667,1,1,1S1.6666666666666667,1,2,1S2.6666666666666665,0,3,0S3.8333333333333335,0,4,0");
+      },
+      "monotone interpolation reverts to linear with fewer than three points": function(line) {
+        var l = line().interpolate("monotone"), d = line();
+        assert.pathEqual(l([[0, 0]]), d([[0, 0]]));
+        assert.pathEqual(l([[0, 0], [1, 1]]), d([[0, 0], [1, 1]]));
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/svg/symbol-test.js b/static/demo/components/d3/test/svg/symbol-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..fd401b3307663b32a34f1afdb507b6cd6e1f13da
--- /dev/null
+++ b/static/demo/components/d3/test/svg/symbol-test.js
@@ -0,0 +1,96 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.svg.symbol");
+
+suite.addBatch({
+  "symbol": {
+    topic: function() {
+      return d3.svg.symbol;
+    },
+    "default symbol is a fixed-size circle": function(symbol) {
+      var a = symbol();
+      assert.pathEqual(a(), "M0,4.51351666838205A4.51351666838205,4.51351666838205 0 1,1 0,-4.51351666838205A4.51351666838205,4.51351666838205 0 1,1 0,4.51351666838205Z");
+    },
+    "size accessor specifies shape area in square pixels": function(symbol) {
+      var a = symbol().size(Number);
+      assert.pathEqual(a(0), "M0,0A0,0 0 1,1 0,0A0,0 0 1,1 0,0Z");
+      assert.pathEqual(a(Math.PI), "M0,1A1,1 0 1,1 0,-1A1,1 0 1,1 0,1Z");
+      assert.pathEqual(a(4 * Math.PI), "M0,2A2,2 0 1,1 0,-2A2,2 0 1,1 0,2Z");
+    },
+    "size accessor is passed data and index": function(symbol) {
+      var a = symbol().size(function(d, i) { return d.z * 2 + i; });
+      assert.pathEqual(a({z: 0}, 0), "M0,0A0,0 0 1,1 0,0A0,0 0 1,1 0,0Z");
+      assert.pathEqual(a({z: Math.PI}, 1), "M0,1.5225997130512636A1.5225997130512636,1.5225997130512636 0 1,1 0,-1.5225997130512636A1.5225997130512636,1.5225997130512636 0 1,1 0,1.5225997130512636Z");
+      assert.pathEqual(a({z: 4 * Math.PI}, 2), "M0,2.938812646693828A2.938812646693828,2.938812646693828 0 1,1 0,-2.938812646693828A2.938812646693828,2.938812646693828 0 1,1 0,2.938812646693828Z");
+    },
+    "supports cross symbol type": function(symbol) {
+      var a = symbol().type("cross").size(Number);
+      assert.pathEqual(a(0), "M0,0H0V0H0V0H0V0H0V0H0V0H0Z");
+      assert.pathEqual(a(20), "M-3,-1H-1V-3H1V-1H3V1H1V3H-1V1H-3Z");
+    },
+    "supports diamond symbol type": function(symbol) {
+      var a = symbol().type("diamond").size(Number);
+      assert.pathEqual(a(0), "M0,0L0,0 0,0 0,0Z");
+      assert.pathEqual(a(10), "M0,-2.9428309563827124L1.6990442448471224,0 0,2.9428309563827124 -1.6990442448471224,0Z");
+    },
+    "supports square symbol type": function(symbol) {
+      var a = symbol().type("square").size(Number);
+      assert.pathEqual(a(0), "M0,0L0,0 0,0 0,0Z");
+      assert.pathEqual(a(4), "M-1,-1L1,-1 1,1 -1,1Z");
+      assert.pathEqual(a(16), "M-2,-2L2,-2 2,2 -2,2Z");
+    },
+    "supports triangle-down symbol type": function(symbol) {
+      var a = symbol().type("triangle-down").size(Number);
+      assert.pathEqual(a(0), "M0,0L0,0 0,0Z");
+      assert.pathEqual(a(10), "M0,2.0808957251439084L2.4028114141347543,-2.0808957251439084 -2.4028114141347543,-2.0808957251439084Z");
+    },
+    "supports triangle-up symbol type": function(symbol) {
+      var a = symbol().type("triangle-up").size(Number);
+      assert.pathEqual(a(0), "M0,0L0,0 0,0Z");
+      assert.pathEqual(a(10), "M0,-2.0808957251439084L2.4028114141347543,2.0808957251439084 -2.4028114141347543,2.0808957251439084Z");
+    },
+    "unknown symbol type defaults to circle": function(symbol) {
+      var a = symbol().type(String);
+      assert.pathEqual(a(), "M0,4.51351666838205A4.51351666838205,4.51351666838205 0 1,1 0,-4.51351666838205A4.51351666838205,4.51351666838205 0 1,1 0,4.51351666838205Z");
+      assert.pathEqual(a("invalid"), "M0,4.51351666838205A4.51351666838205,4.51351666838205 0 1,1 0,-4.51351666838205A4.51351666838205,4.51351666838205 0 1,1 0,4.51351666838205Z");
+      assert.pathEqual(a("hasOwnProperty"), "M0,4.51351666838205A4.51351666838205,4.51351666838205 0 1,1 0,-4.51351666838205A4.51351666838205,4.51351666838205 0 1,1 0,4.51351666838205Z");
+    },
+    "can specify type accessor as a function": function(symbol) {
+      var a = symbol().type(String);
+      assert.pathEqual(a("circle"), "M0,4.51351666838205A4.51351666838205,4.51351666838205 0 1,1 0,-4.51351666838205A4.51351666838205,4.51351666838205 0 1,1 0,4.51351666838205Z");
+      assert.pathEqual(a("cross"), "M-5.366563145999495,-1.7888543819998317H-1.7888543819998317V-5.366563145999495H1.7888543819998317V-1.7888543819998317H5.366563145999495V1.7888543819998317H1.7888543819998317V5.366563145999495H-1.7888543819998317V1.7888543819998317H-5.366563145999495Z");
+      assert.pathEqual(a("diamond"), "M0,-7.444838872816797L4.298279727294167,0 0,7.444838872816797 -4.298279727294167,0Z");
+      assert.pathEqual(a("square"), "M-4,-4L4,-4 4,4 -4,4Z");
+      assert.pathEqual(a("triangle-down"), "M0,5.26429605180997L6.078685485212741,-5.26429605180997 -6.078685485212741,-5.26429605180997Z");
+      assert.pathEqual(a("triangle-up"), "M0,-5.26429605180997L6.078685485212741,5.26429605180997 -6.078685485212741,5.26429605180997Z");
+    }
+  },
+  "symbolTypes": {
+    topic: function() {
+      return d3.svg.symbolTypes;
+    },
+    "contains circle": function(types) {
+      assert.isTrue(types.indexOf("circle") != -1);
+    },
+    "contains cross": function(types) {
+      assert.isTrue(types.indexOf("cross") != -1);
+    },
+    "contains diamond": function(types) {
+      assert.isTrue(types.indexOf("diamond") != -1);
+    },
+    "contains square": function(types) {
+      assert.isTrue(types.indexOf("square") != -1);
+    },
+    "contains triangle-down": function(types) {
+      assert.isTrue(types.indexOf("triangle-down") != -1);
+    },
+    "contains triangle-up": function(types) {
+      assert.isTrue(types.indexOf("triangle-up") != -1);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/day-test.js b/static/demo/components/d3/test/time/day-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..391ffdd20cbc876835ff3c793135a573d3d35c0f
--- /dev/null
+++ b/static/demo/components/d3/test/time/day-test.js
@@ -0,0 +1,181 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.day");
+
+suite.addBatch({
+  "day": {
+    topic: function() {
+      return d3.time.day;
+    },
+    "defaults to floor": function(interval) {
+      assert.strictEqual(interval, interval.floor);
+    },
+    "floor": {
+      topic: function(interval) {
+        return interval.floor;
+      },
+      "returns midnights": function(floor) {
+        assert.deepEqual(floor(local(2010, 11, 31, 23)), local(2010, 11, 31));
+        assert.deepEqual(floor(local(2011, 00, 01, 00)), local(2011, 00, 01));
+        assert.deepEqual(floor(local(2011, 00, 01, 01)), local(2011, 00, 01));
+      },
+      "observes start of daylight savings time": function(floor) {
+        assert.deepEqual(floor(utc(2011, 02, 13, 07)), local(2011, 02, 12));
+        assert.deepEqual(floor(utc(2011, 02, 13, 08)), local(2011, 02, 13));
+        assert.deepEqual(floor(utc(2011, 02, 13, 09)), local(2011, 02, 13));
+        assert.deepEqual(floor(utc(2011, 02, 13, 10)), local(2011, 02, 13));
+      },
+      "observes end of daylight savings time": function(floor) {
+        assert.deepEqual(floor(utc(2011, 10, 06, 07)), local(2011, 10, 06));
+        assert.deepEqual(floor(utc(2011, 10, 06, 08)), local(2011, 10, 06));
+        assert.deepEqual(floor(utc(2011, 10, 06, 09)), local(2011, 10, 06));
+        assert.deepEqual(floor(utc(2011, 10, 06, 10)), local(2011, 10, 06));
+      },
+      "correctly handles years in the first century": function(floor) {
+        assert.deepEqual(floor(local(0011, 10, 06, 07)), local(0011, 10, 06));
+      }
+    },
+    "ceil": {
+      topic: function(interval) {
+        return interval.ceil;
+      },
+      "returns midnights": function(ceil) {
+        assert.deepEqual(ceil(local(2010, 11, 30, 23)), local(2010, 11, 31));
+        assert.deepEqual(ceil(local(2010, 11, 31, 00)), local(2010, 11, 31));
+        assert.deepEqual(ceil(local(2010, 11, 31, 01)), local(2011, 00, 01));
+      },
+      "observes start of daylight savings time": function(ceil) {
+        assert.deepEqual(ceil(utc(2011, 02, 13, 07)), local(2011, 02, 13));
+        assert.deepEqual(ceil(utc(2011, 02, 13, 08)), local(2011, 02, 13));
+        assert.deepEqual(ceil(utc(2011, 02, 13, 09)), local(2011, 02, 14));
+        assert.deepEqual(ceil(utc(2011, 02, 13, 10)), local(2011, 02, 14));
+      },
+      "observes end of daylight savings time": function(ceil) {
+        assert.deepEqual(ceil(utc(2011, 10, 06, 07)), local(2011, 10, 06));
+        assert.deepEqual(ceil(utc(2011, 10, 06, 08)), local(2011, 10, 07));
+        assert.deepEqual(ceil(utc(2011, 10, 06, 09)), local(2011, 10, 07));
+        assert.deepEqual(ceil(utc(2011, 10, 06, 10)), local(2011, 10, 07));
+      },
+      "handles midnight for leap years": function(ceil) {
+        assert.deepEqual(ceil(utc(2012, 02, 01, 00)), local(2012, 02, 01));
+        assert.deepEqual(ceil(utc(2012, 02, 01, 00)), local(2012, 02, 01));
+      }
+    },
+    "offset": {
+      topic: function(interval) {
+        return interval.offset;
+      },
+      "does not modify the passed-in date": function(offset) {
+        var date = local(2010, 11, 31, 23, 59, 59, 999);
+        offset(date, +1);
+        assert.deepEqual(date, local(2010, 11, 31, 23, 59, 59, 999));
+      },
+      "does not round the passed-in-date": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), +1), local(2011, 00, 01, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 456), -2), local(2010, 11, 29, 23, 59, 59, 456));
+      },
+      "allows negative offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31), -1), local(2010, 11, 30));
+        assert.deepEqual(offset(local(2011, 00, 01), -2), local(2010, 11, 30));
+        assert.deepEqual(offset(local(2011, 00, 01), -1), local(2010, 11, 31));
+      },
+      "allows positive offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31), +1), local(2011, 00, 01));
+        assert.deepEqual(offset(local(2010, 11, 30), +2), local(2011, 00, 01));
+        assert.deepEqual(offset(local(2010, 11, 30), +1), local(2010, 11, 31));
+      },
+      "allows zero offset": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), 0), local(2010, 11, 31, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 58, 000), 0), local(2010, 11, 31, 23, 59, 58, 000));
+      }
+    },
+    "UTC": {
+      topic: function(interval) {
+        return interval.utc;
+      },
+      "defaults to floor": function(interval) {
+        assert.strictEqual(interval, interval.floor);
+      },
+      "floor": {
+        topic: function(interval) {
+          return interval.floor;
+        },
+        "returns midnights": function(floor) {
+          assert.deepEqual(floor(utc(2010, 11, 31, 23)), utc(2010, 11, 31));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00)), utc(2011, 00, 01));
+          assert.deepEqual(floor(utc(2011, 00, 01, 01)), utc(2011, 00, 01));
+        },
+        "does not observe the start of daylight savings time": function(floor) {
+          assert.deepEqual(floor(utc(2011, 02, 13, 07)), utc(2011, 02, 13));
+          assert.deepEqual(floor(utc(2011, 02, 13, 08)), utc(2011, 02, 13));
+          assert.deepEqual(floor(utc(2011, 02, 13, 09)), utc(2011, 02, 13));
+          assert.deepEqual(floor(utc(2011, 02, 13, 10)), utc(2011, 02, 13));
+        },
+        "does not observe the end of daylight savings time": function(floor) {
+          assert.deepEqual(floor(utc(2011, 10, 06, 05)), utc(2011, 10, 06));
+          assert.deepEqual(floor(utc(2011, 10, 06, 06)), utc(2011, 10, 06));
+          assert.deepEqual(floor(utc(2011, 10, 06, 07)), utc(2011, 10, 06));
+          assert.deepEqual(floor(utc(2011, 10, 06, 08)), utc(2011, 10, 06));
+        }
+      },
+      "ceil": {
+        topic: function(interval) {
+          return interval.ceil;
+        },
+        "returns midnights": function(ceil) {
+          assert.deepEqual(ceil(utc(2010, 11, 30, 23)), utc(2010, 11, 31));
+          assert.deepEqual(ceil(utc(2010, 11, 31, 00)), utc(2010, 11, 31));
+          assert.deepEqual(ceil(utc(2010, 11, 31, 01)), utc(2011, 00, 01));
+        },
+        "does not observe the start of daylight savings time": function(ceil) {
+          assert.deepEqual(ceil(utc(2011, 02, 13, 07)), utc(2011, 02, 14));
+          assert.deepEqual(ceil(utc(2011, 02, 13, 08)), utc(2011, 02, 14));
+          assert.deepEqual(ceil(utc(2011, 02, 13, 09)), utc(2011, 02, 14));
+          assert.deepEqual(ceil(utc(2011, 02, 13, 10)), utc(2011, 02, 14));
+        },
+        "does not observe the end of daylight savings time": function(ceil) {
+          assert.deepEqual(ceil(utc(2011, 10, 06, 05)), utc(2011, 10, 07));
+          assert.deepEqual(ceil(utc(2011, 10, 06, 06)), utc(2011, 10, 07));
+          assert.deepEqual(ceil(utc(2011, 10, 06, 07)), utc(2011, 10, 07));
+          assert.deepEqual(ceil(utc(2011, 10, 06, 08)), utc(2011, 10, 07));
+        }
+      },
+      "offset": {
+        topic: function(interval) {
+          return interval.offset;
+        },
+        "does not modify the passed-in date": function(offset) {
+          var date = utc(2010, 11, 31, 23, 59, 59, 999);
+          offset(date, +1);
+          assert.deepEqual(date, utc(2010, 11, 31, 23, 59, 59, 999));
+        },
+        "does not round the passed-in-date": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), +1), utc(2011, 00, 01, 23, 59, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 456), -2), utc(2010, 11, 29, 23, 59, 59, 456));
+        },
+        "allows negative offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31), -1), utc(2010, 11, 30));
+          assert.deepEqual(offset(utc(2011, 00, 01), -2), utc(2010, 11, 30));
+          assert.deepEqual(offset(utc(2011, 00, 01), -1), utc(2010, 11, 31));
+        },
+        "allows positive offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31), +1), utc(2011, 00, 01));
+          assert.deepEqual(offset(utc(2010, 11, 30), +2), utc(2011, 00, 01));
+          assert.deepEqual(offset(utc(2010, 11, 30), +1), utc(2010, 11, 31));
+        },
+        "allows zero offset": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), 0), utc(2010, 11, 31, 23, 59, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 58, 000), 0), utc(2010, 11, 31, 23, 59, 58, 000));
+        }
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/dayOfYear-test.js b/static/demo/components/d3/test/time/dayOfYear-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..4efaf44bb956982fd761e7cc86e015d52dbd0c4c
--- /dev/null
+++ b/static/demo/components/d3/test/time/dayOfYear-test.js
@@ -0,0 +1,22 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.dayOfYear");
+
+suite.addBatch({
+  "dayOfYear": {
+    topic: function() {
+      return d3.time.dayOfYear;
+    },
+    "no floating-point rounding error": function(dayOfYear) {
+      assert.equal(dayOfYear(new Date(2011, 4, 9)), 128);
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/days-test.js b/static/demo/components/d3/test/time/days-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..c084428a3194dd7dfe52cbfa432005ef061a094b
--- /dev/null
+++ b/static/demo/components/d3/test/time/days-test.js
@@ -0,0 +1,98 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.days");
+
+suite.addBatch({
+  "days": {
+    topic: function() {
+      return d3.time.days;
+    },
+    "returns midnights": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31, 12), local(2011, 0, 3, 12)), [
+        local(2011, 0, 1),
+        local(2011, 0, 2),
+        local(2011, 0, 3)
+      ]);
+    },
+    "has an inclusive lower bound": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31), local(2011, 0, 3))[0], local(2010, 11, 31));
+    },
+    "has an exclusive upper bound": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31), local(2011, 0, 3))[2], local(2011, 0, 2));
+    },
+    "can skip days": function(range) {
+      assert.deepEqual(range(local(2010, 11, 29), local(2011, 0, 14), 5), [
+        local(2010, 11, 31),
+        local(2011, 0, 1),
+        local(2011, 0, 6),
+        local(2011, 0, 11)
+      ]);
+    },
+    "observes start of daylight savings time": function(range) {
+      assert.deepEqual(range(local(2011, 2, 12), local(2011, 2, 16)), [
+        local(2011, 2, 12),
+        local(2011, 2, 13),
+        local(2011, 2, 14),
+        local(2011, 2, 15)
+      ]);
+    },
+    "observes end of daylight savings time": function(range) {
+      assert.deepEqual(range(local(2011, 10, 5), local(2011, 10, 9)), [
+        local(2011, 10, 5),
+        local(2011, 10, 6),
+        local(2011, 10, 7),
+        local(2011, 10, 8)
+      ]);
+    },
+    "UTC": {
+      topic: function(range) {
+        return range.utc;
+      },
+      "returns midnights": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31, 12), utc(2011, 0, 3, 12)), [
+          utc(2011, 0, 1),
+          utc(2011, 0, 2),
+          utc(2011, 0, 3)
+        ]);
+      },
+      "has an inclusive lower bound": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31), utc(2011, 0, 3))[0], utc(2010, 11, 31));
+      },
+      "has an exclusive upper bound": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31), utc(2011, 0, 3))[2], utc(2011, 0, 2));
+      },
+      "can skip days": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 29), utc(2011, 0, 14), 5), [
+          utc(2010, 11, 31),
+          utc(2011, 0, 1),
+          utc(2011, 0, 6),
+          utc(2011, 0, 11)
+        ]);
+      },
+      "does not observe the start of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 2, 12), utc(2011, 2, 16)), [
+          utc(2011, 2, 12),
+          utc(2011, 2, 13),
+          utc(2011, 2, 14),
+          utc(2011, 2, 15)
+        ]);
+      },
+      "does not observe the end of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 10, 5), utc(2011, 10, 9)), [
+          utc(2011, 10, 5),
+          utc(2011, 10, 6),
+          utc(2011, 10, 7),
+          utc(2011, 10, 8)
+        ]);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/format-test.js b/static/demo/components/d3/test/time/format-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..c1f26564118c14ab88f6391d22f6d4c327ac39f3
--- /dev/null
+++ b/static/demo/components/d3/test/time/format-test.js
@@ -0,0 +1,485 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.format");
+
+suite.addBatch({
+  "format": {
+    topic: function() {
+      return d3.time.format;
+    },
+    "formats abbreviated weekday": function(format) {
+      var f = format("%a");
+      assert.equal(f(local(1990, 0, 1)), "Mon");
+      assert.equal(f(local(1990, 0, 2)), "Tue");
+      assert.equal(f(local(1990, 0, 3)), "Wed");
+      assert.equal(f(local(1990, 0, 4)), "Thu");
+      assert.equal(f(local(1990, 0, 5)), "Fri");
+      assert.equal(f(local(1990, 0, 6)), "Sat");
+      assert.equal(f(local(1990, 0, 7)), "Sun");
+    },
+    "formats weekday": function(format) {
+      var f = format("%A");
+      assert.equal(f(local(1990, 0, 1)), "Monday");
+      assert.equal(f(local(1990, 0, 2)), "Tuesday");
+      assert.equal(f(local(1990, 0, 3)), "Wednesday");
+      assert.equal(f(local(1990, 0, 4)), "Thursday");
+      assert.equal(f(local(1990, 0, 5)), "Friday");
+      assert.equal(f(local(1990, 0, 6)), "Saturday");
+      assert.equal(f(local(1990, 0, 7)), "Sunday");
+    },
+    "formats abbreviated month": function(format) {
+      var f = format("%b");
+      assert.equal(f(local(1990, 0, 1)), "Jan");
+      assert.equal(f(local(1990, 1, 1)), "Feb");
+      assert.equal(f(local(1990, 2, 1)), "Mar");
+      assert.equal(f(local(1990, 3, 1)), "Apr");
+      assert.equal(f(local(1990, 4, 1)), "May");
+      assert.equal(f(local(1990, 5, 1)), "Jun");
+      assert.equal(f(local(1990, 6, 1)), "Jul");
+      assert.equal(f(local(1990, 7, 1)), "Aug");
+      assert.equal(f(local(1990, 8, 1)), "Sep");
+      assert.equal(f(local(1990, 9, 1)), "Oct");
+      assert.equal(f(local(1990, 10, 1)), "Nov");
+      assert.equal(f(local(1990, 11, 1)), "Dec");
+    },
+    "formats locale date and time": function(format) {
+      var f = format("%c");
+      assert.equal(f(local(1990, 0, 1)), "Mon Jan  1 00:00:00 1990");
+    },
+    "formats zero-padded date": function(format) {
+      var f = format("%d");
+      assert.equal(f(local(1990, 0, 1)), "01");
+    },
+    "formats space-padded date": function(format) {
+      var f = format("%e");
+      assert.equal(f(local(1990, 0, 1)), " 1");
+    },
+    "formats zero-padded hour (24)": function(format) {
+      var f = format("%H");
+      assert.equal(f(local(1990, 0, 1, 0)), "00");
+      assert.equal(f(local(1990, 0, 1, 13)), "13");
+    },
+    "formats zero-padded hour (12)": function(format) {
+      var f = format("%I");
+      assert.equal(f(local(1990, 0, 1, 0)), "12");
+      assert.equal(f(local(1990, 0, 1, 13)), "01");
+    },
+    "formats zero-padded day of year": function(format) {
+      var f = format("%j");
+      assert.equal(f(local(1990, 0, 1)), "001");
+      assert.equal(f(local(1990, 5, 1)), "152");
+      assert.equal(f(local(2010, 2, 13)), "072");
+      assert.equal(f(local(2010, 2, 14)), "073"); // DST begins
+      assert.equal(f(local(2010, 2, 15)), "074");
+      assert.equal(f(local(2010, 10, 6)), "310");
+      assert.equal(f(local(2010, 10, 7)), "311"); // DST ends
+      assert.equal(f(local(2010, 10, 8)), "312");
+    },
+    "formats zero-padded month": function(format) {
+      var f = format("%m");
+      assert.equal(f(local(1990, 0, 1)), "01");
+      assert.equal(f(local(1990, 9, 1)), "10");
+    },
+    "formats zero-padded minute": function(format) {
+      var f = format("%M");
+      assert.equal(f(local(1990, 0, 1, 0, 0)), "00");
+      assert.equal(f(local(1990, 0, 1, 0, 32)), "32");
+    },
+    "formats AM or PM": function(format) {
+      var f = format("%p");
+      assert.equal(f(local(1990, 0, 1, 0)), "AM");
+      assert.equal(f(local(1990, 0, 1, 13)), "PM");
+    },
+    "formats zero-padded second": function(format) {
+      var f = format("%S");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 0)), "00");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 32)), "32");
+      var f = format("%0S");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 0)), "00");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 32)), "32");
+    },
+    "formats space-padded second": function(format) {
+      var f = format("%_S");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 0)), " 0");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 3)), " 3");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 32)), "32");
+    },
+    "formats no-padded second": function(format) {
+      var f = format("%-S");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 0)), "0");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 3)), "3");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 32)), "32");
+    },
+    "formats zero-padded millisecond": function(format) {
+      var f = format("%L");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 0, 0)), "000");
+      assert.equal(f(local(1990, 0, 1, 0, 0, 0, 432)), "432");
+    },
+    "formats zero-padded week number": function(format) {
+      var f = format("%U");
+      assert.equal(f(local(1990, 0, 1)), "00");
+      assert.equal(f(local(1990, 5, 1)), "21");
+      assert.equal(f(local(2010, 2, 13, 23)), "10");
+      assert.equal(f(local(2010, 2, 14, 00)), "11"); // DST begins
+      assert.equal(f(local(2010, 2, 15, 00)), "11");
+      assert.equal(f(local(2010, 10, 6, 23)), "44");
+      assert.equal(f(local(2010, 10, 7, 00)), "45"); // DST ends
+      assert.equal(f(local(2010, 10, 8, 00)), "45");
+    },
+    "formats locale date": function(format) {
+      var f = format("%x");
+      assert.equal(f(local(1990, 0, 1)), "01/01/1990");
+      assert.equal(f(local(2010, 5, 1)), "06/01/2010");
+    },
+    "formats locale time": function(format) {
+      var f = format("%X");
+      assert.equal(f(local(1990, 0, 1)), "00:00:00");
+      assert.equal(f(local(1990, 0, 1, 13, 34, 59)), "13:34:59");
+    },
+    "formats zero-padded two-digit year": function(format) {
+      var f = format("%y");
+      assert.equal(f(local(1990, 0, 1)), "90");
+      assert.equal(f(local(2002, 0, 1)), "02");
+    },
+    "formats zero-padded four-digit year": function(format) {
+      var f = format("%Y");
+      assert.equal(f(local(123, 0, 1)), "0123");
+      assert.equal(f(local(1990, 0, 1)), "1990");
+      assert.equal(f(local(2002, 0, 1)), "2002");
+      assert.equal(f(local(10002, 0, 1)), "0002");
+    },
+    "formats time zone": function(format) {
+      var f = format("%Z");
+      assert.equal(f(local(1990, 0, 1)), "-0800");
+    },
+    "formats literal percent sign": function(format) {
+      var f = format("%%");
+      assert.equal(f(local(1990, 0, 1)), "%");
+    },
+    "UTC": {
+      topic: function(format) {
+        return format.utc;
+      },
+      "formats abbreviated weekday": function(format) {
+        var f = format("%a");
+        assert.equal(f(utc(1990, 0, 1)), "Mon");
+        assert.equal(f(utc(1990, 0, 2)), "Tue");
+        assert.equal(f(utc(1990, 0, 3)), "Wed");
+        assert.equal(f(utc(1990, 0, 4)), "Thu");
+        assert.equal(f(utc(1990, 0, 5)), "Fri");
+        assert.equal(f(utc(1990, 0, 6)), "Sat");
+        assert.equal(f(utc(1990, 0, 7)), "Sun");
+      },
+      "formats weekday": function(format) {
+        var f = format("%A");
+        assert.equal(f(utc(1990, 0, 1)), "Monday");
+        assert.equal(f(utc(1990, 0, 2)), "Tuesday");
+        assert.equal(f(utc(1990, 0, 3)), "Wednesday");
+        assert.equal(f(utc(1990, 0, 4)), "Thursday");
+        assert.equal(f(utc(1990, 0, 5)), "Friday");
+        assert.equal(f(utc(1990, 0, 6)), "Saturday");
+        assert.equal(f(utc(1990, 0, 7)), "Sunday");
+      },
+      "formats abbreviated month": function(format) {
+        var f = format("%b");
+        assert.equal(f(utc(1990, 0, 1)), "Jan");
+        assert.equal(f(utc(1990, 1, 1)), "Feb");
+        assert.equal(f(utc(1990, 2, 1)), "Mar");
+        assert.equal(f(utc(1990, 3, 1)), "Apr");
+        assert.equal(f(utc(1990, 4, 1)), "May");
+        assert.equal(f(utc(1990, 5, 1)), "Jun");
+        assert.equal(f(utc(1990, 6, 1)), "Jul");
+        assert.equal(f(utc(1990, 7, 1)), "Aug");
+        assert.equal(f(utc(1990, 8, 1)), "Sep");
+        assert.equal(f(utc(1990, 9, 1)), "Oct");
+        assert.equal(f(utc(1990, 10, 1)), "Nov");
+        assert.equal(f(utc(1990, 11, 1)), "Dec");
+      },
+      "formats locale date and time": function(format) {
+        var f = format("%c");
+        assert.equal(f(utc(1990, 0, 1)), "Mon Jan  1 00:00:00 1990");
+      },
+      "formats zero-padded date": function(format) {
+        var f = format("%d");
+        assert.equal(f(utc(1990, 0, 1)), "01");
+      },
+      "formats space-padded date": function(format) {
+        var f = format("%e");
+        assert.equal(f(utc(1990, 0, 1)), " 1");
+      },
+      "formats zero-padded hour (24)": function(format) {
+        var f = format("%H");
+        assert.equal(f(utc(1990, 0, 1, 0)), "00");
+        assert.equal(f(utc(1990, 0, 1, 13)), "13");
+      },
+      "formats zero-padded hour (12)": function(format) {
+        var f = format("%I");
+        assert.equal(f(utc(1990, 0, 1, 0)), "12");
+        assert.equal(f(utc(1990, 0, 1, 13)), "01");
+      },
+      "formats zero-padded day of year": function(format) {
+        var f = format("%j");
+        assert.equal(f(utc(1990, 0, 1)), "001");
+        assert.equal(f(utc(1990, 5, 1)), "152");
+        assert.equal(f(utc(2010, 2, 13, 23)), "072");
+        assert.equal(f(utc(2010, 2, 14, 00)), "073"); // DST begins
+        assert.equal(f(utc(2010, 2, 15, 00)), "074");
+        assert.equal(f(utc(2010, 10, 6, 23)), "310");
+        assert.equal(f(utc(2010, 10, 7, 00)), "311"); // DST ends
+        assert.equal(f(utc(2010, 10, 8, 00)), "312");
+      },
+      "formats zero-padded month": function(format) {
+        var f = format("%m");
+        assert.equal(f(utc(1990, 0, 1)), "01");
+        assert.equal(f(utc(1990, 9, 1)), "10");
+      },
+      "formats zero-padded minute": function(format) {
+        var f = format("%M");
+        assert.equal(f(utc(1990, 0, 1, 0, 0)), "00");
+        assert.equal(f(utc(1990, 0, 1, 0, 32)), "32");
+      },
+      "formats AM or PM": function(format) {
+        var f = format("%p");
+        assert.equal(f(utc(1990, 0, 1, 0)), "AM");
+        assert.equal(f(utc(1990, 0, 1, 13)), "PM");
+      },
+      "formats zero-padded second": function(format) {
+        var f = format("%S");
+        assert.equal(f(utc(1990, 0, 1, 0, 0, 0)), "00");
+        assert.equal(f(utc(1990, 0, 1, 0, 0, 32)), "32");
+      },
+      "formats zero-padded millisecond": function(format) {
+        var f = format("%L");
+        assert.equal(f(utc(1990, 0, 1, 0, 0, 0, 0)), "000");
+        assert.equal(f(utc(1990, 0, 1, 0, 0, 0, 432)), "432");
+      },
+      "formats zero-padded week number": function(format) {
+        var f = format("%U");
+        assert.equal(f(utc(1990, 0, 1)), "00");
+        assert.equal(f(utc(1990, 5, 1)), "21");
+        assert.equal(f(utc(2010, 2, 13, 23)), "10");
+        assert.equal(f(utc(2010, 2, 14, 00)), "11"); // DST begins
+        assert.equal(f(utc(2010, 2, 15, 00)), "11");
+        assert.equal(f(utc(2010, 10, 6, 23)), "44");
+        assert.equal(f(utc(2010, 10, 7, 00)), "45"); // DST ends
+        assert.equal(f(utc(2010, 10, 8, 00)), "45");
+      },
+      "formats locale date": function(format) {
+        var f = format("%x");
+        assert.equal(f(utc(1990, 0, 1)), "01/01/1990");
+        assert.equal(f(utc(2010, 5, 1)), "06/01/2010");
+      },
+      "formats locale time": function(format) {
+        var f = format("%X");
+        assert.equal(f(utc(1990, 0, 1)), "00:00:00");
+        assert.equal(f(utc(1990, 0, 1, 13, 34, 59)), "13:34:59");
+      },
+      "formats zero-padded two-digit year": function(format) {
+        var f = format("%y");
+        assert.equal(f(utc(1990, 0, 1)), "90");
+        assert.equal(f(utc(2002, 0, 1)), "02");
+      },
+      "formats zero-padded four-digit year": function(format) {
+        var f = format("%Y");
+        assert.equal(f(utc(123, 0, 1)), "0123");
+        assert.equal(f(utc(1990, 0, 1)), "1990");
+        assert.equal(f(utc(2002, 0, 1)), "2002");
+        assert.equal(f(utc(10002, 0, 1)), "0002");
+      },
+      "formats time zone": function(format) {
+        var f = format("%Z");
+        assert.equal(f(utc(1990, 0, 1)), "+0000");
+      },
+      "formats literal percent sign": function(format) {
+        var f = format("%%");
+        assert.equal(f(utc(1990, 0, 1)), "%");
+      },
+    },
+    "ISO": {
+      topic: function(format) {
+        return format.iso;
+      },
+      "toString is %Y-%m-%dT%H:%M:%S.%LZ": function(format) {
+        assert.equal(format + "", "%Y-%m-%dT%H:%M:%S.%LZ");
+      },
+      "formats as ISO 8601": function(format) {
+        assert.equal(format(utc(1990, 0, 1, 0, 0, 0)), "1990-01-01T00:00:00.000Z");
+        assert.equal(format(utc(2011, 11, 31, 23, 59, 59)), "2011-12-31T23:59:59.000Z");
+      }
+    }
+  },
+  "parse": {
+    topic: function() {
+      return d3.time.format;
+    },
+    "parses abbreviated weekday and numeric date": function(format) {
+      var p = format("%a %m/%d/%Y").parse;
+      assert.deepEqual(p("Sun 01/01/1990"), local(1990, 0, 1));
+      assert.deepEqual(p("Wed 02/03/1991"), local(1991, 1, 3));
+      assert.isNull(p("XXX 03/10/2010"));
+    },
+    "parses weekday and numeric date": function(format) {
+      var p = format("%A %m/%d/%Y").parse;
+      assert.deepEqual(p("Sunday 01/01/1990"), local(1990, 0, 1));
+      assert.deepEqual(p("Wednesday 02/03/1991"), local(1991, 1, 3));
+      assert.isNull(p("Caturday 03/10/2010"));
+    },
+    "parses numeric date": function(format) {
+      var p = format("%m/%d/%y").parse;
+      assert.deepEqual(p("01/01/90"), local(1990, 0, 1));
+      assert.deepEqual(p("02/03/91"), local(1991, 1, 3));
+      assert.isNull(p("03/10/2010"));
+    },
+    "parses locale date": function(format) {
+      var p = format("%x").parse;
+      assert.deepEqual(p("01/01/1990"), local(1990, 0, 1));
+      assert.deepEqual(p("02/03/1991"), local(1991, 1, 3));
+      assert.deepEqual(p("03/10/2010"), local(2010, 2, 10));
+    },
+    "parses abbreviated month, date and year": function(format) {
+      var p = format("%b %d, %Y").parse;
+      assert.deepEqual(p("jan 01, 1990"), local(1990, 0, 1));
+      assert.deepEqual(p("feb  2, 2010"), local(2010, 1, 2));
+      assert.isNull(p("jan. 1, 1990"));
+    },
+    "parses month, date and year": function(format) {
+      var p = format("%B %d, %Y").parse;
+      assert.deepEqual(p("january 01, 1990"), local(1990, 0, 1));
+      assert.deepEqual(p("February  2, 2010"), local(2010, 1, 2));
+      assert.isNull(p("jan 1, 1990"));
+    },
+    "parses locale date and time": function(format) {
+      var p = format("%c").parse;
+      assert.deepEqual(p("Mon Jan  1 00:00:00 1990"), local(1990, 0, 1));
+      assert.deepEqual(p("Sun Jan  1 00:00:00 1990"), local(1990, 0, 1));
+      assert.deepEqual(p("Mon Jan 01 00:00:00 1990"), local(1990, 0, 1));
+      assert.deepEqual(p("Mon Jan 1 00:00:00 1990"), local(1990, 0, 1));
+      assert.deepEqual(p("Mon Jan 1 0:0:0 1990"), local(1990, 0, 1));
+    },
+    "parses twenty-four hour, minute and second": function(format) {
+      var p = format("%H:%M:%S").parse;
+      assert.deepEqual(p("00:00:00"), local(1900, 0, 1, 0, 0, 0));
+      assert.deepEqual(p("11:59:59"), local(1900, 0, 1, 11, 59, 59));
+      assert.deepEqual(p("12:00:00"), local(1900, 0, 1, 12, 0, 0));
+      assert.deepEqual(p("12:00:01"), local(1900, 0, 1, 12, 0, 1));
+      assert.deepEqual(p("23:59:59"), local(1900, 0, 1, 23, 59, 59));
+    },
+    "parses locale time": function(format) {
+      var p = format("%X").parse;
+      assert.deepEqual(p("00:00:00"), local(1900, 0, 1, 0, 0, 0));
+      assert.deepEqual(p("11:59:59"), local(1900, 0, 1, 11, 59, 59));
+      assert.deepEqual(p("12:00:00"), local(1900, 0, 1, 12, 0, 0));
+      assert.deepEqual(p("12:00:01"), local(1900, 0, 1, 12, 0, 1));
+      assert.deepEqual(p("23:59:59"), local(1900, 0, 1, 23, 59, 59));
+    },
+    "parses twelve hour, minute and second": function(format) {
+      var p = format("%I:%M:%S %p").parse;
+      assert.deepEqual(p("12:00:00 am"), local(1900, 0, 1, 0, 0, 0));
+      assert.deepEqual(p("11:59:59 AM"), local(1900, 0, 1, 11, 59, 59));
+      assert.deepEqual(p("12:00:00 pm"), local(1900, 0, 1, 12, 0, 0));
+      assert.deepEqual(p("12:00:01 pm"), local(1900, 0, 1, 12, 0, 1));
+      assert.deepEqual(p("11:59:59 PM"), local(1900, 0, 1, 23, 59, 59));
+    },
+    "doesn't crash when given weird strings": function(format) {
+      try {
+        Object.prototype.foo = 10;
+        var p = format("%b %d, %Y").parse;
+        assert.isNull(p("foo 1, 1990"));
+      } finally {
+        delete Object.prototype.foo;
+      }
+    },
+    "UTC": {
+      topic: function(format) {
+        return format.utc;
+      },
+      "parses abbreviated weekday and numeric date": function(format) {
+        var p = format("%a %m/%d/%Y").parse;
+        assert.deepEqual(p("Sun 01/01/1990"), utc(1990, 0, 1));
+        assert.deepEqual(p("Wed 02/03/1991"), utc(1991, 1, 3));
+        assert.isNull(p("XXX 03/10/2010"));
+      },
+      "parses weekday and numeric date": function(format) {
+        var p = format("%A %m/%d/%Y").parse;
+        assert.deepEqual(p("Sunday 01/01/1990"), utc(1990, 0, 1));
+        assert.deepEqual(p("Wednesday 02/03/1991"), utc(1991, 1, 3));
+        assert.isNull(p("Caturday 03/10/2010"));
+      },
+      "parses numeric date": function(format) {
+        var p = format("%m/%d/%y").parse;
+        assert.deepEqual(p("01/01/90"), utc(1990, 0, 1));
+        assert.deepEqual(p("02/03/91"), utc(1991, 1, 3));
+        assert.isNull(p("03/10/2010"));
+      },
+      "parses locale date": function(format) {
+        var p = format("%x").parse;
+        assert.deepEqual(p("01/01/1990"), utc(1990, 0, 1));
+        assert.deepEqual(p("02/03/1991"), utc(1991, 1, 3));
+        assert.deepEqual(p("03/10/2010"), utc(2010, 2, 10));
+      },
+      "parses abbreviated month, date and year": function(format) {
+        var p = format("%b %d, %Y").parse;
+        assert.deepEqual(p("jan 01, 1990"), utc(1990, 0, 1));
+        assert.deepEqual(p("feb  2, 2010"), utc(2010, 1, 2));
+        assert.isNull(p("jan. 1, 1990"));
+      },
+      "parses month, date and year": function(format) {
+        var p = format("%B %d, %Y").parse;
+        assert.deepEqual(p("january 01, 1990"), utc(1990, 0, 1));
+        assert.deepEqual(p("February  2, 2010"), utc(2010, 1, 2));
+        assert.isNull(p("jan 1, 1990"));
+      },
+      "parses locale date and time": function(format) {
+        var p = format("%c").parse;
+        assert.deepEqual(p("Mon Jan  1 00:00:00 1990"), utc(1990, 0, 1));
+        assert.deepEqual(p("Sun Jan  1 00:00:00 1990"), utc(1990, 0, 1));
+        assert.deepEqual(p("Mon Jan 01 00:00:00 1990"), utc(1990, 0, 1));
+        assert.deepEqual(p("Mon Jan 1 00:00:00 1990"), utc(1990, 0, 1));
+        assert.deepEqual(p("Mon Jan 1 0:0:0 1990"), utc(1990, 0, 1));
+      },
+      "parses twenty-four hour, minute and second": function(format) {
+        var p = format("%H:%M:%S").parse;
+        assert.deepEqual(p("00:00:00"), utc(1900, 0, 1, 0, 0, 0));
+        assert.deepEqual(p("11:59:59"), utc(1900, 0, 1, 11, 59, 59));
+        assert.deepEqual(p("12:00:00"), utc(1900, 0, 1, 12, 0, 0));
+        assert.deepEqual(p("12:00:01"), utc(1900, 0, 1, 12, 0, 1));
+        assert.deepEqual(p("23:59:59"), utc(1900, 0, 1, 23, 59, 59));
+      },
+      "parses locale time": function(format) {
+        var p = format("%X").parse;
+        assert.deepEqual(p("00:00:00"), utc(1900, 0, 1, 0, 0, 0));
+        assert.deepEqual(p("11:59:59"), utc(1900, 0, 1, 11, 59, 59));
+        assert.deepEqual(p("12:00:00"), utc(1900, 0, 1, 12, 0, 0));
+        assert.deepEqual(p("12:00:01"), utc(1900, 0, 1, 12, 0, 1));
+        assert.deepEqual(p("23:59:59"), utc(1900, 0, 1, 23, 59, 59));
+      },
+      "parses twelve hour, minute and second": function(format) {
+        var p = format("%I:%M:%S %p").parse;
+        assert.deepEqual(p("12:00:00 am"), utc(1900, 0, 1, 0, 0, 0));
+        assert.deepEqual(p("11:59:59 AM"), utc(1900, 0, 1, 11, 59, 59));
+        assert.deepEqual(p("12:00:00 pm"), utc(1900, 0, 1, 12, 0, 0));
+        assert.deepEqual(p("12:00:01 pm"), utc(1900, 0, 1, 12, 0, 1));
+        assert.deepEqual(p("11:59:59 PM"), utc(1900, 0, 1, 23, 59, 59));
+      }
+    },
+    "ISO": {
+      topic: function(format) {
+        return format.iso;
+      },
+      "parses as ISO 8601": function(format) {
+        var p = format.parse;
+        assert.deepEqual(p("1990-01-01T00:00:00.000Z"), utc(1990, 0, 1, 0, 0, 0));
+        assert.deepEqual(p("2011-12-31T23:59:59.000Z"), utc(2011, 11, 31, 23, 59, 59));
+        assert.isNull(p("1990-01-01T00:00:00.000X"));
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/hour-test.js b/static/demo/components/d3/test/time/hour-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..17474aba6ccaa770746974288aa488be6c29c15d
--- /dev/null
+++ b/static/demo/components/d3/test/time/hour-test.js
@@ -0,0 +1,218 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.hour");
+
+suite.addBatch({
+  "hour": {
+    topic: function() {
+      return d3.time.hour;
+    },
+    "defaults to floor": function(interval) {
+      assert.strictEqual(interval, interval.floor);
+    },
+    "floor": {
+      topic: function(interval) {
+        return interval.floor;
+      },
+      "returns hours": function(floor) {
+        assert.deepEqual(floor(local(2010, 11, 31, 23, 59)), local(2010, 11, 31, 23));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00)), local(2011, 00, 01, 00));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 01)), local(2011, 00, 01, 00));
+      },
+      "observes start of daylight savings time": function(floor) {
+        assert.deepEqual(floor(utc(2011, 02, 13, 08, 59)), utc(2011, 02, 13, 08));
+        assert.deepEqual(floor(utc(2011, 02, 13, 09, 00)), utc(2011, 02, 13, 09));
+        assert.deepEqual(floor(utc(2011, 02, 13, 09, 01)), utc(2011, 02, 13, 09));
+        assert.deepEqual(floor(utc(2011, 02, 13, 09, 59)), utc(2011, 02, 13, 09));
+        assert.deepEqual(floor(utc(2011, 02, 13, 10, 00)), utc(2011, 02, 13, 10));
+        assert.deepEqual(floor(utc(2011, 02, 13, 10, 01)), utc(2011, 02, 13, 10));
+      },
+      "observes end of daylight savings time": function(floor) {
+        assert.deepEqual(floor(utc(2011, 10, 06, 07, 59)), utc(2011, 10, 06, 07));
+        assert.deepEqual(floor(utc(2011, 10, 06, 08, 00)), utc(2011, 10, 06, 08));
+        assert.deepEqual(floor(utc(2011, 10, 06, 08, 01)), utc(2011, 10, 06, 08));
+        assert.deepEqual(floor(utc(2011, 10, 06, 08, 59)), utc(2011, 10, 06, 08));
+        assert.deepEqual(floor(utc(2011, 10, 06, 09, 00)), utc(2011, 10, 06, 09));
+        assert.deepEqual(floor(utc(2011, 10, 06, 09, 01)), utc(2011, 10, 06, 09));
+      },
+      "NPT": {
+        "observes 15-minute offset": time.zone(345, function(floor) {
+          assert.deepEqual(floor(local(2010, 11, 31, 23, 59, 59)), utc(2010, 11, 31, 17, 15));
+          assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 00)), utc(2010, 11, 31, 18, 15));
+          assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 01)), utc(2010, 11, 31, 18, 15));
+        })
+      },
+      "IST": {
+        "observes 30-minute offset": time.zone(330, function(floor) {
+          assert.deepEqual(floor(local(2010, 11, 31, 23, 59, 59)), utc(2010, 11, 31, 17, 30));
+          assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 00)), utc(2010, 11, 31, 18, 30));
+          assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 01)), utc(2010, 11, 31, 18, 30));
+        })
+      }
+    },
+    "ceil": {
+      topic: function(interval) {
+        return interval.ceil;
+      },
+      "returns hours": function(ceil) {
+        assert.deepEqual(ceil(local(2010, 11, 31, 23, 59)), local(2011, 00, 01, 00));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00)), local(2011, 00, 01, 00));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 01)), local(2011, 00, 01, 01));
+      },
+      "observes start of daylight savings time": function(ceil) {
+        assert.deepEqual(ceil(utc(2011, 02, 13, 08, 59)), utc(2011, 02, 13, 09));
+        assert.deepEqual(ceil(utc(2011, 02, 13, 09, 00)), utc(2011, 02, 13, 09));
+        assert.deepEqual(ceil(utc(2011, 02, 13, 09, 01)), utc(2011, 02, 13, 10));
+        assert.deepEqual(ceil(utc(2011, 02, 13, 09, 59)), utc(2011, 02, 13, 10));
+        assert.deepEqual(ceil(utc(2011, 02, 13, 10, 00)), utc(2011, 02, 13, 10));
+        assert.deepEqual(ceil(utc(2011, 02, 13, 10, 01)), utc(2011, 02, 13, 11));
+      },
+      "observes end of daylight savings time": function(ceil) {
+        assert.deepEqual(ceil(utc(2011, 10, 06, 07, 59)), utc(2011, 10, 06, 08));
+        assert.deepEqual(ceil(utc(2011, 10, 06, 08, 00)), utc(2011, 10, 06, 08));
+        assert.deepEqual(ceil(utc(2011, 10, 06, 08, 01)), utc(2011, 10, 06, 09));
+        assert.deepEqual(ceil(utc(2011, 10, 06, 08, 59)), utc(2011, 10, 06, 09));
+        assert.deepEqual(ceil(utc(2011, 10, 06, 09, 00)), utc(2011, 10, 06, 09));
+        assert.deepEqual(ceil(utc(2011, 10, 06, 09, 01)), utc(2011, 10, 06, 10));
+      },
+      "NPT": {
+        "observes 15-minute offset": time.zone(345, function(ceil) {
+          assert.deepEqual(ceil(local(2010, 11, 31, 23, 59, 59)), utc(2010, 11, 31, 18, 15));
+          assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 00)), utc(2010, 11, 31, 18, 15));
+          assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 01)), utc(2010, 11, 31, 19, 15));
+        })
+      },
+      "IST": {
+        "observes 30-minute offset": time.zone(330, function(ceil) {
+          assert.deepEqual(ceil(local(2010, 11, 31, 23, 59, 59)), utc(2010, 11, 31, 18, 30));
+          assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 00)), utc(2010, 11, 31, 18, 30));
+          assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 01)), utc(2010, 11, 31, 19, 30));
+        })
+      }
+    },
+    "offset": {
+      topic: function(interval) {
+        return interval.offset;
+      },
+      "does not modify the passed-in date": function(offset) {
+        var date = local(2010, 11, 31, 23, 59, 59, 999);
+        offset(date, +1);
+        assert.deepEqual(date, local(2010, 11, 31, 23, 59, 59, 999));
+      },
+      "does not round the passed-in-date": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), +1), local(2011, 00, 01, 00, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 456), -2), local(2010, 11, 31, 21, 59, 59, 456));
+      },
+      "allows negative offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 12), -1), local(2010, 11, 31, 11));
+        assert.deepEqual(offset(local(2011, 00, 01, 01), -2), local(2010, 11, 31, 23));
+        assert.deepEqual(offset(local(2011, 00, 01, 00), -1), local(2010, 11, 31, 23));
+      },
+      "allows positive offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 11), +1), local(2010, 11, 31, 12));
+        assert.deepEqual(offset(local(2010, 11, 31, 23), +2), local(2011, 00, 01, 01));
+        assert.deepEqual(offset(local(2010, 11, 31, 23), +1), local(2011, 00, 01, 00));
+      },
+      "allows zero offset": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), 0), local(2010, 11, 31, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 58, 000), 0), local(2010, 11, 31, 23, 59, 58, 000));
+      }
+    },
+    "UTC": {
+      topic: function(interval) {
+        return interval.utc;
+      },
+      "defaults to floor": function(interval) {
+        assert.strictEqual(interval, interval.floor);
+      },
+      "floor": {
+        topic: function(interval) {
+          return interval.floor;
+        },
+        "returns hours": function(floor) {
+          assert.deepEqual(floor(utc(2010, 11, 31, 23, 59)), utc(2010, 11, 31, 23));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00)), utc(2011, 00, 01, 00));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 01)), utc(2011, 00, 01, 00));
+        },
+        "does not observe the start of daylight savings time": function(floor) {
+          assert.deepEqual(floor(utc(2011, 02, 13, 08, 59)), utc(2011, 02, 13, 08));
+          assert.deepEqual(floor(utc(2011, 02, 13, 09, 00)), utc(2011, 02, 13, 09));
+          assert.deepEqual(floor(utc(2011, 02, 13, 09, 01)), utc(2011, 02, 13, 09));
+          assert.deepEqual(floor(utc(2011, 02, 13, 09, 59)), utc(2011, 02, 13, 09));
+          assert.deepEqual(floor(utc(2011, 02, 13, 10, 00)), utc(2011, 02, 13, 10));
+          assert.deepEqual(floor(utc(2011, 02, 13, 10, 01)), utc(2011, 02, 13, 10));
+        },
+        "does not observe the end of daylight savings time": function(floor) {
+          assert.deepEqual(floor(utc(2011, 10, 06, 07, 59)), utc(2011, 10, 06, 07));
+          assert.deepEqual(floor(utc(2011, 10, 06, 08, 00)), utc(2011, 10, 06, 08));
+          assert.deepEqual(floor(utc(2011, 10, 06, 08, 01)), utc(2011, 10, 06, 08));
+          assert.deepEqual(floor(utc(2011, 10, 06, 08, 59)), utc(2011, 10, 06, 08));
+          assert.deepEqual(floor(utc(2011, 10, 06, 09, 00)), utc(2011, 10, 06, 09));
+          assert.deepEqual(floor(utc(2011, 10, 06, 09, 01)), utc(2011, 10, 06, 09));
+        }
+      },
+      "ceil": {
+        topic: function(interval) {
+          return interval.ceil;
+        },
+        "returns hours": function(ceil) {
+          assert.deepEqual(ceil(utc(2010, 11, 31, 23, 59)), utc(2011, 00, 01, 00));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00)), utc(2011, 00, 01, 00));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 01)), utc(2011, 00, 01, 01));
+        },
+        "does not observe the start of daylight savings time": function(ceil) {
+          assert.deepEqual(ceil(utc(2011, 02, 13, 08, 59)), utc(2011, 02, 13, 09));
+          assert.deepEqual(ceil(utc(2011, 02, 13, 09, 00)), utc(2011, 02, 13, 09));
+          assert.deepEqual(ceil(utc(2011, 02, 13, 09, 01)), utc(2011, 02, 13, 10));
+          assert.deepEqual(ceil(utc(2011, 02, 13, 09, 59)), utc(2011, 02, 13, 10));
+          assert.deepEqual(ceil(utc(2011, 02, 13, 10, 00)), utc(2011, 02, 13, 10));
+          assert.deepEqual(ceil(utc(2011, 02, 13, 10, 01)), utc(2011, 02, 13, 11));
+        },
+        "does not observe the end of daylight savings time": function(ceil) {
+          assert.deepEqual(ceil(utc(2011, 10, 06, 07, 59)), utc(2011, 10, 06, 08));
+          assert.deepEqual(ceil(utc(2011, 10, 06, 08, 00)), utc(2011, 10, 06, 08));
+          assert.deepEqual(ceil(utc(2011, 10, 06, 08, 01)), utc(2011, 10, 06, 09));
+          assert.deepEqual(ceil(utc(2011, 10, 06, 08, 59)), utc(2011, 10, 06, 09));
+          assert.deepEqual(ceil(utc(2011, 10, 06, 09, 00)), utc(2011, 10, 06, 09));
+          assert.deepEqual(ceil(utc(2011, 10, 06, 09, 01)), utc(2011, 10, 06, 10));
+        }
+      },
+      "offset": {
+        topic: function(interval) {
+          return interval.offset;
+        },
+        "does not modify the passed-in date": function(offset) {
+          var date = utc(2010, 11, 31, 23, 59, 59, 999);
+          offset(date, +1);
+          assert.deepEqual(date, utc(2010, 11, 31, 23, 59, 59, 999));
+        },
+        "does not round the passed-in-date": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), +1), utc(2011, 00, 01, 00, 59, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 456), -2), utc(2010, 11, 31, 21, 59, 59, 456));
+        },
+        "allows negative offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 12), -1), utc(2010, 11, 31, 11));
+          assert.deepEqual(offset(utc(2011, 00, 01, 01), -2), utc(2010, 11, 31, 23));
+          assert.deepEqual(offset(utc(2011, 00, 01, 00), -1), utc(2010, 11, 31, 23));
+        },
+        "allows positive offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 11), +1), utc(2010, 11, 31, 12));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23), +2), utc(2011, 00, 01, 01));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23), +1), utc(2011, 00, 01, 00));
+        },
+        "allows zero offset": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), 0), utc(2010, 11, 31, 23, 59, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 58, 000), 0), utc(2010, 11, 31, 23, 59, 58, 000));
+        }
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/hours-test.js b/static/demo/components/d3/test/time/hours-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..f30105e64682ed713b9456d090856e057199f12f
--- /dev/null
+++ b/static/demo/components/d3/test/time/hours-test.js
@@ -0,0 +1,112 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.hours");
+
+suite.addBatch({
+  "hours": {
+    topic: function() {
+      return d3.time.hours;
+    },
+    "returns hours": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31, 12, 30), local(2010, 11, 31, 15, 30)), [
+        local(2010, 11, 31, 13),
+        local(2010, 11, 31, 14),
+        local(2010, 11, 31, 15)
+      ]);
+    },
+    "has an inclusive lower bound": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31, 23), local(2011, 0, 1, 2))[0], local(2010, 11, 31, 23));
+    },
+    "has an exclusive upper bound": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31, 23), local(2011, 0, 1, 2))[2], local(2011, 0, 1, 1));
+    },
+    "can skip hours": function(range) {
+      assert.deepEqual(range(local(2011, 1, 1, 1), local(2011, 1, 1, 13), 3), [
+        local(2011, 1, 1, 3),
+        local(2011, 1, 1, 6),
+        local(2011, 1, 1, 9),
+        local(2011, 1, 1, 12)
+      ]);
+    },
+    "observes start of daylight savings time": function(range) {
+      assert.deepEqual(range(local(2011, 2, 13, 1), local(2011, 2, 13, 5)), [
+        utc(2011, 2, 13, 9),
+        utc(2011, 2, 13, 10),
+        utc(2011, 2, 13, 11)
+      ]);
+    },
+    "observes end of daylight savings time": function(range) {
+      assert.deepEqual(range(local(2011, 10, 6, 0), local(2011, 10, 6, 2)), [
+        utc(2011, 10, 6, 7),
+        utc(2011, 10, 6, 8),
+        utc(2011, 10, 6, 9)
+      ]);
+    },
+    "NPT": {
+      "observes 15-minute offset": time.zone(345, function(range) {
+        assert.deepEqual(range(local(2011, 10, 7, 0), local(2011, 10, 7, 3)), [
+          utc(2011, 10, 6, 18, 15),
+          utc(2011, 10, 6, 19, 15),
+          utc(2011, 10, 6, 20, 15)
+        ]);
+      })
+    },
+    "IST": {
+      "observes 30-minute offset": time.zone(330, function(range) {
+        assert.deepEqual(range(local(2011, 10, 7, 0), local(2011, 10, 7, 3)), [
+          utc(2011, 10, 6, 18, 30),
+          utc(2011, 10, 6, 19, 30),
+          utc(2011, 10, 6, 20, 30)
+        ]);
+      })
+    },
+    "UTC": {
+      topic: function(range) {
+        return range.utc;
+      },
+      "returns hours": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31, 12, 30), utc(2010, 11, 31, 15, 30)), [
+          utc(2010, 11, 31, 13),
+          utc(2010, 11, 31, 14),
+          utc(2010, 11, 31, 15)
+        ]);
+      },
+      "has an inclusive lower bound": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31, 23), utc(2011, 0, 1, 2))[0], utc(2010, 11, 31, 23));
+      },
+      "has an exclusive upper bound": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31, 23), utc(2011, 0, 1, 2))[2], utc(2011, 0, 1, 1));
+      },
+      "can skip hours": function(range) {
+        assert.deepEqual(range(utc(2011, 1, 1, 1), utc(2011, 1, 1, 13), 3), [
+          utc(2011, 1, 1, 3),
+          utc(2011, 1, 1, 6),
+          utc(2011, 1, 1, 9),
+          utc(2011, 1, 1, 12)
+        ]);
+      },
+      "observes start of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 2, 13, 9), utc(2011, 2, 13, 12)), [
+          utc(2011, 2, 13, 9),
+          utc(2011, 2, 13, 10),
+          utc(2011, 2, 13, 11)
+        ]);
+      },
+      "observes end of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 10, 6, 7), utc(2011, 10, 6, 10)), [
+          utc(2011, 10, 6, 7),
+          utc(2011, 10, 6, 8),
+          utc(2011, 10, 6, 9)
+        ]);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/minute-test.js b/static/demo/components/d3/test/time/minute-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..25a532ee210a5cdc1c252bfb2c3edd9af7ab1c31
--- /dev/null
+++ b/static/demo/components/d3/test/time/minute-test.js
@@ -0,0 +1,130 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.minute");
+
+suite.addBatch({
+  "minute": {
+    topic: function() {
+      return d3.time.minute;
+    },
+    "defaults to floor": function(interval) {
+      assert.strictEqual(interval, interval.floor);
+    },
+    "floor": {
+      topic: function(interval) {
+        return interval.floor;
+      },
+      "returns minutes": function(floor) {
+        assert.deepEqual(floor(local(2010, 11, 31, 23, 59, 59)), local(2010, 11, 31, 23, 59));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 00)), local(2011, 00, 01, 00, 00));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 59)), local(2011, 00, 01, 00, 00));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 01, 00)), local(2011, 00, 01, 00, 01));
+      }
+    },
+    "ceil": {
+      topic: function(interval) {
+        return interval.ceil;
+      },
+      "returns minutes": function(ceil) {
+        assert.deepEqual(ceil(local(2010, 11, 31, 23, 59, 59)), local(2011, 00, 01, 00, 00));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 00)), local(2011, 00, 01, 00, 00));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 59)), local(2011, 00, 01, 00, 01));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 01, 00)), local(2011, 00, 01, 00, 01));
+      }
+    },
+    "offset": {
+      topic: function(interval) {
+        return interval.offset;
+      },
+      "does not modify the passed-in date": function(offset) {
+        var date = local(2010, 11, 31, 23, 59, 59, 999);
+        offset(date, +1);
+        assert.deepEqual(date, local(2010, 11, 31, 23, 59, 59, 999));
+      },
+      "does not round the passed-in-date": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), +1), local(2011, 00, 01, 00, 00, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 456), -2), local(2010, 11, 31, 23, 57, 59, 456));
+      },
+      "allows negative offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 12), -1), local(2010, 11, 31, 23, 11));
+        assert.deepEqual(offset(local(2011, 00, 01, 00, 01), -2), local(2010, 11, 31, 23, 59));
+        assert.deepEqual(offset(local(2011, 00, 01, 00, 00), -1), local(2010, 11, 31, 23, 59));
+      },
+      "allows positive offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 11), +1), local(2010, 11, 31, 23, 12));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59), +2), local(2011, 00, 01, 00, 01));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59), +1), local(2011, 00, 01, 00, 00));
+      },
+      "allows zero offset": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), 0), local(2010, 11, 31, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 58, 000), 0), local(2010, 11, 31, 23, 59, 58, 000));
+      }
+    },
+    "UTC": {
+      topic: function(interval) {
+        return interval.utc;
+      },
+      "defaults to floor": function(interval) {
+        assert.strictEqual(interval, interval.floor);
+      },
+      "floor": {
+        topic: function(interval) {
+          return interval.floor;
+        },
+        "returns minutes": function(floor) {
+          assert.deepEqual(floor(utc(2010, 11, 31, 23, 59, 59)), utc(2010, 11, 31, 23, 59));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00, 00)), utc(2011, 00, 01, 00, 00));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00, 59)), utc(2011, 00, 01, 00, 00));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 01, 00)), utc(2011, 00, 01, 00, 01));
+        }
+      },
+      "ceil": {
+        topic: function(interval) {
+          return interval.ceil;
+        },
+        "returns minutes": function(ceil) {
+          assert.deepEqual(ceil(utc(2010, 11, 31, 23, 59, 59)), utc(2011, 00, 01, 00, 00));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00, 00)), utc(2011, 00, 01, 00, 00));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00, 59)), utc(2011, 00, 01, 00, 01));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 01, 00)), utc(2011, 00, 01, 00, 01));
+        }
+      },
+      "offset": {
+        topic: function(interval) {
+          return interval.offset;
+        },
+        "does not modify the passed-in date": function(offset) {
+          var date = utc(2010, 11, 31, 23, 59, 59, 999);
+          offset(date, +1);
+          assert.deepEqual(date, utc(2010, 11, 31, 23, 59, 59, 999));
+        },
+        "does not round the passed-in-date": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), +1), utc(2011, 00, 01, 00, 00, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 456), -2), utc(2010, 11, 31, 23, 57, 59, 456));
+        },
+        "allows negative offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 12), -1), utc(2010, 11, 31, 23, 11));
+          assert.deepEqual(offset(utc(2011, 00, 01, 00, 01), -2), utc(2010, 11, 31, 23, 59));
+          assert.deepEqual(offset(utc(2011, 00, 01, 00, 00), -1), utc(2010, 11, 31, 23, 59));
+        },
+        "allows positive offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 11), +1), utc(2010, 11, 31, 23, 12));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59), +2), utc(2011, 00, 01, 00, 01));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59), +1), utc(2011, 00, 01, 00, 00));
+        },
+        "allows zero offset": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), 0), utc(2010, 11, 31, 23, 59, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 58, 000), 0), utc(2010, 11, 31, 23, 59, 58, 000));
+        }
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/minutes-test.js b/static/demo/components/d3/test/time/minutes-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..153a3819f58a876398a4073d15998731b2176697
--- /dev/null
+++ b/static/demo/components/d3/test/time/minutes-test.js
@@ -0,0 +1,94 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.minutes");
+
+suite.addBatch({
+  "minutes": {
+    topic: function() {
+      return d3.time.minutes;
+    },
+    "returns minutes": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31, 23, 59), local(2011, 0, 1, 0, 2)), [
+        local(2010, 11, 31, 23, 59),
+        local(2011, 0, 1, 0, 0),
+        local(2011, 0, 1, 0, 1)
+      ]);
+    },
+    "has an inclusive lower bound": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31, 23, 59), local(2011, 0, 1, 0, 2))[0], local(2010, 11, 31, 23, 59));
+    },
+    "has an exclusive upper bound": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31, 23, 59), local(2011, 0, 1, 0, 2))[2], local(2011, 0, 1, 0, 1));
+    },
+    "can skip minutes": function(range) {
+      assert.deepEqual(range(local(2011, 1, 1, 12, 7), local(2011, 1, 1, 13, 7), 15), [
+        local(2011, 1, 1, 12, 15),
+        local(2011, 1, 1, 12, 30),
+        local(2011, 1, 1, 12, 45),
+        local(2011, 1, 1, 13, 0)
+      ]);
+    },
+    "observes start of daylight savings time": function(range) {
+      assert.deepEqual(range(utc(2011, 2, 13, 9, 59), utc(2011, 2, 13, 10, 2)), [
+        utc(2011, 2, 13, 9, 59),
+        utc(2011, 2, 13, 10, 0),
+        utc(2011, 2, 13, 10, 1)
+      ]);
+    },
+    "observes end of daylight savings time": function(range) {
+      assert.deepEqual(range(utc(2011, 10, 6, 8, 59), utc(2011, 10, 6, 9, 2)), [
+        utc(2011, 10, 6, 8, 59),
+        utc(2011, 10, 6, 9, 0),
+        utc(2011, 10, 6, 9, 1)
+      ]);
+    },
+    "UTC": {
+      topic: function(range) {
+        return range.utc;
+      },
+      "returns minutes": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31, 23, 59), utc(2011, 0, 1, 0, 2)), [
+          utc(2010, 11, 31, 23, 59),
+          utc(2011, 0, 1, 0, 0),
+          utc(2011, 0, 1, 0, 1)
+        ]);
+      },
+      "has an inclusive lower bound": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31, 23, 59), utc(2011, 0, 1, 0, 2))[0], utc(2010, 11, 31, 23, 59));
+      },
+      "has an exclusive upper bound": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31, 23, 59), utc(2011, 0, 1, 0, 2))[2], utc(2011, 0, 1, 0, 1));
+      },
+      "can skip minutes": function(range) {
+        assert.deepEqual(range(utc(2011, 1, 1, 12, 7), utc(2011, 1, 1, 13, 7), 15), [
+          utc(2011, 1, 1, 12, 15),
+          utc(2011, 1, 1, 12, 30),
+          utc(2011, 1, 1, 12, 45),
+          utc(2011, 1, 1, 13, 0)
+        ]);
+      },
+      "does not observe the start of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 2, 13, 9, 59), utc(2011, 2, 13, 10, 2)), [
+          utc(2011, 2, 13, 9, 59),
+          utc(2011, 2, 13, 10, 0),
+          utc(2011, 2, 13, 10, 1)
+        ]);
+      },
+      "does not observe the end of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 10, 6, 8, 59), utc(2011, 10, 6, 9, 2)), [
+          utc(2011, 10, 6, 8, 59),
+          utc(2011, 10, 6, 9, 0),
+          utc(2011, 10, 6, 9, 1)
+        ]);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/month-test.js b/static/demo/components/d3/test/time/month-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..c3d8f5b168f57b32118ffceb80dddeef931438ce
--- /dev/null
+++ b/static/demo/components/d3/test/time/month-test.js
@@ -0,0 +1,153 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.month");
+
+suite.addBatch({
+  "month": {
+    topic: function() {
+      return d3.time.month;
+    },
+    "defaults to floor": function(interval) {
+      assert.strictEqual(interval, interval.floor);
+    },
+    "floor": {
+      topic: function(interval) {
+        return interval.floor;
+      },
+      "returns months": function(floor) {
+        assert.deepEqual(floor(local(2010, 11, 31, 23, 59, 59)), local(2010, 11, 01));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 00)), local(2011, 00, 01));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 01)), local(2011, 00, 01));
+      },
+      "observes the start of daylight savings time": function(floor) {
+        assert.deepEqual(floor(local(2011, 02, 13, 01)), local(2011, 02, 01));
+      },
+      "observes the end of the daylight savings time": function(floor) {
+        assert.deepEqual(floor(local(2011, 10, 06, 01)), local(2011, 10, 01));
+      },
+      "correctly handles years in the first century": function(floor) {
+        assert.deepEqual(floor(local(0011, 10, 06, 07)), local(0011, 10, 01));
+      }
+    },
+    "ceil": {
+      topic: function(interval) {
+        return interval.ceil;
+      },
+      "returns months": function(ceil) {
+        assert.deepEqual(ceil(local(2010, 11, 31, 23, 59, 59)), local(2011, 00, 01));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 00)), local(2011, 00, 01));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 01)), local(2011, 01, 01));
+      },
+      "observes the start of daylight savings time": function(ceil) {
+        assert.deepEqual(ceil(local(2011, 02, 13, 01)), local(2011, 03, 01));
+      },
+      "observes the end of the daylight savings time": function(ceil) {
+        assert.deepEqual(ceil(local(2011, 10, 06, 01)), local(2011, 11, 01));
+      }
+    },
+    "offset": {
+      topic: function(interval) {
+        return interval.offset;
+      },
+      "does not modify the passed-in date": function(offset) {
+        var date = local(2010, 11, 31, 23, 59, 59, 999);
+        offset(date, +1);
+        assert.deepEqual(date, local(2010, 11, 31, 23, 59, 59, 999));
+      },
+      "does not round the passed-in-date": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), +1), local(2011, 00, 31, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 456), -2), local(2010, 09, 31, 23, 59, 59, 456));
+      },
+      "allows negative offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 01), -1), local(2010, 10, 01));
+        assert.deepEqual(offset(local(2011, 00, 01), -2), local(2010, 10, 01));
+        assert.deepEqual(offset(local(2011, 00, 01), -1), local(2010, 11, 01));
+      },
+      "allows positive offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 10, 01), +1), local(2010, 11, 01));
+        assert.deepEqual(offset(local(2010, 10, 01), +2), local(2011, 00, 01));
+        assert.deepEqual(offset(local(2010, 11, 01), +1), local(2011, 00, 01));
+      },
+      "allows zero offset": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), 0), local(2010, 11, 31, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 58, 000), 0), local(2010, 11, 31, 23, 59, 58, 000));
+      }
+    },
+    "UTC": {
+      topic: function(interval) {
+        return interval.utc;
+      },
+      "defaults to floor": function(interval) {
+        assert.strictEqual(interval, interval.floor);
+      },
+      "floor": {
+        topic: function(interval) {
+          return interval.floor;
+        },
+        "returns months": function(floor) {
+          assert.deepEqual(floor(utc(2010, 11, 31, 23, 59, 59)), utc(2010, 11, 01));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00, 00)), utc(2011, 00, 01));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00, 01)), utc(2011, 00, 01));
+        },
+        "does not observe the start of daylight savings time": function(floor) {
+          assert.deepEqual(floor(utc(2011, 02, 13, 01)), utc(2011, 02, 01));
+        },
+        "does not observe the end of the daylight savings time": function(floor) {
+          assert.deepEqual(floor(utc(2011, 10, 06, 01)), utc(2011, 10, 01));
+        }
+      },
+      "ceil": {
+        topic: function(interval) {
+          return interval.ceil;
+        },
+        "returns months": function(ceil) {
+          assert.deepEqual(ceil(utc(2010, 11, 31, 23, 59, 59)), utc(2011, 00, 01));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00, 00)), utc(2011, 00, 01));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00, 01)), utc(2011, 01, 01));
+        },
+        "does not observe the start of daylight savings time": function(ceil) {
+          assert.deepEqual(ceil(utc(2011, 02, 13, 01)), utc(2011, 03, 01));
+        },
+        "does not observe the end of the daylight savings time": function(ceil) {
+          assert.deepEqual(ceil(utc(2011, 10, 06, 01)), utc(2011, 11, 01));
+        }
+      },
+      "offset": {
+        topic: function(interval) {
+          return interval.offset;
+        },
+        "does not modify the passed-in date": function(offset) {
+          var date = utc(2010, 11, 31, 23, 59, 59, 999);
+          offset(date, +1);
+          assert.deepEqual(date, utc(2010, 11, 31, 23, 59, 59, 999));
+        },
+        "does not round the passed-in-date": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), +1), utc(2011, 00, 31, 23, 59, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 456), -2), utc(2010, 09, 31, 23, 59, 59, 456));
+        },
+        "allows negative offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 01), -1), utc(2010, 10, 01));
+          assert.deepEqual(offset(utc(2011, 00, 01), -2), utc(2010, 10, 01));
+          assert.deepEqual(offset(utc(2011, 00, 01), -1), utc(2010, 11, 01));
+        },
+        "allows positive offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 10, 01), +1), utc(2010, 11, 01));
+          assert.deepEqual(offset(utc(2010, 10, 01), +2), utc(2011, 00, 01));
+          assert.deepEqual(offset(utc(2010, 11, 01), +1), utc(2011, 00, 01));
+        },
+        "allows zero offset": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), 0), utc(2010, 11, 31, 23, 59, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 58, 000), 0), utc(2010, 11, 31, 23, 59, 58, 000));
+        }
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/months-test.js b/static/demo/components/d3/test/time/months-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..70c6f581d57b7d15b6446ecd04e5e092eea70dff
--- /dev/null
+++ b/static/demo/components/d3/test/time/months-test.js
@@ -0,0 +1,98 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.months");
+
+suite.addBatch({
+  "months": {
+    topic: function() {
+      return d3.time.months;
+    },
+    "returns months": function(range) {
+      assert.deepEqual(range(local(2010, 10, 31), local(2011, 2, 1)), [
+        local(2010, 11, 1),
+        local(2011, 0, 1),
+        local(2011, 1, 1)
+      ]);
+    },
+    "has an inclusive lower bound": function(range) {
+      assert.deepEqual(range(local(2010, 10, 31), local(2011, 2, 1))[0], local(2010, 11, 1));
+    },
+    "has an exclusive upper bound": function(range) {
+      assert.deepEqual(range(local(2010, 10, 31), local(2011, 2, 1))[2], local(2011, 1, 1));
+    },
+    "can skip months": function(range) {
+      assert.deepEqual(range(local(2011, 1, 1), local(2012, 1, 1), 3), [
+        local(2011, 3, 1),
+        local(2011, 6, 1),
+        local(2011, 9, 1),
+        local(2012, 0, 1)
+      ]);
+    },
+    "observes start of daylight savings time": function(range) {
+      assert.deepEqual(range(local(2011, 0, 1), local(2011, 4, 1)), [
+        local(2011, 0, 1),
+        local(2011, 1, 1),
+        local(2011, 2, 1),
+        local(2011, 3, 1)
+      ]);
+    },
+    "observes end of daylight savings time": function(range) {
+      assert.deepEqual(range(local(2011, 9, 1), local(2012, 1, 1)), [
+        local(2011, 9, 1),
+        local(2011, 10, 1),
+        local(2011, 11, 1),
+        local(2012, 0, 1)
+      ]);
+    },
+    "UTC": {
+      topic: function(range) {
+        return range.utc;
+      },
+      "returns months": function(range) {
+        assert.deepEqual(range(utc(2010, 10, 31), utc(2011, 2, 1)), [
+          utc(2010, 11, 1),
+          utc(2011, 0, 1),
+          utc(2011, 1, 1)
+        ]);
+      },
+      "has an inclusive lower bound": function(range) {
+        assert.deepEqual(range(utc(2010, 10, 31), utc(2011, 2, 1))[0], utc(2010, 11, 1));
+      },
+      "has an exclusive upper bound": function(range) {
+        assert.deepEqual(range(utc(2010, 10, 31), utc(2011, 2, 1))[2], utc(2011, 1, 1));
+      },
+      "can skip months": function(range) {
+        assert.deepEqual(range(utc(2011, 1, 1), utc(2012, 1, 1), 3), [
+          utc(2011, 3, 1),
+          utc(2011, 6, 1),
+          utc(2011, 9, 1),
+          utc(2012, 0, 1)
+        ]);
+      },
+      "does not observe the start of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 0, 1), utc(2011, 4, 1)), [
+          utc(2011, 0, 1),
+          utc(2011, 1, 1),
+          utc(2011, 2, 1),
+          utc(2011, 3, 1)
+        ]);
+      },
+      "does not observe the end of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 9, 1), utc(2012, 1, 1)), [
+          utc(2011, 9, 1),
+          utc(2011, 10, 1),
+          utc(2011, 11, 1),
+          utc(2012, 0, 1)
+        ]);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/scale-test.js b/static/demo/components/d3/test/time/scale-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..aad597998f7883946310b3598f5fca926c2083db
--- /dev/null
+++ b/static/demo/components/d3/test/time/scale-test.js
@@ -0,0 +1,585 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.scale");
+
+suite.addBatch({
+  "scale": {
+    topic: function() {
+      return d3.time.scale;
+    },
+
+    "nice": {
+      "rounds using the specified time interval": function(scale) {
+        var x = scale().domain([local(2009, 0, 1, 0, 12), local(2009, 0, 1, 23, 48)]);
+        assert.deepEqual(x.nice(d3.time.day).domain(), [local(2009, 0, 1), local(2009, 0, 2)]);
+        assert.deepEqual(x.nice(d3.time.week).domain(), [local(2008, 11, 28), local(2009, 0, 4)]);
+        assert.deepEqual(x.nice(d3.time.month).domain(), [local(2008, 11, 1), local(2009, 1, 1)]);
+        assert.deepEqual(x.nice(d3.time.year).domain(), [local(2008, 0, 1), local(2010, 0, 1)]);
+      },
+      "works on degenerate domains": function(scale) {
+        var x = scale().domain([local(2009, 0, 1, 0, 12), local(2009, 0, 1, 0, 12)]);
+        assert.deepEqual(x.nice(d3.time.day).domain(), [local(2009, 0, 1), local(2009, 0, 2)]);
+      },
+      "nicing a polylinear domain only affects the extent": function(linear) {
+        var x = linear().domain([local(2009, 0, 1, 0, 12), local(2009, 0, 1, 23, 48), local(2009, 0, 2, 23, 48)]).nice(d3.time.day);
+        assert.deepEqual(x.domain(), [local(2009, 0, 1), local(2009, 0, 1, 23, 48), local(2009, 0, 3)]);
+      }
+    },
+
+    "copy": {
+      "changes to the domain are isolated": function(scale) {
+        var x = scale().domain([local(2009, 0, 1), local(2010, 0, 1)]), y = x.copy();
+        x.domain([local(2010, 0, 1), local(2011, 0, 1)]);
+        assert.deepEqual(y.domain(), [local(2009, 0, 1), local(2010, 0, 1)]);
+        assert.equal(x(local(2010, 0, 1)), 0);
+        assert.equal(y(local(2010, 0, 1)), 1);
+        y.domain([local(2011, 0, 1), local(2012, 0, 1)]);
+        assert.equal(x(local(2011, 0, 1)), 1);
+        assert.equal(y(local(2011, 0, 1)), 0);
+        assert.deepEqual(x.domain(), [local(2010, 0, 1), local(2011, 0, 1)]);
+        assert.deepEqual(y.domain(), [local(2011, 0, 1), local(2012, 0, 1)]);
+      },
+      "changes to the range are isolated": function(scale) {
+        var x = scale().domain([local(2009, 0, 1), local(2010, 0, 1)]), y = x.copy();
+        x.range([1, 2]);
+        assert.deepEqual(x.invert(1), local(2009, 0, 1));
+        assert.deepEqual(y.invert(1), local(2010, 0, 1));
+        assert.deepEqual(y.range(), [0, 1]);
+        y.range([2, 3]);
+        assert.deepEqual(x.invert(2), local(2010, 0, 1));
+        assert.deepEqual(y.invert(2), local(2009, 0, 1));
+        assert.deepEqual(x.range(), [1, 2]);
+        assert.deepEqual(y.range(), [2, 3]);
+      },
+      "changes to the interpolator are isolated": function(scale) {
+        var x = scale().domain([local(2009, 0, 1), local(2010, 0, 1)]).range(["red", "blue"]), y = x.copy();
+        x.interpolate(d3.interpolateHsl);
+        assert.equal(x(local(2009, 6, 1)), "#ff00fd");
+        assert.equal(y(local(2009, 6, 1)), "#81007e");
+        assert.equal(y.interpolate(), d3.interpolate);
+      },
+      "changes to clamping are isolated": function(scale) {
+        var x = scale().domain([local(2009, 0, 1), local(2010, 0, 1)]).clamp(true), y = x.copy();
+        x.clamp(false);
+        assert.equal(x(local(2011, 0, 1)), 2);
+        assert.equal(y(local(2011, 0, 1)), 1);
+        assert.isTrue(y.clamp());
+        y.clamp(false);
+        assert.equal(x(local(2011, 0, 1)), 2);
+        assert.equal(y(local(2011, 0, 1)), 2);
+        assert.isFalse(x.clamp());
+      }
+    },
+
+    "ticks": {
+      "observes explicit tick interval": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 1, 0), local(2011, 0, 1, 12, 4, 4)]);
+        assert.deepEqual(x.ticks(d3.time.minutes), [
+          local(2011, 0, 1, 12, 1),
+          local(2011, 0, 1, 12, 2),
+          local(2011, 0, 1, 12, 3),
+          local(2011, 0, 1, 12, 4)
+        ]);
+      },
+      "observes explicit tick interval and step": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 33, 4)]);
+        assert.deepEqual(x.ticks(d3.time.minutes, 10), [
+          local(2011, 0, 1, 12, 0),
+          local(2011, 0, 1, 12, 10),
+          local(2011, 0, 1, 12, 20),
+          local(2011, 0, 1, 12, 30)
+        ]);
+      },
+      "generates sub-second ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 0, 1)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 12, 0, 0,   0),
+          local(2011, 0, 1, 12, 0, 0, 200),
+          local(2011, 0, 1, 12, 0, 0, 400),
+          local(2011, 0, 1, 12, 0, 0, 600),
+          local(2011, 0, 1, 12, 0, 0, 800),
+          local(2011, 0, 1, 12, 0, 1,   0)
+        ]);
+      },
+      "generates 1-second ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 0, 4)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 12, 0, 0),
+          local(2011, 0, 1, 12, 0, 1),
+          local(2011, 0, 1, 12, 0, 2),
+          local(2011, 0, 1, 12, 0, 3),
+          local(2011, 0, 1, 12, 0, 4)
+        ]);
+      },
+      "generates 5-second ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 0, 20)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 12, 0, 0),
+          local(2011, 0, 1, 12, 0, 5),
+          local(2011, 0, 1, 12, 0, 10),
+          local(2011, 0, 1, 12, 0, 15),
+          local(2011, 0, 1, 12, 0, 20)
+        ]);
+      },
+      "generates 15-second ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 0, 50)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 12, 0, 0),
+          local(2011, 0, 1, 12, 0, 15),
+          local(2011, 0, 1, 12, 0, 30),
+          local(2011, 0, 1, 12, 0, 45)
+        ]);
+      },
+      "generates 30-second ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 1, 50)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 12, 0, 0),
+          local(2011, 0, 1, 12, 0, 30),
+          local(2011, 0, 1, 12, 1, 0),
+          local(2011, 0, 1, 12, 1, 30)
+        ]);
+      },
+      "generates 1-minute ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 0, 27), local(2011, 0, 1, 12, 4, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 12, 1),
+          local(2011, 0, 1, 12, 2),
+          local(2011, 0, 1, 12, 3),
+          local(2011, 0, 1, 12, 4)
+        ]);
+      },
+      "generates 5-minute ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 3, 27), local(2011, 0, 1, 12, 21, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 12, 5),
+          local(2011, 0, 1, 12, 10),
+          local(2011, 0, 1, 12, 15),
+          local(2011, 0, 1, 12, 20)
+        ]);
+      },
+      "generates 15-minute ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 8, 27), local(2011, 0, 1, 13, 4, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 12, 15),
+          local(2011, 0, 1, 12, 30),
+          local(2011, 0, 1, 12, 45),
+          local(2011, 0, 1, 13, 0)
+        ]);
+      },
+      "generates 30-minute ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 28, 27), local(2011, 0, 1, 14, 4, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 12, 30),
+          local(2011, 0, 1, 13, 0),
+          local(2011, 0, 1, 13, 30),
+          local(2011, 0, 1, 14, 0)
+        ]);
+      },
+      "generates 1-hour ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 12, 28, 27), local(2011, 0, 1, 16, 34, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 13, 0),
+          local(2011, 0, 1, 14, 0),
+          local(2011, 0, 1, 15, 0),
+          local(2011, 0, 1, 16, 0)
+        ]);
+      },
+      "generates 3-hour ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 14, 28, 27), local(2011, 0, 2, 1, 34, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 15, 0),
+          local(2011, 0, 1, 18, 0),
+          local(2011, 0, 1, 21, 0),
+          local(2011, 0, 2, 0, 0)
+        ]);
+      },
+      "generates 6-hour ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 16, 28, 27), local(2011, 0, 2, 14, 34, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 18, 0),
+          local(2011, 0, 2, 0, 0),
+          local(2011, 0, 2, 6, 0),
+          local(2011, 0, 2, 12, 0)
+        ]);
+      },
+      "generates 12-hour ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 16, 28, 27), local(2011, 0, 3, 21, 34, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 2, 0, 0),
+          local(2011, 0, 2, 12, 0),
+          local(2011, 0, 3, 0, 0),
+          local(2011, 0, 3, 12, 0)
+        ]);
+      },
+      "generates 1-day ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 16, 28, 27), local(2011, 0, 5, 21, 34, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 2, 0, 0),
+          local(2011, 0, 3, 0, 0),
+          local(2011, 0, 4, 0, 0),
+          local(2011, 0, 5, 0, 0)
+        ]);
+      },
+      "generates 2-day ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 2, 16, 28, 27), local(2011, 0, 9, 21, 34, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 3, 0, 0),
+          local(2011, 0, 5, 0, 0),
+          local(2011, 0, 7, 0, 0),
+          local(2011, 0, 9, 0, 0)
+        ]);
+      },
+      "generates 1-week ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 1, 16, 28, 27), local(2011, 0, 23, 21, 34, 12)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 2, 0, 0),
+          local(2011, 0, 9, 0, 0),
+          local(2011, 0, 16, 0, 0),
+          local(2011, 0, 23, 0, 0)
+        ]);
+      },
+      "generates 1-month ticks": function(scale) {
+        var x = scale().domain([local(2011, 0, 18), local(2011, 4, 2)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 1, 1, 0, 0),
+          local(2011, 2, 1, 0, 0),
+          local(2011, 3, 1, 0, 0),
+          local(2011, 4, 1, 0, 0)
+        ]);
+      },
+      "generates 3-month ticks": function(scale) {
+        var x = scale().domain([local(2010, 11, 18), local(2011, 10, 2)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 0, 0),
+          local(2011, 3, 1, 0, 0),
+          local(2011, 6, 1, 0, 0),
+          local(2011, 9, 1, 0, 0)
+        ]);
+      },
+      "generates 1-year ticks": function(scale) {
+        var x = scale().domain([local(2010, 11, 18), local(2014, 2, 2)]);
+        assert.deepEqual(x.ticks(4), [
+          local(2011, 0, 1, 0, 0),
+          local(2012, 0, 1, 0, 0),
+          local(2013, 0, 1, 0, 0),
+          local(2014, 0, 1, 0, 0)
+        ]);
+      },
+      "generates multi-year ticks": function(scale) {
+        var x = scale().domain([local(0, 11, 18), local(2014, 2, 2)]);
+        assert.deepEqual(x.ticks(6), [
+          local( 500, 0, 1, 0, 0),
+          local(1000, 0, 1, 0, 0),
+          local(1500, 0, 1, 0, 0),
+          local(2000, 0, 1, 0, 0)
+        ]);
+      }
+    },
+
+    "tickFormat": {
+      topic: function(scale) {
+        return scale().tickFormat();
+      },
+      "formats year on New Year's": function(format) {
+        assert.equal(format(local(2011, 0, 1)), "2011");
+        assert.equal(format(local(2012, 0, 1)), "2012");
+        assert.equal(format(local(2013, 0, 1)), "2013");
+      },
+      "formats month on the 1st of each month": function(format) {
+        assert.equal(format(local(2011, 1, 1)), "February");
+        assert.equal(format(local(2011, 2, 1)), "March");
+        assert.equal(format(local(2011, 3, 1)), "April");
+      },
+      "formats week on Sunday midnight": function(format) {
+        assert.equal(format(local(2011, 1, 6)), "Feb 06");
+        assert.equal(format(local(2011, 1, 13)), "Feb 13");
+        assert.equal(format(local(2011, 1, 20)), "Feb 20");
+      },
+      "formats date on midnight": function(format) {
+        assert.equal(format(local(2011, 1, 2)), "Wed 02");
+        assert.equal(format(local(2011, 1, 3)), "Thu 03");
+        assert.equal(format(local(2011, 1, 4)), "Fri 04");
+      },
+      "formats hour on minute zero": function(format) {
+        assert.equal(format(local(2011, 1, 2, 11)), "11 AM");
+        assert.equal(format(local(2011, 1, 2, 12)), "12 PM");
+        assert.equal(format(local(2011, 1, 2, 13)), "01 PM");
+      },
+      "formats minute on second zero": function(format) {
+        assert.equal(format(local(2011, 1, 2, 11, 59)), "11:59");
+        assert.equal(format(local(2011, 1, 2, 12,  1)), "12:01");
+        assert.equal(format(local(2011, 1, 2, 12,  2)), "12:02");
+      },
+      "otherwise, formats second": function(format) {
+        assert.equal(format(local(2011, 1, 2, 12,  1,  9)), ":09");
+        assert.equal(format(local(2011, 1, 2, 12,  1, 10)), ":10");
+        assert.equal(format(local(2011, 1, 2, 12,  1, 11)), ":11");
+      }
+    },
+
+    "UTC": {
+      topic: function(scale) {
+        return scale.utc;
+      },
+
+      "ticks": {
+        "observes explicit tick interval": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 1, 0), utc(2011, 0, 1, 12, 4, 4)]);
+          assert.deepEqual(x.ticks(d3.time.minutes), [
+            utc(2011, 0, 1, 12, 1),
+            utc(2011, 0, 1, 12, 2),
+            utc(2011, 0, 1, 12, 3),
+            utc(2011, 0, 1, 12, 4)
+          ]);
+        },
+        "observes explicit tick interval and step": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 33, 4)]);
+          assert.deepEqual(x.ticks(d3.time.minutes, 10), [
+            utc(2011, 0, 1, 12, 0),
+            utc(2011, 0, 1, 12, 10),
+            utc(2011, 0, 1, 12, 20),
+            utc(2011, 0, 1, 12, 30)
+          ]);
+        },
+        "generates sub-second ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 0, 1)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 12, 0, 0,   0),
+            utc(2011, 0, 1, 12, 0, 0, 200),
+            utc(2011, 0, 1, 12, 0, 0, 400),
+            utc(2011, 0, 1, 12, 0, 0, 600),
+            utc(2011, 0, 1, 12, 0, 0, 800),
+            utc(2011, 0, 1, 12, 0, 1,   0)
+          ]);
+        },
+        "generates 1-second ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 0, 4)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 12, 0, 0),
+            utc(2011, 0, 1, 12, 0, 1),
+            utc(2011, 0, 1, 12, 0, 2),
+            utc(2011, 0, 1, 12, 0, 3),
+            utc(2011, 0, 1, 12, 0, 4)
+          ]);
+        },
+        "generates 5-second ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 0, 20)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 12, 0, 0),
+            utc(2011, 0, 1, 12, 0, 5),
+            utc(2011, 0, 1, 12, 0, 10),
+            utc(2011, 0, 1, 12, 0, 15),
+            utc(2011, 0, 1, 12, 0, 20)
+          ]);
+        },
+        "generates 15-second ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 0, 50)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 12, 0, 0),
+            utc(2011, 0, 1, 12, 0, 15),
+            utc(2011, 0, 1, 12, 0, 30),
+            utc(2011, 0, 1, 12, 0, 45)
+          ]);
+        },
+        "generates 30-second ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 1, 50)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 12, 0, 0),
+            utc(2011, 0, 1, 12, 0, 30),
+            utc(2011, 0, 1, 12, 1, 0),
+            utc(2011, 0, 1, 12, 1, 30)
+          ]);
+        },
+        "generates 1-minute ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 0, 27), utc(2011, 0, 1, 12, 4, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 12, 1),
+            utc(2011, 0, 1, 12, 2),
+            utc(2011, 0, 1, 12, 3),
+            utc(2011, 0, 1, 12, 4)
+          ]);
+        },
+        "generates 5-minute ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 3, 27), utc(2011, 0, 1, 12, 21, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 12, 5),
+            utc(2011, 0, 1, 12, 10),
+            utc(2011, 0, 1, 12, 15),
+            utc(2011, 0, 1, 12, 20)
+          ]);
+        },
+        "generates 15-minute ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 8, 27), utc(2011, 0, 1, 13, 4, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 12, 15),
+            utc(2011, 0, 1, 12, 30),
+            utc(2011, 0, 1, 12, 45),
+            utc(2011, 0, 1, 13, 0)
+          ]);
+        },
+        "generates 30-minute ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 28, 27), utc(2011, 0, 1, 14, 4, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 12, 30),
+            utc(2011, 0, 1, 13, 0),
+            utc(2011, 0, 1, 13, 30),
+            utc(2011, 0, 1, 14, 0)
+          ]);
+        },
+        "generates 1-hour ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 12, 28, 27), utc(2011, 0, 1, 16, 34, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 13, 0),
+            utc(2011, 0, 1, 14, 0),
+            utc(2011, 0, 1, 15, 0),
+            utc(2011, 0, 1, 16, 0)
+          ]);
+        },
+        "generates 3-hour ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 14, 28, 27), utc(2011, 0, 2, 1, 34, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 15, 0),
+            utc(2011, 0, 1, 18, 0),
+            utc(2011, 0, 1, 21, 0),
+            utc(2011, 0, 2, 0, 0)
+          ]);
+        },
+        "generates 6-hour ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 16, 28, 27), utc(2011, 0, 2, 14, 34, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 18, 0),
+            utc(2011, 0, 2, 0, 0),
+            utc(2011, 0, 2, 6, 0),
+            utc(2011, 0, 2, 12, 0)
+          ]);
+        },
+        "generates 12-hour ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 16, 28, 27), utc(2011, 0, 3, 21, 34, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 2, 0, 0),
+            utc(2011, 0, 2, 12, 0),
+            utc(2011, 0, 3, 0, 0),
+            utc(2011, 0, 3, 12, 0)
+          ]);
+        },
+        "generates 1-day ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 16, 28, 27), utc(2011, 0, 5, 21, 34, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 2, 0, 0),
+            utc(2011, 0, 3, 0, 0),
+            utc(2011, 0, 4, 0, 0),
+            utc(2011, 0, 5, 0, 0)
+          ]);
+        },
+        "generates 2-day ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 2, 16, 28, 27), utc(2011, 0, 9, 21, 34, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 3, 0, 0),
+            utc(2011, 0, 5, 0, 0),
+            utc(2011, 0, 7, 0, 0),
+            utc(2011, 0, 9, 0, 0)
+          ]);
+        },
+        "generates 1-week ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 1, 16, 28, 27), utc(2011, 0, 23, 21, 34, 12)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 2, 0, 0),
+            utc(2011, 0, 9, 0, 0),
+            utc(2011, 0, 16, 0, 0),
+            utc(2011, 0, 23, 0, 0)
+          ]);
+        },
+        "generates 1-month ticks": function(scale) {
+          var x = scale().domain([utc(2011, 0, 18), utc(2011, 4, 2)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 1, 1, 0, 0),
+            utc(2011, 2, 1, 0, 0),
+            utc(2011, 3, 1, 0, 0),
+            utc(2011, 4, 1, 0, 0)
+          ]);
+        },
+        "generates 3-month ticks": function(scale) {
+          var x = scale().domain([utc(2010, 11, 18), utc(2011, 10, 2)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 0, 0),
+            utc(2011, 3, 1, 0, 0),
+            utc(2011, 6, 1, 0, 0),
+            utc(2011, 9, 1, 0, 0)
+          ]);
+        },
+        "generates 1-year ticks": function(scale) {
+          var x = scale().domain([utc(2010, 11, 18), utc(2014, 2, 2)]);
+          assert.deepEqual(x.ticks(4), [
+            utc(2011, 0, 1, 0, 0),
+            utc(2012, 0, 1, 0, 0),
+            utc(2013, 0, 1, 0, 0),
+            utc(2014, 0, 1, 0, 0)
+          ]);
+        },
+        "generates multi-year ticks": function(scale) {
+          var x = scale().domain([utc(0, 11, 18), utc(2014, 2, 2)]);
+          assert.deepEqual(x.ticks(6), [
+            utc( 500, 0, 1, 0, 0),
+            utc(1000, 0, 1, 0, 0),
+            utc(1500, 0, 1, 0, 0),
+            utc(2000, 0, 1, 0, 0)
+          ]);
+        }
+      },
+
+      "tickFormat": {
+        topic: function(scale) {
+          return scale().tickFormat();
+        },
+        "formats year on New Year's": function(format) {
+          assert.equal(format(utc(2011, 0, 1)), "2011");
+          assert.equal(format(utc(2012, 0, 1)), "2012");
+          assert.equal(format(utc(2013, 0, 1)), "2013");
+        },
+        "formats month on the 1st of each month": function(format) {
+          assert.equal(format(utc(2011, 1, 1)), "February");
+          assert.equal(format(utc(2011, 2, 1)), "March");
+          assert.equal(format(utc(2011, 3, 1)), "April");
+        },
+        "formats week on Sunday midnight": function(format) {
+          assert.equal(format(utc(2011, 1, 6)), "Feb 06");
+          assert.equal(format(utc(2011, 1, 13)), "Feb 13");
+          assert.equal(format(utc(2011, 1, 20)), "Feb 20");
+        },
+        "formats date on midnight": function(format) {
+          assert.equal(format(utc(2011, 1, 2)), "Wed 02");
+          assert.equal(format(utc(2011, 1, 3)), "Thu 03");
+          assert.equal(format(utc(2011, 1, 4)), "Fri 04");
+        },
+        "formats hour on minute zero": function(format) {
+          assert.equal(format(utc(2011, 1, 2, 11)), "11 AM");
+          assert.equal(format(utc(2011, 1, 2, 12)), "12 PM");
+          assert.equal(format(utc(2011, 1, 2, 13)), "01 PM");
+        },
+        "formats minute on second zero": function(format) {
+          assert.equal(format(utc(2011, 1, 2, 11, 59)), "11:59");
+          assert.equal(format(utc(2011, 1, 2, 12,  1)), "12:01");
+          assert.equal(format(utc(2011, 1, 2, 12,  2)), "12:02");
+        },
+        "formats second on millisecond zero": function(format) {
+          assert.equal(format(utc(2011, 1, 2, 12,  1,  9)), ":09");
+          assert.equal(format(utc(2011, 1, 2, 12,  1, 10)), ":10");
+          assert.equal(format(utc(2011, 1, 2, 12,  1, 11)), ":11");
+        },
+        "otherwise, formats milliseconds": function(format) {
+          assert.equal(format(utc(2011, 1, 2, 12,  1,  0,   9)), ".009");
+          assert.equal(format(utc(2011, 1, 2, 12,  1,  0,  10)), ".010");
+          assert.equal(format(utc(2011, 1, 2, 12,  1,  0,  11)), ".011");
+        }
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/second-test.js b/static/demo/components/d3/test/time/second-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..4c10edd5202f1e85f0a5a2e827b5df9f02da908c
--- /dev/null
+++ b/static/demo/components/d3/test/time/second-test.js
@@ -0,0 +1,146 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.second");
+
+suite.addBatch({
+  "second": {
+    topic: function() {
+      return d3.time.second;
+    },
+    "defaults to floor": function(interval) {
+      assert.strictEqual(interval, interval.floor);
+    },
+    "floor": {
+      topic: function(interval) {
+        return interval.floor;
+      },
+      "returns seconds": function(floor) {
+        assert.deepEqual(floor(local(2010, 11, 31, 23, 59, 59, 999)), local(2010, 11, 31, 23, 59, 59));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 00, 000)), local(2011, 00, 01, 00, 00, 00));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 00, 001)), local(2011, 00, 01, 00, 00, 00));
+      }
+    },
+    "round": {
+      topic: function(interval) {
+        return interval.round;
+      },
+      "returns seconds": function(round) {
+        assert.deepEqual(round(local(2010, 11, 31, 23, 59, 59, 999)), local(2011, 00, 01, 00, 00, 00));
+        assert.deepEqual(round(local(2011, 00, 01, 00, 00, 00, 499)), local(2011, 00, 01, 00, 00, 00));
+        assert.deepEqual(round(local(2011, 00, 01, 00, 00, 00, 500)), local(2011, 00, 01, 00, 00, 01));
+      }
+    },
+    "ceil": {
+      topic: function(interval) {
+        return interval.ceil;
+      },
+      "returns seconds": function(ceil) {
+        assert.deepEqual(ceil(local(2010, 11, 31, 23, 59, 59, 999)), local(2011, 00, 01, 00, 00, 00));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 00, 000)), local(2011, 00, 01, 00, 00, 00));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 00, 001)), local(2011, 00, 01, 00, 00, 01));
+      }
+    },
+    "offset": {
+      topic: function(interval) {
+        return interval.offset;
+      },
+      "does not modify the passed-in date": function(offset) {
+        var date = local(2010, 11, 31, 23, 59, 59, 999);
+        offset(date, +1);
+        assert.deepEqual(date, local(2010, 11, 31, 23, 59, 59, 999));
+      },
+      "does not round the passed-in-date": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), +1), local(2011, 00, 01, 00, 00, 00, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 456), -2), local(2010, 11, 31, 23, 59, 57, 456));
+      },
+      "allows negative offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59), -1), local(2010, 11, 31, 23, 59, 58));
+        assert.deepEqual(offset(local(2011, 00, 01, 00, 00, 00), -2), local(2010, 11, 31, 23, 59, 58));
+        assert.deepEqual(offset(local(2011, 00, 01, 00, 00, 00), -1), local(2010, 11, 31, 23, 59, 59));
+      },
+      "allows positive offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 58), +1), local(2010, 11, 31, 23, 59, 59));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 58), +2), local(2011, 00, 01, 00, 00, 00));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59), +1), local(2011, 00, 01, 00, 00, 00));
+      },
+      "allows zero offset": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), 0), local(2010, 11, 31, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 58, 000), 0), local(2010, 11, 31, 23, 59, 58, 000));
+      }
+    },
+    "UTC": {
+      topic: function(interval) {
+        return interval.utc;
+      },
+      "defaults to floor": function(interval) {
+        assert.strictEqual(interval, interval.floor);
+      },
+      "floor": {
+        topic: function(interval) {
+          return interval.floor;
+        },
+        "returns seconds": function(floor) {
+          assert.deepEqual(floor(utc(2010, 11, 31, 23, 59, 59, 999)), utc(2010, 11, 31, 23, 59, 59));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00, 00, 000)), utc(2011, 00, 01, 00, 00, 00));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00, 00, 001)), utc(2011, 00, 01, 00, 00, 00));
+        }
+      },
+      "round": {
+        topic: function(interval) {
+          return interval.round;
+        },
+        "returns seconds": function(round) {
+          assert.deepEqual(round(utc(2010, 11, 31, 23, 59, 59, 999)), utc(2011, 00, 01, 00, 00, 00));
+          assert.deepEqual(round(utc(2011, 00, 01, 00, 00, 00, 499)), utc(2011, 00, 01, 00, 00, 00));
+          assert.deepEqual(round(utc(2011, 00, 01, 00, 00, 00, 500)), utc(2011, 00, 01, 00, 00, 01));
+        }
+      },
+      "ceil": {
+        topic: function(interval) {
+          return interval.ceil;
+        },
+        "returns seconds": function(ceil) {
+          assert.deepEqual(ceil(utc(2010, 11, 31, 23, 59, 59, 999)), utc(2011, 00, 01, 00, 00, 00));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00, 00, 000)), utc(2011, 00, 01, 00, 00, 00));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00, 00, 001)), utc(2011, 00, 01, 00, 00, 01));
+        }
+      },
+      "offset": {
+        topic: function(interval) {
+          return interval.offset;
+        },
+        "does not modify the passed-in date": function(offset) {
+          var date = utc(2010, 11, 31, 23, 59, 59, 999);
+          offset(date, +1);
+          assert.deepEqual(date, utc(2010, 11, 31, 23, 59, 59, 999));
+        },
+        "does not round the passed-in-date": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), +1), utc(2011, 00, 01, 00, 00, 00, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 456), -2), utc(2010, 11, 31, 23, 59, 57, 456));
+        },
+        "allows negative offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59), -1), utc(2010, 11, 31, 23, 59, 58));
+          assert.deepEqual(offset(utc(2011, 00, 01, 00, 00, 00), -2), utc(2010, 11, 31, 23, 59, 58));
+          assert.deepEqual(offset(utc(2011, 00, 01, 00, 00, 00), -1), utc(2010, 11, 31, 23, 59, 59));
+        },
+        "allows positive offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 58), +1), utc(2010, 11, 31, 23, 59, 59));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 58), +2), utc(2011, 00, 01, 00, 00, 00));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59), +1), utc(2011, 00, 01, 00, 00, 00));
+        },
+        "allows zero offset": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), 0), utc(2010, 11, 31, 23, 59, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 58, 000), 0), utc(2010, 11, 31, 23, 59, 58, 000));
+        }
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/seconds-test.js b/static/demo/components/d3/test/time/seconds-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a5ba7c7b1b5b23763981623e054d008a1b9662d2
--- /dev/null
+++ b/static/demo/components/d3/test/time/seconds-test.js
@@ -0,0 +1,94 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.seconds");
+
+suite.addBatch({
+  "seconds": {
+    topic: function() {
+      return d3.time.seconds;
+    },
+    "returns seconds": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31, 23, 59, 59), local(2011, 0, 1, 0, 0, 2)), [
+        local(2010, 11, 31, 23, 59, 59),
+        local(2011, 0, 1, 0, 0, 0),
+        local(2011, 0, 1, 0, 0, 1)
+      ]);
+    },
+    "has an inclusive lower bound": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31, 23, 59, 59), local(2011, 0, 1, 0, 0, 2))[0], local(2010, 11, 31, 23, 59, 59));
+    },
+    "has an exclusive upper bound": function(range) {
+      assert.deepEqual(range(local(2010, 11, 31, 23, 59, 59), local(2011, 0, 1, 0, 0, 2))[2], local(2011, 0, 1, 0, 0, 1));
+    },
+    "can skip seconds": function(range) {
+      assert.deepEqual(range(local(2011, 1, 1, 12, 0, 7), local(2011, 1, 1, 12, 1, 7), 15), [
+        local(2011, 1, 1, 12, 0, 15),
+        local(2011, 1, 1, 12, 0, 30),
+        local(2011, 1, 1, 12, 0, 45),
+        local(2011, 1, 1, 12, 1, 0)
+      ]);
+    },
+    "observes start of daylight savings time": function(range) {
+      assert.deepEqual(range(utc(2011, 2, 13, 9, 59, 59), utc(2011, 2, 13, 10, 0, 2)), [
+        utc(2011, 2, 13, 9, 59, 59),
+        utc(2011, 2, 13, 10, 0, 0),
+        utc(2011, 2, 13, 10, 0, 1)
+      ]);
+    },
+    "observes end of daylight savings time": function(range) {
+      assert.deepEqual(range(utc(2011, 10, 6, 8, 59, 59), utc(2011, 10, 6, 9, 0, 2)), [
+        utc(2011, 10, 6, 8, 59, 59),
+        utc(2011, 10, 6, 9, 0, 0),
+        utc(2011, 10, 6, 9, 0, 1)
+      ]);
+    },
+    "UTC": {
+      topic: function(range) {
+        return range.utc;
+      },
+      "returns seconds": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31, 23, 59, 59), utc(2011, 0, 1, 0, 0, 2)), [
+          utc(2010, 11, 31, 23, 59, 59),
+          utc(2011, 0, 1, 0, 0, 0),
+          utc(2011, 0, 1, 0, 0, 1)
+        ]);
+      },
+      "has an inclusive lower bound": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31, 23, 59, 59), utc(2011, 0, 1, 0, 0, 2))[0], utc(2010, 11, 31, 23, 59, 59));
+      },
+      "has an exclusive upper bound": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 31, 23, 59, 59), utc(2011, 0, 1, 0, 0, 2))[2], utc(2011, 0, 1, 0, 0, 1));
+      },
+      "can skip seconds": function(range) {
+        assert.deepEqual(range(utc(2011, 1, 1, 12, 0, 7), utc(2011, 1, 1, 12, 1, 7), 15), [
+          utc(2011, 1, 1, 12, 0, 15),
+          utc(2011, 1, 1, 12, 0, 30),
+          utc(2011, 1, 1, 12, 0, 45),
+          utc(2011, 1, 1, 12, 1, 0)
+        ]);
+      },
+      "does not observe the start of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 2, 13, 9, 59, 59), utc(2011, 2, 13, 10, 0, 2)), [
+          utc(2011, 2, 13, 9, 59, 59),
+          utc(2011, 2, 13, 10, 0, 0),
+          utc(2011, 2, 13, 10, 0, 1)
+        ]);
+      },
+      "does not observe the end of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 10, 6, 8, 59, 59), utc(2011, 10, 6, 9, 0, 2)), [
+          utc(2011, 10, 6, 8, 59, 59),
+          utc(2011, 10, 6, 9, 0, 0),
+          utc(2011, 10, 6, 9, 0, 1)
+        ]);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/time.js b/static/demo/components/d3/test/time/time.js
new file mode 100644
index 0000000000000000000000000000000000000000..df18dd55ec01b28a6db7dbeddd83b3bcdbd948a5
--- /dev/null
+++ b/static/demo/components/d3/test/time/time.js
@@ -0,0 +1,30 @@
+var offset = 0;
+
+exports.local = function(year, month, day, hours, minutes, seconds, milliseconds) {
+  var date = new Date();
+  date.setFullYear(year, month, day);
+  date.setHours(hours || 0, offset + (minutes || 0), seconds || 0, milliseconds || 0);
+  return date;
+};
+
+exports.utc = function(year, month, day, hours, minutes, seconds, milliseconds) {
+  var date = new Date();
+  date.setUTCFullYear(year, month, day);
+  date.setUTCHours(hours || 0, minutes || 0, seconds || 0, milliseconds || 0);
+  return date;
+};
+
+exports.zone = function(tzOffset, scope) {
+  return function() {
+    var o = Date.prototype.getTimezoneOffset;
+    try {
+      // Note: assumes the dates are not in DST.
+      offset = -tzOffset - new Date(0).getTimezoneOffset();
+      Date.prototype.getTimezoneOffset = function() { return offset; };
+      scope.apply(this, arguments);
+    } finally {
+      offset = 0;
+      Date.prototype.getTimezoneOffset = o;
+    }
+  };
+};
diff --git a/static/demo/components/d3/test/time/week-test.js b/static/demo/components/d3/test/time/week-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e9f5441ecdbe95d2b9d73dee932098a9f7c71cb
--- /dev/null
+++ b/static/demo/components/d3/test/time/week-test.js
@@ -0,0 +1,165 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.week");
+
+suite.addBatch({
+  "week": {
+    topic: function() {
+      return d3.time.week;
+    },
+    "defaults to floor": function(interval) {
+      assert.strictEqual(interval, interval.floor);
+    },
+    "floor": {
+      topic: function(interval) {
+        return interval.floor;
+      },
+      "returns sundays": function(floor) {
+        assert.deepEqual(floor(local(2010, 11, 31, 23, 59, 59)), local(2010, 11, 26));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 00)), local(2010, 11, 26));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 01)), local(2010, 11, 26));
+        assert.deepEqual(floor(local(2011, 00, 01, 23, 59, 59)), local(2010, 11, 26));
+        assert.deepEqual(floor(local(2011, 00, 02, 00, 00, 00)), local(2011, 00, 02));
+        assert.deepEqual(floor(local(2011, 00, 02, 00, 00, 01)), local(2011, 00, 02));
+      },
+      "observes the start of daylight savings time": function(floor) {
+        assert.deepEqual(floor(local(2011, 02, 13, 01)), local(2011, 02, 13));
+      },
+      "observes the end of the daylight savings time": function(floor) {
+        assert.deepEqual(floor(local(2011, 10, 06, 01)), local(2011, 10, 06));
+      },
+      "correctly handles years in the first century": function(floor) {
+        assert.deepEqual(floor(local(0011, 10, 06, 07)), local(0011, 10, 01));
+      }
+    },
+    "ceil": {
+      topic: function(interval) {
+        return interval.ceil;
+      },
+      "returns sundays": function(ceil) {
+        assert.deepEqual(ceil(local(2010, 11, 31, 23, 59, 59)), local(2011, 00, 02));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 00)), local(2011, 00, 02));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 01)), local(2011, 00, 02));
+        assert.deepEqual(ceil(local(2011, 00, 01, 23, 59, 59)), local(2011, 00, 02));
+        assert.deepEqual(ceil(local(2011, 00, 02, 00, 00, 00)), local(2011, 00, 02));
+        assert.deepEqual(ceil(local(2011, 00, 02, 00, 00, 01)), local(2011, 00, 09));
+      },
+      "observes the start of daylight savings time": function(ceil) {
+        assert.deepEqual(ceil(local(2011, 02, 13, 01)), local(2011, 02, 20));
+      },
+      "observes the end of the daylight savings time": function(ceil) {
+        assert.deepEqual(ceil(local(2011, 10, 06, 01)), local(2011, 10, 13));
+      }
+    },
+    "offset": {
+      topic: function(interval) {
+        return interval.offset;
+      },
+      "does not modify the passed-in date": function(offset) {
+        var date = local(2010, 11, 31, 23, 59, 59, 999);
+        offset(date, +1);
+        assert.deepEqual(date, local(2010, 11, 31, 23, 59, 59, 999));
+      },
+      "does not round the passed-in-date": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), +1), local(2011, 00, 07, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 456), -2), local(2010, 11, 17, 23, 59, 59, 456));
+      },
+      "allows negative offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 01), -1), local(2010, 10, 24));
+        assert.deepEqual(offset(local(2011, 00, 01), -2), local(2010, 11, 18));
+        assert.deepEqual(offset(local(2011, 00, 01), -1), local(2010, 11, 25));
+      },
+      "allows positive offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 10, 24), +1), local(2010, 11, 01));
+        assert.deepEqual(offset(local(2010, 11, 18), +2), local(2011, 00, 01));
+        assert.deepEqual(offset(local(2010, 11, 25), +1), local(2011, 00, 01));
+      },
+      "allows zero offset": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), 0), local(2010, 11, 31, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 58, 000), 0), local(2010, 11, 31, 23, 59, 58, 000));
+      }
+    },
+    "UTC": {
+      topic: function(interval) {
+        return interval.utc;
+      },
+      "defaults to floor": function(interval) {
+        assert.strictEqual(interval, interval.floor);
+      },
+      "floor": {
+        topic: function(interval) {
+          return interval.floor;
+        },
+        "returns sundays": function(floor) {
+          assert.deepEqual(floor(utc(2010, 11, 31, 23, 59, 59)), utc(2010, 11, 26));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00, 00)), utc(2010, 11, 26));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00, 01)), utc(2010, 11, 26));
+          assert.deepEqual(floor(utc(2011, 00, 01, 23, 59, 59)), utc(2010, 11, 26));
+          assert.deepEqual(floor(utc(2011, 00, 02, 00, 00, 00)), utc(2011, 00, 02));
+          assert.deepEqual(floor(utc(2011, 00, 02, 00, 00, 01)), utc(2011, 00, 02));
+        },
+        "does not observe the start of daylight savings time": function(floor) {
+          assert.deepEqual(floor(utc(2011, 02, 13, 01)), utc(2011, 02, 13));
+        },
+        "does not observe the end of the daylight savings time": function(floor) {
+          assert.deepEqual(floor(utc(2011, 10, 06, 01)), utc(2011, 10, 06));
+        }
+      },
+      "ceil": {
+        topic: function(interval) {
+          return interval.ceil;
+        },
+        "returns sundays": function(ceil) {
+          assert.deepEqual(ceil(utc(2010, 11, 31, 23, 59, 59)), utc(2011, 00, 02));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00, 00)), utc(2011, 00, 02));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00, 01)), utc(2011, 00, 02));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 23, 59, 59)), utc(2011, 00, 02));
+          assert.deepEqual(ceil(utc(2011, 00, 02, 00, 00, 00)), utc(2011, 00, 02));
+          assert.deepEqual(ceil(utc(2011, 00, 02, 00, 00, 01)), utc(2011, 00, 09));
+        },
+        "does not observe the start of daylight savings time": function(ceil) {
+          assert.deepEqual(ceil(utc(2011, 02, 13, 01)), utc(2011, 02, 20));
+        },
+        "does not observe the end of the daylight savings time": function(ceil) {
+          assert.deepEqual(ceil(utc(2011, 10, 06, 01)), utc(2011, 10, 13));
+        }
+      }
+    },
+    "offset": {
+      topic: function(interval) {
+        return interval.offset;
+      },
+      "does not modify the passed-in date": function(offset) {
+        var date = utc(2010, 11, 31, 23, 59, 59, 999);
+        offset(date, +1);
+        assert.deepEqual(date, utc(2010, 11, 31, 23, 59, 59, 999));
+      },
+      "does not round the passed-in-date": function(offset) {
+        assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), +1), utc(2011, 00, 07, 23, 59, 59, 999));
+        assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 456), -2), utc(2010, 11, 17, 23, 59, 59, 456));
+      },
+      "allows negative offsets": function(offset) {
+        assert.deepEqual(offset(utc(2010, 11, 01), -1), utc(2010, 10, 24));
+        assert.deepEqual(offset(utc(2011, 00, 01), -2), utc(2010, 11, 18));
+        assert.deepEqual(offset(utc(2011, 00, 01), -1), utc(2010, 11, 25));
+      },
+      "allows positive offsets": function(offset) {
+        assert.deepEqual(offset(utc(2010, 10, 24), +1), utc(2010, 11, 01));
+        assert.deepEqual(offset(utc(2010, 11, 18), +2), utc(2011, 00, 01));
+        assert.deepEqual(offset(utc(2010, 11, 25), +1), utc(2011, 00, 01));
+      },
+      "allows zero offset": function(offset) {
+        assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), 0), utc(2010, 11, 31, 23, 59, 59, 999));
+        assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 58, 000), 0), utc(2010, 11, 31, 23, 59, 58, 000));
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/weeks-test.js b/static/demo/components/d3/test/time/weeks-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..2f9d6af484b772b36dfbd320c419f11fd3823af6
--- /dev/null
+++ b/static/demo/components/d3/test/time/weeks-test.js
@@ -0,0 +1,98 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert"),
+    time = require("./time"),
+    local = time.local,
+    utc = time.utc;
+
+var suite = vows.describe("d3.time.weeks");
+
+suite.addBatch({
+  "weeks": {
+    topic: function() {
+      return d3.time.weeks;
+    },
+    "returns sundays": function(range) {
+      assert.deepEqual(range(local(2010, 11, 21), local(2011, 0, 12)), [
+        local(2010, 11, 26),
+        local(2011, 0, 2),
+        local(2011, 0, 9)
+      ]);
+    },
+    "has an inclusive lower bound": function(range) {
+      assert.deepEqual(range(local(2010, 11, 21), local(2011, 0, 12))[0], local(2010, 11, 26));
+    },
+    "has an exclusive upper bound": function(range) {
+      assert.deepEqual(range(local(2010, 11, 21), local(2011, 0, 12))[2], local(2011, 0, 9));
+    },
+    "can skip weeks": function(range) {
+      assert.deepEqual(range(local(2011, 0, 1), local(2011, 3, 1), 4), [
+        local(2011, 0, 2),
+        local(2011, 0, 30),
+        local(2011, 1, 27),
+        local(2011, 2, 27)
+      ]);
+    },
+    "observes start of daylight savings time": function(range) {
+      assert.deepEqual(range(local(2011, 2, 1), local(2011, 2, 28)), [
+        local(2011, 2, 6),
+        local(2011, 2, 13),
+        local(2011, 2, 20),
+        local(2011, 2, 27)
+      ]);
+    },
+    "observes end of daylight savings time": function(range) {
+      assert.deepEqual(range(local(2011, 10, 1), local(2011, 10, 30)), [
+        local(2011, 10, 6),
+        local(2011, 10, 13),
+        local(2011, 10, 20),
+        local(2011, 10, 27)
+      ]);
+    },
+    "UTC": {
+      topic: function(range) {
+        return range.utc;
+      },
+      "returns sundays": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 21), utc(2011, 0, 12)), [
+          utc(2010, 11, 26),
+          utc(2011, 0, 2),
+          utc(2011, 0, 9)
+        ]);
+      },
+      "has an inclusive lower bound": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 21), utc(2011, 0, 12))[0], utc(2010, 11, 26));
+      },
+      "has an exclusive upper bound": function(range) {
+        assert.deepEqual(range(utc(2010, 11, 21), utc(2011, 0, 12))[2], utc(2011, 0, 9));
+      },
+      "can skip weeks": function(range) {
+        assert.deepEqual(range(utc(2011, 0, 1), utc(2011, 3, 1), 4), [
+          utc(2011, 0, 2),
+          utc(2011, 0, 30),
+          utc(2011, 1, 27),
+          utc(2011, 2, 27)
+        ]);
+      },
+      "does not observe the start of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 2, 1), utc(2011, 2, 28)), [
+          utc(2011, 2, 6),
+          utc(2011, 2, 13),
+          utc(2011, 2, 20),
+          utc(2011, 2, 27)
+        ]);
+      },
+      "does not observe the end of daylight savings time": function(range) {
+        assert.deepEqual(range(utc(2011, 10, 1), utc(2011, 10, 30)), [
+          utc(2011, 10, 6),
+          utc(2011, 10, 13),
+          utc(2011, 10, 20),
+          utc(2011, 10, 27)
+        ]);
+      }
+    }
+  }
+});
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/year-test.js b/static/demo/components/d3/test/time/year-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..21c322bfdaf7438bc9ab289fc4472218eba9ede1
--- /dev/null
+++ b/static/demo/components/d3/test/time/year-test.js
@@ -0,0 +1,140 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.time.year");
+
+suite.addBatch({
+  "year": {
+    topic: function() {
+      return d3.time.year;
+    },
+    "defaults to floor": function(interval) {
+      assert.strictEqual(interval, interval.floor);
+    },
+    "floor": {
+      topic: function(interval) {
+        return interval.floor;
+      },
+      "returns years": function(floor) {
+        assert.deepEqual(floor(local(2010, 11, 31, 23, 59, 59)), local(2010, 00, 01));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 00)), local(2011, 00, 01));
+        assert.deepEqual(floor(local(2011, 00, 01, 00, 00, 01)), local(2011, 00, 01));
+      },
+      "correctly handles years in the first century": function(floor) {
+        assert.deepEqual(floor(local(0011, 10, 06, 07)), local(0011, 00, 01));
+      }
+    },
+    "ceil": {
+      topic: function(interval) {
+        return interval.ceil;
+      },
+      "returns years": function(ceil) {
+        assert.deepEqual(ceil(local(2010, 11, 31, 23, 59, 59)), local(2011, 00, 01));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 00)), local(2011, 00, 01));
+        assert.deepEqual(ceil(local(2011, 00, 01, 00, 00, 01)), local(2012, 00, 01));
+      }
+    },
+    "offset": {
+      topic: function(interval) {
+        return interval.offset;
+      },
+      "does not modify the passed-in date": function(offset) {
+        var date = local(2010, 11, 31, 23, 59, 59, 999);
+        offset(date, +1);
+        assert.deepEqual(date, local(2010, 11, 31, 23, 59, 59, 999));
+      },
+      "does not round the passed-in-date": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), +1), local(2011, 11, 31, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 456), -2), local(2008, 11, 31, 23, 59, 59, 456));
+      },
+      "allows negative offsets": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 01), -1), local(2009, 11, 01));
+        assert.deepEqual(offset(local(2011, 00, 01), -2), local(2009, 00, 01));
+        assert.deepEqual(offset(local(2011, 00, 01), -1), local(2010, 00, 01));
+      },
+      "allows positive offsets": function(offset) {
+        assert.deepEqual(offset(local(2009, 11, 01), +1), local(2010, 11, 01));
+        assert.deepEqual(offset(local(2009, 00, 01), +2), local(2011, 00, 01));
+        assert.deepEqual(offset(local(2010, 00, 01), +1), local(2011, 00, 01));
+      },
+      "allows zero offset": function(offset) {
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 59, 999), 0), local(2010, 11, 31, 23, 59, 59, 999));
+        assert.deepEqual(offset(local(2010, 11, 31, 23, 59, 58, 000), 0), local(2010, 11, 31, 23, 59, 58, 000));
+      }
+    },
+    "UTC": {
+      topic: function(interval) {
+        return interval.utc;
+      },
+      "defaults to floor": function(interval) {
+        assert.strictEqual(interval, interval.floor);
+      },
+      "floor": {
+        topic: function(interval) {
+          return interval.floor;
+        },
+        "returns years": function(floor) {
+          assert.deepEqual(floor(utc(2010, 11, 31, 23, 59, 59)), utc(2010, 00, 01));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00, 00)), utc(2011, 00, 01));
+          assert.deepEqual(floor(utc(2011, 00, 01, 00, 00, 01)), utc(2011, 00, 01));
+        }
+      },
+      "ceil": {
+        topic: function(interval) {
+          return interval.ceil;
+        },
+        "returns years": function(ceil) {
+          assert.deepEqual(ceil(utc(2010, 11, 31, 23, 59, 59)), utc(2011, 00, 01));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00, 00)), utc(2011, 00, 01));
+          assert.deepEqual(ceil(utc(2011, 00, 01, 00, 00, 01)), utc(2012, 00, 01));
+        }
+      },
+      "offset": {
+        topic: function(interval) {
+          return interval.offset;
+        },
+        "does not modify the passed-in date": function(offset) {
+          var date = utc(2010, 11, 31, 23, 59, 59, 999);
+          offset(date, +1);
+          assert.deepEqual(date, utc(2010, 11, 31, 23, 59, 59, 999));
+        },
+        "does not round the passed-in-date": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), +1), utc(2011, 11, 31, 23, 59, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 456), -2), utc(2008, 11, 31, 23, 59, 59, 456));
+        },
+        "allows negative offsets": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 01), -1), utc(2009, 11, 01));
+          assert.deepEqual(offset(utc(2011, 00, 01), -2), utc(2009, 00, 01));
+          assert.deepEqual(offset(utc(2011, 00, 01), -1), utc(2010, 00, 01));
+        },
+        "allows positive offsets": function(offset) {
+          assert.deepEqual(offset(utc(2009, 11, 01), +1), utc(2010, 11, 01));
+          assert.deepEqual(offset(utc(2009, 00, 01), +2), utc(2011, 00, 01));
+          assert.deepEqual(offset(utc(2010, 00, 01), +1), utc(2011, 00, 01));
+        },
+        "allows zero offset": function(offset) {
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 59, 999), 0), utc(2010, 11, 31, 23, 59, 59, 999));
+          assert.deepEqual(offset(utc(2010, 11, 31, 23, 59, 58, 000), 0), utc(2010, 11, 31, 23, 59, 58, 000));
+        }
+      }
+    }
+  }
+});
+
+function local(year, month, day, hours, minutes, seconds, milliseconds) {
+  var date = new Date();
+  date.setFullYear(year, month, day);
+  date.setHours(hours || 0, minutes || 0, seconds || 0, milliseconds || 0);
+  return date;
+}
+
+function utc(year, month, day, hours, minutes, seconds, milliseconds) {
+  var date = new Date();
+  date.setUTCFullYear(year, month, day);
+  date.setUTCHours(hours || 0, minutes || 0, seconds || 0, milliseconds || 0);
+  return date;
+}
+
+suite.export(module);
diff --git a/static/demo/components/d3/test/time/years-test.js b/static/demo/components/d3/test/time/years-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..0730395390ccd854c555a02799840261dee07bc9
--- /dev/null
+++ b/static/demo/components/d3/test/time/years-test.js
@@ -0,0 +1,77 @@
+require("../env");
+
+var vows = require("vows"),
+    assert = require("assert");
+
+var suite = vows.describe("d3.time.years");
+
+suite.addBatch({
+  "years": {
+    topic: function() {
+      return d3.time.years;
+    },
+    "returns years": function(range) {
+      assert.deepEqual(range(local(2010, 0, 1), local(2013, 0, 1)), [
+        local(2010, 0, 1),
+        local(2011, 0, 1),
+        local(2012, 0, 1)
+      ]);
+    },
+    "has an inclusive lower bound": function(range) {
+      assert.deepEqual(range(local(2010, 0, 1), local(2013, 0, 1))[0], local(2010, 0, 1));
+    },
+    "has an exclusive upper bound": function(range) {
+      assert.deepEqual(range(local(2010, 0, 1), local(2013, 0, 1))[2], local(2012, 0, 1));
+    },
+    "can skip years": function(range) {
+      assert.deepEqual(range(local(2009, 0, 1), local(2029, 0, 1), 5), [
+        local(2010, 0, 1),
+        local(2015, 0, 1),
+        local(2020, 0, 1),
+        local(2025, 0, 1)
+      ]);
+    },
+    "UTC": {
+      topic: function(range) {
+        return range.utc;
+      },
+      "returns years": function(range) {
+        assert.deepEqual(range(utc(2010, 0, 1), utc(2013, 0, 1)), [
+          utc(2010, 0, 1),
+          utc(2011, 0, 1),
+          utc(2012, 0, 1)
+        ]);
+      },
+      "has an inclusive lower bound": function(range) {
+        assert.deepEqual(range(utc(2010, 0, 1), utc(2013, 0, 1))[0], utc(2010, 0, 1));
+      },
+      "has an exclusive upper bound": function(range) {
+        assert.deepEqual(range(utc(2010, 0, 1), utc(2013, 0, 1))[2], utc(2012, 0, 1));
+      },
+      "can skip years": function(range) {
+        assert.deepEqual(range(utc(2009, 0, 1), utc(2029, 0, 1), 5), [
+          utc(2010, 0, 1),
+          utc(2015, 0, 1),
+          utc(2020, 0, 1),
+          utc(2025, 0, 1)
+        ]);
+      }
+    }
+  }
+});
+
+function local(year, month, day, hours, minutes, seconds, milliseconds) {
+  var date = new Date();
+  date.setFullYear(year, month, day);
+  date.setHours(hours || 0, minutes || 0, seconds || 0, milliseconds || 0);
+  return date;
+}
+
+function utc(year, month, day, hours, minutes, seconds, milliseconds) {
+  var date = new Date();
+  date.setUTCFullYear(year, month, day);
+  date.setUTCHours(hours || 0, minutes || 0, seconds || 0, milliseconds || 0);
+  return date;
+}
+
+suite.export(module);
diff --git a/static/demo/components/jquery/.bower.json b/static/demo/components/jquery/.bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..88339e53e896ce24314f3069dea3982194a3dee5
--- /dev/null
+++ b/static/demo/components/jquery/.bower.json
@@ -0,0 +1,23 @@
+{
+  "name": "jquery",
+  "version": "1.9.1",
+  "description": "jQuery component",
+  "keywords": [
+    "jquery",
+    "component"
+  ],
+  "scripts": [
+    "jquery.js"
+  ],
+  "license": "MIT",
+  "homepage": "https://github.com/components/jquery",
+  "_release": "1.9.1",
+  "_resolution": {
+    "type": "version",
+    "tag": "1.9.1",
+    "commit": "ae5c0c13cf163b3751ce55f9d9e97c1ba7ff796d"
+  },
+  "_source": "git://github.com/components/jquery.git",
+  "_target": "~1.9.1",
+  "_originalSource": "git://github.com/components/jquery.git"
+}
\ No newline at end of file
diff --git a/static/demo/components/jquery/.gitignore b/static/demo/components/jquery/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..378eac25d311703f3f2cd456d8036da525cd0366
--- /dev/null
+++ b/static/demo/components/jquery/.gitignore
@@ -0,0 +1 @@
+build
diff --git a/static/demo/components/jquery/README.md b/static/demo/components/jquery/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..ee4907f8567abc78ba8aac4f9a021624331cc36e
--- /dev/null
+++ b/static/demo/components/jquery/README.md
@@ -0,0 +1,4 @@
+jQuery Component
+================
+
+Shim repository for jQuery.
diff --git a/static/demo/components/jquery/component.json b/static/demo/components/jquery/component.json
new file mode 100644
index 0000000000000000000000000000000000000000..291a8f1254d3022f771eceea343da53ef8dc1e74
--- /dev/null
+++ b/static/demo/components/jquery/component.json
@@ -0,0 +1,13 @@
+{
+  "name": "jquery",
+  "version": "1.9.1",
+  "description": "jQuery component",
+  "keywords": [
+    "jquery",
+    "component"
+  ],
+  "scripts": [
+    "jquery.js"
+  ],
+  "license": "MIT"
+}
diff --git a/static/demo/components/jquery/composer.json b/static/demo/components/jquery/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..7d709ea687aa141e3c7f1fa71e9a964ef772ff97
--- /dev/null
+++ b/static/demo/components/jquery/composer.json
@@ -0,0 +1,36 @@
+{
+    "name": "components/jquery",
+    "description": "jQuery JavaScript Library",
+    "type": "component",
+    "homepage": "http://jquery.com",
+    "license": "MIT",
+    "support": {
+        "irc": "irc://irc.freenode.org/jquery",
+        "issues": "http://bugs.jquery.com",
+        "forum": "http://forum.jquery.com",
+        "wiki": "http://docs.jquery.com/",
+        "source": "https://github.com/jquery/jquery"
+    },
+    "authors": [
+        {
+            "name": "John Resig",
+            "email": "jeresig@gmail.com"
+        }
+    ],
+    "require": {
+        "robloach/component-installer": "*"
+    },
+    "extra": {
+        "component": {
+            "scripts": [
+                "jquery.js"
+            ],
+            "files": [
+                "jquery.min.js",
+                "jquery-migrate.js",
+                "jquery-migrate.min.js",
+                "jquery.min.map"
+            ]
+        }
+    }
+}
diff --git a/static/demo/components/jquery/jquery-migrate.js b/static/demo/components/jquery/jquery-migrate.js
new file mode 100644
index 0000000000000000000000000000000000000000..8801b92a4b0476b210f3615a7e00c6f3c4843f70
--- /dev/null
+++ b/static/demo/components/jquery/jquery-migrate.js
@@ -0,0 +1,496 @@
+/*!
+ * jQuery Migrate - v1.1.0 - 2013-01-31
+ * https://github.com/jquery/jquery-migrate
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
+ */
+(function( jQuery, window, undefined ) {
+"use strict";
+
+
+var warnedAbout = {};
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to true to prevent console output; migrateWarnings still maintained
+// jQuery.migrateMute = false;
+
+// Show a message on the console so devs know we're active
+if ( !jQuery.migrateMute && window.console && console.log ) {
+	console.log("JQMIGRATE: Logging is active");
+}
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+	jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+	warnedAbout = {};
+	jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg) {
+	if ( !warnedAbout[ msg ] ) {
+		warnedAbout[ msg ] = true;
+		jQuery.migrateWarnings.push( msg );
+		if ( window.console && console.warn && !jQuery.migrateMute ) {
+			console.warn( "JQMIGRATE: " + msg );
+			if ( jQuery.migrateTrace && console.trace ) {
+				console.trace();
+			}
+		}
+	}
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+	if ( Object.defineProperty ) {
+		// On ES5 browsers (non-oldIE), warn if the code tries to get prop;
+		// allow property to be overwritten in case some other plugin wants it
+		try {
+			Object.defineProperty( obj, prop, {
+				configurable: true,
+				enumerable: true,
+				get: function() {
+					migrateWarn( msg );
+					return value;
+				},
+				set: function( newValue ) {
+					migrateWarn( msg );
+					value = newValue;
+				}
+			});
+			return;
+		} catch( err ) {
+			// IE8 is a dope about Object.defineProperty, can't warn there
+		}
+	}
+
+	// Non-ES5 (or broken) browser; just set the property
+	jQuery._definePropertyBroken = true;
+	obj[ prop ] = value;
+}
+
+if ( document.compatMode === "BackCompat" ) {
+	// jQuery has never supported or tested Quirks Mode
+	migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+
+var attrFn = {},
+	oldAttr = jQuery.attr,
+	valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
+		function() { return null; },
+	valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
+		function() { return undefined; },
+	rnoType = /^(?:input|button)$/i,
+	rnoAttrNodeType = /^[238]$/,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	ruseDefault = /^(?:checked|selected)$/i;
+
+// jQuery.attrFn
+migrateWarnProp( jQuery, "attrFn", attrFn, "jQuery.attrFn is deprecated" );
+
+jQuery.attr = function( elem, name, value, pass ) {
+	var lowerName = name.toLowerCase(),
+		nType = elem && elem.nodeType;
+
+	// Since pass is used internally, we only warn and shim for new jQuery
+	// versions where there isn't a pass arg in the formal params
+	if ( pass && oldAttr.length < 4 ) {
+		migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+		if ( elem && !rnoAttrNodeType.test( nType ) && jQuery.isFunction( jQuery.fn[ name ] ) ) {
+			return jQuery( elem )[ name ]( value );
+		}
+	}
+
+	// Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
+	// for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
+	if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
+		migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+	}
+
+	// Restore boolHook for boolean property/attribute synchronization
+	if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
+		jQuery.attrHooks[ lowerName ] = {
+			get: function( elem, name ) {
+				// Align boolean attributes with corresponding properties
+				// Fall back to attribute presence where some booleans are not supported
+				var attrNode,
+					property = jQuery.prop( elem, name );
+				return property === true || typeof property !== "boolean" &&
+					( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+
+					name.toLowerCase() :
+					undefined;
+			},
+			set: function( elem, value, name ) {
+				var propName;
+				if ( value === false ) {
+					// Remove boolean attributes when set to false
+					jQuery.removeAttr( elem, name );
+				} else {
+					// value is true since we know at this point it's type boolean and not false
+					// Set boolean attributes to the same name and set the DOM property
+					propName = jQuery.propFix[ name ] || name;
+					if ( propName in elem ) {
+						// Only set the IDL specifically if it already exists on the element
+						elem[ propName ] = true;
+					}
+
+					elem.setAttribute( name, name.toLowerCase() );
+				}
+				return name;
+			}
+		};
+
+		// Warn only for attributes that can remain distinct from their properties post-1.9
+		if ( ruseDefault.test( lowerName ) ) {
+			migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
+		}
+	}
+
+	return oldAttr.call( jQuery, elem, name, value );
+};
+
+// attrHooks: value
+jQuery.attrHooks.value = {
+	get: function( elem, name ) {
+		var nodeName = ( elem.nodeName || "" ).toLowerCase();
+		if ( nodeName === "button" ) {
+			return valueAttrGet.apply( this, arguments );
+		}
+		if ( nodeName !== "input" && nodeName !== "option" ) {
+			migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+		}
+		return name in elem ?
+			elem.value :
+			null;
+	},
+	set: function( elem, value ) {
+		var nodeName = ( elem.nodeName || "" ).toLowerCase();
+		if ( nodeName === "button" ) {
+			return valueAttrSet.apply( this, arguments );
+		}
+		if ( nodeName !== "input" && nodeName !== "option" ) {
+			migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+		}
+		// Does not return so that setAttribute is also used
+		elem.value = value;
+	}
+};
+
+
+var matched, browser,
+	oldInit = jQuery.fn.init,
+	oldParseJSON = jQuery.parseJSON,
+	// Note this does NOT include the #9521 XSS fix from 1.7!
+	rquickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;
+
+// $(html) "looks like html" rule change
+jQuery.fn.init = function( selector, context, rootjQuery ) {
+	var match;
+
+	if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
+			(match = rquickExpr.exec( selector )) && match[1] ) {
+		// This is an HTML string according to the "old" rules; is it still?
+		if ( selector.charAt( 0 ) !== "<" ) {
+			migrateWarn("$(html) HTML strings must start with '<' character");
+		}
+		// Now process using loose rules; let pre-1.8 play too
+		if ( context && context.context ) {
+			// jQuery object as context; parseHTML expects a DOM object
+			context = context.context;
+		}
+		if ( jQuery.parseHTML ) {
+			return oldInit.call( this, jQuery.parseHTML( jQuery.trim(selector), context, true ),
+					context, rootjQuery );
+		}
+	}
+	return oldInit.apply( this, arguments );
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+// Let $.parseJSON(falsy_value) return null
+jQuery.parseJSON = function( json ) {
+	if ( !json && json !== null ) {
+		migrateWarn("jQuery.parseJSON requires a valid JSON string");
+		return null;
+	}
+	return oldParseJSON.apply( this, arguments );
+};
+
+jQuery.uaMatch = function( ua ) {
+	ua = ua.toLowerCase();
+
+	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+		/(msie) ([\w.]+)/.exec( ua ) ||
+		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+		[];
+
+	return {
+		browser: match[ 1 ] || "",
+		version: match[ 2 ] || "0"
+	};
+};
+
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
+
+if ( matched.browser ) {
+	browser[ matched.browser ] = true;
+	browser.version = matched.version;
+}
+
+// Chrome is Webkit, but Webkit is also Safari.
+if ( browser.chrome ) {
+	browser.webkit = true;
+} else if ( browser.webkit ) {
+	browser.safari = true;
+}
+
+jQuery.browser = browser;
+
+// Warn if the code tries to get jQuery.browser
+migrateWarnProp( jQuery, "browser", browser, "jQuery.browser is deprecated" );
+
+jQuery.sub = function() {
+	function jQuerySub( selector, context ) {
+		return new jQuerySub.fn.init( selector, context );
+	}
+	jQuery.extend( true, jQuerySub, this );
+	jQuerySub.superclass = this;
+	jQuerySub.fn = jQuerySub.prototype = this();
+	jQuerySub.fn.constructor = jQuerySub;
+	jQuerySub.sub = this.sub;
+	jQuerySub.fn.init = function init( selector, context ) {
+		if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+			context = jQuerySub( context );
+		}
+
+		return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+	};
+	jQuerySub.fn.init.prototype = jQuerySub.fn;
+	var rootjQuerySub = jQuerySub(document);
+	migrateWarn( "jQuery.sub() is deprecated" );
+	return jQuerySub;
+};
+
+
+var oldFnData = jQuery.fn.data;
+
+jQuery.fn.data = function( name ) {
+	var ret, evt,
+		elem = this[0];
+
+	// Handles 1.7 which has this behavior and 1.8 which doesn't
+	if ( elem && name === "events" && arguments.length === 1 ) {
+		ret = jQuery.data( elem, name );
+		evt = jQuery._data( elem, name );
+		if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
+			migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+			return evt;
+		}
+	}
+	return oldFnData.apply( this, arguments );
+};
+
+
+var rscriptType = /\/(java|ecma)script/i,
+	oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
+
+jQuery.fn.andSelf = function() {
+	migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+	return oldSelf.apply( this, arguments );
+};
+
+// Since jQuery.clean is used internally on older versions, we only shim if it's missing
+if ( !jQuery.clean ) {
+	jQuery.clean = function( elems, context, fragment, scripts ) {
+		// Set context per 1.8 logic
+		context = context || document;
+		context = !context.nodeType && context[0] || context;
+		context = context.ownerDocument || context;
+
+		migrateWarn("jQuery.clean() is deprecated");
+
+		var i, elem, handleScript, jsTags,
+			ret = [];
+
+		jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
+
+		// Complex logic lifted directly from jQuery 1.8
+		if ( fragment ) {
+			// Special handling of each script element
+			handleScript = function( elem ) {
+				// Check if we consider it executable
+				if ( !elem.type || rscriptType.test( elem.type ) ) {
+					// Detach the script and store it in the scripts array (if provided) or the fragment
+					// Return truthy to indicate that it has been handled
+					return scripts ?
+						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+						fragment.appendChild( elem );
+				}
+			};
+
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				// Check if we're done after handling an executable script
+				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+					// Append to fragment and handle embedded scripts
+					fragment.appendChild( elem );
+					if ( typeof elem.getElementsByTagName !== "undefined" ) {
+						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+						// Splice the scripts into ret after their former ancestor and advance our index beyond them
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+						i += jsTags.length;
+					}
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var eventAdd = jQuery.event.add,
+	eventRemove = jQuery.event.remove,
+	eventTrigger = jQuery.event.trigger,
+	oldToggle = jQuery.fn.toggle,
+	oldLive = jQuery.fn.live,
+	oldDie = jQuery.fn.die,
+	ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
+	rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
+	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+	hoverHack = function( events ) {
+		if ( typeof( events ) != "string" || jQuery.event.special.hover ) {
+			return events;
+		}
+		if ( rhoverHack.test( events ) ) {
+			migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+		}
+		return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+// Event props removed in 1.9, put them back if needed; no practical way to warn them
+if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
+	jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
+}
+
+// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
+if ( jQuery.event.dispatch ) {
+	migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+}
+
+// Support for 'hover' pseudo-event and ajax event warnings
+jQuery.event.add = function( elem, types, handler, data, selector ){
+	if ( elem !== document && rajaxEvent.test( types ) ) {
+		migrateWarn( "AJAX events should be attached to document: " + types );
+	}
+	eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
+};
+jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
+	eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
+};
+
+jQuery.fn.error = function() {
+	var args = Array.prototype.slice.call( arguments, 0);
+	migrateWarn("jQuery.fn.error() is deprecated");
+	args.splice( 0, 0, "error" );
+	if ( arguments.length ) {
+		return this.bind.apply( this, args );
+	}
+	// error event should not bubble to window, although it does pre-1.7
+	this.triggerHandler.apply( this, args );
+	return this;
+};
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+	// Don't mess with animation or css toggles
+	if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+		return oldToggle.apply( this, arguments );
+	}
+	migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+
+	// Save reference to arguments for access in closure
+	var args = arguments,
+		guid = fn.guid || jQuery.guid++,
+		i = 0,
+		toggler = function( event ) {
+			// Figure out which function to execute
+			var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+			jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+			// Make sure that clicks stop
+			event.preventDefault();
+
+			// and execute the function
+			return args[ lastToggle ].apply( this, arguments ) || false;
+		};
+
+	// link all the functions, so any of them can unbind this click handler
+	toggler.guid = guid;
+	while ( i < args.length ) {
+		args[ i++ ].guid = guid;
+	}
+
+	return this.click( toggler );
+};
+
+jQuery.fn.live = function( types, data, fn ) {
+	migrateWarn("jQuery.fn.live() is deprecated");
+	if ( oldLive ) {
+		return oldLive.apply( this, arguments );
+	}
+	jQuery( this.context ).on( types, this.selector, data, fn );
+	return this;
+};
+
+jQuery.fn.die = function( types, fn ) {
+	migrateWarn("jQuery.fn.die() is deprecated");
+	if ( oldDie ) {
+		return oldDie.apply( this, arguments );
+	}
+	jQuery( this.context ).off( types, this.selector || "**", fn );
+	return this;
+};
+
+// Turn global events into document-triggered events
+jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
+	if ( !elem & !rajaxEvent.test( event ) ) {
+		migrateWarn( "Global events are undocumented and deprecated" );
+	}
+	return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
+};
+jQuery.each( ajaxEvents.split("|"),
+	function( _, name ) {
+		jQuery.event.special[ name ] = {
+			setup: function() {
+				var elem = this;
+
+				// The document needs no shimming; must be !== for oldIE
+				if ( elem !== document ) {
+					jQuery.event.add( document, name + "." + jQuery.guid, function() {
+						jQuery.event.trigger( name, null, elem, true );
+					});
+					jQuery._data( this, name, jQuery.guid++ );
+				}
+				return false;
+			},
+			teardown: function() {
+				if ( this !== document ) {
+					jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
+				}
+				return false;
+			}
+		};
+	}
+);
+
+
+})( jQuery, window );
\ No newline at end of file
diff --git a/static/demo/components/jquery/jquery-migrate.min.js b/static/demo/components/jquery/jquery-migrate.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..b11c91e0fc009afa72ca05c6d132a344cb63f592
--- /dev/null
+++ b/static/demo/components/jquery/jquery-migrate.min.js
@@ -0,0 +1,3 @@
+/*! jQuery Migrate v1.1.0 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */
+jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){"use strict";function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i={},s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i,"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,i){var u=a.toLowerCase(),c=t&&t.nodeType;return i&&4>s.length&&(r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(c)&&e.isFunction(e.fn[a]))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[u]&&p.test(u)&&(e.attrHooks[u]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(u)&&r("jQuery.fn.attr('"+u+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h,a(e,"browser",h,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t};var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,T=e.fn.die,M="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",S=RegExp("\\b(?:"+M+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&S.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),T?T.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return!n&!S.test(e)&&r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(M.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window);
+//@ sourceMappingURL=dist/jquery-migrate.min.map
\ No newline at end of file
diff --git a/static/demo/components/jquery/jquery.js b/static/demo/components/jquery/jquery.js
new file mode 100644
index 0000000000000000000000000000000000000000..86a330515eede7c169280718decc9de4ddb494fb
--- /dev/null
+++ b/static/demo/components/jquery/jquery.js
@@ -0,0 +1,9597 @@
+/*!
+ * jQuery JavaScript Library v1.9.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-2-4
+ */
+(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
+	// The deferred used on DOM ready
+	readyList,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// Support: IE<9
+	// For `typeof node.method` instead of `node.method !== undefined`
+	core_strundefined = typeof undefined,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	document = window.document,
+	location = window.location,
+
+	// 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 = "1.9.1",
+
+	// 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,
+
+	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/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 = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
+
+	// 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
+	completed = function( event ) {
+
+		// readyState === "complete" is good enough for us to call the dom ready in oldIE
+		if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+			detach();
+			jQuery.ready();
+		}
+	},
+	// Clean-up method for dom ready events
+	detach = function() {
+		if ( document.addEventListener ) {
+			document.removeEventListener( "DOMContentLoaded", completed, false );
+			window.removeEventListener( "load", completed, false );
+
+		} else {
+			document.detachEvent( "onreadystatechange", completed );
+			window.detachEvent( "onload", completed );
+		}
+	};
+
+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 ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we 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,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	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 src, copyIsArray, copy, name, options, 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({
+	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;
+		}
+
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( !document.body ) {
+			return setTimeout( jQuery.ready );
+		}
+
+		// 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 || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	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 );
+		}
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ core_toString.call(obj) ] || "object" :
+			typeof obj;
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!core_hasOwn.call(obj, "constructor") &&
+				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || core_hasOwn.call( obj, key );
+	},
+
+	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: function( data ) {
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		if ( data === null ) {
+			return data;
+		}
+
+		if ( typeof data === "string" ) {
+
+			// Make sure leading/trailing whitespace is removed (IE can't handle it)
+			data = jQuery.trim( data );
+
+			if ( data ) {
+				// Make sure the incoming data is actual JSON
+				// Logic borrowed from http://json.org/json2.js
+				if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+					.replace( rvalidtokens, "]" )
+					.replace( rvalidbraces, "")) ) {
+
+					return ( new Function( "return " + data ) )();
+				}
+			}
+		}
+
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && jQuery.trim( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// 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;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+		function( text ) {
+			return text == null ?
+				"" :
+				core_trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				( text + "" ).replace( rtrim, "" );
+		},
+
+	// 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 ) {
+		var len;
+
+		if ( arr ) {
+			if ( core_indexOf ) {
+				return core_indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	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 args, proxy, tmp;
+
+		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: function() {
+		return ( new Date() ).getTime();
+	}
+});
+
+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 );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", completed, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", completed, false );
+
+		// If IE event model is used
+		} else {
+			// Ensure firing before onload, maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", completed );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", completed );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch(e) {}
+
+			if ( top && top.doScroll ) {
+				(function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll("left");
+						} catch(e) {
+							return setTimeout( doScrollCheck, 50 );
+						}
+
+						// detach all dom ready events
+						detach();
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	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);
+// 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 // Flag to know if list is currently firing
+		firing,
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// 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 = [];
+				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 ) {
+				args = args || [];
+				args = [ context, args.slice ? args.slice() : args ];
+				if ( list && ( !fired || stack ) ) {
+					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() {
+
+	var support, all, a,
+		input, select, fragment,
+		opt, eventName, isSupported, i,
+		div = document.createElement("div");
+
+	// Setup
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	// Support tests won't run in some limited or non-browser environments
+	all = div.getElementsByTagName("*");
+	a = div.getElementsByTagName("a")[ 0 ];
+	if ( !all || !a || !all.length ) {
+		return {};
+	}
+
+	// First batch of tests
+	select = document.createElement("select");
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName("input")[ 0 ];
+
+	a.style.cssText = "top:1px;float:left;opacity:.5";
+	support = {
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: div.firstChild.nodeType === 3,
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: a.getAttribute("href") === "/a",
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.5/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+		checkOn: !!input.value,
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Tests for enctype support on a form (#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+		boxModel: document.compatMode === "CSS1Compat",
+
+		// Will be defined later
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		boxSizingReliable: true,
+		pixelPosition: false
+	};
+
+	// Make sure checked status is properly cloned
+	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;
+
+	// Support: IE<9
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	// Check if we can trust getAttribute("value")
+	input = document.createElement("input");
+	input.setAttribute( "value", "" );
+	support.input = input.getAttribute( "value" ) === "";
+
+	// Check if an input maintains its value after becoming a radio
+	input.value = "t";
+	input.setAttribute( "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 = document.createDocumentFragment();
+	fragment.appendChild( input );
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE<9
+	// Opera does not clone events (and typeof div.attachEvent === undefined).
+	// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+	if ( div.attachEvent ) {
+		div.attachEvent( "onclick", function() {
+			support.noCloneEvent = false;
+		});
+
+		div.cloneNode( true ).click();
+	}
+
+	// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
+	for ( i in { submit: true, change: true, focusin: true }) {
+		div.setAttribute( eventName = "on" + i, "t" );
+
+		support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+	}
+
+	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, tds,
+			divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-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";
+
+		body.appendChild( container ).appendChild( div );
+
+		// Support: IE8
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName("td");
+		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Support: IE8
+		// Check if empty table cells still have offsetWidth/Height
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check box-sizing and margin behavior
+		div.innerHTML = "";
+		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+		support.boxSizing = ( div.offsetWidth === 4 );
+		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+		// 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";
+
+			// Check if div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container. (#3333)
+			// Fails in WebKit before Feb 2011 nightlies
+			// 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 );
+		}
+
+		if ( typeof div.style.zoom !== core_strundefined ) {
+			// Support: IE<8
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			div.innerHTML = "";
+			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Support: IE6
+			// Check if elements with layout shrink-wrap their children
+			div.style.display = "block";
+			div.innerHTML = "<div></div>";
+			div.firstChild.style.width = "5px";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+			if ( support.inlineBlockNeedsLayout ) {
+				// Prevent IE 6 from affecting layout for positioned elements #11048
+				// Prevent IE from shrinking the body in IE 7 mode #12869
+				// Support: IE<8
+				body.style.zoom = 1;
+			}
+		}
+
+		body.removeChild( container );
+
+		// Null elements to avoid leaks in IE
+		container = div = tds = marginDiv = null;
+	});
+
+	// Null elements to avoid leaks in IE
+	all = select = fragment = opt = a = input = null;
+
+	return support;
+})();
+
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+	if ( !jQuery.acceptData( elem ) ) {
+		return;
+	}
+
+	var thisCache, ret,
+		internalKey = jQuery.expando,
+		getByName = typeof name === "string",
+
+		// We have to handle DOM nodes and JS objects differently because IE6-7
+		// can't GC object references properly across the DOM-JS boundary
+		isNode = elem.nodeType,
+
+		// Only DOM nodes need the global jQuery cache; JS object data is
+		// attached directly to the object so GC can occur automatically
+		cache = isNode ? jQuery.cache : elem,
+
+		// Only defining an ID for JS objects if its cache already exists allows
+		// the code to shortcut on the same path as a DOM node with no cache
+		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+	// Avoid doing any more work than we need to when trying to get data on an
+	// object that has no data at all
+	if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+		return;
+	}
+
+	if ( !id ) {
+		// Only DOM nodes need a new unique ID for each element since their data
+		// ends up in the global cache
+		if ( isNode ) {
+			elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
+		} else {
+			id = internalKey;
+		}
+	}
+
+	if ( !cache[ id ] ) {
+		cache[ id ] = {};
+
+		// Avoids exposing jQuery metadata on plain JS objects when the object
+		// is serialized using JSON.stringify
+		if ( !isNode ) {
+			cache[ id ].toJSON = jQuery.noop;
+		}
+	}
+
+	// An object can be passed to jQuery.data instead of a key/value pair; this gets
+	// shallow copied over onto the existing cache
+	if ( typeof name === "object" || typeof name === "function" ) {
+		if ( pvt ) {
+			cache[ id ] = jQuery.extend( cache[ id ], name );
+		} else {
+			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+		}
+	}
+
+	thisCache = cache[ id ];
+
+	// jQuery data() is stored in a separate object inside the object's internal data
+	// cache in order to avoid key collisions between internal data and user-defined
+	// data.
+	if ( !pvt ) {
+		if ( !thisCache.data ) {
+			thisCache.data = {};
+		}
+
+		thisCache = thisCache.data;
+	}
+
+	if ( data !== undefined ) {
+		thisCache[ jQuery.camelCase( name ) ] = data;
+	}
+
+	// Check for both converted-to-camel and non-converted data property names
+	// If a data property was specified
+	if ( getByName ) {
+
+		// First Try to find as-is property data
+		ret = thisCache[ name ];
+
+		// Test for null|undefined property data
+		if ( ret == null ) {
+
+			// Try to find the camelCased property
+			ret = thisCache[ jQuery.camelCase( name ) ];
+		}
+	} else {
+		ret = thisCache;
+	}
+
+	return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+	if ( !jQuery.acceptData( elem ) ) {
+		return;
+	}
+
+	var i, l, thisCache,
+		isNode = elem.nodeType,
+
+		// See jQuery.data for more information
+		cache = isNode ? jQuery.cache : elem,
+		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+	// If there is already no cache entry for this object, there is no
+	// purpose in continuing
+	if ( !cache[ id ] ) {
+		return;
+	}
+
+	if ( name ) {
+
+		thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+		if ( thisCache ) {
+
+			// Support array or space separated string names for data keys
+			if ( !jQuery.isArray( name ) ) {
+
+				// try the string as a key before any manipulation
+				if ( name in thisCache ) {
+					name = [ name ];
+				} else {
+
+					// split the camel cased version by spaces unless a key with the spaces exists
+					name = jQuery.camelCase( name );
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+						name = name.split(" ");
+					}
+				}
+			} else {
+				// 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 = name.concat( jQuery.map( name, jQuery.camelCase ) );
+			}
+
+			for ( i = 0, l = name.length; i < l; i++ ) {
+				delete thisCache[ name[i] ];
+			}
+
+			// If there is no data left in the cache, we want to continue
+			// and let the cache object itself get destroyed
+			if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+				return;
+			}
+		}
+	}
+
+	// See jQuery.data for more information
+	if ( !pvt ) {
+		delete cache[ id ].data;
+
+		// Don't destroy the parent cache unless the internal data object
+		// had been the only thing left in it
+		if ( !isEmptyDataObject( cache[ id ] ) ) {
+			return;
+		}
+	}
+
+	// Destroy the cache
+	if ( isNode ) {
+		jQuery.cleanData( [ elem ], true );
+
+	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+	} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+		delete cache[ id ];
+
+	// When all else fails, null
+	} else {
+		cache[ id ] = null;
+	}
+}
+
+jQuery.extend({
+	cache: {},
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return internalData( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		return internalRemoveData( elem, name );
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return internalData( elem, name, data, true );
+	},
+
+	_removeData: function( elem, name ) {
+		return internalRemoveData( elem, name, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		// Do not set data on non-element because it will not be cleared (#8335).
+		if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+			return false;
+		}
+
+		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+		// nodes accept data unless otherwise specified; rejection can be conditional
+		return !noData || noData !== true && elem.getAttribute("classid") === noData;
+	}
+});
+
+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 = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attrs = elem.attributes;
+					for ( ; i < attrs.length; i++ ) {
+						name = attrs[i].name;
+
+						if ( !name.indexOf( "data-" ) ) {
+							name = jQuery.camelCase( name.slice(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				// Try to fetch any internally stored data first
+				return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+			}
+
+			this.each(function() {
+				jQuery.data( this, key, value );
+			});
+		}, null, value, arguments.length > 1, null, true );
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var 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 ) ? jQuery.parseJSON( data ) :
+						data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray(data) ) {
+					queue = jQuery._data( 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--;
+		}
+
+		hooks.cur = fn;
+		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 jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				jQuery._removeData( elem, type + "queue" );
+				jQuery._removeData( elem, 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 = jQuery._data( 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]/g,
+	rreturn = /\r/g,
+	rfocusable = /^(?:input|select|textarea|button|object)$/i,
+	rclickable = /^(?:a|area)$/i,
+	rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
+	ruseDefault = /^(?:checked|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	getSetInput = jQuery.support.input;
+
+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 ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	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,
+			isBool = typeof stateVal === "boolean";
+
+		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 ),
+					state = stateVal,
+					classNames = value.match( core_rnotwhite ) || [];
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space separated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			// Toggle whole class name
+			} else if ( type === core_strundefined || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( 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 ? "" : jQuery._data( 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 ret, hooks, 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,
+				self = jQuery(this);
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.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 ];
+
+					// oldIE 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 values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attr: function( elem, name, value ) {
+		var hooks, notxml, 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 );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+
+			} else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, value + "" );
+				return value;
+			}
+
+		} else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			// In IE9+, Flash objects don't have .getAttribute (#12945)
+			// Support: IE9+
+			if ( typeof elem.getAttribute !== core_strundefined ) {
+				ret =  elem.getAttribute( 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 ( rboolean.test( name ) ) {
+					// Set corresponding property to false for boolean attributes
+					// Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
+					if ( !getSetAttribute && ruseDefault.test( name ) ) {
+						elem[ jQuery.camelCase( "default-" + name ) ] =
+							elem[ propName ] = false;
+					} else {
+						elem[ propName ] = false;
+					}
+
+				// See #9699 for explanation of this approach (setting first, then removal)
+				} else {
+					jQuery.attr( elem, name, "" );
+				}
+
+				elem.removeAttribute( getSetAttribute ? name : propName );
+			}
+		}
+	},
+
+	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: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	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 ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		var
+			// Use .prop to determine if this attribute is understood as boolean
+			prop = jQuery.prop( elem, name ),
+
+			// Fetch it accordingly
+			attr = typeof prop === "boolean" && elem.getAttribute( name ),
+			detail = typeof prop === "boolean" ?
+
+				getSetInput && getSetAttribute ?
+					attr != null :
+					// oldIE fabricates an empty string for missing boolean attributes
+					// and conflates checked/selected into attroperties
+					ruseDefault.test( name ) ?
+						elem[ jQuery.camelCase( "default-" + name ) ] :
+						!!attr :
+
+				// fetch an attribute node for properties not recognized as boolean
+				elem.getAttributeNode( name );
+
+		return detail && detail.value !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+			// IE<8 needs the *property* name
+			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+		// Use defaultChecked and defaultSelected for oldIE
+		} else {
+			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+		}
+
+		return name;
+	}
+};
+
+// fix oldIE value attroperty
+if ( !getSetInput || !getSetAttribute ) {
+	jQuery.attrHooks.value = {
+		get: function( elem, name ) {
+			var ret = elem.getAttributeNode( name );
+			return jQuery.nodeName( elem, "input" ) ?
+
+				// Ignore the value *property* by using defaultValue
+				elem.defaultValue :
+
+				ret && ret.specified ? ret.value : undefined;
+		},
+		set: function( elem, value, name ) {
+			if ( jQuery.nodeName( elem, "input" ) ) {
+				// Does not return so that setAttribute is also used
+				elem.defaultValue = value;
+			} else {
+				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
+				return nodeHook && nodeHook.set( elem, value, name );
+			}
+		}
+	};
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret = elem.getAttributeNode( name );
+			return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
+				ret.value :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				elem.setAttributeNode(
+					(ret = elem.ownerDocument.createAttribute( name ))
+				);
+			}
+
+			ret.value = value += "";
+
+			// Break association with cloned elements by also using setAttribute (#9646)
+			return name === "value" || value === elem.getAttribute( name ) ?
+				value :
+				undefined;
+		}
+	};
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			nodeHook.set( elem, value === "" ? false : value, name );
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+}
+
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret == null ? undefined : ret;
+			}
+		});
+	});
+
+	// href/src property should get the full normalized URL (#10299/#12915)
+	jQuery.each([ "href", "src" ], function( i, name ) {
+		jQuery.propHooks[ name ] = {
+			get: function( elem ) {
+				return elem.getAttribute( name, 4 );
+			}
+		};
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Note: IE uppercases css property names, but if we were to .toLowerCase()
+			// .cssText, that would destroy case senstitivity in URL's, like in "background"
+			return elem.style.cssText || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = value + "" );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+var rformElems = /^(?:input|select|textarea)$/i,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+/*
+ * 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 tmp, events, t, handleObjIn,
+			special, eventHandle, handleObj,
+			handlers, type, namespaces, origType,
+			elemData = jQuery._data( 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
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = ( types || "" ).match( core_rnotwhite ) || [""];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tmp[1];
+			namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+			// 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/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			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, handleObj, tmp,
+			origCount, t, events,
+			special, handlers, type,
+			namespaces, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( 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;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery._removeData( elem, "events" );
+		}
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		var handle, ontype, cur,
+			bubbleType, special, tmp, i,
+			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 );
+
+		event.isTrigger = true;
+		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 = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( 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( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && 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;
+					try {
+						elem[ type ]();
+					} catch ( e ) {
+						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
+						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
+					}
+					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, ret, handleObj, matched, j,
+			handlerQueue = [],
+			args = core_slice.call( arguments ),
+			handlers = ( jQuery._data( 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 sel, handleObj, matches, i,
+			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 check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && (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;
+	},
+
+	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: IE<9
+		// Fix target property (#1925)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Support: Chrome 23+, Safari?
+		// Target should not be a text node (#504, #13143)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Support: IE<9
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	// 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 fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var body, eventDoc, doc,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// 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 relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// 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;
+		}
+	},
+
+	special: {
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		click: {
+			// For checkbox, fire native event so checked state will be right
+			trigger: function() {
+				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+					this.click();
+					return false;
+				}
+			}
+		},
+		focus: {
+			// Fire native event if possible so blur/focus sequence is correct
+			trigger: function() {
+				if ( this !== document.activeElement && this.focus ) {
+					try {
+						this.focus();
+						return false;
+					} catch ( e ) {
+						// Support: IE<9
+						// If we error on focus to hidden element (#1486, #12518),
+						// let .trigger() run the handlers
+					}
+				}
+			},
+			delegateType: "focusin"
+		},
+		blur: {
+			trigger: function() {
+				if ( this === document.activeElement && this.blur ) {
+					this.blur();
+					return false;
+				}
+			},
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Even when returnValue equals to undefined Firefox will still show alert
+				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 = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8
+			// detachEvent needed property on element, by name of that event, to properly expose it to GC
+			if ( typeof elem[ name ] === core_strundefined ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, handle );
+		}
+	};
+
+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.returnValue === false ||
+			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 ) {
+			return;
+		}
+
+		// If preventDefault exists, run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// Support: IE
+		// Otherwise set the returnValue property of the original event to false
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+		if ( !e ) {
+			return;
+		}
+		// If stopPropagation exists, run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+
+		// Support: IE
+		// Set the cancelBubble property of the original event to true
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	}
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+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;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "submitBubbles", true );
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "changeBubbles", true );
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+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 type, origFn;
+
+		// 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 );
+		});
+	},
+
+	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 );
+	},
+
+	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 );
+		}
+	}
+});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://sizzlejs.com/
+ */
+(function( window, undefined ) {
+
+var i,
+	cachedruns,
+	Expr,
+	getText,
+	isXML,
+	compile,
+	hasDuplicate,
+	outermostContext,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsXML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+	sortOrder,
+
+	// Instance-specific data
+	expando = "sizzle" + -(new Date()),
+	preferredDoc = window.document,
+	support = {},
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+
+	// General-purpose constants
+	strundefined = typeof undefined,
+	MAX_NEGATIVE = 1 << 31,
+
+	// Array methods
+	arr = [],
+	pop = arr.pop,
+	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;
+	},
+
+
+	// 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
+	operators = "([*^$|!~]?=)",
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:" + operators + 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 + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"NAME": new RegExp( "^\\[name=['\"]?(" + 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" ),
+		// 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" )
+	},
+
+	rsibling = /[\x20\t\r\n\f]*[+~]/,
+
+	rnative = /^[^{]+\{\s*\[native code/,
+
+	// 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,
+	rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
+
+	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
+	funescape = function( _, escaped ) {
+		var high = "0x" + escaped - 0x10000;
+		// NaN means non-codepoint
+		return high !== high ?
+			escaped :
+			// BMP codepoint
+			high < 0 ?
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	};
+
+// Use a stripped-down slice if we can't use a native one
+try {
+	slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;
+} catch ( e ) {
+	slice = function( i ) {
+		var elem,
+			results = [];
+		while ( (elem = this[i++]) ) {
+			results.push( elem );
+		}
+		return results;
+	};
+}
+
+/**
+ * For feature detection
+ * @param {Function} fn The function to test for native support
+ */
+function isNative( fn ) {
+	return rnative.test( fn + "" );
+}
+
+/**
+ * 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 cache,
+		keys = [];
+
+	return (cache = function( 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);
+	});
+}
+
+/**
+ * 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 {
+		// release memory in IE
+		div = null;
+	}
+}
+
+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 ( !documentIsXML && !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, slice.call(context.getElementsByTagName( selector ), 0) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {
+				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
+				return results;
+			}
+		}
+
+		// QSA path
+		if ( support.qsa && !rbuggyQSA.test(selector) ) {
+			old = true;
+			nid = 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, slice.call( newContext.querySelectorAll(
+						newSelector
+					), 0 ) );
+					return results;
+				} catch(qsaError) {
+				} finally {
+					if ( !old ) {
+						context.removeAttribute("id");
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * 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;
+};
+
+/**
+ * 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;
+
+	// 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
+	documentIsXML = isXML( doc );
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.tagNameNoComments = assert(function( div ) {
+		div.appendChild( doc.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	});
+
+	// Check if attributes should be retrieved by attribute nodes
+	support.attributes = assert(function( div ) {
+		div.innerHTML = "<select></select>";
+		var type = typeof div.lastChild.getAttribute("multiple");
+		// IE8 returns a string for some attributes even when not present
+		return type !== "boolean" && type !== "string";
+	});
+
+	// Check if getElementsByClassName can be trusted
+	support.getByClassName = assert(function( div ) {
+		// Opera can't find a second classname (in 9.6)
+		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
+		if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
+			return false;
+		}
+
+		// Safari 3.2 caches class attributes and doesn't catch changes
+		div.lastChild.className = "e";
+		return div.getElementsByClassName("e").length === 2;
+	});
+
+	// Check if getElementById returns elements by name
+	// Check if getElementsByName privileges form controls or returns elements by ID
+	support.getByName = assert(function( div ) {
+		// Inject content
+		div.id = expando + 0;
+		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
+		docElem.insertBefore( div, docElem.firstChild );
+
+		// Test
+		var pass = doc.getElementsByName &&
+			// buggy browsers will return fewer than the correct 2
+			doc.getElementsByName( expando ).length === 2 +
+			// buggy browsers will return more than the correct 0
+			doc.getElementsByName( expando + 0 ).length;
+		support.getIdNotName = !doc.getElementById( expando );
+
+		// Cleanup
+		docElem.removeChild( div );
+
+		return pass;
+	});
+
+	// IE6/7 return modified attributes
+	Expr.attrHandle = assert(function( div ) {
+		div.innerHTML = "<a href='#'></a>";
+		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
+			div.firstChild.getAttribute("href") === "#";
+	}) ?
+		{} :
+		{
+			"href": function( elem ) {
+				return elem.getAttribute( "href", 2 );
+			},
+			"type": function( elem ) {
+				return elem.getAttribute("type");
+			}
+		};
+
+	// ID find and filter
+	if ( support.getIdNotName ) {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
+				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 {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
+				var m = context.getElementById( id );
+
+				return m ?
+					m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+		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.tagNameNoComments ?
+		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;
+		};
+
+	// Name
+	Expr.find["NAME"] = support.getByName && function( tag, context ) {
+		if ( typeof context.getElementsByName !== strundefined ) {
+			return context.getElementsByName( name );
+		}
+	};
+
+	// Class
+	Expr.find["CLASS"] = support.getByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21),
+	// no need to also add to buggyMatches since matches checks buggyQSA
+	// A support test would require too much code (would include document ready)
+	rbuggyQSA = [ ":focus" ];
+
+	if ( (support.qsa = isNative(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 explictly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// IE8 - Some boolean attributes are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
+			}
+
+			// 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 ) {
+
+			// Opera 10-12/IE8 - ^= $= *= and empty values
+			// Should not select anything
+			div.innerHTML = "<input type='hidden' i=''/>";
+			if ( div.querySelectorAll("[i^='']").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 = isNative( (matches = docElem.matchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.webkitMatchesSelector ||
+		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 = new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
+
+	// Element contains another
+	// Purposefully does not implement inclusive descendent
+	// As in, an element does not contain itself
+	contains = isNative(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;
+		};
+
+	// Document order sorting
+	sortOrder = docElem.compareDocumentPosition ?
+	function( a, b ) {
+		var compare;
+
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {
+			if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {
+				if ( a === doc || contains( preferredDoc, a ) ) {
+					return -1;
+				}
+				if ( b === doc || contains( preferredDoc, b ) ) {
+					return 1;
+				}
+				return 0;
+			}
+			return compare & 4 ? -1 : 1;
+		}
+
+		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 :
+				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;
+	};
+
+	// Always assume the presence of duplicates if sort doesn't
+	// pass them to our comparison function (as in Google Chrome).
+	hasDuplicate = false;
+	[0, 0].sort( sortOrder );
+	support.detectDuplicates = hasDuplicate;
+
+	return document;
+};
+
+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']" );
+
+	// rbuggyQSA always contains :focus, so no need for an existence check
+	if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !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 ) {
+	var val;
+
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	if ( !documentIsXML ) {
+		name = name.toLowerCase();
+	}
+	if ( (val = Expr.attrHandle[ name ]) ) {
+		return val( elem );
+	}
+	if ( documentIsXML || support.attributes ) {
+		return elem.getAttribute( name );
+	}
+	return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?
+		name :
+		val && val.specified ? val.value : null;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+// Document sorting and removing duplicates
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		i = 1,
+		j = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		for ( ; (elem = results[i]); i++ ) {
+			if ( elem === results[ i - 1 ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	return results;
+};
+
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && ( ~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
+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
+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
+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]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * 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,
+
+	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[4] ) {
+				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( nodeName ) {
+			if ( nodeName === "*" ) {
+				return function() { return true; };
+			}
+
+			nodeName = nodeName.replace( runescape, funescape ).toLowerCase();
+			return 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( 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 identifider
+			if ( !ridentifier.test(lang || "") ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( (elemLang = documentIsXML ?
+						elem.getAttribute("xml:lang") || elem.getAttribute("lang") :
+						elem.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;
+		})
+	}
+};
+
+// 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 );
+}
+
+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( tokens.slice( 0, i - 1 ) ).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" &&
+					context.nodeType === 9 && !documentIsXML &&
+					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, slice.call( seed, 0 ) );
+							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,
+		documentIsXML,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+// Deprecated
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Easy API for creating new setFilters
+function setFilters() {}
+Expr.filters = setFilters.prototype = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+// Initialize with the default document
+setDocument();
+
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+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 );
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	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,
+			len = this.length;
+
+		if ( typeof selector !== "string" ) {
+			self = this;
+			return this.pushStack( jQuery( selector ).filter(function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			}) );
+		}
+
+		ret = [];
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, this[ 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;
+		return ret;
+	},
+
+	has: function( target ) {
+		var i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter(function() {
+			for ( i = 0; i < len; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false) );
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true) );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// 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".
+				rneedsContext.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			ret = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+				}
+				cur = cur.parentNode;
+			}
+		}
+
+		return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
+	},
+
+	// 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 jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	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)
+		);
+	}
+});
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && 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 jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( this.length > 1 && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+		safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	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 = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		area: [ 1, "<map>", "</map>" ],
+		param: [ 1, "<object>", "</object>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+		// unless wrapped in a div with non-breaking characters in front of it.
+		_default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+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 );
+	},
+
+	wrapAll: function( html ) {
+		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
+			var 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.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				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();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		return this.domManip( arguments, false, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		});
+	},
+
+	after: function() {
+		return this.domManip( arguments, false, 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,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
+				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++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem, false ) );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+
+			// If this is a select, ensure that it displays empty (#12336)
+			// Support: IE<9
+			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+				elem.options.length = 0;
+			}
+		}
+
+		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 ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						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( value ) {
+		var isFunc = jQuery.isFunction( value );
+
+		// Make sure that the elements are removed from the DOM before they are inserted
+		// this can help fix replacing a parent with child elements
+		if ( !isFunc && typeof value !== "string" ) {
+			value = jQuery( value ).not( this ).detach();
+		}
+
+		return this.domManip( [ value ], true, function( elem ) {
+			var next = this.nextSibling,
+				parent = this.parentNode;
+
+			if ( parent ) {
+				jQuery( this ).remove();
+				parent.insertBefore( elem, next );
+			}
+		});
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+
+		// Flatten any nested arrays
+		args = core_concat.apply( [], args );
+
+		var first, node, hasScripts,
+			scripts, doc, fragment,
+			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, table ? self.html() : undefined );
+				}
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( l ) {
+			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+				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 ) {
+							jQuery.merge( scripts, getAll( node, "script" ) );
+						}
+					}
+
+					callback.call(
+						table && jQuery.nodeName( this[i], "table" ) ?
+							findOrAppend( this[i], "tbody" ) :
+							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 || "" ) &&
+							!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+							if ( node.src ) {
+								// Hope ajax is available...
+								jQuery.ajax({
+									url: node.src,
+									type: "GET",
+									dataType: "script",
+									async: false,
+									global: false,
+									"throws": true
+								});
+							} else {
+								jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+							}
+						}
+					}
+				}
+
+				// Fix #11809: Avoid leaking memory
+				fragment = first = null;
+			}
+		}
+
+		return this;
+	}
+});
+
+function findOrAppend( elem, tag ) {
+	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	var attr = elem.getAttributeNode("type");
+	elem.type = ( attr && attr.specified ) + "/" + 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 elem,
+		i = 0;
+	for ( ; (elem = elems[i]) != null; i++ ) {
+		jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+	}
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function fixCloneNodeIssues( src, dest ) {
+	var nodeName, e, data;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 copies events bound via attachEvent when using cloneNode.
+	if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
+		data = jQuery._data( dest );
+
+		for ( e in data.events ) {
+			jQuery.removeEvent( dest, e, data.handle );
+		}
+
+		// Event data gets referenced instead of copied if the expando gets copied too
+		dest.removeAttribute( jQuery.expando );
+	}
+
+	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+	if ( nodeName === "script" && dest.text !== src.text ) {
+		disableScript( dest ).text = src.text;
+		restoreScript( dest );
+
+	// IE6-10 improperly clones children of object elements using classid.
+	// IE10 throws NoModificationAllowedError if parent is null, #12132.
+	} else if ( nodeName === "object" ) {
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+
+		dest.defaultChecked = dest.checked = src.checked;
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.defaultSelected = dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone(true);
+			jQuery( insert[i] )[ original ]( elems );
+
+			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+			core_push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+function getAll( context, tag ) {
+	var elems, elem,
+		i = 0,
+		found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
+			typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
+			undefined;
+
+	if ( !found ) {
+		for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+			if ( !tag || jQuery.nodeName( elem, tag ) ) {
+				found.push( elem );
+			} else {
+				jQuery.merge( found, getAll( elem, tag ) );
+			}
+		}
+	}
+
+	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+		jQuery.merge( [ context ], found ) :
+		found;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( manipulation_rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var destElements, node, clone, i, srcElements,
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		if ( (!jQuery.support.noCloneEvent || !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 );
+
+			// Fix all IE cloning issues
+			for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					fixCloneNodeIssues( node, 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; (node = srcElements[i]) != null; i++ ) {
+					cloneCopyEvent( node, destElements[i] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		destElements = srcElements = node = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	buildFragment: function( elems, context, scripts, selection ) {
+		var j, elem, contains,
+			tmp, tag, tbody, wrap,
+			l = elems.length,
+
+			// Ensure a safe fragment
+			safe = createSafeFragment( context ),
+
+			nodes = [],
+			i = 0;
+
+		for ( ; i < l; i++ ) {
+			elem = elems[ i ];
+
+			if ( elem || elem === 0 ) {
+
+				// Add nodes directly
+				if ( jQuery.type( elem ) === "object" ) {
+					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 || safe.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;
+					}
+
+					// Manually add leading whitespace removed by IE
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						elem = tag === "table" && !rtbody.test( elem ) ?
+							tmp.firstChild :
+
+							// String was a bare <thead> or <tfoot>
+							wrap[1] === "<table>" && !rtbody.test( elem ) ?
+								tmp :
+								0;
+
+						j = elem && elem.childNodes.length;
+						while ( j-- ) {
+							if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+								elem.removeChild( tbody );
+							}
+						}
+					}
+
+					jQuery.merge( nodes, tmp.childNodes );
+
+					// Fix #12392 for WebKit and IE > 9
+					tmp.textContent = "";
+
+					// Fix #12392 for oldIE
+					while ( tmp.firstChild ) {
+						tmp.removeChild( tmp.firstChild );
+					}
+
+					// Remember the top-level container for proper cleanup
+					tmp = safe.lastChild;
+				}
+			}
+		}
+
+		// Fix #11356: Clear elements from fragment
+		if ( tmp ) {
+			safe.removeChild( tmp );
+		}
+
+		// Reset defaultChecked for any radios and checkboxes
+		// about to be appended to the DOM in IE 6/7 (#8060)
+		if ( !jQuery.support.appendChecked ) {
+			jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+		}
+
+		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( safe.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 );
+					}
+				}
+			}
+		}
+
+		tmp = null;
+
+		return safe;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var elem, type, id, data,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = jQuery.support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( acceptData || jQuery.acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							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 );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// IE does not allow us to delete expando properties from nodes,
+						// nor does it have a removeAttribute function on Document nodes;
+						// we must handle all of these cases
+						if ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( typeof elem.removeAttribute !== core_strundefined ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						core_deletedIds.push( id );
+					}
+				}
+			}
+		}
+	}
+});
+var iframe, getStyles, curCSS,
+	ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity\s*=\s*([^)]*)/,
+	rposition = /^(top|right|bottom|left)$/,
+	// 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 );
+}
+
+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 ] = jQuery._data( 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 ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+
+			if ( !values[ index ] ) {
+				hidden = isHidden( elem );
+
+				if ( display && display !== "none" || !hidden ) {
+					jQuery._data( 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 len, styles,
+				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 ) {
+		var bool = typeof state === "boolean";
+
+		return this.each(function() {
+			if ( bool ? state : 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;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"columnCount": true,
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": 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": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// 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 specifing 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 ) {
+
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} 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 num, val, 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;
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	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;
+	}
+});
+
+// NOTE: we've included the "window" in window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+	getStyles = function( elem ) {
+		return window.getComputedStyle( elem, null );
+	};
+
+	curCSS = function( elem, name, _computed ) {
+		var width, minWidth, maxWidth,
+			computed = _computed || getStyles( elem ),
+
+			// 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 );
+			}
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+			// 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;
+	};
+} else if ( document.documentElement.currentStyle ) {
+	getStyles = function( elem ) {
+		return elem.currentStyle;
+	};
+
+	curCSS = function( elem, name, _computed ) {
+		var left, rs, rsLeft,
+			computed = _computed || getStyles( elem ),
+			ret = computed ? computed[ name ] : undefined,
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		// but not position css attributes, as those are proportional to the parent element instead
+		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rs = elem.runtimeStyle;
+			rsLeft = rs && rs.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				rs.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				rs.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : 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
+			);
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			// if value === "", then remove inline opacity #12685
+			if ( ( value >= 1 || value === "" ) &&
+					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+					style.removeAttribute ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there is no filter style applied in a css rule or unset inline opacity, we are done
+				if ( value === "" || currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// 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.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	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.hover = function( fnOver, fnOut ) {
+	return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+};
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+	ajax_nonce = jQuery.now(),
+
+	ajax_rquery = /\?/,
+	rhash = /#.*$/,
+	rts = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #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 deep, key,
+		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, response, type,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = url.slice( off, url.length );
+		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.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
+		});
+	};
+});
+
+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"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": window.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 // Cross-domain detection vars
+			parts,
+			// Loop variable
+			i,
+			// URL without anti-cache param
+			cacheURL,
+			// Response headers as string
+			responseHeadersString,
+			// timeout handle
+			timeoutTimer,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			transport,
+			// Response headers
+			responseHeaders,
+			// 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 (#5866: IE7 issue with protocol-less urls)
+		// 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;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// 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 ) {
+					isSuccess = true;
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					isSuccess = true;
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					isSuccess = ajaxConvert( s, response );
+					statusText = isSuccess.state;
+					success = isSuccess.data;
+					error = isSuccess.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;
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	}
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+	var firstDataType, ct, finalDataType, type,
+		contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// 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
+function ajaxConvert( s, response ) {
+	var conv2, current, conv, tmp,
+		converters = {},
+		i = 0,
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice(),
+		prev = dataTypes[ 0 ];
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	// Convert to each sequential dataType, tolerating list modification
+	for ( ; (current = dataTypes[++i]); ) {
+
+		// There's only work to do if current dataType is non-auto
+		if ( current !== "*" ) {
+
+			// Convert response if prev dataType is non-auto and differs from current
+			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.splice( i--, 0, current );
+								}
+
+								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 };
+						}
+					}
+				}
+			}
+
+			// Update prev for next iteration
+			prev = 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 global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || jQuery("head")[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement("script");
+
+				script.async = true;
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( script.parentNode ) {
+							script.parentNode.removeChild( script );
+						}
+
+						// Dereference the script
+						script = null;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+
+				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( undefined, true );
+				}
+			}
+		};
+	}
+});
+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";
+	}
+});
+var xhrCallbacks, xhrSupported,
+	xhrId = 0,
+	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject && function() {
+		// Abort all pending requests
+		var key;
+		for ( key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( undefined, true );
+		}
+	};
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject("Microsoft.XMLHTTP");
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+xhrSupported = jQuery.ajaxSettings.xhr();
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = jQuery.support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var handle, i,
+						xhr = s.xhr();
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.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 ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers["X-Requested-With"] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( err ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+						var status, responseHeaders, statusText, responses;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occurred
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									responses = {};
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									if ( typeof xhr.responseText === "string" ) {
+										responses.text = xhr.responseText;
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					if ( !s.async ) {
+						// if we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						setTimeout( callback );
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback( undefined, true );
+					}
+				}
+			};
+		}
+	});
+}
+var fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var end, unit,
+				tween = this.createTween( prop, value ),
+				parts = rfxnum.exec( value ),
+				target = tween.cur(),
+				start = +target || 0,
+				scale = 1,
+				maxIterations = 20;
+
+			if ( parts ) {
+				end = +parts[2];
+				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+				// We need to compute starting value
+				if ( unit !== "px" && start ) {
+					// Iteratively approximate from a nonzero starting point
+					// Prefer the current property, because this process will be trivial if it uses the same units
+					// Fallback to end or a simple constant
+					start = jQuery.css( tween.elem, prop, true ) || end || 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 );
+				}
+
+				tween.unit = unit;
+				tween.start = start;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+			}
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	});
+	return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+	jQuery.each( props, function( prop, value ) {
+		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+			index = 0,
+			length = collection.length;
+		for ( ; index < length; index++ ) {
+			if ( collection[ index ].call( animation, prop, value ) ) {
+
+				// we're done with this property
+				return;
+			}
+		}
+	});
+}
+
+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;
+		}
+	}
+
+	createTweens( animation, props );
+
+	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 value, name, index, easing, 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, index, length,
+		value, dataShow, toggle,
+		tween, hooks, oldfire,
+		anim = this,
+		style = elem.style,
+		orig = {},
+		handled = [],
+		hidden = elem.nodeType && isHidden( elem );
+
+	// 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 IE does 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" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !jQuery.support.shrinkWrapBlocks ) {
+			anim.always(function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			});
+		}
+	}
+
+
+	// show/hide pass
+	for ( index in props ) {
+		value = props[ index ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ index ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+				continue;
+			}
+			handled.push( index );
+		}
+	}
+
+	length = handled.length;
+	if ( length ) {
+		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+		if ( "hidden" in dataShow ) {
+			hidden = dataShow.hidden;
+		}
+
+		// 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;
+			jQuery._removeData( elem, "fxshow" );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( index = 0 ; index < length ; index++ ) {
+			prop = handled[ index ];
+			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+
+			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;
+			}
+		}
+	}
+};
+
+// Remove in 2.0 - this supports IE8's 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 );
+				doAnimation.finish = function() {
+					anim.stop( true );
+				};
+				// Empty animations, or finishing resolves immediately
+				if ( empty || jQuery._data( 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 = jQuery._data( 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 = jQuery._data( 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.cur && hooks.cur.finish ) {
+				hooks.cur.finish.call( this );
+			}
+
+			// 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,
+		box = { top: 0, left: 0 },
+		elem = this[ 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.scrollTop )  - ( docElem.clientTop  || 0 ),
+		left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+	};
+};
+
+jQuery.offset = {
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// 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,
+			parentOffset = { top: 0, left: 0 },
+			elem = this[ 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
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		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 || document.documentElement;
+			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || document.documentElement;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+// 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
+					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+					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() {
+
+// })();
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use 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.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+})( window );
\ No newline at end of file
diff --git a/static/demo/components/jquery/jquery.min.js b/static/demo/components/jquery/jquery.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..006e953102ded2db8e217e4507de3baa8bcc976d
--- /dev/null
+++ b/static/demo/components/jquery/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery.min.map
+*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},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(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
+return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
+}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.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(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,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"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
\ No newline at end of file
diff --git a/static/demo/components/jquery/jquery.min.map b/static/demo/components/jquery/jquery.min.map
new file mode 100644
index 0000000000000000000000000000000000000000..7137d89266eb51d036becebd71cb29e103aa7656
--- /dev/null
+++ b/static/demo/components/jquery/jquery.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"jquery.min.js","sources":["jquery.js"],"names":["window","undefined","readyList","rootjQuery","core_strundefined","document","location","_jQuery","jQuery","_$","$","class2type","core_deletedIds","core_version","core_concat","concat","core_push","push","core_slice","slice","core_indexOf","indexOf","core_toString","toString","core_hasOwn","hasOwnProperty","core_trim","trim","selector","context","fn","init","core_pnum","source","core_rnotwhite","rtrim","rquickExpr","rsingleTag","rvalidchars","rvalidbraces","rvalidescape","rvalidtokens","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","completed","event","addEventListener","type","readyState","detach","ready","removeEventListener","detachEvent","prototype","jquery","constructor","match","elem","this","charAt","length","exec","find","merge","parseHTML","nodeType","ownerDocument","test","isPlainObject","isFunction","attr","getElementById","parentNode","id","makeArray","size","toArray","call","get","num","pushStack","elems","ret","prevObject","each","callback","args","promise","done","apply","arguments","first","eq","last","i","len","j","map","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isArray","noConflict","isReady","readyWait","holdReady","hold","wait","body","setTimeout","resolveWith","trigger","off","obj","Array","isWindow","isNumeric","isNaN","parseFloat","isFinite","String","e","key","isEmptyObject","error","msg","Error","data","keepScripts","parsed","scripts","createElement","buildFragment","remove","childNodes","parseJSON","JSON","parse","replace","Function","parseXML","xml","tmp","DOMParser","parseFromString","ActiveXObject","async","loadXML","documentElement","getElementsByTagName","noop","globalEval","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","arr","results","Object","inArray","Math","max","second","l","grep","inv","retVal","arg","guid","proxy","access","chainable","emptyGet","raw","bulk","now","Date","getTime","Deferred","attachEvent","top","frameElement","doScroll","doScrollCheck","split","optionsCache","createOptions","object","_","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","list","stack","once","fire","stopOnFalse","shift","self","disable","add","start","unique","has","index","empty","disabled","lock","locked","fireWith","func","tuples","state","always","deferred","fail","then","fns","newDefer","tuple","action","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","contexts","values","progressValues","notifyWith","progressContexts","resolveContexts","support","a","input","select","fragment","opt","eventName","isSupported","div","setAttribute","innerHTML","appendChild","style","cssText","getSetAttribute","className","leadingWhitespace","firstChild","tbody","htmlSerialize","getAttribute","hrefNormalized","opacity","cssFloat","checkOn","optSelected","selected","enctype","html5Clone","cloneNode","outerHTML","boxModel","compatMode","deleteExpando","noCloneEvent","inlineBlockNeedsLayout","shrinkWrapBlocks","reliableMarginRight","boxSizingReliable","pixelPosition","checked","noCloneChecked","optDisabled","radioValue","createDocumentFragment","appendChecked","checkClone","lastChild","click","submit","change","focusin","attributes","expando","backgroundClip","clearCloneStyle","container","marginDiv","tds","divReset","offsetHeight","display","reliableHiddenOffsets","boxSizing","offsetWidth","doesNotIncludeMarginInBodyOffset","offsetTop","getComputedStyle","width","marginRight","zoom","removeChild","rbrace","rmultiDash","internalData","pvt","acceptData","thisCache","internalKey","getByName","isNode","cache","pop","toJSON","internalRemoveData","isEmptyDataObject","cleanData","random","noData","embed","applet","hasData","removeData","_data","_removeData","attrs","dataAttr","queue","dequeue","startLength","hooks","_queueHooks","next","cur","unshift","stop","setter","delay","time","fx","speeds","timeout","clearTimeout","clearQueue","count","defer","elements","nodeHook","boolHook","rclass","rreturn","rfocusable","rclickable","rboolean","ruseDefault","getSetInput","removeAttr","prop","removeProp","propFix","addClass","classes","clazz","proceed","removeClass","toggleClass","stateVal","isBool","classNames","hasClass","val","valHooks","set","option","specified","selectedIndex","one","notxml","nType","isXMLDoc","attrHooks","propName","attrNames","removeAttribute","tabindex","readonly","for","class","maxlength","cellspacing","cellpadding","rowspan","colspan","usemap","frameborder","contenteditable","propHooks","tabIndex","attributeNode","getAttributeNode","parseInt","href","detail","defaultValue","button","setAttributeNode","createAttribute","parent","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","global","types","handler","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","needsContext","expr","namespace","join","delegateCount","setup","mappedTypes","origCount","RegExp","teardown","removeEvent","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","result","noBubble","defaultView","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","matched","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","matches","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","filter","original","which","charCode","keyCode","eventDoc","doc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","focus","activeElement","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","orig","related","contains","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","origFn","bind","unbind","delegate","undelegate","triggerHandler","cachedruns","Expr","getText","isXML","compile","hasDuplicate","outermostContext","setDocument","docElem","documentIsXML","rbuggyQSA","rbuggyMatches","sortOrder","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","strundefined","MAX_NEGATIVE","whitespace","characterEncoding","identifier","operators","pseudos","rcomma","rcombinators","rpseudo","ridentifier","matchExpr","ID","CLASS","NAME","TAG","ATTR","PSEUDO","CHILD","rsibling","rnative","rinputs","rheader","rescape","rattributeQuotes","runescape","funescape","escaped","high","fromCharCode","isNative","keys","cacheLength","markFunction","assert","Sizzle","seed","m","groups","old","nid","newContext","newSelector","getByClassName","getElementsByClassName","qsa","tokenize","toSelector","querySelectorAll","qsaError","node","tagNameNoComments","createComment","insertBefore","pass","getElementsByName","getIdNotName","attrHandle","attrId","tag","matchesSelector","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","b","adown","bup","compare","aup","ap","bp","siblingCheck","detectDuplicates","uniqueSort","duplicates","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","pattern","operator","check","what","simple","forward","ofType","outerCache","nodeIndex","useCache","pseudo","setFilters","idx","not","matcher","unmatched","innerText","lang","elemLang","hash","root","hasFocus","enabled","header","even","odd","lt","gt","radio","checkbox","file","password","image","reset","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","dirkey","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","dirrunsUnique","group","token","filters","runtil","rparentsprev","isSimple","rneedsContext","guaranteedUnique","children","contents","prev","targets","winnow","is","closest","pos","prevAll","addBack","andSelf","sibling","parents","parentsUntil","until","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","n","r","qualifier","keep","filtered","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","manipulation_rcheckableType","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","append","createTextNode","wrapAll","html","wrap","wrapInner","unwrap","replaceWith","domManip","prepend","before","after","keepData","getAll","setGlobalEval","dataAndEvents","deepDataAndEvents","isFunc","table","hasScripts","iNoClone","disableScript","findOrAppend","restoreScript","ajax","url","dataType","throws","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultChecked","defaultSelected","appendTo","prependTo","insertAfter","replaceAll","insert","found","fixDefaultChecked","destElements","srcElements","inPage","selection","safe","nodes","iframe","getStyles","curCSS","ralpha","ropacity","rposition","rdisplayswap","rmargin","rnumsplit","rnumnonpx","rrelNum","elemdisplay","BODY","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssExpand","cssPrefixes","vendorPropName","capName","origName","isHidden","el","css","showHide","show","hidden","css_defaultDisplay","styles","hide","toggle","bool","cssHooks","computed","cssNumber","columnCount","fillOpacity","lineHeight","orphans","widows","zIndex","cssProps","float","extra","swap","_computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","setPositiveNumber","subtract","augmentWidthOrHeight","isBorderBox","getWidthOrHeight","valueIsBorderBox","actualDisplay","write","close","$1","visible","margin","padding","border","prefix","suffix","expand","expanded","parts","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","serialize","serializeArray","traditional","s","encodeURIComponent","ajaxSettings","buildParams","v","hover","fnOver","fnOut","ajaxLocParts","ajaxLocation","ajax_nonce","ajax_rquery","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","_load","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","params","response","responseText","complete","status","method","success","active","lastModified","etag","isLocal","processData","contentType","accepts","*","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","mimeType","code","abort","statusText","finalText","crossDomain","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","modified","ajaxHandleResponses","ajaxConvert","rejectWith","getScript","getJSON","firstDataType","ct","finalDataType","conv2","current","conv","dataFilter","script","text script","head","scriptCharset","charset","onload","onreadystatechange","isAbort","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","xhrCallbacks","xhrSupported","xhrId","xhrOnUnloadAbort","createStandardXHR","XMLHttpRequest","createActiveXHR","xhr","cors","username","open","xhrFields","err","firefoxAccessException","unload","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","unit","tween","createTween","scale","maxIterations","createFxNow","createTweens","animation","collection","Animation","properties","stopped","tick","currentTime","startTime","duration","percent","tweens","run","opts","specialEasing","originalProperties","Tween","easing","gotoEnd","propFilter","timer","anim","tweener","prefilter","dataShow","oldfire","handled","unqueued","overflow","overflowX","overflowY","eased","step","cssFn","speed","animate","genFx","fadeTo","to","optall","doAnimation","finish","stopQueue","timers","includeWidth","height","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","linear","p","swing","cos","PI","interval","setInterval","clearInterval","slow","fast","animated","offset","setOffset","win","box","getBoundingClientRect","getWindow","pageYOffset","pageXOffset","curElem","curOffset","curCSSTop","curCSSLeft","calculatePosition","curPosition","curTop","curLeft","using","offsetParent","parentOffset","scrollTo","Height","Width","content","defaultExtra","funcName","define","amd"],"mappings":"CAaA,SAAWA,EAAQC,GAOnB,GAECC,GAGAC,EAIAC,QAA2BH,GAG3BI,EAAWL,EAAOK,SAClBC,EAAWN,EAAOM,SAGlBC,EAAUP,EAAOQ,OAGjBC,EAAKT,EAAOU,EAGZC,KAGAC,KAEAC,EAAe,QAGfC,EAAcF,EAAgBG,OAC9BC,EAAYJ,EAAgBK,KAC5BC,EAAaN,EAAgBO,MAC7BC,EAAeR,EAAgBS,QAC/BC,EAAgBX,EAAWY,SAC3BC,EAAcb,EAAWc,eACzBC,EAAYb,EAAac,KAGzBnB,EAAS,SAAUoB,EAAUC,GAE5B,MAAO,IAAIrB,GAAOsB,GAAGC,KAAMH,EAAUC,EAAS1B,IAI/C6B,EAAY,sCAAsCC,OAGlDC,EAAiB,OAGjBC,EAAQ,qCAKRC,EAAa,mCAGbC,EAAa,6BAGbC,EAAc,gBACdC,EAAe,uBACfC,EAAe,qCACfC,EAAe,kEAGfC,EAAY,QACZC,EAAa,eAGbC,EAAa,SAAUC,EAAKC,GAC3B,MAAOA,GAAOC,eAIfC,EAAY,SAAUC,IAGhB5C,EAAS6C,kBAAmC,SAAfD,EAAME,MAA2C,aAAxB9C,EAAS+C,cACnEC,IACA7C,EAAO8C,UAITD,EAAS,WACHhD,EAAS6C,kBACb7C,EAASkD,oBAAqB,mBAAoBP,GAAW,GAC7DhD,EAAOuD,oBAAqB,OAAQP,GAAW,KAG/C3C,EAASmD,YAAa,qBAAsBR,GAC5ChD,EAAOwD,YAAa,SAAUR,IAIjCxC,GAAOsB,GAAKtB,EAAOiD,WAElBC,OAAQ7C,EAER8C,YAAanD,EACbuB,KAAM,SAAUH,EAAUC,EAAS1B,GAClC,GAAIyD,GAAOC,CAGX,KAAMjC,EACL,MAAOkC,KAIR,IAAyB,gBAAblC,GAAwB,CAUnC,GAPCgC,EAF2B,MAAvBhC,EAASmC,OAAO,IAAyD,MAA3CnC,EAASmC,OAAQnC,EAASoC,OAAS,IAAepC,EAASoC,QAAU,GAE7F,KAAMpC,EAAU,MAGlBQ,EAAW6B,KAAMrC,IAIrBgC,IAAUA,EAAM,IAAO/B,EAqDrB,OAAMA,GAAWA,EAAQ6B,QACtB7B,GAAW1B,GAAa+D,KAAMtC,GAKhCkC,KAAKH,YAAa9B,GAAUqC,KAAMtC,EAxDzC,IAAKgC,EAAM,GAAK,CAWf,GAVA/B,EAAUA,YAAmBrB,GAASqB,EAAQ,GAAKA,EAGnDrB,EAAO2D,MAAOL,KAAMtD,EAAO4D,UAC1BR,EAAM,GACN/B,GAAWA,EAAQwC,SAAWxC,EAAQyC,eAAiBzC,EAAUxB,GACjE,IAIIgC,EAAWkC,KAAMX,EAAM,KAAQpD,EAAOgE,cAAe3C,GACzD,IAAM+B,IAAS/B,GAETrB,EAAOiE,WAAYX,KAAMF,IAC7BE,KAAMF,GAAS/B,EAAS+B,IAIxBE,KAAKY,KAAMd,EAAO/B,EAAS+B,GAK9B,OAAOE,MAQP,GAJAD,EAAOxD,EAASsE,eAAgBf,EAAM,IAIjCC,GAAQA,EAAKe,WAAa,CAG9B,GAAKf,EAAKgB,KAAOjB,EAAM,GACtB,MAAOzD,GAAW+D,KAAMtC,EAIzBkC,MAAKE,OAAS,EACdF,KAAK,GAAKD,EAKX,MAFAC,MAAKjC,QAAUxB,EACfyD,KAAKlC,SAAWA,EACTkC,KAcH,MAAKlC,GAASyC,UACpBP,KAAKjC,QAAUiC,KAAK,GAAKlC,EACzBkC,KAAKE,OAAS,EACPF,MAIItD,EAAOiE,WAAY7C,GACvBzB,EAAWmD,MAAO1B,IAGrBA,EAASA,WAAa3B,IAC1B6D,KAAKlC,SAAWA,EAASA,SACzBkC,KAAKjC,QAAUD,EAASC,SAGlBrB,EAAOsE,UAAWlD,EAAUkC,QAIpClC,SAAU,GAGVoC,OAAQ,EAGRe,KAAM,WACL,MAAOjB,MAAKE,QAGbgB,QAAS,WACR,MAAO9D,GAAW+D,KAAMnB,OAKzBoB,IAAK,SAAUC,GACd,MAAc,OAAPA,EAGNrB,KAAKkB,UAGG,EAANG,EAAUrB,KAAMA,KAAKE,OAASmB,GAAQrB,KAAMqB,IAKhDC,UAAW,SAAUC,GAGpB,GAAIC,GAAM9E,EAAO2D,MAAOL,KAAKH,cAAe0B,EAO5C,OAJAC,GAAIC,WAAazB,KACjBwB,EAAIzD,QAAUiC,KAAKjC,QAGZyD,GAMRE,KAAM,SAAUC,EAAUC,GACzB,MAAOlF,GAAOgF,KAAM1B,KAAM2B,EAAUC,IAGrCpC,MAAO,SAAUxB,GAIhB,MAFAtB,GAAO8C,MAAMqC,UAAUC,KAAM9D,GAEtBgC,MAGR3C,MAAO,WACN,MAAO2C,MAAKsB,UAAWlE,EAAW2E,MAAO/B,KAAMgC,aAGhDC,MAAO,WACN,MAAOjC,MAAKkC,GAAI,IAGjBC,KAAM,WACL,MAAOnC,MAAKkC,GAAI,KAGjBA,GAAI,SAAUE,GACb,GAAIC,GAAMrC,KAAKE,OACdoC,GAAKF,GAAU,EAAJA,EAAQC,EAAM,EAC1B,OAAOrC,MAAKsB,UAAWgB,GAAK,GAASD,EAAJC,GAAYtC,KAAKsC,SAGnDC,IAAK,SAAUZ,GACd,MAAO3B,MAAKsB,UAAW5E,EAAO6F,IAAIvC,KAAM,SAAUD,EAAMqC,GACvD,MAAOT,GAASR,KAAMpB,EAAMqC,EAAGrC,OAIjCyC,IAAK,WACJ,MAAOxC,MAAKyB,YAAczB,KAAKH,YAAY,OAK5C1C,KAAMD,EACNuF,QAASA,KACTC,UAAWA,QAIZhG,EAAOsB,GAAGC,KAAK0B,UAAYjD,EAAOsB,GAElCtB,EAAOiG,OAASjG,EAAOsB,GAAG2E,OAAS,WAClC,GAAIC,GAAKC,EAAaC,EAAMC,EAAMC,EAASC,EAC1CC,EAASlB,UAAU,OACnBI,EAAI,EACJlC,EAAS8B,UAAU9B,OACnBiD,GAAO,CAqBR,KAlBuB,iBAAXD,KACXC,EAAOD,EACPA,EAASlB,UAAU,OAEnBI,EAAI,GAIkB,gBAAXc,IAAwBxG,EAAOiE,WAAWuC,KACrDA,MAIIhD,IAAWkC,IACfc,EAASlD,OACPoC,GAGSlC,EAAJkC,EAAYA,IAEnB,GAAmC,OAA7BY,EAAUhB,UAAWI,IAE1B,IAAMW,IAAQC,GACbJ,EAAMM,EAAQH,GACdD,EAAOE,EAASD,GAGXG,IAAWJ,IAKXK,GAAQL,IAAUpG,EAAOgE,cAAcoC,KAAUD,EAAcnG,EAAO0G,QAAQN,MAC7ED,GACJA,GAAc,EACdI,EAAQL,GAAOlG,EAAO0G,QAAQR,GAAOA,MAGrCK,EAAQL,GAAOlG,EAAOgE,cAAckC,GAAOA,KAI5CM,EAAQH,GAASrG,EAAOiG,OAAQQ,EAAMF,EAAOH,IAGlCA,IAAS3G,IACpB+G,EAAQH,GAASD,GAOrB,OAAOI,IAGRxG,EAAOiG,QACNU,WAAY,SAAUF,GASrB,MARKjH,GAAOU,IAAMF,IACjBR,EAAOU,EAAID,GAGPwG,GAAQjH,EAAOQ,SAAWA,IAC9BR,EAAOQ,OAASD,GAGVC,GAIR4G,SAAS,EAITC,UAAW,EAGXC,UAAW,SAAUC,GACfA,EACJ/G,EAAO6G,YAEP7G,EAAO8C,OAAO,IAKhBA,MAAO,SAAUkE,GAGhB,GAAKA,KAAS,KAAShH,EAAO6G,WAAY7G,EAAO4G,QAAjD,CAKA,IAAM/G,EAASoH,KACd,MAAOC,YAAYlH,EAAO8C,MAI3B9C,GAAO4G,SAAU,EAGZI,KAAS,KAAUhH,EAAO6G,UAAY,IAK3CnH,EAAUyH,YAAatH,GAAYG,IAG9BA,EAAOsB,GAAG8F,SACdpH,EAAQH,GAAWuH,QAAQ,SAASC,IAAI,YAO1CpD,WAAY,SAAUqD,GACrB,MAA4B,aAArBtH,EAAO2C,KAAK2E,IAGpBZ,QAASa,MAAMb,SAAW,SAAUY,GACnC,MAA4B,UAArBtH,EAAO2C,KAAK2E,IAGpBE,SAAU,SAAUF,GACnB,MAAc,OAAPA,GAAeA,GAAOA,EAAI9H,QAGlCiI,UAAW,SAAUH,GACpB,OAAQI,MAAOC,WAAWL,KAAUM,SAAUN,IAG/C3E,KAAM,SAAU2E,GACf,MAAY,OAAPA,EACWA,EAARO,GAEc,gBAARP,IAAmC,kBAARA,GACxCnH,EAAYW,EAAc2D,KAAK6C,KAAU,eAClCA,IAGTtD,cAAe,SAAUsD,GAIxB,IAAMA,GAA4B,WAArBtH,EAAO2C,KAAK2E,IAAqBA,EAAIzD,UAAY7D,EAAOwH,SAAUF,GAC9E,OAAO,CAGR,KAEC,GAAKA,EAAInE,cACPnC,EAAYyD,KAAK6C,EAAK,iBACtBtG,EAAYyD,KAAK6C,EAAInE,YAAYF,UAAW,iBAC7C,OAAO,EAEP,MAAQ6E,GAET,OAAO,EAMR,GAAIC,EACJ,KAAMA,IAAOT,IAEb,MAAOS,KAAQtI,GAAauB,EAAYyD,KAAM6C,EAAKS,IAGpDC,cAAe,SAAUV,GACxB,GAAIjB,EACJ,KAAMA,IAAQiB,GACb,OAAO,CAER,QAAO,GAGRW,MAAO,SAAUC,GAChB,KAAUC,OAAOD,IAMlBtE,UAAW,SAAUwE,EAAM/G,EAASgH,GACnC,IAAMD,GAAwB,gBAATA,GACpB,MAAO,KAEgB,kBAAZ/G,KACXgH,EAAchH,EACdA,GAAU,GAEXA,EAAUA,GAAWxB,CAErB,IAAIyI,GAASzG,EAAW4B,KAAM2E,GAC7BG,GAAWF,KAGZ,OAAKC,IACKjH,EAAQmH,cAAeF,EAAO,MAGxCA,EAAStI,EAAOyI,eAAiBL,GAAQ/G,EAASkH,GAC7CA,GACJvI,EAAQuI,GAAUG,SAEZ1I,EAAO2D,SAAW2E,EAAOK,cAGjCC,UAAW,SAAUR,GAEpB,MAAK5I,GAAOqJ,MAAQrJ,EAAOqJ,KAAKC,MACxBtJ,EAAOqJ,KAAKC,MAAOV,GAGb,OAATA,EACGA,EAGa,gBAATA,KAGXA,EAAOpI,EAAOmB,KAAMiH,GAEfA,GAGCtG,EAAYiC,KAAMqE,EAAKW,QAAS/G,EAAc,KACjD+G,QAAS9G,EAAc,KACvB8G,QAAShH,EAAc,MAEXiH,SAAU,UAAYZ,MAKtCpI,EAAOiI,MAAO,iBAAmBG,GAAjCpI,IAIDiJ,SAAU,SAAUb,GACnB,GAAIc,GAAKC,CACT,KAAMf,GAAwB,gBAATA,GACpB,MAAO,KAER,KACM5I,EAAO4J,WACXD,EAAM,GAAIC,WACVF,EAAMC,EAAIE,gBAAiBjB,EAAO,cAElCc,EAAM,GAAII,eAAe,oBACzBJ,EAAIK,MAAQ,QACZL,EAAIM,QAASpB,IAEb,MAAON,GACRoB,EAAMzJ,EAKP,MAHMyJ,IAAQA,EAAIO,kBAAmBP,EAAIQ,qBAAsB,eAAgBlG,QAC9ExD,EAAOiI,MAAO,gBAAkBG,GAE1Bc,GAGRS,KAAM,aAKNC,WAAY,SAAUxB,GAChBA,GAAQpI,EAAOmB,KAAMiH,KAIvB5I,EAAOqK,YAAc,SAAUzB,GAChC5I,EAAe,KAAEiF,KAAMjF,EAAQ4I,KAC3BA,IAMP0B,UAAW,SAAUC,GACpB,MAAOA,GAAOhB,QAAS7G,EAAW,OAAQ6G,QAAS5G,EAAYC,IAGhE4H,SAAU,SAAU3G,EAAMgD,GACzB,MAAOhD,GAAK2G,UAAY3G,EAAK2G,SAASC,gBAAkB5D,EAAK4D,eAI9DjF,KAAM,SAAUsC,EAAKrC,EAAUC,GAC9B,GAAIgF,GACHxE,EAAI,EACJlC,EAAS8D,EAAI9D,OACbkD,EAAUyD,EAAa7C,EAExB,IAAKpC,GACJ,GAAKwB,GACJ,KAAYlD,EAAJkC,EAAYA,IAGnB,GAFAwE,EAAQjF,EAASI,MAAOiC,EAAK5B,GAAKR,GAE7BgF,KAAU,EACd,UAIF,KAAMxE,IAAK4B,GAGV,GAFA4C,EAAQjF,EAASI,MAAOiC,EAAK5B,GAAKR,GAE7BgF,KAAU,EACd,UAOH,IAAKxD,GACJ,KAAYlD,EAAJkC,EAAYA,IAGnB,GAFAwE,EAAQjF,EAASR,KAAM6C,EAAK5B,GAAKA,EAAG4B,EAAK5B,IAEpCwE,KAAU,EACd,UAIF,KAAMxE,IAAK4B,GAGV,GAFA4C,EAAQjF,EAASR,KAAM6C,EAAK5B,GAAKA,EAAG4B,EAAK5B,IAEpCwE,KAAU,EACd,KAMJ,OAAO5C,IAIRnG,KAAMD,IAAcA,EAAUuD,KAAK,gBAClC,SAAU2F,GACT,MAAe,OAARA,EACN,GACAlJ,EAAUuD,KAAM2F,IAIlB,SAAUA,GACT,MAAe,OAARA,EACN,IACEA,EAAO,IAAKrB,QAASpH,EAAO,KAIjC2C,UAAW,SAAU+F,EAAKC,GACzB,GAAIxF,GAAMwF,KAaV,OAXY,OAAPD,IACCF,EAAaI,OAAOF,IACxBrK,EAAO2D,MAAOmB,EACE,gBAARuF,IACLA,GAAQA,GAGX7J,EAAUiE,KAAMK,EAAKuF,IAIhBvF,GAGR0F,QAAS,SAAUnH,EAAMgH,EAAK3E,GAC7B,GAAIC,EAEJ,IAAK0E,EAAM,CACV,GAAKzJ,EACJ,MAAOA,GAAa6D,KAAM4F,EAAKhH,EAAMqC,EAMtC,KAHAC,EAAM0E,EAAI7G,OACVkC,EAAIA,EAAQ,EAAJA,EAAQ+E,KAAKC,IAAK,EAAG/E,EAAMD,GAAMA,EAAI,EAEjCC,EAAJD,EAASA,IAEhB,GAAKA,IAAK2E,IAAOA,EAAK3E,KAAQrC,EAC7B,MAAOqC,GAKV,MAAO,IAGR/B,MAAO,SAAU4B,EAAOoF,GACvB,GAAIC,GAAID,EAAOnH,OACdkC,EAAIH,EAAM/B,OACVoC,EAAI,CAEL,IAAkB,gBAANgF,GACX,KAAYA,EAAJhF,EAAOA,IACdL,EAAOG,KAAQiF,EAAQ/E,OAGxB,OAAQ+E,EAAO/E,KAAOnG,EACrB8F,EAAOG,KAAQiF,EAAQ/E,IAMzB,OAFAL,GAAM/B,OAASkC,EAERH,GAGRsF,KAAM,SAAUhG,EAAOI,EAAU6F,GAChC,GAAIC,GACHjG,KACAY,EAAI,EACJlC,EAASqB,EAAMrB,MAKhB,KAJAsH,IAAQA,EAIItH,EAAJkC,EAAYA,IACnBqF,IAAW9F,EAAUJ,EAAOa,GAAKA,GAC5BoF,IAAQC,GACZjG,EAAIrE,KAAMoE,EAAOa,GAInB,OAAOZ,IAIRe,IAAK,SAAUhB,EAAOI,EAAU+F,GAC/B,GAAId,GACHxE,EAAI,EACJlC,EAASqB,EAAMrB,OACfkD,EAAUyD,EAAatF,GACvBC,IAGD,IAAK4B,EACJ,KAAYlD,EAAJkC,EAAYA,IACnBwE,EAAQjF,EAAUJ,EAAOa,GAAKA,EAAGsF,GAEnB,MAATd,IACJpF,EAAKA,EAAItB,QAAW0G,OAMtB,KAAMxE,IAAKb,GACVqF,EAAQjF,EAAUJ,EAAOa,GAAKA,EAAGsF,GAEnB,MAATd,IACJpF,EAAKA,EAAItB,QAAW0G,EAMvB,OAAO5J,GAAY+E,SAAWP,IAI/BmG,KAAM,EAINC,MAAO,SAAU5J,EAAID,GACpB,GAAI6D,GAAMgG,EAAO/B,CAUjB,OARwB,gBAAZ9H,KACX8H,EAAM7H,EAAID,GACVA,EAAUC,EACVA,EAAK6H,GAKAnJ,EAAOiE,WAAY3C,IAKzB4D,EAAOxE,EAAW+D,KAAMa,UAAW,GACnC4F,EAAQ,WACP,MAAO5J,GAAG+D,MAAOhE,GAAWiC,KAAM4B,EAAK3E,OAAQG,EAAW+D,KAAMa,cAIjE4F,EAAMD,KAAO3J,EAAG2J,KAAO3J,EAAG2J,MAAQjL,EAAOiL,OAElCC,GAZCzL,GAiBT0L,OAAQ,SAAUtG,EAAOvD,EAAIyG,EAAKmC,EAAOkB,EAAWC,EAAUC,GAC7D,GAAI5F,GAAI,EACPlC,EAASqB,EAAMrB,OACf+H,EAAc,MAAPxD,CAGR,IAA4B,WAAvB/H,EAAO2C,KAAMoF,GAAqB,CACtCqD,GAAY,CACZ,KAAM1F,IAAKqC,GACV/H,EAAOmL,OAAQtG,EAAOvD,EAAIoE,EAAGqC,EAAIrC,IAAI,EAAM2F,EAAUC,OAIhD,IAAKpB,IAAUzK,IACrB2L,GAAY,EAENpL,EAAOiE,WAAYiG,KACxBoB,GAAM,GAGFC,IAECD,GACJhK,EAAGmD,KAAMI,EAAOqF,GAChB5I,EAAK,OAILiK,EAAOjK,EACPA,EAAK,SAAU+B,EAAM0E,EAAKmC,GACzB,MAAOqB,GAAK9G,KAAMzE,EAAQqD,GAAQ6G,MAKhC5I,GACJ,KAAYkC,EAAJkC,EAAYA,IACnBpE,EAAIuD,EAAMa,GAAIqC,EAAKuD,EAAMpB,EAAQA,EAAMzF,KAAMI,EAAMa,GAAIA,EAAGpE,EAAIuD,EAAMa,GAAIqC,IAK3E,OAAOqD,GACNvG,EAGA0G,EACCjK,EAAGmD,KAAMI,GACTrB,EAASlC,EAAIuD,EAAM,GAAIkD,GAAQsD,GAGlCG,IAAK,WACJ,OAAO,GAAMC,OAASC,aAIxB1L,EAAO8C,MAAMqC,QAAU,SAAUmC,GAChC,IAAM5H,EAOL,GALAA,EAAYM,EAAO2L,WAKU,aAAxB9L,EAAS+C,WAEbsE,WAAYlH,EAAO8C,WAGb,IAAKjD,EAAS6C,iBAEpB7C,EAAS6C,iBAAkB,mBAAoBF,GAAW,GAG1DhD,EAAOkD,iBAAkB,OAAQF,GAAW,OAGtC,CAEN3C,EAAS+L,YAAa,qBAAsBpJ,GAG5ChD,EAAOoM,YAAa,SAAUpJ,EAI9B,IAAIqJ,IAAM,CAEV,KACCA,EAA6B,MAAvBrM,EAAOsM,cAAwBjM,EAAS4J,gBAC7C,MAAM3B,IAEH+D,GAAOA,EAAIE,UACf,QAAUC,KACT,IAAMhM,EAAO4G,QAAU,CAEtB,IAGCiF,EAAIE,SAAS,QACZ,MAAMjE,GACP,MAAOZ,YAAY8E,EAAe,IAInCnJ,IAGA7C,EAAO8C,YAMZ,MAAOpD,GAAUyF,QAASmC,IAI3BtH,EAAOgF,KAAK,gEAAgEiH,MAAM,KAAM,SAASvG,EAAGW,GACnGlG,EAAY,WAAakG,EAAO,KAAQA,EAAK4D,eAG9C,SAASE,GAAa7C,GACrB,GAAI9D,GAAS8D,EAAI9D,OAChBb,EAAO3C,EAAO2C,KAAM2E,EAErB,OAAKtH,GAAOwH,SAAUF,IACd,EAGc,IAAjBA,EAAIzD,UAAkBL,GACnB,EAGQ,UAATb,GAA6B,aAATA,IACb,IAAXa,GACgB,gBAAXA,IAAuBA,EAAS,GAAOA,EAAS,IAAO8D,IAIhE3H,EAAaK,EAAOH,EAEpB,IAAIqM,KAGJ,SAASC,GAAe7F,GACvB,GAAI8F,GAASF,EAAc5F,KAI3B,OAHAtG,GAAOgF,KAAMsB,EAAQlD,MAAO1B,OAAwB,SAAU2K,EAAGC,GAChEF,EAAQE,IAAS,IAEXF,EAyBRpM,EAAOuM,UAAY,SAAUjG,GAI5BA,EAA6B,gBAAZA,GACd4F,EAAc5F,IAAa6F,EAAe7F,GAC5CtG,EAAOiG,UAAYK,EAEpB,IACCkG,GAEAC,EAEAC,EAEAC,EAEAC,EAEAC,EAEAC,KAEAC,GAASzG,EAAQ0G,SAEjBC,EAAO,SAAU7E,GAOhB,IANAqE,EAASnG,EAAQmG,QAAUrE,EAC3BsE,GAAQ,EACRE,EAAcC,GAAe,EAC7BA,EAAc,EACdF,EAAeG,EAAKtJ,OACpBgJ,GAAS,EACDM,GAAsBH,EAAdC,EAA4BA,IAC3C,GAAKE,EAAMF,GAAcvH,MAAO+C,EAAM,GAAKA,EAAM,OAAU,GAAS9B,EAAQ4G,YAAc,CACzFT,GAAS,CACT,OAGFD,GAAS,EACJM,IACCC,EACCA,EAAMvJ,QACVyJ,EAAMF,EAAMI,SAEFV,EACXK,KAEAM,EAAKC,YAKRD,GAECE,IAAK,WACJ,GAAKR,EAAO,CAEX,GAAIS,GAAQT,EAAKtJ,QACjB,QAAU8J,GAAKpI,GACdlF,EAAOgF,KAAME,EAAM,SAAUmH,EAAGrB,GAC/B,GAAIrI,GAAO3C,EAAO2C,KAAMqI,EACV,cAATrI,EACE2D,EAAQkH,QAAWJ,EAAKK,IAAKzC,IAClC8B,EAAKrM,KAAMuK,GAEDA,GAAOA,EAAIxH,QAAmB,WAATb,GAEhC2K,EAAKtC,OAGJ1F,WAGCkH,EACJG,EAAeG,EAAKtJ,OAGTiJ,IACXI,EAAcU,EACdN,EAAMR,IAGR,MAAOnJ,OAGRoF,OAAQ,WAkBP,MAjBKoE,IACJ9M,EAAOgF,KAAMM,UAAW,SAAU+G,EAAGrB,GACpC,GAAI0C,EACJ,QAASA,EAAQ1N,EAAOwK,QAASQ,EAAK8B,EAAMY,IAAY,GACvDZ,EAAK9G,OAAQ0H,EAAO,GAEflB,IACUG,GAATe,GACJf,IAEaC,GAATc,GACJd,OAMEtJ,MAIRmK,IAAK,SAAUnM,GACd,MAAOA,GAAKtB,EAAOwK,QAASlJ,EAAIwL,GAAS,MAASA,IAAQA,EAAKtJ,SAGhEmK,MAAO,WAEN,MADAb,MACOxJ,MAGR+J,QAAS,WAER,MADAP,GAAOC,EAAQN,EAAShN,EACjB6D,MAGRsK,SAAU,WACT,OAAQd,GAGTe,KAAM,WAKL,MAJAd,GAAQtN,EACFgN,GACLW,EAAKC,UAEC/J,MAGRwK,OAAQ,WACP,OAAQf,GAGTgB,SAAU,SAAU1M,EAAS6D,GAU5B,MATAA,GAAOA,MACPA,GAAS7D,EAAS6D,EAAKvE,MAAQuE,EAAKvE,QAAUuE,IACzC4H,GAAWJ,IAASK,IACnBP,EACJO,EAAMtM,KAAMyE,GAEZ+H,EAAM/H,IAGD5B,MAGR2J,KAAM,WAEL,MADAG,GAAKW,SAAUzK,KAAMgC,WACdhC,MAGRoJ,MAAO,WACN,QAASA,GAIZ,OAAOU,IAERpN,EAAOiG,QAEN0F,SAAU,SAAUqC,GACnB,GAAIC,KAEA,UAAW,OAAQjO,EAAOuM,UAAU,eAAgB,aACpD,SAAU,OAAQvM,EAAOuM,UAAU,eAAgB,aACnD,SAAU,WAAYvM,EAAOuM,UAAU,YAE1C2B,EAAQ,UACR/I,GACC+I,MAAO,WACN,MAAOA,IAERC,OAAQ,WAEP,MADAC,GAAShJ,KAAME,WAAY+I,KAAM/I,WAC1BhC,MAERgL,KAAM,WACL,GAAIC,GAAMjJ,SACV,OAAOtF,GAAO2L,SAAS,SAAU6C,GAChCxO,EAAOgF,KAAMiJ,EAAQ,SAAUvI,EAAG+I,GACjC,GAAIC,GAASD,EAAO,GACnBnN,EAAKtB,EAAOiE,WAAYsK,EAAK7I,KAAS6I,EAAK7I,EAE5C0I,GAAUK,EAAM,IAAK,WACpB,GAAIE,GAAWrN,GAAMA,EAAG+D,MAAO/B,KAAMgC,UAChCqJ,IAAY3O,EAAOiE,WAAY0K,EAASxJ,SAC5CwJ,EAASxJ,UACPC,KAAMoJ,EAASI,SACfP,KAAMG,EAASK,QACfC,SAAUN,EAASO,QAErBP,EAAUE,EAAS,QAAUpL,OAAS6B,EAAUqJ,EAASrJ,UAAY7B,KAAMhC,GAAOqN,GAAarJ,eAIlGiJ,EAAM,OACJpJ,WAIJA,QAAS,SAAUmC,GAClB,MAAc,OAAPA,EAActH,EAAOiG,OAAQqB,EAAKnC,GAAYA,IAGvDiJ,IAwCD,OArCAjJ,GAAQ6J,KAAO7J,EAAQmJ,KAGvBtO,EAAOgF,KAAMiJ,EAAQ,SAAUvI,EAAG+I,GACjC,GAAI3B,GAAO2B,EAAO,GACjBQ,EAAcR,EAAO,EAGtBtJ,GAASsJ,EAAM,IAAO3B,EAAKQ,IAGtB2B,GACJnC,EAAKQ,IAAI,WAERY,EAAQe,GAGNhB,EAAY,EAAJvI,GAAS,GAAI2H,QAASY,EAAQ,GAAK,GAAIJ,MAInDO,EAAUK,EAAM,IAAO,WAEtB,MADAL,GAAUK,EAAM,GAAK,QAAUnL,OAAS8K,EAAWjJ,EAAU7B,KAAMgC,WAC5DhC,MAER8K,EAAUK,EAAM,GAAK,QAAW3B,EAAKiB,WAItC5I,EAAQA,QAASiJ,GAGZJ,GACJA,EAAKvJ,KAAM2J,EAAUA,GAIfA,GAIRc,KAAM,SAAUC,GACf,GAAIzJ,GAAI,EACP0J,EAAgB1O,EAAW+D,KAAMa,WACjC9B,EAAS4L,EAAc5L,OAGvB6L,EAAuB,IAAX7L,GAAkB2L,GAAenP,EAAOiE,WAAYkL,EAAYhK,SAAc3B,EAAS,EAGnG4K,EAAyB,IAAdiB,EAAkBF,EAAcnP,EAAO2L,WAGlD2D,EAAa,SAAU5J,EAAG6J,EAAUC,GACnC,MAAO,UAAUtF,GAChBqF,EAAU7J,GAAMpC,KAChBkM,EAAQ9J,GAAMJ,UAAU9B,OAAS,EAAI9C,EAAW+D,KAAMa,WAAc4E,EAChEsF,IAAWC,EACdrB,EAASsB,WAAYH,EAAUC,KACfH,GAChBjB,EAASjH,YAAaoI,EAAUC,KAKnCC,EAAgBE,EAAkBC,CAGnC,IAAKpM,EAAS,EAIb,IAHAiM,EAAqBlI,MAAO/D,GAC5BmM,EAAuBpI,MAAO/D,GAC9BoM,EAAsBrI,MAAO/D,GACjBA,EAAJkC,EAAYA,IACd0J,EAAe1J,IAAO1F,EAAOiE,WAAYmL,EAAe1J,GAAIP,SAChEiK,EAAe1J,GAAIP,UACjBC,KAAMkK,EAAY5J,EAAGkK,EAAiBR,IACtCf,KAAMD,EAASS,QACfC,SAAUQ,EAAY5J,EAAGiK,EAAkBF,MAE3CJ,CAUL,OAJMA,IACLjB,EAASjH,YAAayI,EAAiBR,GAGjChB,EAASjJ,aAGlBnF,EAAO6P,QAAU,WAEhB,GAAIA,GAASxN,EAAKyN,EACjBC,EAAOC,EAAQC,EACfC,EAAKC,EAAWC,EAAa1K,EAC7B2K,EAAMxQ,EAAS2I,cAAc,MAS9B,IANA6H,EAAIC,aAAc,YAAa,KAC/BD,EAAIE,UAAY,qEAGhBlO,EAAMgO,EAAI3G,qBAAqB,KAC/BoG,EAAIO,EAAI3G,qBAAqB,KAAM,IAC7BrH,IAAQyN,IAAMzN,EAAImB,OACvB,QAIDwM,GAASnQ,EAAS2I,cAAc,UAChC0H,EAAMF,EAAOQ,YAAa3Q,EAAS2I,cAAc,WACjDuH,EAAQM,EAAI3G,qBAAqB,SAAU,GAE3CoG,EAAEW,MAAMC,QAAU,gCAClBb,GAECc,gBAAmC,MAAlBN,EAAIO,UAGrBC,kBAA+C,IAA5BR,EAAIS,WAAWjN,SAIlCkN,OAAQV,EAAI3G,qBAAqB,SAASlG,OAI1CwN,gBAAiBX,EAAI3G,qBAAqB,QAAQlG,OAIlDiN,MAAO,MAAM1M,KAAM+L,EAAEmB,aAAa,UAIlCC,eAA2C,OAA3BpB,EAAEmB,aAAa,QAK/BE,QAAS,OAAOpN,KAAM+L,EAAEW,MAAMU,SAI9BC,WAAYtB,EAAEW,MAAMW,SAGpBC,UAAWtB,EAAM7F,MAIjBoH,YAAapB,EAAIqB,SAGjBC,UAAW3R,EAAS2I,cAAc,QAAQgJ,QAI1CC,WAA0E,kBAA9D5R,EAAS2I,cAAc,OAAOkJ,WAAW,GAAOC,UAG5DC,SAAkC,eAAxB/R,EAASgS,WAGnBC,eAAe,EACfC,cAAc,EACdC,wBAAwB,EACxBC,kBAAkB,EAClBC,qBAAqB,EACrBC,mBAAmB,EACnBC,eAAe,GAIhBrC,EAAMsC,SAAU,EAChBxC,EAAQyC,eAAiBvC,EAAM2B,WAAW,GAAOW,QAIjDrC,EAAOpC,UAAW,EAClBiC,EAAQ0C,aAAerC,EAAItC,QAG3B,WACQyC,GAAItM,KACV,MAAO+D,GACR+H,EAAQiC,eAAgB,EAIzB/B,EAAQlQ,EAAS2I,cAAc,SAC/BuH,EAAMO,aAAc,QAAS,IAC7BT,EAAQE,MAA0C,KAAlCA,EAAMkB,aAAc,SAGpClB,EAAM7F,MAAQ,IACd6F,EAAMO,aAAc,OAAQ,SAC5BT,EAAQ2C,WAA6B,MAAhBzC,EAAM7F,MAG3B6F,EAAMO,aAAc,UAAW,KAC/BP,EAAMO,aAAc,OAAQ,KAE5BL,EAAWpQ,EAAS4S,yBACpBxC,EAASO,YAAaT,GAItBF,EAAQ6C,cAAgB3C,EAAMsC,QAG9BxC,EAAQ8C,WAAa1C,EAASyB,WAAW,GAAOA,WAAW,GAAOkB,UAAUP,QAKvEhC,EAAIzE,cACRyE,EAAIzE,YAAa,UAAW,WAC3BiE,EAAQkC,cAAe,IAGxB1B,EAAIqB,WAAW,GAAOmB,QAKvB,KAAMnN,KAAOoN,QAAQ,EAAMC,QAAQ,EAAMC,SAAS,GACjD3C,EAAIC,aAAcH,EAAY,KAAOzK,EAAG,KAExCmK,EAASnK,EAAI,WAAcyK,IAAa3Q,IAAU6Q,EAAI4C,WAAY9C,GAAY+C,WAAY,CAmG3F,OAhGA7C,GAAII,MAAM0C,eAAiB,cAC3B9C,EAAIqB,WAAW,GAAOjB,MAAM0C,eAAiB,GAC7CtD,EAAQuD,gBAA+C,gBAA7B/C,EAAII,MAAM0C,eAGpCnT,EAAO,WACN,GAAIqT,GAAWC,EAAWC,EACzBC,EAAW,+HACXvM,EAAOpH,EAAS6J,qBAAqB,QAAQ,EAExCzC,KAKNoM,EAAYxT,EAAS2I,cAAc,OACnC6K,EAAU5C,MAAMC,QAAU,gFAE1BzJ,EAAKuJ,YAAa6C,GAAY7C,YAAaH,GAS3CA,EAAIE,UAAY,8CAChBgD,EAAMlD,EAAI3G,qBAAqB,MAC/B6J,EAAK,GAAI9C,MAAMC,QAAU,2CACzBN,EAA0C,IAA1BmD,EAAK,GAAIE,aAEzBF,EAAK,GAAI9C,MAAMiD,QAAU,GACzBH,EAAK,GAAI9C,MAAMiD,QAAU,OAIzB7D,EAAQ8D,sBAAwBvD,GAA2C,IAA1BmD,EAAK,GAAIE,aAG1DpD,EAAIE,UAAY,GAChBF,EAAII,MAAMC,QAAU,wKACpBb,EAAQ+D,UAAkC,IAApBvD,EAAIwD,YAC1BhE,EAAQiE,iCAAwD,IAAnB7M,EAAK8M,UAG7CvU,EAAOwU,mBACXnE,EAAQuC,cAAuE,QAArD5S,EAAOwU,iBAAkB3D,EAAK,WAAexE,IACvEgE,EAAQsC,kBAA2F,SAArE3S,EAAOwU,iBAAkB3D,EAAK,QAAY4D,MAAO,QAAUA,MAMzFX,EAAYjD,EAAIG,YAAa3Q,EAAS2I,cAAc,QACpD8K,EAAU7C,MAAMC,QAAUL,EAAII,MAAMC,QAAU8C,EAC9CF,EAAU7C,MAAMyD,YAAcZ,EAAU7C,MAAMwD,MAAQ,IACtD5D,EAAII,MAAMwD,MAAQ,MAElBpE,EAAQqC,qBACNvK,YAAcnI,EAAOwU,iBAAkBV,EAAW,WAAeY,oBAGxD7D,GAAII,MAAM0D,OAASvU,IAK9ByQ,EAAIE,UAAY,GAChBF,EAAII,MAAMC,QAAU8C,EAAW,8CAC/B3D,EAAQmC,uBAA+C,IAApB3B,EAAIwD,YAIvCxD,EAAII,MAAMiD,QAAU,QACpBrD,EAAIE,UAAY,cAChBF,EAAIS,WAAWL,MAAMwD,MAAQ,MAC7BpE,EAAQoC,iBAAyC,IAApB5B,EAAIwD,YAE5BhE,EAAQmC,yBAIZ/K,EAAKwJ,MAAM0D,KAAO,IAIpBlN,EAAKmN,YAAaf,GAGlBA,EAAYhD,EAAMkD,EAAMD,EAAY,QAIrCjR,EAAM2N,EAASC,EAAWC,EAAMJ,EAAIC,EAAQ,KAErCF,IAGR,IAAIwE,GAAS,+BACZC,EAAa,UAEd,SAASC,GAAclR,EAAMgD,EAAM+B,EAAMoM,GACxC,GAAMxU,EAAOyU,WAAYpR,GAAzB,CAIA,GAAIqR,GAAW5P,EACd6P,EAAc3U,EAAOkT,QACrB0B,EAA4B,gBAATvO,GAInBwO,EAASxR,EAAKQ,SAIdiR,EAAQD,EAAS7U,EAAO8U,MAAQzR,EAIhCgB,EAAKwQ,EAASxR,EAAMsR,GAAgBtR,EAAMsR,IAAiBA,CAI5D,IAAOtQ,GAAOyQ,EAAMzQ,KAASmQ,GAAQM,EAAMzQ,GAAI+D,QAAUwM,GAAaxM,IAAS3I,EAoE/E,MAhEM4E,KAGAwQ,EACJxR,EAAMsR,GAAgBtQ,EAAKjE,EAAgB2U,OAAS/U,EAAOiL,OAE3D5G,EAAKsQ,GAIDG,EAAOzQ,KACZyQ,EAAOzQ,MAIDwQ,IACLC,EAAOzQ,GAAK2Q,OAAShV,EAAO2J,QAMT,gBAATtD,IAAqC,kBAATA,MAClCmO,EACJM,EAAOzQ,GAAOrE,EAAOiG,OAAQ6O,EAAOzQ,GAAMgC,GAE1CyO,EAAOzQ,GAAK+D,KAAOpI,EAAOiG,OAAQ6O,EAAOzQ,GAAK+D,KAAM/B,IAItDqO,EAAYI,EAAOzQ,GAKbmQ,IACCE,EAAUtM,OACfsM,EAAUtM,SAGXsM,EAAYA,EAAUtM,MAGlBA,IAAS3I,IACbiV,EAAW1U,EAAO8J,UAAWzD,IAAW+B,GAKpCwM,GAGJ9P,EAAM4P,EAAWrO,GAGL,MAAPvB,IAGJA,EAAM4P,EAAW1U,EAAO8J,UAAWzD,MAGpCvB,EAAM4P,EAGA5P,GAGR,QAASmQ,GAAoB5R,EAAMgD,EAAMmO,GACxC,GAAMxU,EAAOyU,WAAYpR,GAAzB,CAIA,GAAIqC,GAAGkF,EAAG8J,EACTG,EAASxR,EAAKQ,SAGdiR,EAAQD,EAAS7U,EAAO8U,MAAQzR,EAChCgB,EAAKwQ,EAASxR,EAAMrD,EAAOkT,SAAYlT,EAAOkT,OAI/C,IAAM4B,EAAOzQ,GAAb,CAIA,GAAKgC,IAEJqO,EAAYF,EAAMM,EAAOzQ,GAAOyQ,EAAOzQ,GAAK+D,MAE3B,CAGVpI,EAAO0G,QAASL,GAsBrBA,EAAOA,EAAK9F,OAAQP,EAAO6F,IAAKQ,EAAMrG,EAAO8J,YAnBxCzD,IAAQqO,GACZrO,GAASA,IAITA,EAAOrG,EAAO8J,UAAWzD,GAExBA,EADIA,IAAQqO,IACHrO,GAEFA,EAAK4F,MAAM,KAarB,KAAMvG,EAAI,EAAGkF,EAAIvE,EAAK7C,OAAYoH,EAAJlF,EAAOA,UAC7BgP,GAAWrO,EAAKX,GAKxB,MAAQ8O,EAAMU,EAAoBlV,EAAOgI,eAAiB0M,GACzD,QAMGF,UACEM,GAAOzQ,GAAK+D,KAIb8M,EAAmBJ,EAAOzQ,QAM5BwQ,EACJ7U,EAAOmV,WAAa9R,IAAQ,GAGjBrD,EAAO6P,QAAQiC,eAAiBgD,GAASA,EAAMtV,aACnDsV,GAAOzQ,GAIdyQ,EAAOzQ,GAAO,QAIhBrE,EAAOiG,QACN6O,SAIA5B,QAAS,UAAa7S,EAAeoK,KAAK2K,UAAWrM,QAAS,MAAO,IAIrEsM,QACCC,OAAS,EAETlJ,OAAU,6CACVmJ,QAAU,GAGXC,QAAS,SAAUnS,GAElB,MADAA,GAAOA,EAAKQ,SAAW7D,EAAO8U,MAAOzR,EAAKrD,EAAOkT,UAAa7P,EAAMrD,EAAOkT,WAClE7P,IAAS6R,EAAmB7R,IAGtC+E,KAAM,SAAU/E,EAAMgD,EAAM+B,GAC3B,MAAOmM,GAAclR,EAAMgD,EAAM+B,IAGlCqN,WAAY,SAAUpS,EAAMgD,GAC3B,MAAO4O,GAAoB5R,EAAMgD,IAIlCqP,MAAO,SAAUrS,EAAMgD,EAAM+B,GAC5B,MAAOmM,GAAclR,EAAMgD,EAAM+B,GAAM,IAGxCuN,YAAa,SAAUtS,EAAMgD,GAC5B,MAAO4O,GAAoB5R,EAAMgD,GAAM,IAIxCoO,WAAY,SAAUpR,GAErB,GAAKA,EAAKQ,UAA8B,IAAlBR,EAAKQ,UAAoC,IAAlBR,EAAKQ,SACjD,OAAO,CAGR,IAAIwR,GAAShS,EAAK2G,UAAYhK,EAAOqV,OAAQhS,EAAK2G,SAASC,cAG3D,QAAQoL,GAAUA,KAAW,GAAQhS,EAAK4N,aAAa,aAAeoE,KAIxErV,EAAOsB,GAAG2E,QACTmC,KAAM,SAAUL,EAAKmC,GACpB,GAAI0L,GAAOvP,EACVhD,EAAOC,KAAK,GACZoC,EAAI,EACJ0C,EAAO,IAGR,IAAKL,IAAQtI,EAAY,CACxB,GAAK6D,KAAKE,SACT4E,EAAOpI,EAAOoI,KAAM/E,GAEG,IAAlBA,EAAKQ,WAAmB7D,EAAO0V,MAAOrS,EAAM,gBAAkB,CAElE,IADAuS,EAAQvS,EAAK4P,WACD2C,EAAMpS,OAAVkC,EAAkBA,IACzBW,EAAOuP,EAAMlQ,GAAGW,KAEVA,EAAKxF,QAAS,WACnBwF,EAAOrG,EAAO8J,UAAWzD,EAAK1F,MAAM,IAEpCkV,EAAUxS,EAAMgD,EAAM+B,EAAM/B,IAG9BrG,GAAO0V,MAAOrS,EAAM,eAAe,GAIrC,MAAO+E,GAIR,MAAoB,gBAARL,GACJzE,KAAK0B,KAAK,WAChBhF,EAAOoI,KAAM9E,KAAMyE,KAId/H,EAAOmL,OAAQ7H,KAAM,SAAU4G,GAErC,MAAKA,KAAUzK,EAEP4D,EAAOwS,EAAUxS,EAAM0E,EAAK/H,EAAOoI,KAAM/E,EAAM0E,IAAU,MAGjEzE,KAAK0B,KAAK,WACThF,EAAOoI,KAAM9E,KAAMyE,EAAKmC,KADzB5G,IAGE,KAAM4G,EAAO5E,UAAU9B,OAAS,EAAG,MAAM,IAG7CiS,WAAY,SAAU1N,GACrB,MAAOzE,MAAK0B,KAAK,WAChBhF,EAAOyV,WAAYnS,KAAMyE,OAK5B,SAAS8N,GAAUxS,EAAM0E,EAAKK,GAG7B,GAAKA,IAAS3I,GAA+B,IAAlB4D,EAAKQ,SAAiB,CAEhD,GAAIwC,GAAO,QAAU0B,EAAIgB,QAASuL,EAAY,OAAQrK,aAItD,IAFA7B,EAAO/E,EAAK4N,aAAc5K,GAEL,gBAAT+B,GAAoB,CAC/B,IACCA,EAAgB,SAATA,GAAkB,EACf,UAATA,GAAmB,EACV,SAATA,EAAkB,MAEjBA,EAAO,KAAOA,GAAQA,EACvBiM,EAAOtQ,KAAMqE,GAASpI,EAAO4I,UAAWR,GACvCA,EACD,MAAON,IAGT9H,EAAOoI,KAAM/E,EAAM0E,EAAKK,OAGxBA,GAAO3I,EAIT,MAAO2I,GAIR,QAAS8M,GAAmB5N,GAC3B,GAAIjB,EACJ,KAAMA,IAAQiB,GAGb,IAAc,SAATjB,IAAmBrG,EAAOgI,cAAeV,EAAIjB,MAGpC,WAATA,EACJ,OAAO,CAIT,QAAO,EAERrG,EAAOiG,QACN6P,MAAO,SAAUzS,EAAMV,EAAMyF,GAC5B,GAAI0N,EAEJ,OAAKzS,IACJV,GAASA,GAAQ,MAAS,QAC1BmT,EAAQ9V,EAAO0V,MAAOrS,EAAMV,GAGvByF,KACE0N,GAAS9V,EAAO0G,QAAQ0B,GAC7B0N,EAAQ9V,EAAO0V,MAAOrS,EAAMV,EAAM3C,EAAOsE,UAAU8D,IAEnD0N,EAAMrV,KAAM2H,IAGP0N,OAZR,GAgBDC,QAAS,SAAU1S,EAAMV,GACxBA,EAAOA,GAAQ,IAEf,IAAImT,GAAQ9V,EAAO8V,MAAOzS,EAAMV,GAC/BqT,EAAcF,EAAMtS,OACpBlC,EAAKwU,EAAM3I,QACX8I,EAAQjW,EAAOkW,YAAa7S,EAAMV,GAClCwT,EAAO,WACNnW,EAAO+V,QAAS1S,EAAMV,GAIZ,gBAAPrB,IACJA,EAAKwU,EAAM3I,QACX6I,KAGDC,EAAMG,IAAM9U,EACPA,IAIU,OAATqB,GACJmT,EAAMO,QAAS,oBAITJ,GAAMK,KACbhV,EAAGmD,KAAMpB,EAAM8S,EAAMF,KAGhBD,GAAeC,GACpBA,EAAMtI,MAAMV,QAKdiJ,YAAa,SAAU7S,EAAMV,GAC5B,GAAIoF,GAAMpF,EAAO,YACjB,OAAO3C,GAAO0V,MAAOrS,EAAM0E,IAAS/H,EAAO0V,MAAOrS,EAAM0E,GACvD4F,MAAO3N,EAAOuM,UAAU,eAAee,IAAI,WAC1CtN,EAAO2V,YAAatS,EAAMV,EAAO,SACjC3C,EAAO2V,YAAatS,EAAM0E,UAM9B/H,EAAOsB,GAAG2E,QACT6P,MAAO,SAAUnT,EAAMyF,GACtB,GAAImO,GAAS,CAQb,OANqB,gBAAT5T,KACXyF,EAAOzF,EACPA,EAAO,KACP4T,KAGuBA,EAAnBjR,UAAU9B,OACPxD,EAAO8V,MAAOxS,KAAK,GAAIX,GAGxByF,IAAS3I,EACf6D,KACAA,KAAK0B,KAAK,WACT,GAAI8Q,GAAQ9V,EAAO8V,MAAOxS,KAAMX,EAAMyF,EAGtCpI,GAAOkW,YAAa5S,KAAMX,GAEZ,OAATA,GAA8B,eAAbmT,EAAM,IAC3B9V,EAAO+V,QAASzS,KAAMX,MAI1BoT,QAAS,SAAUpT,GAClB,MAAOW,MAAK0B,KAAK,WAChBhF,EAAO+V,QAASzS,KAAMX,MAKxB6T,MAAO,SAAUC,EAAM9T,GAItB,MAHA8T,GAAOzW,EAAO0W,GAAK1W,EAAO0W,GAAGC,OAAQF,IAAUA,EAAOA,EACtD9T,EAAOA,GAAQ,KAERW,KAAKwS,MAAOnT,EAAM,SAAUwT,EAAMF,GACxC,GAAIW,GAAU1P,WAAYiP,EAAMM,EAChCR,GAAMK,KAAO,WACZO,aAAcD,OAIjBE,WAAY,SAAUnU,GACrB,MAAOW,MAAKwS,MAAOnT,GAAQ,UAI5BwC,QAAS,SAAUxC,EAAM2E,GACxB,GAAI6B,GACH4N,EAAQ,EACRC,EAAQhX,EAAO2L,WACfsL,EAAW3T,KACXoC,EAAIpC,KAAKE,OACToL,EAAU,aACCmI,GACTC,EAAM7P,YAAa8P,GAAYA,IAIb,iBAATtU,KACX2E,EAAM3E,EACNA,EAAOlD,GAERkD,EAAOA,GAAQ,IAEf,OAAO+C,IACNyD,EAAMnJ,EAAO0V,MAAOuB,EAAUvR,GAAK/C,EAAO,cACrCwG,GAAOA,EAAIwE,QACfoJ,IACA5N,EAAIwE,MAAML,IAAKsB,GAIjB,OADAA,KACOoI,EAAM7R,QAASmC,KAGxB,IAAI4P,GAAUC,EACbC,EAAS,YACTC,EAAU,MACVC,EAAa,6CACbC,EAAa,gBACbC,EAAW,8HACXC,EAAc,0BACd9G,EAAkB3Q,EAAO6P,QAAQc,gBACjC+G,EAAc1X,EAAO6P,QAAQE,KAE9B/P,GAAOsB,GAAG2E,QACT/B,KAAM,SAAUmC,EAAM6D,GACrB,MAAOlK,GAAOmL,OAAQ7H,KAAMtD,EAAOkE,KAAMmC,EAAM6D,EAAO5E,UAAU9B,OAAS,IAG1EmU,WAAY,SAAUtR,GACrB,MAAO/C,MAAK0B,KAAK,WAChBhF,EAAO2X,WAAYrU,KAAM+C,MAI3BuR,KAAM,SAAUvR,EAAM6D,GACrB,MAAOlK,GAAOmL,OAAQ7H,KAAMtD,EAAO4X,KAAMvR,EAAM6D,EAAO5E,UAAU9B,OAAS,IAG1EqU,WAAY,SAAUxR,GAErB,MADAA,GAAOrG,EAAO8X,QAASzR,IAAUA,EAC1B/C,KAAK0B,KAAK,WAEhB,IACC1B,KAAM+C,GAAS5G,QACR6D,MAAM+C,GACZ,MAAOyB,QAIXiQ,SAAU,SAAU7N,GACnB,GAAI8N,GAAS3U,EAAM+S,EAAK6B,EAAOrS,EAC9BF,EAAI,EACJC,EAAMrC,KAAKE,OACX0U,EAA2B,gBAAVhO,IAAsBA,CAExC,IAAKlK,EAAOiE,WAAYiG,GACvB,MAAO5G,MAAK0B,KAAK,SAAUY,GAC1B5F,EAAQsD,MAAOyU,SAAU7N,EAAMzF,KAAMnB,KAAMsC,EAAGtC,KAAKsN,aAIrD,IAAKsH,EAIJ,IAFAF,GAAY9N,GAAS,IAAK9G,MAAO1B,OAErBiE,EAAJD,EAASA,IAOhB,GANArC,EAAOC,KAAMoC,GACb0Q,EAAwB,IAAlB/S,EAAKQ,WAAoBR,EAAKuN,WACjC,IAAMvN,EAAKuN,UAAY,KAAM7H,QAASqO,EAAQ,KAChD,KAGU,CACVxR,EAAI,CACJ,OAASqS,EAAQD,EAAQpS,KACgB,EAAnCwQ,EAAIvV,QAAS,IAAMoX,EAAQ,OAC/B7B,GAAO6B,EAAQ,IAGjB5U,GAAKuN,UAAY5Q,EAAOmB,KAAMiV,GAMjC,MAAO9S,OAGR6U,YAAa,SAAUjO,GACtB,GAAI8N,GAAS3U,EAAM+S,EAAK6B,EAAOrS,EAC9BF,EAAI,EACJC,EAAMrC,KAAKE,OACX0U,EAA+B,IAArB5S,UAAU9B,QAAiC,gBAAV0G,IAAsBA,CAElE,IAAKlK,EAAOiE,WAAYiG,GACvB,MAAO5G,MAAK0B,KAAK,SAAUY,GAC1B5F,EAAQsD,MAAO6U,YAAajO,EAAMzF,KAAMnB,KAAMsC,EAAGtC,KAAKsN,aAGxD,IAAKsH,EAGJ,IAFAF,GAAY9N,GAAS,IAAK9G,MAAO1B,OAErBiE,EAAJD,EAASA,IAQhB,GAPArC,EAAOC,KAAMoC,GAEb0Q,EAAwB,IAAlB/S,EAAKQ,WAAoBR,EAAKuN,WACjC,IAAMvN,EAAKuN,UAAY,KAAM7H,QAASqO,EAAQ,KAChD,IAGU,CACVxR,EAAI,CACJ,OAASqS,EAAQD,EAAQpS,KAExB,MAAQwQ,EAAIvV,QAAS,IAAMoX,EAAQ,MAAS,EAC3C7B,EAAMA,EAAIrN,QAAS,IAAMkP,EAAQ,IAAK,IAGxC5U,GAAKuN,UAAY1G,EAAQlK,EAAOmB,KAAMiV,GAAQ,GAKjD,MAAO9S,OAGR8U,YAAa,SAAUlO,EAAOmO,GAC7B,GAAI1V,SAAcuH,GACjBoO,EAA6B,iBAAbD,EAEjB,OAAKrY,GAAOiE,WAAYiG,GAChB5G,KAAK0B,KAAK,SAAUU,GAC1B1F,EAAQsD,MAAO8U,YAAalO,EAAMzF,KAAKnB,KAAMoC,EAAGpC,KAAKsN,UAAWyH,GAAWA,KAItE/U,KAAK0B,KAAK,WAChB,GAAc,WAATrC,EAAoB,CAExB,GAAIiO,GACHlL,EAAI,EACJ0H,EAAOpN,EAAQsD,MACf4K,EAAQmK,EACRE,EAAarO,EAAM9G,MAAO1B,MAE3B,OAASkP,EAAY2H,EAAY7S,KAEhCwI,EAAQoK,EAASpK,GAASd,EAAKoL,SAAU5H,GACzCxD,EAAMc,EAAQ,WAAa,eAAiB0C,QAIlCjO,IAAS/C,GAA8B,YAAT+C,KACpCW,KAAKsN,WAET5Q,EAAO0V,MAAOpS,KAAM,gBAAiBA,KAAKsN,WAO3CtN,KAAKsN,UAAYtN,KAAKsN,WAAa1G,KAAU,EAAQ,GAAKlK,EAAO0V,MAAOpS,KAAM,kBAAqB,OAKtGkV,SAAU,SAAUpX,GACnB,GAAIwP,GAAY,IAAMxP,EAAW,IAChCsE,EAAI,EACJkF,EAAItH,KAAKE,MACV,MAAYoH,EAAJlF,EAAOA,IACd,GAA0B,IAArBpC,KAAKoC,GAAG7B,WAAmB,IAAMP,KAAKoC,GAAGkL,UAAY,KAAK7H,QAAQqO,EAAQ,KAAKvW,QAAS+P,IAAe,EAC3G,OAAO,CAIT,QAAO,GAGR6H,IAAK,SAAUvO,GACd,GAAIpF,GAAKmR,EAAOhS,EACfZ,EAAOC,KAAK,EAEb,EAAA,GAAMgC,UAAU9B,OAsBhB,MAFAS,GAAajE,EAAOiE,WAAYiG,GAEzB5G,KAAK0B,KAAK,SAAUU,GAC1B,GAAI+S,GACHrL,EAAOpN,EAAOsD,KAEQ,KAAlBA,KAAKO,WAKT4U,EADIxU,EACEiG,EAAMzF,KAAMnB,KAAMoC,EAAG0H,EAAKqL,OAE1BvO,EAIK,MAAPuO,EACJA,EAAM,GACoB,gBAARA,GAClBA,GAAO,GACIzY,EAAO0G,QAAS+R,KAC3BA,EAAMzY,EAAO6F,IAAI4S,EAAK,SAAWvO,GAChC,MAAgB,OAATA,EAAgB,GAAKA,EAAQ,MAItC+L,EAAQjW,EAAO0Y,SAAUpV,KAAKX,OAAU3C,EAAO0Y,SAAUpV,KAAK0G,SAASC,eAGjEgM,GAAW,OAASA,IAAUA,EAAM0C,IAAKrV,KAAMmV,EAAK,WAAchZ,IACvE6D,KAAK4G,MAAQuO,KAlDd,IAAKpV,EAGJ,MAFA4S,GAAQjW,EAAO0Y,SAAUrV,EAAKV,OAAU3C,EAAO0Y,SAAUrV,EAAK2G,SAASC,eAElEgM,GAAS,OAASA,KAAUnR,EAAMmR,EAAMvR,IAAKrB,EAAM,YAAe5D,EAC/DqF,GAGRA,EAAMzB,EAAK6G,MAEW,gBAARpF,GAEbA,EAAIiE,QAAQsO,EAAS,IAEd,MAAPvS,EAAc,GAAKA,OA2CxB9E,EAAOiG,QACNyS,UACCE,QACClU,IAAK,SAAUrB,GAGd,GAAIoV,GAAMpV,EAAK4P,WAAW/I,KAC1B,QAAQuO,GAAOA,EAAII,UAAYxV,EAAK6G,MAAQ7G,EAAK+G,OAGnD4F,QACCtL,IAAK,SAAUrB,GACd,GAAI6G,GAAO0O,EACVtS,EAAUjD,EAAKiD,QACfoH,EAAQrK,EAAKyV,cACbC,EAAoB,eAAd1V,EAAKV,MAAiC,EAAR+K,EACpC8B,EAASuJ,EAAM,QACfrO,EAAMqO,EAAMrL,EAAQ,EAAIpH,EAAQ9C,OAChCkC,EAAY,EAARgI,EACHhD,EACAqO,EAAMrL,EAAQ,CAGhB,MAAYhD,EAAJhF,EAASA,IAIhB,GAHAkT,EAAStS,EAASZ,MAGXkT,EAAOrH,UAAY7L,IAAMgI,IAE5B1N,EAAO6P,QAAQ0C,YAAeqG,EAAOhL,SAA+C,OAApCgL,EAAO3H,aAAa,cACnE2H,EAAOxU,WAAWwJ,UAAa5N,EAAOgK,SAAU4O,EAAOxU,WAAY,aAAiB,CAMxF,GAHA8F,EAAQlK,EAAQ4Y,GAASH,MAGpBM,EACJ,MAAO7O,EAIRsF,GAAO/O,KAAMyJ,GAIf,MAAOsF,IAGRmJ,IAAK,SAAUtV,EAAM6G,GACpB,GAAIsF,GAASxP,EAAOsE,UAAW4F,EAS/B,OAPAlK,GAAOqD,GAAMK,KAAK,UAAUsB,KAAK,WAChC1B,KAAKiO,SAAWvR,EAAOwK,QAASxK,EAAOsD,MAAMmV,MAAOjJ,IAAY,IAG3DA,EAAOhM,SACZH,EAAKyV,cAAgB,IAEftJ,KAKVtL,KAAM,SAAUb,EAAMgD,EAAM6D,GAC3B,GAAI+L,GAAO+C,EAAQlU,EAClBmU,EAAQ5V,EAAKQ,QAGd,IAAMR,GAAkB,IAAV4V,GAAyB,IAAVA,GAAyB,IAAVA,EAK5C,aAAY5V,GAAK4N,eAAiBrR,EAC1BI,EAAO4X,KAAMvU,EAAMgD,EAAM6D,IAGjC8O,EAAmB,IAAVC,IAAgBjZ,EAAOkZ,SAAU7V,GAIrC2V,IACJ3S,EAAOA,EAAK4D,cACZgM,EAAQjW,EAAOmZ,UAAW9S,KAAYmR,EAASzT,KAAMsC,GAAS8Q,EAAWD,IAGrEhN,IAAUzK,EAaHwW,GAAS+C,GAAU,OAAS/C,IAA6C,QAAnCnR,EAAMmR,EAAMvR,IAAKrB,EAAMgD,IACjEvB,SAMKzB,GAAK4N,eAAiBrR,IACjCkF,EAAOzB,EAAK4N,aAAc5K,IAIb,MAAPvB,EACNrF,EACAqF,GAzBc,OAAVoF,EAGO+L,GAAS+C,GAAU,OAAS/C,KAAUnR,EAAMmR,EAAM0C,IAAKtV,EAAM6G,EAAO7D,MAAY5G,EACpFqF,GAGPzB,EAAKiN,aAAcjK,EAAM6D,EAAQ,IAC1BA,IAPPlK,EAAO2X,WAAYtU,EAAMgD,GAAzBrG,KA4BH2X,WAAY,SAAUtU,EAAM6G,GAC3B,GAAI7D,GAAM+S,EACT1T,EAAI,EACJ2T,EAAYnP,GAASA,EAAM9G,MAAO1B,EAEnC,IAAK2X,GAA+B,IAAlBhW,EAAKQ,SACtB,MAASwC,EAAOgT,EAAU3T,KACzB0T,EAAWpZ,EAAO8X,QAASzR,IAAUA,EAGhCmR,EAASzT,KAAMsC,IAGbsK,GAAmB8G,EAAY1T,KAAMsC,GAC1ChD,EAAMrD,EAAO8J,UAAW,WAAazD,IACpChD,EAAM+V,IAAa,EAEpB/V,EAAM+V,IAAa,EAKpBpZ,EAAOkE,KAAMb,EAAMgD,EAAM,IAG1BhD,EAAKiW,gBAAiB3I,EAAkBtK,EAAO+S,IAKlDD,WACCxW,MACCgW,IAAK,SAAUtV,EAAM6G,GACpB,IAAMlK,EAAO6P,QAAQ2C,YAAwB,UAAVtI,GAAqBlK,EAAOgK,SAAS3G,EAAM,SAAW,CAGxF,GAAIoV,GAAMpV,EAAK6G,KAKf,OAJA7G,GAAKiN,aAAc,OAAQpG,GACtBuO,IACJpV,EAAK6G,MAAQuO,GAEPvO,MAMX4N,SACCyB,SAAU,WACVC,SAAU,WACVC,MAAO,UACPC,QAAS,YACTC,UAAW,YACXC,YAAa,cACbC,YAAa,cACbC,QAAS,UACTC,QAAS,UACTC,OAAQ,SACRC,YAAa,cACbC,gBAAiB,mBAGlBtC,KAAM,SAAUvU,EAAMgD,EAAM6D,GAC3B,GAAIpF,GAAKmR,EAAO+C,EACfC,EAAQ5V,EAAKQ,QAGd,IAAMR,GAAkB,IAAV4V,GAAyB,IAAVA,GAAyB,IAAVA,EAY5C,MARAD,GAAmB,IAAVC,IAAgBjZ,EAAOkZ,SAAU7V,GAErC2V,IAEJ3S,EAAOrG,EAAO8X,QAASzR,IAAUA,EACjC4P,EAAQjW,EAAOma,UAAW9T,IAGtB6D,IAAUzK,EACTwW,GAAS,OAASA,KAAUnR,EAAMmR,EAAM0C,IAAKtV,EAAM6G,EAAO7D,MAAY5G,EACnEqF,EAGEzB,EAAMgD,GAAS6D,EAIpB+L,GAAS,OAASA,IAA6C,QAAnCnR,EAAMmR,EAAMvR,IAAKrB,EAAMgD,IAChDvB,EAGAzB,EAAMgD,IAKhB8T,WACCC,UACC1V,IAAK,SAAUrB,GAGd,GAAIgX,GAAgBhX,EAAKiX,iBAAiB,WAE1C,OAAOD,IAAiBA,EAAcxB,UACrC0B,SAAUF,EAAcnQ,MAAO,IAC/BoN,EAAWvT,KAAMV,EAAK2G,WAAcuN,EAAWxT,KAAMV,EAAK2G,WAAc3G,EAAKmX,KAC5E,EACA/a,OAON0X,GACCzS,IAAK,SAAUrB,EAAMgD,GACpB,GAECuR,GAAO5X,EAAO4X,KAAMvU,EAAMgD,GAG1BnC,EAAuB,iBAAT0T,IAAsBvU,EAAK4N,aAAc5K,GACvDoU,EAAyB,iBAAT7C,GAEfF,GAAe/G,EACN,MAARzM,EAGAuT,EAAY1T,KAAMsC,GACjBhD,EAAMrD,EAAO8J,UAAW,WAAazD,MACnCnC,EAGJb,EAAKiX,iBAAkBjU,EAEzB,OAAOoU,IAAUA,EAAOvQ,SAAU,EACjC7D,EAAK4D,cACLxK,GAEFkZ,IAAK,SAAUtV,EAAM6G,EAAO7D,GAa3B,MAZK6D,MAAU,EAEdlK,EAAO2X,WAAYtU,EAAMgD,GACdqR,GAAe/G,IAAoB8G,EAAY1T,KAAMsC,GAEhEhD,EAAKiN,cAAeK,GAAmB3Q,EAAO8X,QAASzR,IAAUA,EAAMA,GAIvEhD,EAAMrD,EAAO8J,UAAW,WAAazD,IAAWhD,EAAMgD,IAAS,EAGzDA,IAKHqR,GAAgB/G,IACrB3Q,EAAOmZ,UAAUjP,OAChBxF,IAAK,SAAUrB,EAAMgD,GACpB,GAAIvB,GAAMzB,EAAKiX,iBAAkBjU,EACjC,OAAOrG,GAAOgK,SAAU3G,EAAM,SAG7BA,EAAKqX,aAEL5V,GAAOA,EAAI+T,UAAY/T,EAAIoF,MAAQzK,GAErCkZ,IAAK,SAAUtV,EAAM6G,EAAO7D,GAC3B,MAAKrG,GAAOgK,SAAU3G,EAAM,UAE3BA,EAAKqX,aAAexQ,EAApB7G,GAGO6T,GAAYA,EAASyB,IAAKtV,EAAM6G,EAAO7D,MAO5CsK,IAILuG,EAAWlX,EAAO0Y,SAASiC,QAC1BjW,IAAK,SAAUrB,EAAMgD,GACpB,GAAIvB,GAAMzB,EAAKiX,iBAAkBjU,EACjC,OAAOvB,KAAkB,OAATuB,GAA0B,SAATA,GAA4B,WAATA,EAAkC,KAAdvB,EAAIoF,MAAepF,EAAI+T,WAC9F/T,EAAIoF,MACJzK,GAEFkZ,IAAK,SAAUtV,EAAM6G,EAAO7D,GAE3B,GAAIvB,GAAMzB,EAAKiX,iBAAkBjU,EAUjC,OATMvB,IACLzB,EAAKuX,iBACH9V,EAAMzB,EAAKS,cAAc+W,gBAAiBxU,IAI7CvB,EAAIoF,MAAQA,GAAS,GAGL,UAAT7D,GAAoB6D,IAAU7G,EAAK4N,aAAc5K,GACvD6D,EACAzK,IAMHO,EAAOmZ,UAAUe,iBAChBxV,IAAKwS,EAASxS,IACdiU,IAAK,SAAUtV,EAAM6G,EAAO7D,GAC3B6Q,EAASyB,IAAKtV,EAAgB,KAAV6G,GAAe,EAAQA,EAAO7D,KAMpDrG,EAAOgF,MAAO,QAAS,UAAY,SAAUU,EAAGW,GAC/CrG,EAAOmZ,UAAW9S,GAASrG,EAAOiG,OAAQjG,EAAOmZ,UAAW9S,IAC3DsS,IAAK,SAAUtV,EAAM6G,GACpB,MAAe,KAAVA,GACJ7G,EAAKiN,aAAcjK,EAAM,QAClB6D,GAFR,QAYElK,EAAO6P,QAAQqB,iBACpBlR,EAAOgF,MAAO,OAAQ,MAAO,QAAS,UAAY,SAAUU,EAAGW,GAC9DrG,EAAOmZ,UAAW9S,GAASrG,EAAOiG,OAAQjG,EAAOmZ,UAAW9S,IAC3D3B,IAAK,SAAUrB,GACd,GAAIyB,GAAMzB,EAAK4N,aAAc5K,EAAM,EACnC,OAAc,OAAPvB,EAAcrF,EAAYqF,OAMpC9E,EAAOgF,MAAO,OAAQ,OAAS,SAAUU,EAAGW,GAC3CrG,EAAOma,UAAW9T,IACjB3B,IAAK,SAAUrB,GACd,MAAOA,GAAK4N,aAAc5K,EAAM,QAM9BrG,EAAO6P,QAAQY,QACpBzQ,EAAOmZ,UAAU1I,OAChB/L,IAAK,SAAUrB,GAId,MAAOA,GAAKoN,MAAMC,SAAWjR,GAE9BkZ,IAAK,SAAUtV,EAAM6G,GACpB,MAAS7G,GAAKoN,MAAMC,QAAUxG,EAAQ,MAOnClK,EAAO6P,QAAQyB,cACpBtR,EAAOma,UAAU5I,SAAWvR,EAAOiG,OAAQjG,EAAOma,UAAU5I,UAC3D7M,IAAK,SAAUrB,GACd,GAAIyX,GAASzX,EAAKe,UAUlB,OARK0W,KACJA,EAAOhC,cAGFgC,EAAO1W,YACX0W,EAAO1W,WAAW0U,eAGb,SAMJ9Y,EAAO6P,QAAQ2B,UACpBxR,EAAO8X,QAAQtG,QAAU,YAIpBxR,EAAO6P,QAAQwB,SACpBrR,EAAOgF,MAAO,QAAS,YAAc,WACpChF,EAAO0Y,SAAUpV,OAChBoB,IAAK,SAAUrB,GAEd,MAAsC,QAA/BA,EAAK4N,aAAa,SAAoB,KAAO5N,EAAK6G,UAK7DlK,EAAOgF,MAAO,QAAS,YAAc,WACpChF,EAAO0Y,SAAUpV,MAAStD,EAAOiG,OAAQjG,EAAO0Y,SAAUpV,OACzDqV,IAAK,SAAUtV,EAAM6G,GACpB,MAAKlK,GAAO0G,QAASwD,GACX7G,EAAKgP,QAAUrS,EAAOwK,QAASxK,EAAOqD,GAAMoV,MAAOvO,IAAW,EADxE,MAMH,IAAI6Q,GAAa,+BAChBC,GAAY,OACZC,GAAc,+BACdC,GAAc,kCACdC,GAAiB,sBAElB,SAASC,MACR,OAAO,EAGR,QAASC,MACR,OAAO,EAORrb,EAAOyC,OAEN6Y,UAEAhO,IAAK,SAAUjK,EAAMkY,EAAOC,EAASpT,EAAMhH,GAC1C,GAAI+H,GAAKsS,EAAQC,EAAGC,EACnBC,EAASC,EAAaC,EACtBC,EAAUpZ,EAAMqZ,EAAYC,EAC5BC,EAAWlc,EAAO0V,MAAOrS,EAG1B,IAAM6Y,EAAN,CAKKV,EAAQA,UACZG,EAAcH,EACdA,EAAUG,EAAYH,QACtBpa,EAAWua,EAAYva,UAIlBoa,EAAQvQ,OACbuQ,EAAQvQ,KAAOjL,EAAOiL,SAIhBwQ,EAASS,EAAST,UACxBA,EAASS,EAAST,YAEZI,EAAcK,EAASC,UAC7BN,EAAcK,EAASC,OAAS,SAAUrU,GAGzC,aAAc9H,KAAWJ,GAAuBkI,GAAK9H,EAAOyC,MAAM2Z,YAActU,EAAEnF,KAEjFlD,EADAO,EAAOyC,MAAM4Z,SAAShX,MAAOwW,EAAYxY,KAAMiC,YAIjDuW,EAAYxY,KAAOA,GAKpBkY,GAAUA,GAAS,IAAKnY,MAAO1B,KAAqB,IACpDga,EAAIH,EAAM/X,MACV,OAAQkY,IACPvS,EAAMgS,GAAe1X,KAAM8X,EAAMG,QACjC/Y,EAAOsZ,EAAW9S,EAAI,GACtB6S,GAAe7S,EAAI,IAAM,IAAK8C,MAAO,KAAMlG,OAG3C6V,EAAU5b,EAAOyC,MAAMmZ,QAASjZ,OAGhCA,GAASvB,EAAWwa,EAAQU,aAAeV,EAAQW,WAAc5Z,EAGjEiZ,EAAU5b,EAAOyC,MAAMmZ,QAASjZ,OAGhCmZ,EAAY9b,EAAOiG,QAClBtD,KAAMA,EACNsZ,SAAUA,EACV7T,KAAMA,EACNoT,QAASA,EACTvQ,KAAMuQ,EAAQvQ,KACd7J,SAAUA,EACVob,aAAcpb,GAAYpB,EAAOyc,KAAKrZ,MAAMoZ,aAAazY,KAAM3C,GAC/Dsb,UAAWV,EAAWW,KAAK,MACzBhB,IAGII,EAAWN,EAAQ9Y,MACzBoZ,EAAWN,EAAQ9Y,MACnBoZ,EAASa,cAAgB,EAGnBhB,EAAQiB,OAASjB,EAAQiB,MAAMpY,KAAMpB,EAAM+E,EAAM4T,EAAYH,MAAkB,IAE/ExY,EAAKX,iBACTW,EAAKX,iBAAkBC,EAAMkZ,GAAa,GAE/BxY,EAAKuI,aAChBvI,EAAKuI,YAAa,KAAOjJ,EAAMkZ,KAK7BD,EAAQtO,MACZsO,EAAQtO,IAAI7I,KAAMpB,EAAMyY,GAElBA,EAAUN,QAAQvQ,OACvB6Q,EAAUN,QAAQvQ,KAAOuQ,EAAQvQ,OAK9B7J,EACJ2a,EAAS/V,OAAQ+V,EAASa,gBAAiB,EAAGd,GAE9CC,EAAStb,KAAMqb,GAIhB9b,EAAOyC,MAAM6Y,OAAQ3Y,IAAS,CAI/BU,GAAO,OAIRqF,OAAQ,SAAUrF,EAAMkY,EAAOC,EAASpa,EAAU0b,GACjD,GAAIlX,GAAGkW,EAAW3S,EACjB4T,EAAWrB,EAAGD,EACdG,EAASG,EAAUpZ,EACnBqZ,EAAYC,EACZC,EAAWlc,EAAOwV,QAASnS,IAAUrD,EAAO0V,MAAOrS,EAEpD,IAAM6Y,IAAcT,EAASS,EAAST,QAAtC,CAKAF,GAAUA,GAAS,IAAKnY,MAAO1B,KAAqB,IACpDga,EAAIH,EAAM/X,MACV,OAAQkY,IAMP,GALAvS,EAAMgS,GAAe1X,KAAM8X,EAAMG,QACjC/Y,EAAOsZ,EAAW9S,EAAI,GACtB6S,GAAe7S,EAAI,IAAM,IAAK8C,MAAO,KAAMlG,OAGrCpD,EAAN,CAOAiZ,EAAU5b,EAAOyC,MAAMmZ,QAASjZ,OAChCA,GAASvB,EAAWwa,EAAQU,aAAeV,EAAQW,WAAc5Z,EACjEoZ,EAAWN,EAAQ9Y,OACnBwG,EAAMA,EAAI,IAAU6T,OAAQ,UAAYhB,EAAWW,KAAK,iBAAmB,WAG3EI,EAAYnX,EAAImW,EAASvY,MACzB,OAAQoC,IACPkW,EAAYC,EAAUnW,IAEfkX,GAAeb,IAAaH,EAAUG,UACzCT,GAAWA,EAAQvQ,OAAS6Q,EAAU7Q,MACtC9B,IAAOA,EAAIpF,KAAM+X,EAAUY,YAC3Btb,GAAYA,IAAa0a,EAAU1a,WAAyB,OAAbA,IAAqB0a,EAAU1a,YACjF2a,EAAS/V,OAAQJ,EAAG,GAEfkW,EAAU1a,UACd2a,EAASa,gBAELhB,EAAQlT,QACZkT,EAAQlT,OAAOjE,KAAMpB,EAAMyY,GAOzBiB,KAAchB,EAASvY,SACrBoY,EAAQqB,UAAYrB,EAAQqB,SAASxY,KAAMpB,EAAM2Y,EAAYE,EAASC,WAAa,GACxFnc,EAAOkd,YAAa7Z,EAAMV,EAAMuZ,EAASC,cAGnCV,GAAQ9Y,QAtCf,KAAMA,IAAQ8Y,GACbzb,EAAOyC,MAAMiG,OAAQrF,EAAMV,EAAO4Y,EAAOG,GAAKF,EAASpa,GAAU,EA0C/DpB,GAAOgI,cAAeyT,WACnBS,GAASC,OAIhBnc,EAAO2V,YAAatS,EAAM,aAI5B+D,QAAS,SAAU3E,EAAO2F,EAAM/E,EAAM8Z,GACrC,GAAIhB,GAAQiB,EAAQhH,EACnBiH,EAAYzB,EAASzS,EAAKzD,EAC1B4X,GAAcja,GAAQxD,GACtB8C,EAAO3B,EAAYyD,KAAMhC,EAAO,QAAWA,EAAME,KAAOF,EACxDuZ,EAAahb,EAAYyD,KAAMhC,EAAO,aAAgBA,EAAMia,UAAUzQ,MAAM,OAK7E,IAHAmK,EAAMjN,EAAM9F,EAAOA,GAAQxD,EAGJ,IAAlBwD,EAAKQ,UAAoC,IAAlBR,EAAKQ,WAK5BqX,GAAYnX,KAAMpB,EAAO3C,EAAOyC,MAAM2Z,aAItCzZ,EAAK9B,QAAQ,MAAQ,IAEzBmb,EAAarZ,EAAKsJ,MAAM,KACxBtJ,EAAOqZ,EAAW7O,QAClB6O,EAAWjW,QAEZqX,EAA6B,EAApBza,EAAK9B,QAAQ,MAAY,KAAO8B,EAGzCF,EAAQA,EAAOzC,EAAOkT,SACrBzQ,EACA,GAAIzC,GAAOud,MAAO5a,EAAuB,gBAAVF,IAAsBA,GAEtDA,EAAM+a,WAAY,EAClB/a,EAAMia,UAAYV,EAAWW,KAAK,KAClCla,EAAMgb,aAAehb,EAAMia,UACtBM,OAAQ,UAAYhB,EAAWW,KAAK,iBAAmB,WAC3D,KAGDla,EAAMib,OAASje,EACTgD,EAAM+D,SACX/D,EAAM+D,OAASnD,GAIhB+E,EAAe,MAARA,GACJ3F,GACFzC,EAAOsE,UAAW8D,GAAQ3F,IAG3BmZ,EAAU5b,EAAOyC,MAAMmZ,QAASjZ,OAC1Bwa,IAAgBvB,EAAQxU,SAAWwU,EAAQxU,QAAQ/B,MAAOhC,EAAM+E,MAAW,GAAjF,CAMA,IAAM+U,IAAiBvB,EAAQ+B,WAAa3d,EAAOwH,SAAUnE,GAAS,CAMrE,IAJAga,EAAazB,EAAQU,cAAgB3Z,EAC/BuY,GAAYnX,KAAMsZ,EAAa1a,KACpCyT,EAAMA,EAAIhS,YAEHgS,EAAKA,EAAMA,EAAIhS,WACtBkZ,EAAU7c,KAAM2V,GAChBjN,EAAMiN,CAIFjN,MAAS9F,EAAKS,eAAiBjE,IACnCyd,EAAU7c,KAAM0I,EAAIyU,aAAezU,EAAI0U,cAAgBre,GAKzDkG,EAAI,CACJ,QAAS0Q,EAAMkH,EAAU5X,QAAUjD,EAAMqb,uBAExCrb,EAAME,KAAO+C,EAAI,EAChB2X,EACAzB,EAAQW,UAAY5Z,EAGrBwZ,GAAWnc,EAAO0V,MAAOU,EAAK,eAAoB3T,EAAME,OAAU3C,EAAO0V,MAAOU,EAAK,UAChF+F,GACJA,EAAO9W,MAAO+Q,EAAKhO,GAIpB+T,EAASiB,GAAUhH,EAAKgH,GACnBjB,GAAUnc,EAAOyU,WAAY2B,IAAS+F,EAAO9W,OAAS8W,EAAO9W,MAAO+Q,EAAKhO,MAAW,GACxF3F,EAAMsb,gBAMR,IAHAtb,EAAME,KAAOA,IAGPwa,GAAiB1a,EAAMub,sBAErBpC,EAAQqC,UAAYrC,EAAQqC,SAAS5Y,MAAOhC,EAAKS,cAAesE,MAAW,GACtE,UAATzF,GAAoB3C,EAAOgK,SAAU3G,EAAM,OAAUrD,EAAOyU,WAAYpR,KAKrE+Z,IAAU/Z,EAAMV,IAAW3C,EAAOwH,SAAUnE,IAAS,CAGzD8F,EAAM9F,EAAM+Z,GAEPjU,IACJ9F,EAAM+Z,GAAW,MAIlBpd,EAAOyC,MAAM2Z,UAAYzZ,CACzB,KACCU,EAAMV,KACL,MAAQmF,IAIV9H,EAAOyC,MAAM2Z,UAAY3c,EAEpB0J,IACJ9F,EAAM+Z,GAAWjU,GAMrB,MAAO1G,GAAMib,SAGdrB,SAAU,SAAU5Z,GAGnBA,EAAQzC,EAAOyC,MAAMyb,IAAKzb,EAE1B,IAAIiD,GAAGZ,EAAKgX,EAAWqC,EAASvY,EAC/BwY,KACAlZ,EAAOxE,EAAW+D,KAAMa,WACxByW,GAAa/b,EAAO0V,MAAOpS,KAAM,eAAoBb,EAAME,UAC3DiZ,EAAU5b,EAAOyC,MAAMmZ,QAASnZ,EAAME,SAOvC,IAJAuC,EAAK,GAAKzC,EACVA,EAAM4b,eAAiB/a,MAGlBsY,EAAQ0C,aAAe1C,EAAQ0C,YAAY7Z,KAAMnB,KAAMb,MAAY,EAAxE,CAKA2b,EAAepe,EAAOyC,MAAMsZ,SAAStX,KAAMnB,KAAMb,EAAOsZ,GAGxDrW,EAAI,CACJ,QAASyY,EAAUC,EAAc1Y,QAAWjD,EAAMqb,uBAAyB,CAC1Erb,EAAM8b,cAAgBJ,EAAQ9a,KAE9BuC,EAAI,CACJ,QAASkW,EAAYqC,EAAQpC,SAAUnW,QAAWnD,EAAM+b,kCAIjD/b,EAAMgb,cAAgBhb,EAAMgb,aAAa1Z,KAAM+X,EAAUY,cAE9Dja,EAAMqZ,UAAYA,EAClBrZ,EAAM2F,KAAO0T,EAAU1T,KAEvBtD,IAAS9E,EAAOyC,MAAMmZ,QAASE,EAAUG,eAAkBE,QAAUL,EAAUN,SAC5EnW,MAAO8Y,EAAQ9a,KAAM6B,GAEnBJ,IAAQrF,IACNgD,EAAMib,OAAS5Y,MAAS,IAC7BrC,EAAMsb,iBACNtb,EAAMgc,oBAYX,MAJK7C,GAAQ8C,cACZ9C,EAAQ8C,aAAaja,KAAMnB,KAAMb,GAG3BA,EAAMib,SAGd3B,SAAU,SAAUtZ,EAAOsZ,GAC1B,GAAI4C,GAAK7C,EAAW8C,EAASlZ,EAC5B0Y,KACAxB,EAAgBb,EAASa,cACzBxG,EAAM3T,EAAM+D,MAKb,IAAKoW,GAAiBxG,EAAIvS,YAAcpB,EAAMkY,QAAyB,UAAflY,EAAME,MAE7D,KAAQyT,GAAO9S,KAAM8S,EAAMA,EAAIhS,YAAcd,KAI5C,GAAsB,IAAjB8S,EAAIvS,WAAmBuS,EAAIxI,YAAa,GAAuB,UAAfnL,EAAME,MAAoB,CAE9E,IADAic,KACMlZ,EAAI,EAAOkX,EAAJlX,EAAmBA,IAC/BoW,EAAYC,EAAUrW,GAGtBiZ,EAAM7C,EAAU1a,SAAW,IAEtBwd,EAASD,KAAUlf,IACvBmf,EAASD,GAAQ7C,EAAUU,aAC1Bxc,EAAQ2e,EAAKrb,MAAOoK,MAAO0I,IAAS,EACpCpW,EAAO0D,KAAMib,EAAKrb,KAAM,MAAQ8S,IAAQ5S,QAErCob,EAASD,IACbC,EAAQne,KAAMqb,EAGX8C,GAAQpb,QACZ4a,EAAa3d,MAAO4C,KAAM+S,EAAK2F,SAAU6C,IAW7C,MAJqB7C,GAASvY,OAAzBoZ,GACJwB,EAAa3d,MAAO4C,KAAMC,KAAMyY,SAAUA,EAASpb,MAAOic,KAGpDwB,GAGRF,IAAK,SAAUzb,GACd,GAAKA,EAAOzC,EAAOkT,SAClB,MAAOzQ,EAIR,IAAIiD,GAAGkS,EAAMxR,EACZzD,EAAOF,EAAME,KACbkc,EAAgBpc,EAChBqc,EAAUxb,KAAKyb,SAAUpc,EAEpBmc,KACLxb,KAAKyb,SAAUpc,GAASmc,EACvB7D,GAAYlX,KAAMpB,GAASW,KAAK0b,WAChChE,GAAUjX,KAAMpB,GAASW,KAAK2b,aAGhC7Y,EAAO0Y,EAAQI,MAAQ5b,KAAK4b,MAAM3e,OAAQue,EAAQI,OAAU5b,KAAK4b,MAEjEzc,EAAQ,GAAIzC,GAAOud,MAAOsB,GAE1BnZ,EAAIU,EAAK5C,MACT,OAAQkC,IACPkS,EAAOxR,EAAMV,GACbjD,EAAOmV,GAASiH,EAAejH,EAmBhC,OAdMnV,GAAM+D,SACX/D,EAAM+D,OAASqY,EAAcM,YAActf,GAKb,IAA1B4C,EAAM+D,OAAO3C,WACjBpB,EAAM+D,OAAS/D,EAAM+D,OAAOpC,YAK7B3B,EAAM2c,UAAY3c,EAAM2c,QAEjBN,EAAQO,OAASP,EAAQO,OAAQ5c,EAAOoc,GAAkBpc,GAIlEyc,MAAO,wHAAwHjT,MAAM,KAErI8S,YAEAE,UACCC,MAAO,4BAA4BjT,MAAM,KACzCoT,OAAQ,SAAU5c,EAAO6c,GAOxB,MAJoB,OAAf7c,EAAM8c,QACV9c,EAAM8c,MAA6B,MAArBD,EAASE,SAAmBF,EAASE,SAAWF,EAASG,SAGjEhd,IAITuc,YACCE,MAAO,mGAAmGjT,MAAM,KAChHoT,OAAQ,SAAU5c,EAAO6c,GACxB,GAAIrY,GAAMyY,EAAUC,EACnBhF,EAAS2E,EAAS3E,OAClBiF,EAAcN,EAASM,WAuBxB,OApBoB,OAAfnd,EAAMod,OAAqC,MAApBP,EAASQ,UACpCJ,EAAWjd,EAAM+D,OAAO1C,eAAiBjE,EACzC8f,EAAMD,EAASjW,gBACfxC,EAAOyY,EAASzY,KAEhBxE,EAAMod,MAAQP,EAASQ,SAAYH,GAAOA,EAAII,YAAc9Y,GAAQA,EAAK8Y,YAAc,IAAQJ,GAAOA,EAAIK,YAAc/Y,GAAQA,EAAK+Y,YAAc,GACnJvd,EAAMwd,MAAQX,EAASY,SAAYP,GAAOA,EAAIQ,WAAclZ,GAAQA,EAAKkZ,WAAc,IAAQR,GAAOA,EAAIS,WAAcnZ,GAAQA,EAAKmZ,WAAc,KAI9I3d,EAAM4d,eAAiBT,IAC5Bnd,EAAM4d,cAAgBT,IAAgBnd,EAAM+D,OAAS8Y,EAASgB,UAAYV,GAKrEnd,EAAM8c,OAAS5E,IAAWlb,IAC/BgD,EAAM8c,MAAmB,EAAT5E,EAAa,EAAe,EAATA,EAAa,EAAe,EAATA,EAAa,EAAI,GAGjElY,IAITmZ,SACC2E,MAEC5C,UAAU,GAEX9K,OAECzL,QAAS,WACR,MAAKpH,GAAOgK,SAAU1G,KAAM,UAA2B,aAAdA,KAAKX,MAAuBW,KAAKuP,OACzEvP,KAAKuP,SACE,GAFR,IAMF2N,OAECpZ,QAAS,WACR,GAAK9D,OAASzD,EAAS4gB,eAAiBnd,KAAKkd,MAC5C,IAEC,MADAld,MAAKkd,SACE,EACN,MAAQ1Y,MAOZwU,aAAc,WAEfoE,MACCtZ,QAAS,WACR,MAAK9D,QAASzD,EAAS4gB,eAAiBnd,KAAKod,MAC5Cpd,KAAKod,QACE,GAFR,GAKDpE,aAAc,YAGfqE,cACCjC,aAAc,SAAUjc,GAGlBA,EAAMib,SAAWje,IACrBgD,EAAMoc,cAAc+B,YAAcne,EAAMib,WAM5CmD,SAAU,SAAUle,EAAMU,EAAMZ,EAAOqe,GAItC,GAAIhZ,GAAI9H,EAAOiG,OACd,GAAIjG,GAAOud,MACX9a,GACEE,KAAMA,EACPoe,aAAa,EACblC,kBAGGiC,GACJ9gB,EAAOyC,MAAM2E,QAASU,EAAG,KAAMzE,GAE/BrD,EAAOyC,MAAM4Z,SAAS5X,KAAMpB,EAAMyE,GAE9BA,EAAEkW,sBACNvb,EAAMsb,mBAKT/d,EAAOkd,YAAcrd,EAASkD,oBAC7B,SAAUM,EAAMV,EAAMwZ,GAChB9Y,EAAKN,qBACTM,EAAKN,oBAAqBJ,EAAMwZ,GAAQ,IAG1C,SAAU9Y,EAAMV,EAAMwZ,GACrB,GAAI9V,GAAO,KAAO1D,CAEbU,GAAKL,oBAIGK,GAAMgD,KAAWzG,IAC5ByD,EAAMgD,GAAS,MAGhBhD,EAAKL,YAAaqD,EAAM8V,KAI3Bnc,EAAOud,MAAQ,SAAUrX,EAAKgZ,GAE7B,MAAO5b,gBAAgBtD,GAAOud,OAKzBrX,GAAOA,EAAIvD,MACfW,KAAKub,cAAgB3Y,EACrB5C,KAAKX,KAAOuD,EAAIvD,KAIhBW,KAAK0a,mBAAuB9X,EAAI8a,kBAAoB9a,EAAI0a,eAAgB,GACvE1a,EAAI+a,mBAAqB/a,EAAI+a,oBAAwB7F,GAAaC,IAInE/X,KAAKX,KAAOuD,EAIRgZ,GACJlf,EAAOiG,OAAQ3C,KAAM4b,GAItB5b,KAAK4d,UAAYhb,GAAOA,EAAIgb,WAAalhB,EAAOwL,MAGhDlI,KAAMtD,EAAOkT,UAAY,EAvBzB,GAJQ,GAAIlT,GAAOud,MAAOrX,EAAKgZ,IAgChClf,EAAOud,MAAMta,WACZ+a,mBAAoB3C,GACpByC,qBAAsBzC,GACtBmD,8BAA+BnD,GAE/B0C,eAAgB,WACf,GAAIjW,GAAIxE,KAAKub,aAEbvb,MAAK0a,mBAAqB5C,GACpBtT,IAKDA,EAAEiW,eACNjW,EAAEiW,iBAKFjW,EAAE8Y,aAAc,IAGlBnC,gBAAiB,WAChB,GAAI3W,GAAIxE,KAAKub,aAEbvb,MAAKwa,qBAAuB1C,GACtBtT,IAIDA,EAAE2W,iBACN3W,EAAE2W,kBAKH3W,EAAEqZ,cAAe,IAElBC,yBAA0B,WACzB9d,KAAKkb,8BAAgCpD,GACrC9X,KAAKmb,oBAKPze,EAAOgF,MACNqc,WAAY,YACZC,WAAY,YACV,SAAUC,EAAMrD,GAClBle,EAAOyC,MAAMmZ,QAAS2F,IACrBjF,aAAc4B,EACd3B,SAAU2B,EAEV/B,OAAQ,SAAU1Z,GACjB,GAAIqC,GACH0B,EAASlD,KACTke,EAAU/e,EAAM4d,cAChBvE,EAAYrZ,EAAMqZ,SASnB;QALM0F,GAAYA,IAAYhb,IAAWxG,EAAOyhB,SAAUjb,EAAQgb,MACjE/e,EAAME,KAAOmZ,EAAUG,SACvBnX,EAAMgX,EAAUN,QAAQnW,MAAO/B,KAAMgC,WACrC7C,EAAME,KAAOub,GAEPpZ,MAMJ9E,EAAO6P,QAAQ6R,gBAEpB1hB,EAAOyC,MAAMmZ,QAAQ9I,QACpB+J,MAAO,WAEN,MAAK7c,GAAOgK,SAAU1G,KAAM,SACpB,GAIRtD,EAAOyC,MAAM6K,IAAKhK,KAAM,iCAAkC,SAAUwE,GAEnE,GAAIzE,GAAOyE,EAAEtB,OACZmb,EAAO3hB,EAAOgK,SAAU3G,EAAM,UAAarD,EAAOgK,SAAU3G,EAAM,UAAaA,EAAKse,KAAOliB,CACvFkiB,KAAS3hB,EAAO0V,MAAOiM,EAAM,mBACjC3hB,EAAOyC,MAAM6K,IAAKqU,EAAM,iBAAkB,SAAUlf,GACnDA,EAAMmf,gBAAiB,IAExB5hB,EAAO0V,MAAOiM,EAAM,iBAAiB,MARvC3hB,IAcD0e,aAAc,SAAUjc,GAElBA,EAAMmf,uBACHnf,GAAMmf,eACRte,KAAKc,aAAe3B,EAAM+a,WAC9Bxd,EAAOyC,MAAMoe,SAAU,SAAUvd,KAAKc,WAAY3B,GAAO,KAK5Dwa,SAAU,WAET,MAAKjd,GAAOgK,SAAU1G,KAAM,SACpB,GAIRtD,EAAOyC,MAAMiG,OAAQpF,KAAM,YAA3BtD,MAMGA,EAAO6P,QAAQgS,gBAEpB7hB,EAAOyC,MAAMmZ,QAAQ7I,QAEpB8J,MAAO,WAEN,MAAK9B,GAAWhX,KAAMT,KAAK0G,YAIP,aAAd1G,KAAKX,MAAqC,UAAdW,KAAKX,QACrC3C,EAAOyC,MAAM6K,IAAKhK,KAAM,yBAA0B,SAAUb,GACjB,YAArCA,EAAMoc,cAAciD,eACxBxe,KAAKye,eAAgB,KAGvB/hB,EAAOyC,MAAM6K,IAAKhK,KAAM,gBAAiB,SAAUb,GAC7Ca,KAAKye,gBAAkBtf,EAAM+a,YACjCla,KAAKye,eAAgB,GAGtB/hB,EAAOyC,MAAMoe,SAAU,SAAUvd,KAAMb,GAAO,OAGzC,IAGRzC,EAAOyC,MAAM6K,IAAKhK,KAAM,yBAA0B,SAAUwE,GAC3D,GAAIzE,GAAOyE,EAAEtB,MAERuU,GAAWhX,KAAMV,EAAK2G,YAAehK,EAAO0V,MAAOrS,EAAM,mBAC7DrD,EAAOyC,MAAM6K,IAAKjK,EAAM,iBAAkB,SAAUZ,IAC9Ca,KAAKc,YAAe3B,EAAMse,aAAgBte,EAAM+a,WACpDxd,EAAOyC,MAAMoe,SAAU,SAAUvd,KAAKc,WAAY3B,GAAO,KAG3DzC,EAAO0V,MAAOrS,EAAM,iBAAiB,MATvCrD,IAcDmc,OAAQ,SAAU1Z,GACjB,GAAIY,GAAOZ,EAAM+D,MAGjB,OAAKlD,QAASD,GAAQZ,EAAMse,aAAete,EAAM+a,WAA4B,UAAdna,EAAKV,MAAkC,aAAdU,EAAKV,KACrFF,EAAMqZ,UAAUN,QAAQnW,MAAO/B,KAAMgC,WAD7C,GAKD2X,SAAU,WAGT,MAFAjd,GAAOyC,MAAMiG,OAAQpF,KAAM,aAEnByX,EAAWhX,KAAMT,KAAK0G,aAM3BhK,EAAO6P,QAAQmS,gBACpBhiB,EAAOgF,MAAOwb,MAAO,UAAWE,KAAM,YAAc,SAAUa,EAAMrD,GAGnE,GAAI+D,GAAW,EACdzG,EAAU,SAAU/Y,GACnBzC,EAAOyC,MAAMoe,SAAU3C,EAAKzb,EAAM+D,OAAQxG,EAAOyC,MAAMyb,IAAKzb,IAAS,GAGvEzC,GAAOyC,MAAMmZ,QAASsC,IACrBrB,MAAO,WACc,IAAfoF,KACJpiB,EAAS6C,iBAAkB6e,EAAM/F,GAAS,IAG5CyB,SAAU,WACW,MAAbgF,GACNpiB,EAASkD,oBAAqBwe,EAAM/F,GAAS,OAOlDxb,EAAOsB,GAAG2E,QAETic,GAAI,SAAU3G,EAAOna,EAAUgH,EAAM9G,EAAiByX,GACrD,GAAIpW,GAAMwf,CAGV,IAAsB,gBAAV5G,GAAqB,CAEP,gBAAbna,KAEXgH,EAAOA,GAAQhH,EACfA,EAAW3B,EAEZ,KAAMkD,IAAQ4Y,GACbjY,KAAK4e,GAAIvf,EAAMvB,EAAUgH,EAAMmT,EAAO5Y,GAAQoW,EAE/C,OAAOzV,MAmBR,GAhBa,MAAR8E,GAAsB,MAAN9G,GAEpBA,EAAKF,EACLgH,EAAOhH,EAAW3B,GACD,MAAN6B,IACc,gBAAbF,IAEXE,EAAK8G,EACLA,EAAO3I,IAGP6B,EAAK8G,EACLA,EAAOhH,EACPA,EAAW3B,IAGR6B,KAAO,EACXA,EAAK+Z,OACC,KAAM/Z,EACZ,MAAOgC,KAaR,OAVa,KAARyV,IACJoJ,EAAS7gB,EACTA,EAAK,SAAUmB,GAGd,MADAzC,KAASqH,IAAK5E,GACP0f,EAAO9c,MAAO/B,KAAMgC,YAG5BhE,EAAG2J,KAAOkX,EAAOlX,OAAUkX,EAAOlX,KAAOjL,EAAOiL,SAE1C3H,KAAK0B,KAAM,WACjBhF,EAAOyC,MAAM6K,IAAKhK,KAAMiY,EAAOja,EAAI8G,EAAMhH,MAG3C2X,IAAK,SAAUwC,EAAOna,EAAUgH,EAAM9G,GACrC,MAAOgC,MAAK4e,GAAI3G,EAAOna,EAAUgH,EAAM9G,EAAI,IAE5C+F,IAAK,SAAUkU,EAAOna,EAAUE,GAC/B,GAAIwa,GAAWnZ,CACf,IAAK4Y,GAASA,EAAMwC,gBAAkBxC,EAAMO,UAQ3C,MANAA,GAAYP,EAAMO,UAClB9b,EAAQub,EAAM8C,gBAAiBhX,IAC9ByU,EAAUY,UAAYZ,EAAUG,SAAW,IAAMH,EAAUY,UAAYZ,EAAUG,SACjFH,EAAU1a,SACV0a,EAAUN,SAEJlY,IAER,IAAsB,gBAAViY,GAAqB,CAEhC,IAAM5Y,IAAQ4Y,GACbjY,KAAK+D,IAAK1E,EAAMvB,EAAUma,EAAO5Y,GAElC,OAAOW,MAUR,OARKlC,KAAa,GAA6B,kBAAbA,MAEjCE,EAAKF,EACLA,EAAW3B,GAEP6B,KAAO,IACXA,EAAK+Z,IAEC/X,KAAK0B,KAAK,WAChBhF,EAAOyC,MAAMiG,OAAQpF,KAAMiY,EAAOja,EAAIF,MAIxCghB,KAAM,SAAU7G,EAAOnT,EAAM9G,GAC5B,MAAOgC,MAAK4e,GAAI3G,EAAO,KAAMnT,EAAM9G,IAEpC+gB,OAAQ,SAAU9G,EAAOja,GACxB,MAAOgC,MAAK+D,IAAKkU,EAAO,KAAMja,IAG/BghB,SAAU,SAAUlhB,EAAUma,EAAOnT,EAAM9G,GAC1C,MAAOgC,MAAK4e,GAAI3G,EAAOna,EAAUgH,EAAM9G,IAExCihB,WAAY,SAAUnhB,EAAUma,EAAOja,GAEtC,MAA4B,KAArBgE,UAAU9B,OAAeF,KAAK+D,IAAKjG,EAAU,MAASkC,KAAK+D,IAAKkU,EAAOna,GAAY,KAAME,IAGjG8F,QAAS,SAAUzE,EAAMyF,GACxB,MAAO9E,MAAK0B,KAAK,WAChBhF,EAAOyC,MAAM2E,QAASzE,EAAMyF,EAAM9E,SAGpCkf,eAAgB,SAAU7f,EAAMyF,GAC/B,GAAI/E,GAAOC,KAAK,EAChB,OAAKD,GACGrD,EAAOyC,MAAM2E,QAASzE,EAAMyF,EAAM/E,GAAM,GADhD,KAWF,SAAW7D,EAAQC,GAEnB,GAAIiG,GACH+c,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAnjB,EACAojB,EACAC,EACAC,EACAC,EACAxE,EACA6C,EACA4B,EAGAnQ,EAAU,UAAY,GAAKzH,MAC3B6X,EAAe9jB,EAAOK,SACtBgQ,KACA0T,EAAU,EACVne,EAAO,EACPoe,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAGhBG,QAAsBnkB,GACtBokB,EAAe,GAAK,GAGpBxZ,KACA0K,EAAM1K,EAAI0K,IACVtU,EAAO4J,EAAI5J,KACXE,EAAQ0J,EAAI1J,MAEZE,EAAUwJ,EAAIxJ,SAAW,SAAUwC,GAClC,GAAIqC,GAAI,EACPC,EAAMrC,KAAKE,MACZ,MAAYmC,EAAJD,EAASA,IAChB,GAAKpC,KAAKoC,KAAOrC,EAChB,MAAOqC,EAGT,OAAO,IAORoe,EAAa,sBAEbC,EAAoB,mCAKpBC,EAAaD,EAAkBhb,QAAS,IAAK,MAG7Ckb,EAAY,eACZhR,EAAa,MAAQ6Q,EAAa,KAAOC,EAAoB,IAAMD,EAClE,OAASG,EAAYH,EAAa,wCAA0CE,EAAa,QAAUF,EAAa,OAQjHI,EAAU,KAAOH,EAAoB,mEAAqE9Q,EAAWlK,QAAS,EAAG,GAAM,eAGvIpH,EAAYqb,OAAQ,IAAM8G,EAAa,8BAAgCA,EAAa,KAAM,KAE1FK,EAAanH,OAAQ,IAAM8G,EAAa,KAAOA,EAAa,KAC5DM,EAAmBpH,OAAQ,IAAM8G,EAAa,4BAA8BA,EAAa,KACzFO,EAAcrH,OAAQkH,GACtBI,EAAkBtH,OAAQ,IAAMgH,EAAa,KAE7CO,GACCC,GAAUxH,OAAQ,MAAQ+G,EAAoB,KAC9CU,MAAazH,OAAQ,QAAU+G,EAAoB,KACnDW,KAAY1H,OAAQ,mBAAqB+G,EAAoB,cAC7DY,IAAW3H,OAAQ,KAAO+G,EAAkBhb,QAAS,IAAK,MAAS,KACnE6b,KAAY5H,OAAQ,IAAM/J,GAC1B4R,OAAc7H,OAAQ,IAAMkH,GAC5BY,MAAa9H,OAAQ,yDAA2D8G,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KAGvCtH,aAAoBQ,OAAQ,IAAM8G,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEiB,EAAW,sBAEXC,EAAU,2BAGVpjB,EAAa,mCAEbqjB,EAAU,sCACVC,EAAU,SAEVC,EAAU,QACVC,EAAmB,gDAGnBC,GAAY,wCACZC,GAAY,SAAUjZ,EAAGkZ,GACxB,GAAIC,GAAO,KAAOD,EAAU,KAE5B,OAAOC,KAASA,EACfD,EAEO,EAAPC,EACC3d,OAAO4d,aAAcD,EAAO,OAE5B3d,OAAO4d,aAA2B,MAAbD,GAAQ,GAA4B,MAAR,KAAPA,GAI9C,KACC7kB,EAAM8D,KAAM6e,EAAa7Z,gBAAgBd,WAAY,GAAI,GAAG9E,SAC3D,MAAQiE,IACTnH,EAAQ,SAAU+E,GACjB,GAAIrC,GACHiH,IACD,OAASjH,EAAOC,KAAKoC,KACpB4E,EAAQ7J,KAAM4C,EAEf,OAAOiH,IAQT,QAASob,IAAUpkB,GAClB,MAAO0jB,GAAQjhB,KAAMzC,EAAK,IAS3B,QAASmiB,MACR,GAAI3O,GACH6Q,IAED,OAAQ7Q,GAAQ,SAAU/M,EAAKmC,GAM9B,MAJKyb,GAAKllB,KAAMsH,GAAO,KAAQ2a,EAAKkD,mBAE5B9Q,GAAO6Q,EAAKxY,SAEZ2H,EAAO/M,GAAQmC,GAQzB,QAAS2b,IAAcvkB,GAEtB,MADAA,GAAI4R,IAAY,EACT5R,EAOR,QAASwkB,IAAQxkB,GAChB,GAAI+O,GAAMxQ,EAAS2I,cAAc,MAEjC,KACC,MAAOlH,GAAI+O,GACV,MAAOvI,GACR,OAAO,EACN,QAEDuI,EAAM,MAIR,QAAS0V,IAAQ3kB,EAAUC,EAASiJ,EAAS0b,GAC5C,GAAI5iB,GAAOC,EAAM4iB,EAAGpiB,EAEnB6B,EAAGwgB,EAAQC,EAAKC,EAAKC,EAAYC,CASlC,KAPOjlB,EAAUA,EAAQyC,eAAiBzC,EAAUiiB,KAAmBzjB,GACtEmjB,EAAa3hB,GAGdA,EAAUA,GAAWxB,EACrByK,EAAUA,OAEJlJ,GAAgC,gBAAbA,GACxB,MAAOkJ,EAGR,IAAuC,KAAjCzG,EAAWxC,EAAQwC,WAAgC,IAAbA,EAC3C,QAGD,KAAMqf,IAAkB8C,EAAO,CAG9B,GAAM5iB,EAAQxB,EAAW6B,KAAMrC,GAE9B,GAAM6kB,EAAI7iB,EAAM,IACf,GAAkB,IAAbS,EAAiB,CAIrB,GAHAR,EAAOhC,EAAQ8C,eAAgB8hB,IAG1B5iB,IAAQA,EAAKe,WAQjB,MAAOkG,EALP,IAAKjH,EAAKgB,KAAO4hB,EAEhB,MADA3b,GAAQ7J,KAAM4C,GACPiH,MAOT,IAAKjJ,EAAQyC,gBAAkBT,EAAOhC,EAAQyC,cAAcK,eAAgB8hB,KAC3ExE,EAAUpgB,EAASgC,IAAUA,EAAKgB,KAAO4hB,EAEzC,MADA3b,GAAQ7J,KAAM4C,GACPiH,MAKH,CAAA,GAAKlH,EAAM,GAEjB,MADA3C,GAAK4E,MAAOiF,EAAS3J,EAAM8D,KAAKpD,EAAQqI,qBAAsBtI,GAAY,IACnEkJ,CAGD,KAAM2b,EAAI7iB,EAAM,KAAOyM,EAAQ0W,gBAAkBllB,EAAQmlB,uBAE/D,MADA/lB,GAAK4E,MAAOiF,EAAS3J,EAAM8D,KAAKpD,EAAQmlB,uBAAwBP,GAAK,IAC9D3b,EAKT,GAAKuF,EAAQ4W,MAAQtD,EAAUpf,KAAK3C,GAAY,CAU/C,GATA+kB,GAAM,EACNC,EAAMlT,EACNmT,EAAahlB,EACbilB,EAA2B,IAAbziB,GAAkBzC,EAMd,IAAbyC,GAAqD,WAAnCxC,EAAQ2I,SAASC,cAA6B,CACpEic,EAASQ,GAAUtlB,IAEb+kB,EAAM9kB,EAAQ4P,aAAa,OAChCmV,EAAMD,EAAIpd,QAASoc,EAAS,QAE5B9jB,EAAQiP,aAAc,KAAM8V,GAE7BA,EAAM,QAAUA,EAAM,MAEtB1gB,EAAIwgB,EAAO1iB,MACX,OAAQkC,IACPwgB,EAAOxgB,GAAK0gB,EAAMO,GAAYT,EAAOxgB,GAEtC2gB,GAAatB,EAAShhB,KAAM3C,IAAcC,EAAQ+C,YAAc/C,EAChEilB,EAAcJ,EAAOvJ,KAAK,KAG3B,GAAK2J,EACJ,IAIC,MAHA7lB,GAAK4E,MAAOiF,EAAS3J,EAAM8D,KAAM4hB,EAAWO,iBAC3CN,GACE,IACIhc,EACN,MAAMuc,IACN,QACKV,GACL9kB,EAAQiY,gBAAgB,QAQ7B,MAAOtJ,IAAQ5O,EAAS2H,QAASpH,EAAO,MAAQN,EAASiJ,EAAS0b,GAOnEpD,EAAQmD,GAAOnD,MAAQ,SAAUvf,GAGhC,GAAIoG,GAAkBpG,IAASA,EAAKS,eAAiBT,GAAMoG,eAC3D,OAAOA,GAA+C,SAA7BA,EAAgBO,UAAsB,GAQhEgZ,EAAc+C,GAAO/C,YAAc,SAAU8D,GAC5C,GAAInH,GAAMmH,EAAOA,EAAKhjB,eAAiBgjB,EAAOxD,CAG9C,OAAK3D,KAAQ9f,GAA6B,IAAjB8f,EAAI9b,UAAmB8b,EAAIlW,iBAKpD5J,EAAW8f,EACXsD,EAAUtD,EAAIlW,gBAGdyZ,EAAgBN,EAAOjD,GAGvB9P,EAAQkX,kBAAoBjB,GAAO,SAAUzV,GAE5C,MADAA,GAAIG,YAAamP,EAAIqH,cAAc,MAC3B3W,EAAI3G,qBAAqB,KAAKlG,SAIvCqM,EAAQoD,WAAa6S,GAAO,SAAUzV,GACrCA,EAAIE,UAAY,mBAChB,IAAI5N,SAAc0N,GAAIuC,UAAU3B,aAAa,WAE7C,OAAgB,YAATtO,GAA+B,WAATA,IAI9BkN,EAAQ0W,eAAiBT,GAAO,SAAUzV,GAGzC,MADAA,GAAIE,UAAY,yDACVF,EAAImW,wBAA2BnW,EAAImW,uBAAuB,KAAKhjB,QAKrE6M,EAAIuC,UAAUhC,UAAY,IACwB,IAA3CP,EAAImW,uBAAuB,KAAKhjB,SAL/B,IAUTqM,EAAQ+E,UAAYkR,GAAO,SAAUzV,GAEpCA,EAAIhM,GAAK6O,EAAU,EACnB7C,EAAIE,UAAY,YAAc2C,EAAU,oBAAsBA,EAAU,WACxE+P,EAAQgE,aAAc5W,EAAK4S,EAAQnS,WAGnC,IAAIoW,GAAOvH,EAAIwH,mBAEdxH,EAAIwH,kBAAmBjU,GAAU1P,SAAW,EAE5Cmc,EAAIwH,kBAAmBjU,EAAU,GAAI1P,MAMtC,OALAqM,GAAQuX,cAAgBzH,EAAIxb,eAAgB+O,GAG5C+P,EAAQ7O,YAAa/D,GAEd6W,IAIRxE,EAAK2E,WAAavB,GAAO,SAAUzV,GAElC,MADAA,GAAIE,UAAY,mBACTF,EAAIS,kBAAqBT,GAAIS,WAAWG,eAAiB2S,GACvB,MAAxCvT,EAAIS,WAAWG,aAAa,cAI5BuJ,KAAQ,SAAUnX,GACjB,MAAOA,GAAK4N,aAAc,OAAQ,IAEnCtO,KAAQ,SAAUU,GACjB,MAAOA,GAAK4N,aAAa,UAKvBpB,EAAQuX,cACZ1E,EAAKhf,KAAS,GAAI,SAAUW,EAAIhD,GAC/B,SAAYA,GAAQ8C,iBAAmByf,IAAiBV,EAAgB,CACvE,GAAI+C,GAAI5kB,EAAQ8C,eAAgBE,EAGhC,OAAO4hB,IAAKA,EAAE7hB,YAAc6hB,QAG9BvD,EAAKrD,OAAW,GAAI,SAAUhb,GAC7B,GAAIijB,GAASjjB,EAAG0E,QAASsc,GAAWC,GACpC,OAAO,UAAUjiB,GAChB,MAAOA,GAAK4N,aAAa,QAAUqW,MAIrC5E,EAAKhf,KAAS,GAAI,SAAUW,EAAIhD,GAC/B,SAAYA,GAAQ8C,iBAAmByf,IAAiBV,EAAgB,CACvE,GAAI+C,GAAI5kB,EAAQ8C,eAAgBE,EAEhC,OAAO4hB,GACNA,EAAE5hB,KAAOA,SAAa4hB,GAAE3L,mBAAqBsJ,GAAgBqC,EAAE3L,iBAAiB,MAAMpQ,QAAU7F,GAC9F4hB,GACDxmB,OAIJijB,EAAKrD,OAAW,GAAK,SAAUhb,GAC9B,GAAIijB,GAASjjB,EAAG0E,QAASsc,GAAWC,GACpC,OAAO,UAAUjiB,GAChB,GAAIyjB,SAAczjB,GAAKiX,mBAAqBsJ,GAAgBvgB,EAAKiX,iBAAiB,KAClF,OAAOwM,IAAQA,EAAK5c,QAAUod,KAMjC5E,EAAKhf,KAAU,IAAImM,EAAQkX,kBAC1B,SAAUQ,EAAKlmB,GACd,aAAYA,GAAQqI,uBAAyBka,EACrCviB,EAAQqI,qBAAsB6d,GADtC,GAID,SAAUA,EAAKlmB,GACd,GAAIgC,GACH8F,KACAzD,EAAI,EACJ4E,EAAUjJ,EAAQqI,qBAAsB6d,EAGzC,IAAa,MAARA,EAAc,CAClB,MAASlkB,EAAOiH,EAAQ5E,KACA,IAAlBrC,EAAKQ,UACTsF,EAAI1I,KAAM4C,EAIZ,OAAO8F,GAER,MAAOmB,IAIToY,EAAKhf,KAAW,KAAImM,EAAQ+E,WAAa,SAAU2S,EAAKlmB,GACvD,aAAYA,GAAQ8lB,oBAAsBvD,EAClCviB,EAAQ8lB,kBAAmB9gB,MADnC,GAMDqc,EAAKhf,KAAY,MAAImM,EAAQ0W,gBAAkB,SAAU3V,EAAWvP,GACnE,aAAYA,GAAQmlB,yBAA2B5C,GAAiBV,EAAhE,EACQ7hB,EAAQmlB,uBAAwB5V,IAOzCwS,KAKAD,GAAc,WAERtT,EAAQ4W,IAAMf,GAAS/F,EAAIiH,qBAGhCd,GAAO,SAAUzV,GAMhBA,EAAIE,UAAY,iDAGVF,EAAIuW,iBAAiB,cAAcpjB,QACxC2f,EAAU1iB,KAAM,MAAQqjB,EAAa,gEAMhCzT,EAAIuW,iBAAiB,YAAYpjB,QACtC2f,EAAU1iB,KAAK,cAIjBqlB,GAAO,SAAUzV,GAIhBA,EAAIE,UAAY,8BACXF,EAAIuW,iBAAiB,WAAWpjB,QACpC2f,EAAU1iB,KAAM,SAAWqjB,EAAa,gBAKnCzT,EAAIuW,iBAAiB,YAAYpjB,QACtC2f,EAAU1iB,KAAM,WAAY,aAI7B4P,EAAIuW,iBAAiB,QACrBzD,EAAU1iB,KAAK,YAIXoP,EAAQ2X,gBAAkB9B,GAAW9G,EAAUqE,EAAQuE,iBAC5DvE,EAAQwE,oBACRxE,EAAQyE,uBACRzE,EAAQ0E,kBACR1E,EAAQ2E,qBAER9B,GAAO,SAAUzV,GAGhBR,EAAQgY,kBAAoBjJ,EAAQna,KAAM4L,EAAK,OAI/CuO,EAAQna,KAAM4L,EAAK,aACnB+S,EAAc3iB,KAAM,KAAMyjB,KAI5Bf,EAAgBnG,OAAQmG,EAAUxG,KAAK,MACvCyG,EAAoBpG,OAAQoG,EAAczG,KAAK,MAK/C8E,EAAWiE,GAASzC,EAAQxB,WAAawB,EAAQ6E,wBAChD,SAAUhY,EAAGiY,GACZ,GAAIC,GAAuB,IAAflY,EAAEjM,SAAiBiM,EAAErG,gBAAkBqG,EAClDmY,EAAMF,GAAKA,EAAE3jB,UACd,OAAO0L,KAAMmY,MAAWA,GAAwB,IAAjBA,EAAIpkB,YAClCmkB,EAAMvG,SACLuG,EAAMvG,SAAUwG,GAChBnY,EAAEgY,yBAA8D,GAAnChY,EAAEgY,wBAAyBG,MAG3D,SAAUnY,EAAGiY,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAE3jB,WACd,GAAK2jB,IAAMjY,EACV,OAAO,CAIV,QAAO,GAITuT,EAAYJ,EAAQ6E,wBACpB,SAAUhY,EAAGiY,GACZ,GAAIG,EAEJ,OAAKpY,KAAMiY,GACVjF,GAAe,EACR,IAGFoF,EAAUH,EAAED,yBAA2BhY,EAAEgY,yBAA2BhY,EAAEgY,wBAAyBC,IACrF,EAAVG,GAAepY,EAAE1L,YAAwC,KAA1B0L,EAAE1L,WAAWP,SAC3CiM,IAAM6P,GAAO8B,EAAU6B,EAAcxT,GAClC,GAEHiY,IAAMpI,GAAO8B,EAAU6B,EAAcyE,GAClC,EAED,EAES,EAAVG,EAAc,GAAK,EAGpBpY,EAAEgY,wBAA0B,GAAK,GAEzC,SAAUhY,EAAGiY,GACZ,GAAI3R,GACH1Q,EAAI,EACJyiB,EAAMrY,EAAE1L,WACR6jB,EAAMF,EAAE3jB,WACRgkB,GAAOtY,GACPuY,GAAON,EAGR,IAAKjY,IAAMiY,EAEV,MADAjF,IAAe,EACR,CAGD,KAAMqF,IAAQF,EACpB,MAAOnY,KAAM6P,EAAM,GAClBoI,IAAMpI,EAAM,EACZwI,EAAM,GACNF,EAAM,EACN,CAGK,IAAKE,IAAQF,EACnB,MAAOK,IAAcxY,EAAGiY,EAIzB3R,GAAMtG,CACN,OAASsG,EAAMA,EAAIhS,WAClBgkB,EAAG/R,QAASD,EAEbA,GAAM2R,CACN,OAAS3R,EAAMA,EAAIhS,WAClBikB,EAAGhS,QAASD,EAIb,OAAQgS,EAAG1iB,KAAO2iB,EAAG3iB,GACpBA,GAGD,OAAOA,GAEN4iB,GAAcF,EAAG1iB,GAAI2iB,EAAG3iB,IAGxB0iB,EAAG1iB,KAAO4d,EAAe,GACzB+E,EAAG3iB,KAAO4d,EAAe,EACzB,GAKFR,GAAe,GACd,EAAG,GAAG/c,KAAMsd,GACbxT,EAAQ0Y,iBAAmBzF,EAEpBjjB,GA9UCA,GAiVTkmB,GAAOnH,QAAU,SAAUnC,EAAMxF,GAChC,MAAO8O,IAAQtJ,EAAM,KAAM,KAAMxF,IAGlC8O,GAAOyB,gBAAkB,SAAUnkB,EAAMoZ,GAUxC,IAROpZ,EAAKS,eAAiBT,KAAWxD,GACvCmjB,EAAa3f,GAIdoZ,EAAOA,EAAK1T,QAASqc,EAAkB,aAGlCvV,EAAQ2X,iBAAoBtE,GAAmBE,GAAkBA,EAAcrf,KAAK0Y,IAAW0G,EAAUpf,KAAK0Y,IAClH,IACC,GAAI3X,GAAM8Z,EAAQna,KAAMpB,EAAMoZ,EAG9B,IAAK3X,GAAO+K,EAAQgY,mBAGlBxkB,EAAKxD,UAAuC,KAA3BwD,EAAKxD,SAASgE,SAChC,MAAOiB,GAEP,MAAMgD,IAGT,MAAOie,IAAQtJ,EAAM5c,EAAU,MAAOwD,IAAQG,OAAS,GAGxDuiB,GAAOtE,SAAW,SAAUpgB,EAASgC,GAKpC,OAHOhC,EAAQyC,eAAiBzC,KAAcxB,GAC7CmjB,EAAa3hB,GAEPogB,EAAUpgB,EAASgC,IAG3B0iB,GAAO7hB,KAAO,SAAUb,EAAMgD,GAC7B,GAAIoS,EAUJ,QAPOpV,EAAKS,eAAiBT,KAAWxD,GACvCmjB,EAAa3f,GAGR6f,IACL7c,EAAOA,EAAK4D,gBAEPwO,EAAMiK,EAAK2E,WAAYhhB,IACrBoS,EAAKpV,GAER6f,GAAiBrT,EAAQoD,WACtB5P,EAAK4N,aAAc5K,KAEjBoS,EAAMpV,EAAKiX,iBAAkBjU,KAAWhD,EAAK4N,aAAc5K,KAAYhD,EAAMgD,MAAW,EACjGA,EACAoS,GAAOA,EAAII,UAAYJ,EAAIvO,MAAQ,MAGrC6b,GAAO9d,MAAQ,SAAUC,GACxB,KAAUC,OAAO,0CAA4CD,IAI9D6d,GAAOyC,WAAa,SAAUle,GAC7B,GAAIjH,GACHolB,KACA/iB,EAAI,EACJE,EAAI,CAML,IAHAkd,GAAgBjT,EAAQ0Y,iBACxBje,EAAQvE,KAAMsd,GAETP,EAAe,CACnB,KAASzf,EAAOiH,EAAQ5E,GAAKA,IACvBrC,IAASiH,EAAS5E,EAAI,KAC1BE,EAAI6iB,EAAWhoB,KAAMiF,GAGvB,OAAQE,IACP0E,EAAQtE,OAAQyiB,EAAY7iB,GAAK,GAInC,MAAO0E,GAGR,SAASge,IAAcxY,EAAGiY,GACzB,GAAI3R,GAAM2R,GAAKjY,EACd4Y,EAAOtS,KAAU2R,EAAEY,aAAe9E,KAAoB/T,EAAE6Y,aAAe9E,EAGxE,IAAK6E,EACJ,MAAOA,EAIR,IAAKtS,EACJ,MAASA,EAAMA,EAAIwS,YAClB,GAAKxS,IAAQ2R,EACZ,MAAO,EAKV,OAAOjY,GAAI,EAAI,GAIhB,QAAS+Y,IAAmBlmB,GAC3B,MAAO,UAAUU,GAChB,GAAIgD,GAAOhD,EAAK2G,SAASC,aACzB,OAAgB,UAAT5D,GAAoBhD,EAAKV,OAASA,GAK3C,QAASmmB,IAAoBnmB,GAC5B,MAAO,UAAUU,GAChB,GAAIgD,GAAOhD,EAAK2G,SAASC,aACzB,QAAiB,UAAT5D,GAA6B,WAATA,IAAsBhD,EAAKV,OAASA,GAKlE,QAASomB,IAAwBznB,GAChC,MAAOukB,IAAa,SAAUmD,GAE7B,MADAA,IAAYA,EACLnD,GAAa,SAAUG,EAAMpH,GACnC,GAAIhZ,GACHqjB,EAAe3nB,KAAQ0kB,EAAKxiB,OAAQwlB,GACpCtjB,EAAIujB,EAAazlB,MAGlB,OAAQkC,IACFsgB,EAAOpgB,EAAIqjB,EAAavjB,MAC5BsgB,EAAKpgB,KAAOgZ,EAAQhZ,GAAKogB,EAAKpgB,SAWnC+c,EAAUoD,GAAOpD,QAAU,SAAUtf,GACpC,GAAIyjB,GACHhiB,EAAM,GACNY,EAAI,EACJ7B,EAAWR,EAAKQ,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBR,GAAK6lB,YAChB,MAAO7lB,GAAK6lB,WAGZ,KAAM7lB,EAAOA,EAAKyN,WAAYzN,EAAMA,EAAOA,EAAKulB,YAC/C9jB,GAAO6d,EAAStf,OAGZ,IAAkB,IAAbQ,GAA+B,IAAbA,EAC7B,MAAOR,GAAK8lB,cAhBZ,MAASrC,EAAOzjB,EAAKqC,GAAKA,IAEzBZ,GAAO6d,EAASmE,EAkBlB,OAAOhiB,IAGR4d,EAAOqD,GAAOqD,WAGbxD,YAAa,GAEbyD,aAAcxD,GAEdziB,MAAOmhB,EAEP7gB,QAEA4lB,UACCC,KAAOC,IAAK,aAAcjkB,OAAO,GACjCkkB,KAAOD,IAAK,cACZE,KAAOF,IAAK,kBAAmBjkB,OAAO,GACtCokB,KAAOH,IAAK,oBAGbI,WACChF,KAAQ,SAAUxhB,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAG2F,QAASsc,GAAWC,IAGxCliB,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAM,IAAK2F,QAASsc,GAAWC,IAE5C,OAAbliB,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAMzC,MAAO,EAAG,IAGxBmkB,MAAS,SAAU1hB,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAG6G,cAEY,QAA3B7G,EAAM,GAAGzC,MAAO,EAAG,IAEjByC,EAAM,IACX2iB,GAAO9d,MAAO7E,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjB2iB,GAAO9d,MAAO7E,EAAM,IAGdA,GAGRyhB,OAAU,SAAUzhB,GACnB,GAAIymB,GACHC,GAAY1mB,EAAM,IAAMA,EAAM,EAE/B,OAAKmhB,GAAiB,MAAExgB,KAAMX,EAAM,IAC5B,MAIHA,EAAM,GACVA,EAAM,GAAKA,EAAM,GAGN0mB,GAAYzF,EAAQtgB,KAAM+lB,KAEpCD,EAASnD,GAAUoD,GAAU,MAE7BD,EAASC,EAASjpB,QAAS,IAAKipB,EAAStmB,OAASqmB,GAAWC,EAAStmB,UAGvEJ,EAAM,GAAKA,EAAM,GAAGzC,MAAO,EAAGkpB,GAC9BzmB,EAAM,GAAK0mB,EAASnpB,MAAO,EAAGkpB,IAIxBzmB,EAAMzC,MAAO,EAAG,MAIzB0e,QAECsF,IAAO,SAAU3a,GAChB,MAAkB,MAAbA,EACG,WAAa,OAAO,IAG5BA,EAAWA,EAASjB,QAASsc,GAAWC,IAAYrb,cAC7C,SAAU5G,GAChB,MAAOA,GAAK2G,UAAY3G,EAAK2G,SAASC,gBAAkBD,KAI1Dya,MAAS,SAAU7T,GAClB,GAAImZ,GAAUvG,EAAY5S,EAAY,IAEtC,OAAOmZ,KACLA,EAAc/M,OAAQ,MAAQ8G,EAAa,IAAMlT,EAAY,IAAMkT,EAAa,SACjFN,EAAY5S,EAAW,SAAUvN,GAChC,MAAO0mB,GAAQhmB,KAAMV,EAAKuN,iBAAqBvN,GAAK4N,eAAiB2S,GAAgBvgB,EAAK4N,aAAa,UAAa,OAIvH2T,KAAQ,SAAUve,EAAM2jB,EAAUC,GACjC,MAAO,UAAU5mB,GAChB,GAAIqa,GAASqI,GAAO7hB,KAAMb,EAAMgD,EAEhC,OAAe,OAAVqX,EACgB,OAAbsM,EAEFA,GAINtM,GAAU,GAEU,MAAbsM,EAAmBtM,IAAWuM,EACvB,OAAbD,EAAoBtM,IAAWuM,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BvM,EAAO7c,QAASopB,GAChC,OAAbD,EAAoBC,GAASvM,EAAO7c,QAASopB,GAAU,GAC1C,OAAbD,EAAoBC,GAASvM,EAAO/c,OAAQspB,EAAMzmB,UAAaymB,EAClD,OAAbD,GAAsB,IAAMtM,EAAS,KAAM7c,QAASopB,GAAU,GACjD,OAAbD,EAAoBtM,IAAWuM,GAASvM,EAAO/c,MAAO,EAAGspB,EAAMzmB,OAAS,KAAQymB,EAAQ,KACxF,IAZO,IAgBVnF,MAAS,SAAUniB,EAAMunB,EAAMlB,EAAUzjB,EAAOE,GAC/C,GAAI0kB,GAAgC,QAAvBxnB,EAAKhC,MAAO,EAAG,GAC3BypB,EAA+B,SAArBznB,EAAKhC,MAAO,IACtB0pB,EAAkB,YAATH,CAEV,OAAiB,KAAV3kB,GAAwB,IAATE,EAGrB,SAAUpC,GACT,QAASA,EAAKe,YAGf,SAAUf,EAAMhC,EAAS6H,GACxB,GAAI4L,GAAOwV,EAAYxD,EAAM4B,EAAM6B,EAAWhd,EAC7Cic,EAAMW,IAAWC,EAAU,cAAgB,kBAC3CtP,EAASzX,EAAKe,WACdiC,EAAOgkB,GAAUhnB,EAAK2G,SAASC,cAC/BugB,GAAYthB,IAAQmhB,CAErB,IAAKvP,EAAS,CAGb,GAAKqP,EAAS,CACb,MAAQX,EAAM,CACb1C,EAAOzjB,CACP,OAASyjB,EAAOA,EAAM0C,GACrB,GAAKa,EAASvD,EAAK9c,SAASC,gBAAkB5D,EAAyB,IAAlBygB,EAAKjjB,SACzD,OAAO,CAIT0J,GAAQic,EAAe,SAAT7mB,IAAoB4K,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAU6c,EAAUtP,EAAOhK,WAAagK,EAAOlI,WAG1CwX,GAAWI,EAAW,CAE1BF,EAAaxP,EAAQ5H,KAAc4H,EAAQ5H,OAC3C4B,EAAQwV,EAAY3nB,OACpB4nB,EAAYzV,EAAM,KAAOyO,GAAWzO,EAAM,GAC1C4T,EAAO5T,EAAM,KAAOyO,GAAWzO,EAAM,GACrCgS,EAAOyD,GAAazP,EAAOnS,WAAY4hB,EAEvC,OAASzD,IAASyD,GAAazD,GAAQA,EAAM0C,KAG3Cd,EAAO6B,EAAY,IAAMhd,EAAMwH,MAGhC,GAAuB,IAAlB+R,EAAKjjB,YAAoB6kB,GAAQ5B,IAASzjB,EAAO,CACrDinB,EAAY3nB,IAAW4gB,EAASgH,EAAW7B,EAC3C,YAKI,IAAK8B,IAAa1V,GAASzR,EAAM6P,KAAc7P,EAAM6P,QAAkBvQ,KAAWmS,EAAM,KAAOyO,EACrGmF,EAAO5T,EAAM,OAKb,OAASgS,IAASyD,GAAazD,GAAQA,EAAM0C,KAC3Cd,EAAO6B,EAAY,IAAMhd,EAAMwH,MAEhC,IAAOsV,EAASvD,EAAK9c,SAASC,gBAAkB5D,EAAyB,IAAlBygB,EAAKjjB,aAAsB6kB,IAE5E8B,KACH1D,EAAM5T,KAAc4T,EAAM5T,QAAkBvQ,IAAW4gB,EAASmF,IAG7D5B,IAASzjB,GACb,KAQJ,OADAqlB,IAAQjjB,EACDijB,IAASnjB,GAA4B,IAAjBmjB,EAAOnjB,GAAemjB,EAAOnjB,GAAS,KAKrEsf,OAAU,SAAU4F,EAAQzB,GAK3B,GAAI9jB,GACH5D,EAAKohB,EAAKwB,QAASuG,IAAY/H,EAAKgI,WAAYD,EAAOxgB,gBACtD8b,GAAO9d,MAAO,uBAAyBwiB,EAKzC,OAAKnpB,GAAI4R,GACD5R,EAAI0nB,GAIP1nB,EAAGkC,OAAS,GAChB0B,GAASulB,EAAQA,EAAQ,GAAIzB,GACtBtG,EAAKgI,WAAWzpB,eAAgBwpB,EAAOxgB,eAC7C4b,GAAa,SAAUG,EAAMpH,GAC5B,GAAI+L,GACHxM,EAAU7c,EAAI0kB,EAAMgD,GACpBtjB,EAAIyY,EAAQ3a,MACb,OAAQkC,IACPilB,EAAM9pB,EAAQ4D,KAAMuhB,EAAM7H,EAAQzY,IAClCsgB,EAAM2E,KAAW/L,EAAS+L,GAAQxM,EAAQzY,MAG5C,SAAUrC,GACT,MAAO/B,GAAI+B,EAAM,EAAG6B,KAIhB5D,IAIT4iB,SAEC0G,IAAO/E,GAAa,SAAUzkB,GAI7B,GAAI2O,MACHzF,KACAugB,EAAUhI,EAASzhB,EAAS2H,QAASpH,EAAO,MAE7C,OAAOkpB,GAAS3X,GACf2S,GAAa,SAAUG,EAAMpH,EAASvd,EAAS6H,GAC9C,GAAI7F,GACHynB,EAAYD,EAAS7E,EAAM,KAAM9c,MACjCxD,EAAIsgB,EAAKxiB,MAGV,OAAQkC,KACDrC,EAAOynB,EAAUplB,MACtBsgB,EAAKtgB,KAAOkZ,EAAQlZ,GAAKrC,MAI5B,SAAUA,EAAMhC,EAAS6H,GAGxB,MAFA6G,GAAM,GAAK1M,EACXwnB,EAAS9a,EAAO,KAAM7G,EAAKoB,IACnBA,EAAQyK,SAInBtH,IAAOoY,GAAa,SAAUzkB,GAC7B,MAAO,UAAUiC,GAChB,MAAO0iB,IAAQ3kB,EAAUiC,GAAOG,OAAS,KAI3Cie,SAAYoE,GAAa,SAAUzb,GAClC,MAAO,UAAU/G,GAChB,OAASA,EAAK6lB,aAAe7lB,EAAK0nB,WAAapI,EAAStf,IAASxC,QAASuJ,GAAS,MAWrF4gB,KAAQnF,GAAc,SAAUmF,GAM/B,MAJM1G,GAAYvgB,KAAKinB,GAAQ,KAC9BjF,GAAO9d,MAAO,qBAAuB+iB,GAEtCA,EAAOA,EAAKjiB,QAASsc,GAAWC,IAAYrb,cACrC,SAAU5G,GAChB,GAAI4nB,EACJ,GACC,IAAMA,EAAW/H,EAChB7f,EAAK4N,aAAa,aAAe5N,EAAK4N,aAAa,QACnD5N,EAAK2nB,KAGL,MADAC,GAAWA,EAAShhB,cACbghB,IAAaD,GAA2C,IAAnCC,EAASpqB,QAASmqB,EAAO,YAE5C3nB,EAAOA,EAAKe,aAAiC,IAAlBf,EAAKQ,SAC3C,QAAO,KAKT2C,OAAU,SAAUnD,GACnB,GAAI6nB,GAAO1rB,EAAOM,UAAYN,EAAOM,SAASorB,IAC9C,OAAOA,IAAQA,EAAKvqB,MAAO,KAAQ0C,EAAKgB,IAGzC8mB,KAAQ,SAAU9nB,GACjB,MAAOA,KAAS4f,GAGjBzC,MAAS,SAAUnd,GAClB,MAAOA,KAASxD,EAAS4gB,iBAAmB5gB,EAASurB,UAAYvrB,EAASurB,gBAAkB/nB,EAAKV,MAAQU,EAAKmX,OAASnX,EAAK+W,WAI7HiR,QAAW,SAAUhoB,GACpB,MAAOA,GAAKuK,YAAa,GAG1BA,SAAY,SAAUvK,GACrB,MAAOA,GAAKuK,YAAa,GAG1ByE,QAAW,SAAUhP,GAGpB,GAAI2G,GAAW3G,EAAK2G,SAASC,aAC7B,OAAqB,UAAbD,KAA0B3G,EAAKgP,SAA0B,WAAbrI,KAA2B3G,EAAKkO,UAGrFA,SAAY,SAAUlO,GAOrB,MAJKA,GAAKe,YACTf,EAAKe,WAAW0U,cAGVzV,EAAKkO,YAAa,GAI1B5D,MAAS,SAAUtK,GAMlB,IAAMA,EAAOA,EAAKyN,WAAYzN,EAAMA,EAAOA,EAAKulB,YAC/C,GAAKvlB,EAAK2G,SAAW,KAAyB,IAAlB3G,EAAKQ,UAAoC,IAAlBR,EAAKQ,SACvD,OAAO,CAGT,QAAO,GAGRiX,OAAU,SAAUzX,GACnB,OAAQqf,EAAKwB,QAAe,MAAG7gB,IAIhCioB,OAAU,SAAUjoB,GACnB,MAAO6hB,GAAQnhB,KAAMV,EAAK2G,WAG3B+F,MAAS,SAAU1M,GAClB,MAAO4hB,GAAQlhB,KAAMV,EAAK2G,WAG3B2Q,OAAU,SAAUtX,GACnB,GAAIgD,GAAOhD,EAAK2G,SAASC,aACzB,OAAgB,UAAT5D,GAAkC,WAAdhD,EAAKV,MAA8B,WAAT0D,GAGtD+D,KAAQ,SAAU/G,GACjB,GAAIa,EAGJ,OAAuC,UAAhCb,EAAK2G,SAASC,eACN,SAAd5G,EAAKV,OACmC,OAArCuB,EAAOb,EAAK4N,aAAa,UAAoB/M,EAAK+F,gBAAkB5G,EAAKV,OAI9E4C,MAASwjB,GAAuB,WAC/B,OAAS,KAGVtjB,KAAQsjB,GAAuB,SAAUE,EAAczlB,GACtD,OAASA,EAAS,KAGnBgC,GAAMujB,GAAuB,SAAUE,EAAczlB,EAAQwlB,GAC5D,OAAoB,EAAXA,EAAeA,EAAWxlB,EAASwlB,KAG7CuC,KAAQxC,GAAuB,SAAUE,EAAczlB,GACtD,GAAIkC,GAAI,CACR,MAAYlC,EAAJkC,EAAYA,GAAK,EACxBujB,EAAaxoB,KAAMiF,EAEpB,OAAOujB,KAGRuC,IAAOzC,GAAuB,SAAUE,EAAczlB,GACrD,GAAIkC,GAAI,CACR,MAAYlC,EAAJkC,EAAYA,GAAK,EACxBujB,EAAaxoB,KAAMiF,EAEpB,OAAOujB,KAGRwC,GAAM1C,GAAuB,SAAUE,EAAczlB,EAAQwlB,GAC5D,GAAItjB,GAAe,EAAXsjB,EAAeA,EAAWxlB,EAASwlB,CAC3C,QAAUtjB,GAAK,GACdujB,EAAaxoB,KAAMiF,EAEpB,OAAOujB,KAGRyC,GAAM3C,GAAuB,SAAUE,EAAczlB,EAAQwlB,GAC5D,GAAItjB,GAAe,EAAXsjB,EAAeA,EAAWxlB,EAASwlB,CAC3C,MAAcxlB,IAAJkC,GACTujB,EAAaxoB,KAAMiF,EAEpB,OAAOujB,MAMV,KAAMvjB,KAAOimB,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5ErJ,EAAKwB,QAASxe,GAAMmjB,GAAmBnjB,EAExC,KAAMA,KAAOoN,QAAQ,EAAMkZ,OAAO,GACjCtJ,EAAKwB,QAASxe,GAAMojB,GAAoBpjB,EAGzC,SAASghB,IAAUtlB,EAAU6qB,GAC5B,GAAI9N,GAAS/a,EAAO8oB,EAAQvpB,EAC3BwpB,EAAOjG,EAAQkG,EACfC,EAAS3I,EAAYtiB,EAAW,IAEjC,IAAKirB,EACJ,MAAOJ,GAAY,EAAII,EAAO1rB,MAAO,EAGtCwrB,GAAQ/qB,EACR8kB,KACAkG,EAAa1J,EAAKkH,SAElB,OAAQuC,EAAQ,GAGThO,IAAY/a,EAAQ+gB,EAAO1gB,KAAM0oB,OACjC/oB,IAEJ+oB,EAAQA,EAAMxrB,MAAOyC,EAAM,GAAGI,SAAY2oB,GAE3CjG,EAAOzlB,KAAMyrB,OAGd/N,GAAU,GAGJ/a,EAAQghB,EAAa3gB,KAAM0oB,MAChChO,EAAU/a,EAAM+J,QAChB+e,EAAOzrB,MACNyJ,MAAOiU,EAEPxb,KAAMS,EAAM,GAAG2F,QAASpH,EAAO,OAEhCwqB,EAAQA,EAAMxrB,MAAOwd,EAAQ3a,QAI9B,KAAMb,IAAQ+f,GAAKrD,SACZjc,EAAQmhB,EAAW5hB,GAAOc,KAAM0oB,KAAcC,EAAYzpB,MAC9DS,EAAQgpB,EAAYzpB,GAAQS,MAC7B+a,EAAU/a,EAAM+J,QAChB+e,EAAOzrB,MACNyJ,MAAOiU,EACPxb,KAAMA,EACNic,QAASxb,IAEV+oB,EAAQA,EAAMxrB,MAAOwd,EAAQ3a,QAI/B,KAAM2a,EACL,MAOF,MAAO8N,GACNE,EAAM3oB,OACN2oB,EACCpG,GAAO9d,MAAO7G,GAEdsiB,EAAYtiB,EAAU8kB,GAASvlB,MAAO,GAGzC,QAASgmB,IAAYuF,GACpB,GAAIxmB,GAAI,EACPC,EAAMumB,EAAO1oB,OACbpC,EAAW,EACZ,MAAYuE,EAAJD,EAASA,IAChBtE,GAAY8qB,EAAOxmB,GAAGwE,KAEvB,OAAO9I,GAGR,QAASkrB,IAAezB,EAAS0B,EAAYC,GAC5C,GAAIhD,GAAM+C,EAAW/C,IACpBiD,EAAmBD,GAAgB,eAARhD,EAC3BkD,EAAWtnB,GAEZ,OAAOmnB,GAAWhnB,MAEjB,SAAUlC,EAAMhC,EAAS6H,GACxB,MAAS7F,EAAOA,EAAMmmB,GACrB,GAAuB,IAAlBnmB,EAAKQ,UAAkB4oB,EAC3B,MAAO5B,GAASxnB,EAAMhC,EAAS6H,IAMlC,SAAU7F,EAAMhC,EAAS6H,GACxB,GAAId,GAAM0M,EAAOwV,EAChBqC,EAASpJ,EAAU,IAAMmJ,CAG1B,IAAKxjB,GACJ,MAAS7F,EAAOA,EAAMmmB,GACrB,IAAuB,IAAlBnmB,EAAKQ,UAAkB4oB,IACtB5B,EAASxnB,EAAMhC,EAAS6H,GAC5B,OAAO,MAKV,OAAS7F,EAAOA,EAAMmmB,GACrB,GAAuB,IAAlBnmB,EAAKQ,UAAkB4oB,EAE3B,GADAnC,EAAajnB,EAAM6P,KAAc7P,EAAM6P,QACjC4B,EAAQwV,EAAYd,KAAU1U,EAAM,KAAO6X,GAChD,IAAMvkB,EAAO0M,EAAM,OAAQ,GAAQ1M,IAASqa,EAC3C,MAAOra,MAAS,MAKjB,IAFA0M,EAAQwV,EAAYd,IAAUmD,GAC9B7X,EAAM,GAAK+V,EAASxnB,EAAMhC,EAAS6H,IAASuZ,EACvC3N,EAAM,MAAO,EACjB,OAAO,GASf,QAAS8X,IAAgBC,GACxB,MAAOA,GAASrpB,OAAS,EACxB,SAAUH,EAAMhC,EAAS6H,GACxB,GAAIxD,GAAImnB,EAASrpB,MACjB,OAAQkC,IACP,IAAMmnB,EAASnnB,GAAIrC,EAAMhC,EAAS6H,GACjC,OAAO,CAGT,QAAO,GAER2jB,EAAS,GAGX,QAASC,IAAUhC,EAAWjlB,EAAKwZ,EAAQhe,EAAS6H,GACnD,GAAI7F,GACH0pB,KACArnB,EAAI,EACJC,EAAMmlB,EAAUtnB,OAChBwpB,EAAgB,MAAPnnB,CAEV,MAAYF,EAAJD,EAASA,KACVrC,EAAOynB,EAAUplB,OAChB2Z,GAAUA,EAAQhc,EAAMhC,EAAS6H,MACtC6jB,EAAatsB,KAAM4C,GACd2pB,GACJnnB,EAAIpF,KAAMiF,GAMd,OAAOqnB,GAGR,QAASE,IAAYrD,EAAWxoB,EAAUypB,EAASqC,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAYha,KAC/Bga,EAAaD,GAAYC,IAErBC,IAAeA,EAAYja,KAC/Bia,EAAaF,GAAYE,EAAYC,IAE/BvH,GAAa,SAAUG,EAAM1b,EAASjJ,EAAS6H,GACrD,GAAImkB,GAAM3nB,EAAGrC,EACZiqB,KACAC,KACAC,EAAcljB,EAAQ9G,OAGtBqB,EAAQmhB,GAAQyH,GAAkBrsB,GAAY,IAAKC,EAAQwC,UAAaxC,GAAYA,MAGpFqsB,GAAY9D,IAAe5D,GAAS5kB,EAEnCyD,EADAioB,GAAUjoB,EAAOyoB,EAAQ1D,EAAWvoB,EAAS6H,GAG9CykB,EAAa9C,EAEZsC,IAAgBnH,EAAO4D,EAAY4D,GAAeN,MAMjD5iB,EACDojB,CAQF,IALK7C,GACJA,EAAS6C,EAAWC,EAAYtsB,EAAS6H,GAIrCgkB,EAAa,CACjBG,EAAOP,GAAUa,EAAYJ,GAC7BL,EAAYG,KAAUhsB,EAAS6H,GAG/BxD,EAAI2nB,EAAK7pB,MACT,OAAQkC,KACDrC,EAAOgqB,EAAK3nB,MACjBioB,EAAYJ,EAAQ7nB,MAASgoB,EAAWH,EAAQ7nB,IAAOrC,IAK1D,GAAK2iB,GACJ,GAAKmH,GAAcvD,EAAY,CAC9B,GAAKuD,EAAa,CAEjBE,KACA3nB,EAAIioB,EAAWnqB,MACf,OAAQkC,KACDrC,EAAOsqB,EAAWjoB,KAEvB2nB,EAAK5sB,KAAOitB,EAAUhoB,GAAKrC,EAG7B8pB,GAAY,KAAOQ,KAAkBN,EAAMnkB,GAI5CxD,EAAIioB,EAAWnqB,MACf,OAAQkC,KACDrC,EAAOsqB,EAAWjoB,MACtB2nB,EAAOF,EAAatsB,EAAQ4D,KAAMuhB,EAAM3iB,GAASiqB,EAAO5nB,IAAM,KAE/DsgB,EAAKqH,KAAU/iB,EAAQ+iB,GAAQhqB,SAOlCsqB,GAAab,GACZa,IAAerjB,EACdqjB,EAAW3nB,OAAQwnB,EAAaG,EAAWnqB,QAC3CmqB,GAEGR,EACJA,EAAY,KAAM7iB,EAASqjB,EAAYzkB,GAEvCzI,EAAK4E,MAAOiF,EAASqjB,KAMzB,QAASC,IAAmB1B,GAC3B,GAAI2B,GAAchD,EAASjlB,EAC1BD,EAAMumB,EAAO1oB,OACbsqB,EAAkBpL,EAAK4G,SAAU4C,EAAO,GAAGvpB,MAC3CorB,EAAmBD,GAAmBpL,EAAK4G,SAAS,KACpD5jB,EAAIooB,EAAkB,EAAI,EAG1BE,EAAe1B,GAAe,SAAUjpB,GACvC,MAAOA,KAASwqB,GACdE,GAAkB,GACrBE,EAAkB3B,GAAe,SAAUjpB,GAC1C,MAAOxC,GAAQ4D,KAAMopB,EAAcxqB,GAAS,IAC1C0qB,GAAkB,GACrBlB,GAAa,SAAUxpB,EAAMhC,EAAS6H,GACrC,OAAU4kB,IAAqB5kB,GAAO7H,IAAY0hB,MAChD8K,EAAexsB,GAASwC,SACxBmqB,EAAc3qB,EAAMhC,EAAS6H,GAC7B+kB,EAAiB5qB,EAAMhC,EAAS6H,KAGpC,MAAYvD,EAAJD,EAASA,IAChB,GAAMmlB,EAAUnI,EAAK4G,SAAU4C,EAAOxmB,GAAG/C,MACxCkqB,GAAaP,GAAcM,GAAgBC,GAAYhC,QACjD,CAIN,GAHAA,EAAUnI,EAAKrD,OAAQ6M,EAAOxmB,GAAG/C,MAAO0C,MAAO,KAAM6mB,EAAOxmB,GAAGkZ,SAG1DiM,EAAS3X,GAAY,CAGzB,IADAtN,IAAMF,EACMC,EAAJC,EAASA,IAChB,GAAK8c,EAAK4G,SAAU4C,EAAOtmB,GAAGjD,MAC7B,KAGF,OAAOsqB,IACNvnB,EAAI,GAAKknB,GAAgBC,GACzBnnB,EAAI,GAAKihB,GAAYuF,EAAOvrB,MAAO,EAAG+E,EAAI,IAAMqD,QAASpH,EAAO,MAChEkpB,EACIjlB,EAAJF,GAASkoB,GAAmB1B,EAAOvrB,MAAO+E,EAAGE,IACzCD,EAAJC,GAAWgoB,GAAoB1B,EAASA,EAAOvrB,MAAOiF,IAClDD,EAAJC,GAAW+gB,GAAYuF,IAGzBW,EAASpsB,KAAMoqB,GAIjB,MAAO+B,IAAgBC,GAGxB,QAASqB,IAA0BC,EAAiBC,GAEnD,GAAIC,GAAoB,EACvBC,EAAQF,EAAY5qB,OAAS,EAC7B+qB,EAAYJ,EAAgB3qB,OAAS,EACrCgrB,EAAe,SAAUxI,EAAM3kB,EAAS6H,EAAKoB,EAASmkB,GACrD,GAAIprB,GAAMuC,EAAGilB,EACZ6D,KACAC,EAAe,EACfjpB,EAAI,IACJolB,EAAY9E,MACZ4I,EAA6B,MAAjBH,EACZI,EAAgB9L,EAEhBle,EAAQmhB,GAAQuI,GAAa7L,EAAKhf,KAAU,IAAG,IAAK+qB,GAAiBptB,EAAQ+C,YAAc/C,GAE3FytB,EAAiBvL,GAA4B,MAAjBsL,EAAwB,EAAIpkB,KAAK2K,UAAY,EAS1E,KAPKwZ,IACJ7L,EAAmB1hB,IAAYxB,GAAYwB,EAC3CohB,EAAa4L,GAKe,OAApBhrB,EAAOwB,EAAMa,IAAaA,IAAM,CACxC,GAAK6oB,GAAalrB,EAAO,CACxBuC,EAAI,CACJ,OAASilB,EAAUsD,EAAgBvoB,KAClC,GAAKilB,EAASxnB,EAAMhC,EAAS6H,GAAQ,CACpCoB,EAAQ7J,KAAM4C,EACd,OAGGurB,IACJrL,EAAUuL,EACVrM,IAAe4L,GAKZC,KAEEjrB,GAAQwnB,GAAWxnB,IACxBsrB,IAII3I,GACJ8E,EAAUrqB,KAAM4C,IAOnB,GADAsrB,GAAgBjpB,EACX4oB,GAAS5oB,IAAMipB,EAAe,CAClC/oB,EAAI,CACJ,OAASilB,EAAUuD,EAAYxoB,KAC9BilB,EAASC,EAAW4D,EAAYrtB,EAAS6H,EAG1C,IAAK8c,EAAO,CAEX,GAAK2I,EAAe,EACnB,MAAQjpB,IACAolB,EAAUplB,IAAMgpB,EAAWhpB,KACjCgpB,EAAWhpB,GAAKqP,EAAItQ,KAAM6F,GAM7BokB,GAAa5B,GAAU4B,GAIxBjuB,EAAK4E,MAAOiF,EAASokB,GAGhBE,IAAc5I,GAAQ0I,EAAWlrB,OAAS,GAC5CmrB,EAAeP,EAAY5qB,OAAW,GAExCuiB,GAAOyC,WAAYle,GAUrB,MALKskB,KACJrL,EAAUuL,EACV/L,EAAmB8L,GAGb/D,EAGT,OAAOwD,GACNzI,GAAc2I,GACdA,EAGF3L,EAAUkD,GAAOlD,QAAU,SAAUzhB,EAAU2tB,GAC9C,GAAIrpB,GACH0oB,KACAD,KACA9B,EAAS1I,EAAeviB,EAAW,IAEpC,KAAMirB,EAAS,CAER0C,IACLA,EAAQrI,GAAUtlB,IAEnBsE,EAAIqpB,EAAMvrB,MACV,OAAQkC,IACP2mB,EAASuB,GAAmBmB,EAAMrpB,IAC7B2mB,EAAQnZ,GACZkb,EAAY3tB,KAAM4rB,GAElB8B,EAAgB1tB,KAAM4rB,EAKxBA,GAAS1I,EAAeviB,EAAU8sB,GAA0BC,EAAiBC,IAE9E,MAAO/B,GAGR,SAASoB,IAAkBrsB,EAAUmO,EAAUjF,GAC9C,GAAI5E,GAAI,EACPC,EAAM4J,EAAS/L,MAChB,MAAYmC,EAAJD,EAASA,IAChBqgB,GAAQ3kB,EAAUmO,EAAS7J,GAAI4E,EAEhC,OAAOA,GAGR,QAAS0F,IAAQ5O,EAAUC,EAASiJ,EAAS0b,GAC5C,GAAItgB,GAAGwmB,EAAQ8C,EAAOrsB,EAAMe,EAC3BN,EAAQsjB,GAAUtlB,EAEnB,KAAM4kB,GAEiB,IAAjB5iB,EAAMI,OAAe,CAIzB,GADA0oB,EAAS9oB,EAAM,GAAKA,EAAM,GAAGzC,MAAO,GAC/BurB,EAAO1oB,OAAS,GAAkC,QAA5BwrB,EAAQ9C,EAAO,IAAIvpB,MACvB,IAArBtB,EAAQwC,WAAmBqf,GAC3BR,EAAK4G,SAAU4C,EAAO,GAAGvpB,MAAS,CAGnC,GADAtB,EAAUqhB,EAAKhf,KAAS,GAAGsrB,EAAMpQ,QAAQ,GAAG7V,QAASsc,GAAWC,IAAajkB,GAAU,IACjFA,EACL,MAAOiJ,EAGRlJ,GAAWA,EAAST,MAAOurB,EAAO/e,QAAQjD,MAAM1G,QAIjDkC,EAAI6e,EAAwB,aAAExgB,KAAM3C,GAAa,EAAI8qB,EAAO1oB,MAC5D,OAAQkC,IAAM,CAIb,GAHAspB,EAAQ9C,EAAOxmB,GAGVgd,EAAK4G,SAAW3mB,EAAOqsB,EAAMrsB,MACjC,KAED,KAAMe,EAAOgf,EAAKhf,KAAMf,MAEjBqjB,EAAOtiB,EACZsrB,EAAMpQ,QAAQ,GAAG7V,QAASsc,GAAWC,IACrCP,EAAShhB,KAAMmoB,EAAO,GAAGvpB,OAAUtB,EAAQ+C,YAAc/C,IACrD,CAKJ,GAFA6qB,EAAOlmB,OAAQN,EAAG,GAClBtE,EAAW4kB,EAAKxiB,QAAUmjB,GAAYuF,IAChC9qB,EAEL,MADAX,GAAK4E,MAAOiF,EAAS3J,EAAM8D,KAAMuhB,EAAM,IAChC1b,CAGR,SAgBL,MAPAuY,GAASzhB,EAAUgC,GAClB4iB,EACA3kB,EACA6hB,EACA5Y,EACAya,EAAShhB,KAAM3C,IAETkJ,EAIRoY,EAAKwB,QAAa,IAAIxB,EAAKwB,QAAY,EAGvC,SAASwG,OACThI,EAAKuM,QAAUvE,GAAWznB,UAAYyf,EAAKwB,QAC3CxB,EAAKgI,WAAa,GAAIA,IAGtB1H,IAGA+C,GAAO7hB,KAAOlE,EAAOkE,KACrBlE,EAAO0D,KAAOqiB,GACd/lB,EAAOyc,KAAOsJ,GAAOqD,UACrBppB,EAAOyc,KAAK,KAAOzc,EAAOyc,KAAKyH,QAC/BlkB,EAAOwN,OAASuY,GAAOyC,WACvBxoB,EAAOoK,KAAO2b,GAAOpD,QACrB3iB,EAAOkZ,SAAW6M,GAAOnD,MACzB5iB,EAAOyhB,SAAWsE,GAAOtE,UAGrBjiB,EACJ,IAAI0vB,IAAS,SACZC,GAAe,iCACfC,GAAW,iBACXC,GAAgBrvB,EAAOyc,KAAKrZ,MAAMoZ,aAElC8S,IACCC,UAAU,EACVC,UAAU,EACVrZ,MAAM,EACNsZ,MAAM,EAGRzvB,GAAOsB,GAAG2E,QACTvC,KAAM,SAAUtC,GACf,GAAIsE,GAAGZ,EAAKsI,EACXzH,EAAMrC,KAAKE,MAEZ,IAAyB,gBAAbpC,GAEX,MADAgM,GAAO9J,KACAA,KAAKsB,UAAW5E,EAAQoB,GAAWie,OAAO,WAChD,IAAM3Z,EAAI,EAAOC,EAAJD,EAASA,IACrB,GAAK1F,EAAOyhB,SAAUrU,EAAM1H,GAAKpC,MAChC,OAAO,IAOX,KADAwB,KACMY,EAAI,EAAOC,EAAJD,EAASA,IACrB1F,EAAO0D,KAAMtC,EAAUkC,KAAMoC,GAAKZ,EAMnC,OAFAA,GAAMxB,KAAKsB,UAAWe,EAAM,EAAI3F,EAAOwN,OAAQ1I,GAAQA,GACvDA,EAAI1D,UAAakC,KAAKlC,SAAWkC,KAAKlC,SAAW,IAAM,IAAOA,EACvD0D,GAGR2I,IAAK,SAAUjH,GACd,GAAId,GACHgqB,EAAU1vB,EAAQwG,EAAQlD,MAC1BqC,EAAM+pB,EAAQlsB,MAEf,OAAOF,MAAK+b,OAAO,WAClB,IAAM3Z,EAAI,EAAOC,EAAJD,EAASA,IACrB,GAAK1F,EAAOyhB,SAAUne,KAAMosB,EAAQhqB,IACnC,OAAO,KAMXklB,IAAK,SAAUxpB,GACd,MAAOkC,MAAKsB,UAAW+qB,GAAOrsB,KAAMlC,GAAU,KAG/Cie,OAAQ,SAAUje,GACjB,MAAOkC,MAAKsB,UAAW+qB,GAAOrsB,KAAMlC,GAAU,KAG/CwuB,GAAI,SAAUxuB,GACb,QAASA,IACY,gBAAbA,GAGNiuB,GAActrB,KAAM3C,GACnBpB,EAAQoB,EAAUkC,KAAKjC,SAAUqM,MAAOpK,KAAK,KAAQ,EACrDtD,EAAOqf,OAAQje,EAAUkC,MAAOE,OAAS,EAC1CF,KAAK+b,OAAQje,GAAWoC,OAAS,IAGpCqsB,QAAS,SAAUzG,EAAW/nB,GAC7B,GAAI+U,GACH1Q,EAAI,EACJkF,EAAItH,KAAKE,OACTsB,KACAgrB,EAAMT,GAActrB,KAAMqlB,IAAoC,gBAAdA,GAC/CppB,EAAQopB,EAAW/nB,GAAWiC,KAAKjC,SACnC,CAEF,MAAYuJ,EAAJlF,EAAOA,IAAM,CACpB0Q,EAAM9S,KAAKoC,EAEX,OAAQ0Q,GAAOA,EAAItS,eAAiBsS,IAAQ/U,GAA4B,KAAjB+U,EAAIvS,SAAkB,CAC5E,GAAKisB,EAAMA,EAAIpiB,MAAM0I,GAAO,GAAKpW,EAAO0D,KAAK8jB,gBAAgBpR,EAAKgT,GAAa,CAC9EtkB,EAAIrE,KAAM2V,EACV,OAEDA,EAAMA,EAAIhS,YAIZ,MAAOd,MAAKsB,UAAWE,EAAItB,OAAS,EAAIxD,EAAOwN,OAAQ1I,GAAQA,IAKhE4I,MAAO,SAAUrK,GAGhB,MAAMA,GAKe,gBAATA,GACJrD,EAAOwK,QAASlH,KAAK,GAAItD,EAAQqD,IAIlCrD,EAAOwK,QAEbnH,EAAKH,OAASG,EAAK,GAAKA,EAAMC,MAXrBA,KAAK,IAAMA,KAAK,GAAGc,WAAed,KAAKiC,QAAQwqB,UAAUvsB,OAAS,IAc7E8J,IAAK,SAAUlM,EAAUC,GACxB,GAAIsX,GAA0B,gBAAbvX,GACfpB,EAAQoB,EAAUC,GAClBrB,EAAOsE,UAAWlD,GAAYA,EAASyC,UAAazC,GAAaA,GAClEiB,EAAMrC,EAAO2D,MAAOL,KAAKoB,MAAOiU,EAEjC,OAAOrV,MAAKsB,UAAW5E,EAAOwN,OAAOnL,KAGtC2tB,QAAS,SAAU5uB,GAClB,MAAOkC,MAAKgK,IAAiB,MAAZlM,EAChBkC,KAAKyB,WAAazB,KAAKyB,WAAWsa,OAAOje,OAK5CpB,EAAOsB,GAAG2uB,QAAUjwB,EAAOsB,GAAG0uB,OAE9B,SAASE,IAAS9Z,EAAKoT,GACtB,EACCpT,GAAMA,EAAKoT,SACFpT,GAAwB,IAAjBA,EAAIvS,SAErB,OAAOuS,GAGRpW,EAAOgF,MACN8V,OAAQ,SAAUzX,GACjB,GAAIyX,GAASzX,EAAKe,UAClB,OAAO0W,IAA8B,KAApBA,EAAOjX,SAAkBiX,EAAS,MAEpDqV,QAAS,SAAU9sB,GAClB,MAAOrD,GAAOwpB,IAAKnmB,EAAM,eAE1B+sB,aAAc,SAAU/sB,EAAMqC,EAAG2qB,GAChC,MAAOrwB,GAAOwpB,IAAKnmB,EAAM,aAAcgtB,IAExCla,KAAM,SAAU9S,GACf,MAAO6sB,IAAS7sB,EAAM,gBAEvBosB,KAAM,SAAUpsB,GACf,MAAO6sB,IAAS7sB,EAAM,oBAEvBitB,QAAS,SAAUjtB,GAClB,MAAOrD,GAAOwpB,IAAKnmB,EAAM,gBAE1B0sB,QAAS,SAAU1sB,GAClB,MAAOrD,GAAOwpB,IAAKnmB,EAAM,oBAE1BktB,UAAW,SAAUltB,EAAMqC,EAAG2qB,GAC7B,MAAOrwB,GAAOwpB,IAAKnmB,EAAM,cAAegtB,IAEzCG,UAAW,SAAUntB,EAAMqC,EAAG2qB,GAC7B,MAAOrwB,GAAOwpB,IAAKnmB,EAAM,kBAAmBgtB,IAE7CI,SAAU,SAAUptB,GACnB,MAAOrD,GAAOkwB,SAAW7sB,EAAKe,gBAAmB0M,WAAYzN,IAE9DksB,SAAU,SAAUlsB,GACnB,MAAOrD,GAAOkwB,QAAS7sB,EAAKyN,aAE7B0e,SAAU,SAAUnsB,GACnB,MAAOrD,GAAOgK,SAAU3G,EAAM,UAC7BA,EAAKqtB,iBAAmBrtB,EAAKstB,cAAc9wB,SAC3CG,EAAO2D,SAAWN,EAAKsF,cAEvB,SAAUtC,EAAM/E,GAClBtB,EAAOsB,GAAI+E,GAAS,SAAUgqB,EAAOjvB,GACpC,GAAI0D,GAAM9E,EAAO6F,IAAKvC,KAAMhC,EAAI+uB,EAgBhC,OAdMnB,IAAOnrB,KAAMsC,KAClBjF,EAAWivB,GAGPjvB,GAAgC,gBAAbA,KACvB0D,EAAM9E,EAAOqf,OAAQje,EAAU0D,IAGhCA,EAAMxB,KAAKE,OAAS,IAAM8rB,GAAkBjpB,GAASrG,EAAOwN,OAAQ1I,GAAQA,EAEvExB,KAAKE,OAAS,GAAK2rB,GAAaprB,KAAMsC,KAC1CvB,EAAMA,EAAI8rB,WAGJttB,KAAKsB,UAAWE,MAIzB9E,EAAOiG,QACNoZ,OAAQ,SAAU5C,EAAM5X,EAAO+lB,GAK9B,MAJKA,KACJnO,EAAO,QAAUA,EAAO,KAGD,IAAjB5X,EAAMrB,OACZxD,EAAO0D,KAAK8jB,gBAAgB3iB,EAAM,GAAI4X,IAAU5X,EAAM,OACtD7E,EAAO0D,KAAKkb,QAAQnC,EAAM5X,IAG5B2kB,IAAK,SAAUnmB,EAAMmmB,EAAK6G,GACzB,GAAIlS,MACH/H,EAAM/S,EAAMmmB,EAEb,OAAQpT,GAAwB,IAAjBA,EAAIvS,WAAmBwsB,IAAU5wB,GAA8B,IAAjB2W,EAAIvS,WAAmB7D,EAAQoW,GAAMwZ,GAAIS,IAC/E,IAAjBja,EAAIvS,UACRsa,EAAQ1d,KAAM2V,GAEfA,EAAMA,EAAIoT,EAEX,OAAOrL,IAGR+R,QAAS,SAAUW,EAAGxtB,GACrB,GAAIytB,KAEJ,MAAQD,EAAGA,EAAIA,EAAEjI,YACI,IAAfiI,EAAEhtB,UAAkBgtB,IAAMxtB,GAC9BytB,EAAErwB,KAAMowB,EAIV,OAAOC,KAKT,SAASnB,IAAQ1Y,EAAU8Z,EAAWC,GAMrC,GAFAD,EAAYA,GAAa,EAEpB/wB,EAAOiE,WAAY8sB,GACvB,MAAO/wB,GAAO6K,KAAKoM,EAAU,SAAU5T,EAAMqC,GAC5C,GAAIqF,KAAWgmB,EAAUtsB,KAAMpB,EAAMqC,EAAGrC,EACxC,OAAO0H,KAAWimB,GAGb,IAAKD,EAAUltB,SACrB,MAAO7D,GAAO6K,KAAKoM,EAAU,SAAU5T,GACtC,MAASA,KAAS0tB,IAAgBC,GAG7B,IAA0B,gBAAdD,GAAyB,CAC3C,GAAIE,GAAWjxB,EAAO6K,KAAKoM,EAAU,SAAU5T,GAC9C,MAAyB,KAAlBA,EAAKQ,UAGb,IAAKurB,GAASrrB,KAAMgtB,GACnB,MAAO/wB,GAAOqf,OAAO0R,EAAWE,GAAWD,EAE3CD,GAAY/wB,EAAOqf,OAAQ0R,EAAWE,GAIxC,MAAOjxB,GAAO6K,KAAKoM,EAAU,SAAU5T,GACtC,MAASrD,GAAOwK,QAASnH,EAAM0tB,IAAe,IAAQC,IAGxD,QAASE,IAAoBrxB,GAC5B,GAAIiN,GAAOqkB,GAAUllB,MAAO,KAC3BmlB,EAAWvxB,EAAS4S,wBAErB,IAAK2e,EAAS5oB,cACb,MAAQsE,EAAKtJ,OACZ4tB,EAAS5oB,cACRsE,EAAKiI,MAIR,OAAOqc,GAGR,GAAID,IAAY,6JAEfE,GAAgB,6BAChBC,GAAmBtU,OAAO,OAASmU,GAAY,WAAY,KAC3DI,GAAqB,OACrBC,GAAY,0EACZC,GAAW,YACXC,GAAS,UACTC,GAAQ,YACRC,GAAe,0BACfC,GAA8B,wBAE9BC,GAAW,oCACXC,GAAc,4BACdC,GAAoB,cACpBC,GAAe,2CAGfC,IACCtZ,QAAU,EAAG,+BAAgC,aAC7CuZ,QAAU,EAAG,aAAc,eAC3BC,MAAQ,EAAG,QAAS,UACpBC,OAAS,EAAG,WAAY,aACxBC,OAAS,EAAG,UAAW,YACvBC,IAAM,EAAG,iBAAkB,oBAC3BC,KAAO,EAAG,mCAAoC,uBAC9CC,IAAM,EAAG,qBAAsB,yBAI/BxU,SAAUje,EAAO6P,QAAQmB,eAAkB,EAAG,GAAI,KAAS,EAAG,SAAU,WAEzE0hB,GAAexB,GAAoBrxB,GACnC8yB,GAAcD,GAAaliB,YAAa3Q,EAAS2I,cAAc,OAEhE0pB,IAAQU,SAAWV,GAAQtZ,OAC3BsZ,GAAQnhB,MAAQmhB,GAAQW,MAAQX,GAAQY,SAAWZ,GAAQa,QAAUb,GAAQI,MAC7EJ,GAAQc,GAAKd,GAAQO,GAErBzyB,EAAOsB,GAAG2E,QACTmE,KAAM,SAAUF,GACf,MAAOlK,GAAOmL,OAAQ7H,KAAM,SAAU4G,GACrC,MAAOA,KAAUzK,EAChBO,EAAOoK,KAAM9G,MACbA,KAAKqK,QAAQslB,QAAU3vB,KAAK,IAAMA,KAAK,GAAGQ,eAAiBjE,GAAWqzB,eAAgBhpB,KACrF,KAAMA,EAAO5E,UAAU9B,SAG3B2vB,QAAS,SAAUC,GAClB,GAAKpzB,EAAOiE,WAAYmvB,GACvB,MAAO9vB,MAAK0B,KAAK,SAASU,GACzB1F,EAAOsD,MAAM6vB,QAASC,EAAK3uB,KAAKnB,KAAMoC,KAIxC,IAAKpC,KAAK,GAAK,CAEd,GAAI+vB,GAAOrzB,EAAQozB,EAAM9vB,KAAK,GAAGQ,eAAgB0B,GAAG,GAAGe,OAAM,EAExDjD,MAAK,GAAGc,YACZivB,EAAKpM,aAAc3jB,KAAK,IAGzB+vB,EAAKxtB,IAAI,WACR,GAAIxC,GAAOC,IAEX,OAAQD,EAAKyN,YAA2C,IAA7BzN,EAAKyN,WAAWjN,SAC1CR,EAAOA,EAAKyN,UAGb,OAAOzN,KACL4vB,OAAQ3vB,MAGZ,MAAOA,OAGRgwB,UAAW,SAAUF,GACpB,MAAKpzB,GAAOiE,WAAYmvB,GAChB9vB,KAAK0B,KAAK,SAASU,GACzB1F,EAAOsD,MAAMgwB,UAAWF,EAAK3uB,KAAKnB,KAAMoC,MAInCpC,KAAK0B,KAAK,WAChB,GAAIoI,GAAOpN,EAAQsD,MAClBksB,EAAWpiB,EAAKoiB,UAEZA,GAAShsB,OACbgsB,EAAS2D,QAASC,GAGlBhmB,EAAK6lB,OAAQG,MAKhBC,KAAM,SAAUD,GACf,GAAInvB,GAAajE,EAAOiE,WAAYmvB,EAEpC,OAAO9vB,MAAK0B,KAAK,SAASU,GACzB1F,EAAQsD,MAAO6vB,QAASlvB,EAAamvB,EAAK3uB,KAAKnB,KAAMoC,GAAK0tB,MAI5DG,OAAQ,WACP,MAAOjwB,MAAKwX,SAAS9V,KAAK,WACnBhF,EAAOgK,SAAU1G,KAAM,SAC5BtD,EAAQsD,MAAOkwB,YAAalwB,KAAKqF,cAEhC7C,OAGJmtB,OAAQ,WACP,MAAO3vB,MAAKmwB,SAASnuB,WAAW,EAAM,SAAUjC,IACxB,IAAlBC,KAAKO,UAAoC,KAAlBP,KAAKO,UAAqC,IAAlBP,KAAKO,WACxDP,KAAKkN,YAAanN,MAKrBqwB,QAAS,WACR,MAAOpwB,MAAKmwB,SAASnuB,WAAW,EAAM,SAAUjC,IACxB,IAAlBC,KAAKO,UAAoC,KAAlBP,KAAKO,UAAqC,IAAlBP,KAAKO,WACxDP,KAAK2jB,aAAc5jB,EAAMC,KAAKwN,eAKjC6iB,OAAQ,WACP,MAAOrwB,MAAKmwB,SAAUnuB,WAAW,EAAO,SAAUjC,GAC5CC,KAAKc,YACTd,KAAKc,WAAW6iB,aAAc5jB,EAAMC,SAKvCswB,MAAO,WACN,MAAOtwB,MAAKmwB,SAAUnuB,WAAW,EAAO,SAAUjC,GAC5CC,KAAKc,YACTd,KAAKc,WAAW6iB,aAAc5jB,EAAMC,KAAKslB,gBAM5ClgB,OAAQ,SAAUtH,EAAUyyB,GAC3B,GAAIxwB,GACHqC,EAAI,CAEL,MAA4B,OAAnBrC,EAAOC,KAAKoC,IAAaA,MAC3BtE,GAAYpB,EAAOqf,OAAQje,GAAYiC,IAASG,OAAS,KACxDqwB,GAA8B,IAAlBxwB,EAAKQ,UACtB7D,EAAOmV,UAAW2e,GAAQzwB,IAGtBA,EAAKe,aACJyvB,GAAY7zB,EAAOyhB,SAAUpe,EAAKS,cAAeT,IACrD0wB,GAAeD,GAAQzwB,EAAM,WAE9BA,EAAKe,WAAWgQ,YAAa/Q,IAKhC,OAAOC,OAGRqK,MAAO,WACN,GAAItK,GACHqC,EAAI,CAEL,MAA4B,OAAnBrC,EAAOC,KAAKoC,IAAaA,IAAM,CAEhB,IAAlBrC,EAAKQ,UACT7D,EAAOmV,UAAW2e,GAAQzwB,GAAM,GAIjC,OAAQA,EAAKyN,WACZzN,EAAK+Q,YAAa/Q,EAAKyN,WAKnBzN,GAAKiD,SAAWtG,EAAOgK,SAAU3G,EAAM,YAC3CA,EAAKiD,QAAQ9C,OAAS,GAIxB,MAAOF,OAGRiD,MAAO,SAAUytB,EAAeC,GAI/B,MAHAD,GAAiC,MAAjBA,GAAwB,EAAQA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD3wB,KAAKuC,IAAK,WAChB,MAAO7F,GAAOuG,MAAOjD,KAAM0wB,EAAeC,MAI5Cb,KAAM,SAAUlpB,GACf,MAAOlK,GAAOmL,OAAQ7H,KAAM,SAAU4G,GACrC,GAAI7G,GAAOC,KAAK,OACfoC,EAAI,EACJkF,EAAItH,KAAKE,MAEV,IAAK0G,IAAUzK,EACd,MAAyB,KAAlB4D,EAAKQ,SACXR,EAAKkN,UAAUxH,QAASsoB,GAAe,IACvC5xB,CAIF,MAAsB,gBAAVyK,IAAuB0nB,GAAa7tB,KAAMmG,KACnDlK,EAAO6P,QAAQmB,eAAkBsgB,GAAavtB,KAAMmG,KACpDlK,EAAO6P,QAAQgB,mBAAsB0gB,GAAmBxtB,KAAMmG,IAC/DgoB,IAAWT,GAAShuB,KAAMyG,KAAY,GAAI,KAAM,GAAGD,gBAAkB,CAEtEC,EAAQA,EAAMnB,QAASyoB,GAAW,YAElC,KACC,KAAW5mB,EAAJlF,EAAOA,IAEbrC,EAAOC,KAAKoC,OACW,IAAlBrC,EAAKQ,WACT7D,EAAOmV,UAAW2e,GAAQzwB,GAAM,IAChCA,EAAKkN,UAAYrG,EAInB7G,GAAO,EAGN,MAAMyE,KAGJzE,GACJC,KAAKqK,QAAQslB,OAAQ/oB,IAEpB,KAAMA,EAAO5E,UAAU9B,SAG3BgwB,YAAa,SAAUtpB,GACtB,GAAIgqB,GAASl0B,EAAOiE,WAAYiG,EAQhC,OAJMgqB,IAA2B,gBAAVhqB,KACtBA,EAAQlK,EAAQkK,GAAQ0gB,IAAKtnB,MAAOT,UAG9BS,KAAKmwB,UAAYvpB,IAAS,EAAM,SAAU7G,GAChD,GAAI8S,GAAO7S,KAAKslB,YACf9N,EAASxX,KAAKc,UAEV0W,KACJ9a,EAAQsD,MAAOoF,SACfoS,EAAOmM,aAAc5jB,EAAM8S,OAK9BtT,OAAQ,SAAUzB,GACjB,MAAOkC,MAAKoF,OAAQtH,GAAU,IAG/BqyB,SAAU,SAAUvuB,EAAMivB,EAAOlvB,GAGhCC,EAAO5E,EAAY+E,SAAWH,EAE9B,IAAIK,GAAOuhB,EAAMsN,EAChB7rB,EAASoX,EAAK1P,EACdvK,EAAI,EACJkF,EAAItH,KAAKE,OACTmV,EAAMrV,KACN+wB,EAAWzpB,EAAI,EACfV,EAAQhF,EAAK,GACbjB,EAAajE,EAAOiE,WAAYiG,EAGjC,IAAKjG,KAAsB,GAAL2G,GAA2B,gBAAVV,IAAsBlK,EAAO6P,QAAQ8C,aAAemf,GAAS/tB,KAAMmG,GACzG,MAAO5G,MAAK0B,KAAK,SAAU0I,GAC1B,GAAIN,GAAOuL,EAAInT,GAAIkI,EACdzJ,KACJiB,EAAK,GAAKgF,EAAMzF,KAAMnB,KAAMoK,EAAOymB,EAAQ/mB,EAAKgmB,OAAS3zB,IAE1D2N,EAAKqmB,SAAUvuB,EAAMivB,EAAOlvB,IAI9B,IAAK2F,IACJqF,EAAWjQ,EAAOyI,cAAevD,EAAM5B,KAAM,GAAIQ,eAAe,EAAOR,MACvEiC,EAAQ0K,EAASa,WAEmB,IAA/Bb,EAAStH,WAAWnF,SACxByM,EAAW1K,GAGPA,GAAQ,CAOZ,IANA4uB,EAAQA,GAASn0B,EAAOgK,SAAUzE,EAAO,MACzCgD,EAAUvI,EAAO6F,IAAKiuB,GAAQ7jB,EAAU,UAAYqkB,IACpDF,EAAa7rB,EAAQ/E,OAIToH,EAAJlF,EAAOA,IACdohB,EAAO7W,EAEFvK,IAAM2uB,IACVvN,EAAO9mB,EAAOuG,MAAOugB,GAAM,GAAM,GAG5BsN,GACJp0B,EAAO2D,MAAO4E,EAASurB,GAAQhN,EAAM,YAIvC7hB,EAASR,KACR0vB,GAASn0B,EAAOgK,SAAU1G,KAAKoC,GAAI,SAClC6uB,GAAcjxB,KAAKoC,GAAI,SACvBpC,KAAKoC,GACNohB,EACAphB,EAIF,IAAK0uB,EAOJ,IANAzU,EAAMpX,EAASA,EAAQ/E,OAAS,GAAIM,cAGpC9D,EAAO6F,IAAK0C,EAASisB,IAGf9uB,EAAI,EAAO0uB,EAAJ1uB,EAAgBA,IAC5BohB,EAAOve,EAAS7C,GACXqsB,GAAYhuB,KAAM+iB,EAAKnkB,MAAQ,MAClC3C,EAAO0V,MAAOoR,EAAM,eAAkB9mB,EAAOyhB,SAAU9B,EAAKmH,KAExDA,EAAK5gB,IAETlG,EAAOy0B,MACNC,IAAK5N,EAAK5gB,IACVvD,KAAM,MACNgyB,SAAU,SACVprB,OAAO,EACP+R,QAAQ,EACRsZ,UAAU,IAGX50B,EAAO4J,YAAckd,EAAK1c,MAAQ0c,EAAKoC,aAAepC,EAAKvW,WAAa,IAAKxH,QAASkpB,GAAc,KAOxGhiB,GAAW1K,EAAQ,KAIrB,MAAOjC,QAIT,SAASixB,IAAclxB,EAAMkkB,GAC5B,MAAOlkB,GAAKqG,qBAAsB6d,GAAM,IAAMlkB,EAAKmN,YAAanN,EAAKS,cAAc0E,cAAe+e,IAInG,QAAS+M,IAAejxB,GACvB,GAAIa,GAAOb,EAAKiX,iBAAiB,OAEjC,OADAjX,GAAKV,MAASuB,GAAQA,EAAK2U,WAAc,IAAMxV,EAAKV,KAC7CU,EAER,QAASmxB,IAAenxB,GACvB,GAAID,GAAQ4uB,GAAkBvuB,KAAMJ,EAAKV,KAMzC,OALKS,GACJC,EAAKV,KAAOS,EAAM,GAElBC,EAAKiW,gBAAgB,QAEfjW,EAIR,QAAS0wB,IAAelvB,EAAOgwB,GAC9B,GAAIxxB,GACHqC,EAAI,CACL,MAA6B,OAApBrC,EAAOwB,EAAMa,IAAaA,IAClC1F,EAAO0V,MAAOrS,EAAM,cAAewxB,GAAe70B,EAAO0V,MAAOmf,EAAYnvB,GAAI,eAIlF,QAASovB,IAAgB5uB,EAAK6uB,GAE7B,GAAuB,IAAlBA,EAAKlxB,UAAmB7D,EAAOwV,QAAStP,GAA7C,CAIA,GAAIvD,GAAM+C,EAAGkF,EACZoqB,EAAUh1B,EAAO0V,MAAOxP,GACxB+uB,EAAUj1B,EAAO0V,MAAOqf,EAAMC,GAC9BvZ,EAASuZ,EAAQvZ,MAElB,IAAKA,EAAS,OACNwZ,GAAQ9Y,OACf8Y,EAAQxZ,SAER,KAAM9Y,IAAQ8Y,GACb,IAAM/V,EAAI,EAAGkF,EAAI6Q,EAAQ9Y,GAAOa,OAAYoH,EAAJlF,EAAOA,IAC9C1F,EAAOyC,MAAM6K,IAAKynB,EAAMpyB,EAAM8Y,EAAQ9Y,GAAQ+C,IAM5CuvB,EAAQ7sB,OACZ6sB,EAAQ7sB,KAAOpI,EAAOiG,UAAYgvB,EAAQ7sB,QAI5C,QAAS8sB,IAAoBhvB,EAAK6uB,GACjC,GAAI/qB,GAAUlC,EAAGM,CAGjB,IAAuB,IAAlB2sB,EAAKlxB,SAAV,CAOA,GAHAmG,EAAW+qB,EAAK/qB,SAASC,eAGnBjK,EAAO6P,QAAQkC,cAAgBgjB,EAAM/0B,EAAOkT,SAAY,CAC7D9K,EAAOpI,EAAO0V,MAAOqf,EAErB,KAAMjtB,IAAKM,GAAKqT,OACfzb,EAAOkd,YAAa6X,EAAMjtB,EAAGM,EAAK+T,OAInC4Y,GAAKzb,gBAAiBtZ,EAAOkT,SAIZ,WAAblJ,GAAyB+qB,EAAK3qB,OAASlE,EAAIkE,MAC/CkqB,GAAeS,GAAO3qB,KAAOlE,EAAIkE,KACjCoqB,GAAeO,IAIS,WAAb/qB,GACN+qB,EAAK3wB,aACT2wB,EAAKpjB,UAAYzL,EAAIyL,WAOjB3R,EAAO6P,QAAQ4B,YAAgBvL,EAAIqK,YAAcvQ,EAAOmB,KAAK4zB,EAAKxkB,aACtEwkB,EAAKxkB,UAAYrK,EAAIqK,YAGE,UAAbvG,GAAwB6nB,GAA4B9tB,KAAMmC,EAAIvD,OAKzEoyB,EAAKI,eAAiBJ,EAAK1iB,QAAUnM,EAAImM,QAIpC0iB,EAAK7qB,QAAUhE,EAAIgE,QACvB6qB,EAAK7qB,MAAQhE,EAAIgE,QAKM,WAAbF,EACX+qB,EAAKK,gBAAkBL,EAAKxjB,SAAWrL,EAAIkvB,iBAInB,UAAbprB,GAAqC,aAAbA,KACnC+qB,EAAKra,aAAexU,EAAIwU,eAI1B1a,EAAOgF,MACNqwB,SAAU,SACVC,UAAW,UACXrO,aAAc,SACdsO,YAAa,QACbC,WAAY,eACV,SAAUnvB,EAAMiZ,GAClBtf,EAAOsB,GAAI+E,GAAS,SAAUjF,GAC7B,GAAIyD,GACHa,EAAI,EACJZ,KACA2wB,EAASz1B,EAAQoB,GACjBqE,EAAOgwB,EAAOjyB,OAAS,CAExB,MAAaiC,GAALC,EAAWA,IAClBb,EAAQa,IAAMD,EAAOnC,KAAOA,KAAKiD,OAAM,GACvCvG,EAAQy1B,EAAO/vB,IAAM4Z,GAAYza,GAGjCrE,EAAU6E,MAAOP,EAAKD,EAAMH,MAG7B,OAAOpB,MAAKsB,UAAWE,KAIzB,SAASgvB,IAAQzyB,EAASkmB,GACzB,GAAI1iB,GAAOxB,EACVqC,EAAI,EACJgwB,QAAer0B,GAAQqI,uBAAyB9J,EAAoByB,EAAQqI,qBAAsB6d,GAAO,WACjGlmB,GAAQulB,mBAAqBhnB,EAAoByB,EAAQulB,iBAAkBW,GAAO,KACzF9nB,CAEF,KAAMi2B,EACL,IAAMA,KAAY7wB,EAAQxD,EAAQsH,YAActH,EAA8B,OAApBgC,EAAOwB,EAAMa,IAAaA,KAC7E6hB,GAAOvnB,EAAOgK,SAAU3G,EAAMkkB,GACnCmO,EAAMj1B,KAAM4C,GAEZrD,EAAO2D,MAAO+xB,EAAO5B,GAAQzwB,EAAMkkB,GAKtC,OAAOA,KAAQ9nB,GAAa8nB,GAAOvnB,EAAOgK,SAAU3I,EAASkmB,GAC5DvnB,EAAO2D,OAAStC,GAAWq0B,GAC3BA,EAIF,QAASC,IAAmBtyB,GACtBwuB,GAA4B9tB,KAAMV,EAAKV,QAC3CU,EAAK8xB,eAAiB9xB,EAAKgP,SAI7BrS,EAAOiG,QACNM,MAAO,SAAUlD,EAAM2wB,EAAeC,GACrC,GAAI2B,GAAc9O,EAAMvgB,EAAOb,EAAGmwB,EACjCC,EAAS91B,EAAOyhB,SAAUpe,EAAKS,cAAeT,EAW/C,IATKrD,EAAO6P,QAAQ4B,YAAczR,EAAOkZ,SAAS7V,KAAUiuB,GAAavtB,KAAM,IAAMV,EAAK2G,SAAW,KACpGzD,EAAQlD,EAAKqO,WAAW,IAIxBihB,GAAYpiB,UAAYlN,EAAKsO,UAC7BghB,GAAYve,YAAa7N,EAAQosB,GAAY7hB,eAGvC9Q,EAAO6P,QAAQkC,cAAiB/R,EAAO6P,QAAQyC,gBACjC,IAAlBjP,EAAKQ,UAAoC,KAAlBR,EAAKQ,UAAqB7D,EAAOkZ,SAAS7V,IAOnE,IAJAuyB,EAAe9B,GAAQvtB,GACvBsvB,EAAc/B,GAAQzwB,GAGhBqC,EAAI,EAA8B,OAA1BohB,EAAO+O,EAAYnwB,MAAeA,EAE1CkwB,EAAalwB,IACjBwvB,GAAoBpO,EAAM8O,EAAalwB,GAM1C,IAAKsuB,EACJ,GAAKC,EAIJ,IAHA4B,EAAcA,GAAe/B,GAAQzwB,GACrCuyB,EAAeA,GAAgB9B,GAAQvtB,GAEjCb,EAAI,EAA8B,OAA1BohB,EAAO+O,EAAYnwB,IAAaA,IAC7CovB,GAAgBhO,EAAM8O,EAAalwB,QAGpCovB,IAAgBzxB,EAAMkD,EAaxB,OARAqvB,GAAe9B,GAAQvtB,EAAO,UACzBqvB,EAAapyB,OAAS,GAC1BuwB,GAAe6B,GAAeE,GAAUhC,GAAQzwB,EAAM,WAGvDuyB,EAAeC,EAAc/O,EAAO,KAG7BvgB,GAGRkC,cAAe,SAAU5D,EAAOxD,EAASkH,EAASwtB,GACjD,GAAInwB,GAAGvC,EAAMoe,EACZtY,EAAKoe,EAAKxW,EAAOsiB,EACjBzoB,EAAI/F,EAAMrB,OAGVwyB,EAAO9E,GAAoB7vB,GAE3B40B,KACAvwB,EAAI,CAEL,MAAYkF,EAAJlF,EAAOA,IAGd,GAFArC,EAAOwB,EAAOa,GAETrC,GAAiB,IAATA,EAGZ,GAA6B,WAAxBrD,EAAO2C,KAAMU,GACjBrD,EAAO2D,MAAOsyB,EAAO5yB,EAAKQ,UAAaR,GAASA,OAG1C,IAAMsuB,GAAM5tB,KAAMV,GAIlB,CACN8F,EAAMA,GAAO6sB,EAAKxlB,YAAanP,EAAQmH,cAAc,QAGrD+e,GAAQkK,GAAShuB,KAAMJ,KAAW,GAAI,KAAM,GAAG4G,cAC/CopB,EAAOnB,GAAS3K,IAAS2K,GAAQjU,SAEjC9U,EAAIoH,UAAY8iB,EAAK,GAAKhwB,EAAK0F,QAASyoB,GAAW,aAAgB6B,EAAK,GAGxEztB,EAAIytB,EAAK,EACT,OAAQztB,IACPuD,EAAMA,EAAIyJ,SASX,KALM5S,EAAO6P,QAAQgB,mBAAqB0gB,GAAmBxtB,KAAMV,IAClE4yB,EAAMx1B,KAAMY,EAAQ6xB,eAAgB3B,GAAmB9tB,KAAMJ,GAAO,MAI/DrD,EAAO6P,QAAQkB,MAAQ,CAG5B1N,EAAe,UAARkkB,GAAoBmK,GAAO3tB,KAAMV,GAI3B,YAAZgwB,EAAK,IAAqB3B,GAAO3tB,KAAMV,GAEtC,EADA8F,EAJDA,EAAI2H,WAOLlL,EAAIvC,GAAQA,EAAKsF,WAAWnF,MAC5B,OAAQoC,IACF5F,EAAOgK,SAAW+G,EAAQ1N,EAAKsF,WAAW/C,GAAK,WAAcmL,EAAMpI,WAAWnF,QAClFH,EAAK+Q,YAAarD;CAKrB/Q,EAAO2D,MAAOsyB,EAAO9sB,EAAIR,YAGzBQ,EAAI+f,YAAc,EAGlB,OAAQ/f,EAAI2H,WACX3H,EAAIiL,YAAajL,EAAI2H,WAItB3H,GAAM6sB,EAAKpjB,cAtDXqjB,GAAMx1B,KAAMY,EAAQ6xB,eAAgB7vB,GA4DlC8F,IACJ6sB,EAAK5hB,YAAajL,GAKbnJ,EAAO6P,QAAQ6C,eACpB1S,EAAO6K,KAAMipB,GAAQmC,EAAO,SAAWN,IAGxCjwB,EAAI,CACJ,OAASrC,EAAO4yB,EAAOvwB,KAItB,KAAKqwB,GAAmD,KAAtC/1B,EAAOwK,QAASnH,EAAM0yB,MAIxCtU,EAAWzhB,EAAOyhB,SAAUpe,EAAKS,cAAeT,GAGhD8F,EAAM2qB,GAAQkC,EAAKxlB,YAAanN,GAAQ,UAGnCoe,GACJsS,GAAe5qB,GAIXZ,GAAU,CACd3C,EAAI,CACJ,OAASvC,EAAO8F,EAAKvD,KACfmsB,GAAYhuB,KAAMV,EAAKV,MAAQ,KACnC4F,EAAQ9H,KAAM4C,GAQlB,MAFA8F,GAAM,KAEC6sB,GAGR7gB,UAAW,SAAUtQ,EAAsB4P,GAC1C,GAAIpR,GAAMV,EAAM0B,EAAI+D,EACnB1C,EAAI,EACJiP,EAAc3U,EAAOkT,QACrB4B,EAAQ9U,EAAO8U,MACfhD,EAAgB9R,EAAO6P,QAAQiC,cAC/B8J,EAAU5b,EAAOyC,MAAMmZ,OAExB,MAA6B,OAApBvY,EAAOwB,EAAMa,IAAaA,IAElC,IAAK+O,GAAczU,EAAOyU,WAAYpR,MAErCgB,EAAKhB,EAAMsR,GACXvM,EAAO/D,GAAMyQ,EAAOzQ,IAER,CACX,GAAK+D,EAAKqT,OACT,IAAM9Y,IAAQyF,GAAKqT,OACbG,EAASjZ,GACb3C,EAAOyC,MAAMiG,OAAQrF,EAAMV,GAI3B3C,EAAOkd,YAAa7Z,EAAMV,EAAMyF,EAAK+T,OAMnCrH,GAAOzQ,WAEJyQ,GAAOzQ,GAKTyN,QACGzO,GAAMsR,SAEKtR,GAAKiW,kBAAoB1Z,EAC3CyD,EAAKiW,gBAAiB3E,GAGtBtR,EAAMsR,GAAgB,KAGvBvU,EAAgBK,KAAM4D,OAO5B,IAAI6xB,IAAQC,GAAWC,GACtBC,GAAS,kBACTC,GAAW,wBACXC,GAAY,4BAGZC,GAAe,4BACfC,GAAU,UACVC,GAAgB1Z,OAAQ,KAAOxb,EAAY,SAAU,KACrDm1B,GAAgB3Z,OAAQ,KAAOxb,EAAY,kBAAmB,KAC9Do1B,GAAc5Z,OAAQ,YAAcxb,EAAY,IAAK,KACrDq1B,IAAgBC,KAAM,SAEtBC,IAAYC,SAAU,WAAYC,WAAY,SAAUvjB,QAAS,SACjEwjB,IACCC,cAAe,EACfC,WAAY,KAGbC,IAAc,MAAO,QAAS,SAAU,QACxCC,IAAgB,SAAU,IAAK,MAAO,KAGvC,SAASC,IAAgB9mB,EAAOpK,GAG/B,GAAKA,IAAQoK,GACZ,MAAOpK,EAIR,IAAImxB,GAAUnxB,EAAK9C,OAAO,GAAGhB,cAAgB8D,EAAK1F,MAAM,GACvD82B,EAAWpxB,EACXX,EAAI4xB,GAAY9zB,MAEjB,OAAQkC,IAEP,GADAW,EAAOixB,GAAa5xB,GAAM8xB,EACrBnxB,IAAQoK,GACZ,MAAOpK,EAIT,OAAOoxB,GAGR,QAASC,IAAUr0B,EAAMs0B,GAIxB,MADAt0B,GAAOs0B,GAAMt0B,EAC4B,SAAlCrD,EAAO43B,IAAKv0B,EAAM,aAA2BrD,EAAOyhB,SAAUpe,EAAKS,cAAeT,GAG1F,QAASw0B,IAAU5gB,EAAU6gB,GAC5B,GAAIpkB,GAASrQ,EAAM00B,EAClBvoB,KACA9B,EAAQ,EACRlK,EAASyT,EAASzT,MAEnB,MAAgBA,EAARkK,EAAgBA,IACvBrK,EAAO4T,EAAUvJ,GACXrK,EAAKoN,QAIXjB,EAAQ9B,GAAU1N,EAAO0V,MAAOrS,EAAM,cACtCqQ,EAAUrQ,EAAKoN,MAAMiD,QAChBokB,GAGEtoB,EAAQ9B,IAAuB,SAAZgG,IACxBrQ,EAAKoN,MAAMiD,QAAU,IAMM,KAAvBrQ,EAAKoN,MAAMiD,SAAkBgkB,GAAUr0B,KAC3CmM,EAAQ9B,GAAU1N,EAAO0V,MAAOrS,EAAM,aAAc20B,GAAmB30B,EAAK2G,aAIvEwF,EAAQ9B,KACbqqB,EAASL,GAAUr0B,IAEdqQ,GAAuB,SAAZA,IAAuBqkB,IACtC/3B,EAAO0V,MAAOrS,EAAM,aAAc00B,EAASrkB,EAAU1T,EAAO43B,IAAKv0B,EAAM,aAQ3E,KAAMqK,EAAQ,EAAWlK,EAARkK,EAAgBA,IAChCrK,EAAO4T,EAAUvJ,GACXrK,EAAKoN,QAGLqnB,GAA+B,SAAvBz0B,EAAKoN,MAAMiD,SAA6C,KAAvBrQ,EAAKoN,MAAMiD,UACzDrQ,EAAKoN,MAAMiD,QAAUokB,EAAOtoB,EAAQ9B,IAAW,GAAK,QAItD,OAAOuJ,GAGRjX,EAAOsB,GAAG2E,QACT2xB,IAAK,SAAUvxB,EAAM6D,GACpB,MAAOlK,GAAOmL,OAAQ7H,KAAM,SAAUD,EAAMgD,EAAM6D,GACjD,GAAIvE,GAAKsyB,EACRpyB,KACAH,EAAI,CAEL,IAAK1F,EAAO0G,QAASL,GAAS,CAI7B,IAHA4xB,EAAS9B,GAAW9yB,GACpBsC,EAAMU,EAAK7C,OAECmC,EAAJD,EAASA,IAChBG,EAAKQ,EAAMX,IAAQ1F,EAAO43B,IAAKv0B,EAAMgD,EAAMX,IAAK,EAAOuyB,EAGxD,OAAOpyB,GAGR,MAAOqE,KAAUzK,EAChBO,EAAOyQ,MAAOpN,EAAMgD,EAAM6D,GAC1BlK,EAAO43B,IAAKv0B,EAAMgD,IACjBA,EAAM6D,EAAO5E,UAAU9B,OAAS,IAEpCs0B,KAAM,WACL,MAAOD,IAAUv0B,MAAM,IAExB40B,KAAM,WACL,MAAOL,IAAUv0B,OAElB60B,OAAQ,SAAUjqB,GACjB,GAAIkqB,GAAwB,iBAAVlqB,EAElB,OAAO5K,MAAK0B,KAAK,YACXozB,EAAOlqB,EAAQwpB,GAAUp0B,OAC7BtD,EAAQsD,MAAOw0B,OAEf93B,EAAQsD,MAAO40B,YAMnBl4B,EAAOiG,QAGNoyB,UACClnB,SACCzM,IAAK,SAAUrB,EAAMi1B,GACpB,GAAKA,EAAW,CAEf,GAAIxzB,GAAMsxB,GAAQ/yB,EAAM,UACxB,OAAe,KAARyB,EAAa,IAAMA,MAO9ByzB,WACCC,aAAe,EACfC,aAAe,EACfrB,YAAc,EACdsB,YAAc,EACdvnB,SAAW,EACXwnB,SAAW,EACXC,QAAU,EACVC,QAAU,EACV1kB,MAAQ,GAKT2kB,UAECC,QAAS/4B,EAAO6P,QAAQuB,SAAW,WAAa,cAIjDX,MAAO,SAAUpN,EAAMgD,EAAM6D,EAAO8uB,GAEnC,GAAM31B,GAA0B,IAAlBA,EAAKQ,UAAoC,IAAlBR,EAAKQ,UAAmBR,EAAKoN,MAAlE,CAKA,GAAI3L,GAAKnC,EAAMsT,EACdwhB,EAAWz3B,EAAO8J,UAAWzD,GAC7BoK,EAAQpN,EAAKoN,KASd,IAPApK,EAAOrG,EAAO84B,SAAUrB,KAAgBz3B,EAAO84B,SAAUrB,GAAaF,GAAgB9mB,EAAOgnB,IAI7FxhB,EAAQjW,EAAOq4B,SAAUhyB,IAAUrG,EAAOq4B,SAAUZ,GAG/CvtB,IAAUzK,EAsCd,MAAKwW,IAAS,OAASA,KAAUnR,EAAMmR,EAAMvR,IAAKrB,GAAM,EAAO21B,MAAav5B,EACpEqF,EAID2L,EAAOpK,EAhCd,IAVA1D,QAAcuH,GAGA,WAATvH,IAAsBmC,EAAM8xB,GAAQnzB,KAAMyG,MAC9CA,GAAUpF,EAAI,GAAK,GAAMA,EAAI,GAAK6C,WAAY3H,EAAO43B,IAAKv0B,EAAMgD,IAEhE1D,EAAO,YAIM,MAATuH,GAA0B,WAATvH,GAAqB+E,MAAOwC,KAKpC,WAATvH,GAAsB3C,EAAOu4B,UAAWd,KAC5CvtB,GAAS,MAKJlK,EAAO6P,QAAQuD,iBAA6B,KAAVlJ,GAA+C,IAA/B7D,EAAKxF,QAAQ,gBACpE4P,EAAOpK,GAAS,WAIX4P,GAAW,OAASA,KAAW/L,EAAQ+L,EAAM0C,IAAKtV,EAAM6G,EAAO8uB,MAAav5B,IAIjF,IACCgR,EAAOpK,GAAS6D,EACf,MAAMpC,OAcX8vB,IAAK,SAAUv0B,EAAMgD,EAAM2yB,EAAOf,GACjC,GAAItzB,GAAK8T,EAAKxC,EACbwhB,EAAWz3B,EAAO8J,UAAWzD,EAyB9B,OAtBAA,GAAOrG,EAAO84B,SAAUrB,KAAgBz3B,EAAO84B,SAAUrB,GAAaF,GAAgBl0B,EAAKoN,MAAOgnB,IAIlGxhB,EAAQjW,EAAOq4B,SAAUhyB,IAAUrG,EAAOq4B,SAAUZ,GAG/CxhB,GAAS,OAASA,KACtBwC,EAAMxC,EAAMvR,IAAKrB,GAAM,EAAM21B,IAIzBvgB,IAAQhZ,IACZgZ,EAAM2d,GAAQ/yB,EAAMgD,EAAM4xB,IAId,WAARxf,GAAoBpS,IAAQ6wB,MAChCze,EAAMye,GAAoB7wB,IAIZ,KAAV2yB,GAAgBA,GACpBr0B,EAAMgD,WAAY8Q,GACXugB,KAAU,GAAQh5B,EAAOyH,UAAW9C,GAAQA,GAAO,EAAI8T,GAExDA,GAIRwgB,KAAM,SAAU51B,EAAMiD,EAASrB,EAAUC,GACxC,GAAIJ,GAAKuB,EACR8f,IAGD,KAAM9f,IAAQC,GACb6f,EAAK9f,GAAShD,EAAKoN,MAAOpK,GAC1BhD,EAAKoN,MAAOpK,GAASC,EAASD,EAG/BvB,GAAMG,EAASI,MAAOhC,EAAM6B,MAG5B,KAAMmB,IAAQC,GACbjD,EAAKoN,MAAOpK,GAAS8f,EAAK9f,EAG3B,OAAOvB,MAMJtF,EAAOwU,kBACXmiB,GAAY,SAAU9yB,GACrB,MAAO7D,GAAOwU,iBAAkB3Q,EAAM,OAGvC+yB,GAAS,SAAU/yB,EAAMgD,EAAM6yB,GAC9B,GAAIjlB,GAAOklB,EAAUC,EACpBd,EAAWY,GAAa/C,GAAW9yB,GAGnCyB,EAAMwzB,EAAWA,EAASe,iBAAkBhzB,IAAUiyB,EAAUjyB,GAAS5G,EACzEgR,EAAQpN,EAAKoN,KA8Bd,OA5BK6nB,KAES,KAARxzB,GAAe9E,EAAOyhB,SAAUpe,EAAKS,cAAeT,KACxDyB,EAAM9E,EAAOyQ,MAAOpN,EAAMgD,IAOtBswB,GAAU5yB,KAAMe,IAAS2xB,GAAQ1yB,KAAMsC,KAG3C4N,EAAQxD,EAAMwD,MACdklB,EAAW1oB,EAAM0oB,SACjBC,EAAW3oB,EAAM2oB,SAGjB3oB,EAAM0oB,SAAW1oB,EAAM2oB,SAAW3oB,EAAMwD,MAAQnP,EAChDA,EAAMwzB,EAASrkB,MAGfxD,EAAMwD,MAAQA,EACdxD,EAAM0oB,SAAWA,EACjB1oB,EAAM2oB,SAAWA,IAIZt0B,IAEGjF,EAAS4J,gBAAgB6vB,eACpCnD,GAAY,SAAU9yB,GACrB,MAAOA,GAAKi2B,cAGblD,GAAS,SAAU/yB,EAAMgD,EAAM6yB,GAC9B,GAAIK,GAAMC,EAAIC,EACbnB,EAAWY,GAAa/C,GAAW9yB,GACnCyB,EAAMwzB,EAAWA,EAAUjyB,GAAS5G,EACpCgR,EAAQpN,EAAKoN,KAoCd,OAhCY,OAAP3L,GAAe2L,GAASA,EAAOpK,KACnCvB,EAAM2L,EAAOpK,IAUTswB,GAAU5yB,KAAMe,KAAUyxB,GAAUxyB,KAAMsC,KAG9CkzB,EAAO9oB,EAAM8oB,KACbC,EAAKn2B,EAAKq2B,aACVD,EAASD,GAAMA,EAAGD,KAGbE,IACJD,EAAGD,KAAOl2B,EAAKi2B,aAAaC,MAE7B9oB,EAAM8oB,KAAgB,aAATlzB,EAAsB,MAAQvB,EAC3CA,EAAM2L,EAAMkpB,UAAY,KAGxBlpB,EAAM8oB,KAAOA,EACRE,IACJD,EAAGD,KAAOE,IAIG,KAAR30B,EAAa,OAASA,GAI/B,SAAS80B,IAAmBv2B,EAAM6G,EAAO2vB,GACxC,GAAIjb,GAAU8X,GAAUjzB,KAAMyG,EAC9B,OAAO0U,GAENnU,KAAKC,IAAK,EAAGkU,EAAS,IAAQib,GAAY,KAAUjb,EAAS,IAAO,MACpE1U,EAGF,QAAS4vB,IAAsBz2B,EAAMgD,EAAM2yB,EAAOe,EAAa9B,GAC9D,GAAIvyB,GAAIszB,KAAYe,EAAc,SAAW,WAE5C,EAES,UAAT1zB,EAAmB,EAAI,EAEvBoS,EAAM,CAEP,MAAY,EAAJ/S,EAAOA,GAAK,EAEJ,WAAVszB,IACJvgB,GAAOzY,EAAO43B,IAAKv0B,EAAM21B,EAAQ3B,GAAW3xB,IAAK,EAAMuyB,IAGnD8B,GAEW,YAAVf,IACJvgB,GAAOzY,EAAO43B,IAAKv0B,EAAM,UAAYg0B,GAAW3xB,IAAK,EAAMuyB,IAI7C,WAAVe,IACJvgB,GAAOzY,EAAO43B,IAAKv0B,EAAM,SAAWg0B,GAAW3xB,GAAM,SAAS,EAAMuyB,MAIrExf,GAAOzY,EAAO43B,IAAKv0B,EAAM,UAAYg0B,GAAW3xB,IAAK,EAAMuyB,GAG5C,YAAVe,IACJvgB,GAAOzY,EAAO43B,IAAKv0B,EAAM,SAAWg0B,GAAW3xB,GAAM,SAAS,EAAMuyB,IAKvE,OAAOxf,GAGR,QAASuhB,IAAkB32B,EAAMgD,EAAM2yB,GAGtC,GAAIiB,IAAmB,EACtBxhB,EAAe,UAATpS,EAAmBhD,EAAKwQ,YAAcxQ,EAAKoQ,aACjDwkB,EAAS9B,GAAW9yB,GACpB02B,EAAc/5B,EAAO6P,QAAQ+D,WAAgE,eAAnD5T,EAAO43B,IAAKv0B,EAAM,aAAa,EAAO40B,EAKjF,IAAY,GAAPxf,GAAmB,MAAPA,EAAc,CAQ9B,GANAA,EAAM2d,GAAQ/yB,EAAMgD,EAAM4xB,IACf,EAANxf,GAAkB,MAAPA,KACfA,EAAMpV,EAAKoN,MAAOpK,IAIdswB,GAAU5yB,KAAK0U,GACnB,MAAOA,EAKRwhB,GAAmBF,IAAiB/5B,EAAO6P,QAAQsC,mBAAqBsG,IAAQpV,EAAKoN,MAAOpK,IAG5FoS,EAAM9Q,WAAY8Q,IAAS,EAI5B,MAASA,GACRqhB,GACCz2B,EACAgD,EACA2yB,IAAWe,EAAc,SAAW,WACpCE,EACAhC,GAEE,KAIL,QAASD,IAAoBhuB,GAC5B,GAAI2V,GAAM9f,EACT6T,EAAUmjB,GAAa7sB,EA0BxB,OAxBM0J,KACLA,EAAUwmB,GAAelwB,EAAU2V,GAGlB,SAAZjM,GAAuBA,IAE3BwiB,IAAWA,IACVl2B,EAAO,kDACN43B,IAAK,UAAW,6BAChBvC,SAAU1V,EAAIlW,iBAGhBkW,GAAQuW,GAAO,GAAGvF,eAAiBuF,GAAO,GAAGxF,iBAAkB7wB,SAC/D8f,EAAIwa,MAAM,+BACVxa,EAAIya,QAEJ1mB,EAAUwmB,GAAelwB,EAAU2V,GACnCuW,GAAOrzB,UAIRg0B,GAAa7sB,GAAa0J,GAGpBA,EAIR,QAASwmB,IAAe7zB,EAAMsZ,GAC7B,GAAItc,GAAOrD,EAAQ2f,EAAInX,cAAenC,IAASgvB,SAAU1V,EAAI1Y,MAC5DyM,EAAU1T,EAAO43B,IAAKv0B,EAAK,GAAI,UAEhC,OADAA,GAAKqF,SACEgL,EAGR1T,EAAOgF,MAAO,SAAU,SAAW,SAAUU,EAAGW,GAC/CrG,EAAOq4B,SAAUhyB,IAChB3B,IAAK,SAAUrB,EAAMi1B,EAAUU,GAC9B,MAAKV,GAGwB,IAArBj1B,EAAKwQ,aAAqB2iB,GAAazyB,KAAM/D,EAAO43B,IAAKv0B,EAAM,YACrErD,EAAOi5B,KAAM51B,EAAM0zB,GAAS,WAC3B,MAAOiD,IAAkB32B,EAAMgD,EAAM2yB,KAEtCgB,GAAkB32B,EAAMgD,EAAM2yB,GAPhC,GAWDrgB,IAAK,SAAUtV,EAAM6G,EAAO8uB,GAC3B,GAAIf,GAASe,GAAS7C,GAAW9yB,EACjC,OAAOu2B,IAAmBv2B,EAAM6G,EAAO8uB,EACtCc,GACCz2B,EACAgD,EACA2yB,EACAh5B,EAAO6P,QAAQ+D,WAAgE,eAAnD5T,EAAO43B,IAAKv0B,EAAM,aAAa,EAAO40B,GAClEA,GACG,OAMFj4B,EAAO6P,QAAQsB,UACpBnR,EAAOq4B,SAASlnB,SACfzM,IAAK,SAAUrB,EAAMi1B,GAEpB,MAAOhC,IAASvyB,MAAOu0B,GAAYj1B,EAAKi2B,aAAej2B,EAAKi2B,aAAaja,OAAShc,EAAKoN,MAAM4O,SAAW,IACrG,IAAO1X,WAAYqV,OAAOqd,IAAS,GACrC/B,EAAW,IAAM,IAGnB3f,IAAK,SAAUtV,EAAM6G,GACpB,GAAIuG,GAAQpN,EAAKoN,MAChB6oB,EAAej2B,EAAKi2B,aACpBnoB,EAAUnR,EAAOyH,UAAWyC,GAAU,iBAA2B,IAARA,EAAc,IAAM,GAC7EmV,EAASia,GAAgBA,EAAaja,QAAU5O,EAAM4O,QAAU,EAIjE5O,GAAM0D,KAAO,GAINjK,GAAS,GAAe,KAAVA,IAC6B,KAAhDlK,EAAOmB,KAAMke,EAAOtW,QAASstB,GAAQ,MACrC5lB,EAAM6I,kBAKP7I,EAAM6I,gBAAiB,UAGR,KAAVpP,GAAgBovB,IAAiBA,EAAaja,UAMpD5O,EAAM4O,OAASgX,GAAOtyB,KAAMsb,GAC3BA,EAAOtW,QAASstB,GAAQllB,GACxBkO,EAAS,IAAMlO,MAOnBnR,EAAO,WACAA,EAAO6P,QAAQqC,sBACpBlS,EAAOq4B,SAASnkB,aACfxP,IAAK,SAAUrB,EAAMi1B,GACpB,MAAKA,GAGGt4B,EAAOi5B,KAAM51B,GAAQqQ,QAAW,gBACtC0iB,IAAU/yB,EAAM,gBAJlB,MAaGrD,EAAO6P,QAAQuC,eAAiBpS,EAAOsB,GAAG01B,UAC/Ch3B,EAAOgF,MAAQ,MAAO,QAAU,SAAUU,EAAGkS,GAC5C5X,EAAOq4B,SAAUzgB,IAChBlT,IAAK,SAAUrB,EAAMi1B,GACpB,MAAKA,IACJA,EAAWlC,GAAQ/yB,EAAMuU,GAElB+e,GAAU5yB,KAAMu0B,GACtBt4B,EAAQqD,GAAO2zB,WAAYpf,GAAS,KACpC0gB,GALF,QAcAt4B,EAAOyc,MAAQzc,EAAOyc,KAAKwS,UAC/BjvB,EAAOyc,KAAKwS,QAAQ8I,OAAS,SAAU10B,GAGtC,MAA2B,IAApBA,EAAKwQ,aAAyC,GAArBxQ,EAAKoQ,eAClCzT,EAAO6P,QAAQ8D,uBAAmG,UAAxEtQ,EAAKoN,OAASpN,EAAKoN,MAAMiD,SAAY1T,EAAO43B,IAAKv0B,EAAM,aAGrGrD,EAAOyc,KAAKwS,QAAQqL,QAAU,SAAUj3B,GACvC,OAAQrD,EAAOyc,KAAKwS,QAAQ8I,OAAQ10B,KAKtCrD,EAAOgF,MACNu1B,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpB36B,EAAOq4B,SAAUqC,EAASC,IACzBC,OAAQ,SAAU1wB,GACjB,GAAIxE,GAAI,EACPm1B,KAGAC,EAAyB,gBAAV5wB,GAAqBA,EAAM+B,MAAM,MAAS/B,EAE1D,MAAY,EAAJxE,EAAOA,IACdm1B,EAAUH,EAASrD,GAAW3xB,GAAMi1B,GACnCG,EAAOp1B,IAAOo1B,EAAOp1B,EAAI,IAAOo1B,EAAO,EAGzC,OAAOD,KAIHpE,GAAQ1yB,KAAM22B,KACnB16B,EAAOq4B,SAAUqC,EAASC,GAAShiB,IAAMihB,KAG3C,IAAImB,IAAM,OACTC,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,oCAEhBn7B,GAAOsB,GAAG2E,QACTm1B,UAAW,WACV,MAAOp7B,GAAOqyB,MAAO/uB,KAAK+3B,mBAE3BA,eAAgB,WACf,MAAO/3B,MAAKuC,IAAI,WAEf,GAAIoR,GAAWjX,EAAO4X,KAAMtU,KAAM,WAClC,OAAO2T,GAAWjX,EAAOsE,UAAW2S,GAAa3T,OAEjD+b,OAAO,WACP,GAAI1c,GAAOW,KAAKX,IAEhB,OAAOW,MAAK+C,OAASrG,EAAQsD,MAAOssB,GAAI,cACvCuL,GAAap3B,KAAMT,KAAK0G,YAAekxB,GAAgBn3B,KAAMpB,KAC3DW,KAAK+O,UAAYwf,GAA4B9tB,KAAMpB,MAEtDkD,IAAI,SAAUH,EAAGrC,GACjB,GAAIoV,GAAMzY,EAAQsD,MAAOmV,KAEzB,OAAc,OAAPA,EACN,KACAzY,EAAO0G,QAAS+R,GACfzY,EAAO6F,IAAK4S,EAAK,SAAUA,GAC1B,OAASpS,KAAMhD,EAAKgD,KAAM6D,MAAOuO,EAAI1P,QAASkyB,GAAO,YAEpD50B,KAAMhD,EAAKgD,KAAM6D,MAAOuO,EAAI1P,QAASkyB,GAAO,WAC9Cv2B,SAML1E,EAAOqyB,MAAQ,SAAUviB,EAAGwrB,GAC3B,GAAIZ,GACHa,KACAjuB,EAAM,SAAUvF,EAAKmC,GAEpBA,EAAQlK,EAAOiE,WAAYiG,GAAUA,IAAqB,MAATA,EAAgB,GAAKA,EACtEqxB,EAAGA,EAAE/3B,QAAWg4B,mBAAoBzzB,GAAQ,IAAMyzB,mBAAoBtxB,GASxE,IALKoxB,IAAgB77B,IACpB67B,EAAct7B,EAAOy7B,cAAgBz7B,EAAOy7B,aAAaH,aAIrDt7B,EAAO0G,QAASoJ,IAASA,EAAE5M,SAAWlD,EAAOgE,cAAe8L,GAEhE9P,EAAOgF,KAAM8K,EAAG,WACfxC,EAAKhK,KAAK+C,KAAM/C,KAAK4G,aAMtB,KAAMwwB,IAAU5qB,GACf4rB,GAAahB,EAAQ5qB,EAAG4qB,GAAUY,EAAahuB,EAKjD,OAAOiuB,GAAE5e,KAAM,KAAM5T,QAASgyB,GAAK,KAGpC,SAASW,IAAahB,EAAQpzB,EAAKg0B,EAAahuB,GAC/C,GAAIjH,EAEJ,IAAKrG,EAAO0G,QAASY,GAEpBtH,EAAOgF,KAAMsC,EAAK,SAAU5B,EAAGi2B,GACzBL,GAAeN,GAASj3B,KAAM22B,GAElCptB,EAAKotB,EAAQiB,GAIbD,GAAahB,EAAS,KAAqB,gBAANiB,GAAiBj2B,EAAI,IAAO,IAAKi2B,EAAGL,EAAahuB,SAIlF,IAAMguB,GAAsC,WAAvBt7B,EAAO2C,KAAM2E,GAQxCgG,EAAKotB,EAAQpzB,OANb,KAAMjB,IAAQiB,GACbo0B,GAAahB,EAAS,IAAMr0B,EAAO,IAAKiB,EAAKjB,GAAQi1B,EAAahuB,GAQrEtN,EAAOgF,KAAM,0MAEqDiH,MAAM,KAAM,SAAUvG,EAAGW,GAG1FrG,EAAOsB,GAAI+E,GAAS,SAAU+B,EAAM9G,GACnC,MAAOgE,WAAU9B,OAAS,EACzBF,KAAK4e,GAAI7b,EAAM,KAAM+B,EAAM9G,GAC3BgC,KAAK8D,QAASf,MAIjBrG,EAAOsB,GAAGs6B,MAAQ,SAAUC,EAAQC,GACnC,MAAOx4B,MAAK+d,WAAYwa,GAASva,WAAYwa,GAASD,GAEvD,IAECE,IACAC,GACAC,GAAaj8B,EAAOwL,MAEpB0wB,GAAc,KACdC,GAAQ,OACRC,GAAM,gBACNC,GAAW,gCAEXC,GAAiB,4DACjBC,GAAa,iBACbC,GAAY,QACZC,GAAO,8CAGPC,GAAQ18B,EAAOsB,GAAGif,KAWlBoc,MAOAC,MAGAC,GAAW,KAAKt8B,OAAO,IAIxB,KACCy7B,GAAel8B,EAAS0a,KACvB,MAAO1S,IAGRk0B,GAAen8B,EAAS2I,cAAe,KACvCwzB,GAAaxhB,KAAO,GACpBwhB,GAAeA,GAAaxhB,KAI7BuhB,GAAeU,GAAKh5B,KAAMu4B,GAAa/xB,kBAGvC,SAAS6yB,IAA6BC,GAGrC,MAAO,UAAUC,EAAoBhvB,GAED,gBAAvBgvB,KACXhvB,EAAOgvB,EACPA,EAAqB,IAGtB,IAAIrI,GACHjvB,EAAI,EACJu3B,EAAYD,EAAmB/yB,cAAc7G,MAAO1B,MAErD,IAAK1B,EAAOiE,WAAY+J,GAEvB,MAAS2mB,EAAWsI,EAAUv3B,KAER,MAAhBivB,EAAS,IACbA,EAAWA,EAASh0B,MAAO,IAAO,KACjCo8B,EAAWpI,GAAaoI,EAAWpI,QAAkBte,QAASrI,KAI9D+uB,EAAWpI,GAAaoI,EAAWpI,QAAkBl0B,KAAMuN,IAQjE,QAASkvB,IAA+BH,EAAWz2B,EAAS62B,EAAiBC,GAE5E,GAAIC,MACHC,EAAqBP,IAAcH,EAEpC,SAASW,GAAS5I,GACjB,GAAIpjB,EAYJ,OAXA8rB,GAAW1I,IAAa,EACxB30B,EAAOgF,KAAM+3B,EAAWpI,OAAkB,SAAUtoB,EAAGmxB,GACtD,GAAIC,GAAsBD,EAAoBl3B,EAAS62B,EAAiBC,EACxE,OAAmC,gBAAxBK,IAAqCH,GAAqBD,EAAWI,GAIpEH,IACD/rB,EAAWksB,GADf,GAHNn3B,EAAQ22B,UAAU5mB,QAASonB,GAC3BF,EAASE,IACF,KAKFlsB,EAGR,MAAOgsB,GAASj3B,EAAQ22B,UAAW,MAAUI,EAAW,MAASE,EAAS,KAM3E,QAASG,IAAYl3B,EAAQN,GAC5B,GAAIO,GAAMsB,EACT41B,EAAc39B,EAAOy7B,aAAakC,eAEnC,KAAM51B,IAAO7B,GACPA,EAAK6B,KAAUtI,KACjBk+B,EAAa51B,GAAQvB,EAAWC,IAASA,OAAgBsB,GAAQ7B,EAAK6B,GAO1E,OAJKtB,IACJzG,EAAOiG,QAAQ,EAAMO,EAAQC,GAGvBD,EAGRxG,EAAOsB,GAAGif,KAAO,SAAUmU,EAAKkJ,EAAQ34B,GACvC,GAAoB,gBAARyvB,IAAoBgI,GAC/B,MAAOA,IAAMr3B,MAAO/B,KAAMgC,UAG3B,IAAIlE,GAAUy8B,EAAUl7B,EACvByK,EAAO9J,KACP+D,EAAMqtB,EAAI7zB,QAAQ,IA+CnB,OA7CKwG,IAAO,IACXjG,EAAWszB,EAAI/zB,MAAO0G,EAAKqtB,EAAIlxB,QAC/BkxB,EAAMA,EAAI/zB,MAAO,EAAG0G,IAIhBrH,EAAOiE,WAAY25B,IAGvB34B,EAAW24B,EACXA,EAASn+B,GAGEm+B,GAA4B,gBAAXA,KAC5Bj7B,EAAO,QAIHyK,EAAK5J,OAAS,GAClBxD,EAAOy0B,MACNC,IAAKA,EAGL/xB,KAAMA,EACNgyB,SAAU,OACVvsB,KAAMw1B,IACJx4B,KAAK,SAAU04B,GAGjBD,EAAWv4B,UAEX8H,EAAKgmB,KAAMhyB,EAIVpB,EAAO,SAASizB,OAAQjzB,EAAO4D,UAAWk6B,IAAiBp6B,KAAMtC,GAGjE08B,KAECC,SAAU94B,GAAY,SAAUm4B,EAAOY,GACzC5wB,EAAKpI,KAAMC,EAAU44B,IAAcT,EAAMU,aAAcE,EAAQZ,MAI1D95B,MAIRtD,EAAOgF,MAAQ,YAAa,WAAY,eAAgB,YAAa,cAAe,YAAc,SAAUU,EAAG/C,GAC9G3C,EAAOsB,GAAIqB,GAAS,SAAUrB,GAC7B,MAAOgC,MAAK4e,GAAIvf,EAAMrB,MAIxBtB,EAAOgF,MAAQ,MAAO,QAAU,SAAUU,EAAGu4B,GAC5Cj+B,EAAQi+B,GAAW,SAAUvJ,EAAKtsB,EAAMnD,EAAUtC,GAQjD,MANK3C,GAAOiE,WAAYmE,KACvBzF,EAAOA,GAAQsC,EACfA,EAAWmD,EACXA,EAAO3I,GAGDO,EAAOy0B,MACbC,IAAKA,EACL/xB,KAAMs7B,EACNtJ,SAAUhyB,EACVyF,KAAMA,EACN81B,QAASj5B,OAKZjF,EAAOiG,QAGNk4B,OAAQ,EAGRC,gBACAC,QAEA5C,cACC/G,IAAKsH,GACLr5B,KAAM,MACN27B,QAAShC,GAAev4B,KAAMg4B,GAAc,IAC5CzgB,QAAQ,EACRijB,aAAa,EACbh1B,OAAO,EACPi1B,YAAa,mDAabC,SACCC,IAAK7B,GACLzyB,KAAM,aACNgpB,KAAM,YACNlqB,IAAK,4BACLy1B,KAAM,qCAGPnP,UACCtmB,IAAK,MACLkqB,KAAM,OACNuL,KAAM,QAGPC,gBACC11B,IAAK,cACLkB,KAAM,gBAKPy0B,YAGCC,SAAUt/B,EAAOqI,OAGjBk3B,aAAa,EAGbC,YAAah/B,EAAO4I,UAGpBq2B,WAAYj/B,EAAOiJ,UAOpB00B,aACCjJ,KAAK,EACLrzB,SAAS,IAOX69B,UAAW,SAAU14B,EAAQ24B,GAC5B,MAAOA,GAGNzB,GAAYA,GAAYl3B,EAAQxG,EAAOy7B,cAAgB0D,GAGvDzB,GAAY19B,EAAOy7B,aAAcj1B,IAGnC44B,cAAetC,GAA6BH,IAC5C0C,cAAevC,GAA6BF,IAG5CnI,KAAM,SAAUC,EAAKpuB,GAGA,gBAARouB,KACXpuB,EAAUouB,EACVA,EAAMj1B,GAIP6G,EAAUA,KAEV,IACCw0B,GAEAp1B,EAEA45B,EAEAC,EAEAC,EAGAC,EAEAC,EAEAC,EAEApE,EAAIv7B,EAAOk/B,aAAe54B,GAE1Bs5B,EAAkBrE,EAAEl6B,SAAWk6B,EAE/BsE,EAAqBtE,EAAEl6B,UAAau+B,EAAgB/7B,UAAY+7B,EAAgB18B,QAC/ElD,EAAQ4/B,GACR5/B,EAAOyC,MAER2L,EAAWpO,EAAO2L,WAClBm0B,EAAmB9/B,EAAOuM,UAAU,eAEpCwzB,EAAaxE,EAAEwE,eAEfC,KACAC,KAEA/xB,EAAQ,EAERgyB,EAAW,WAEX9C,GACCx6B,WAAY,EAGZu9B,kBAAmB,SAAUp4B,GAC5B,GAAI3E,EACJ,IAAe,IAAV8K,EAAc,CAClB,IAAMyxB,EAAkB,CACvBA,IACA,OAASv8B,EAAQi5B,GAAS54B,KAAM87B,GAC/BI,EAAiBv8B,EAAM,GAAG6G,eAAkB7G,EAAO,GAGrDA,EAAQu8B,EAAiB53B,EAAIkC,eAE9B,MAAgB,OAAT7G,EAAgB,KAAOA,GAI/Bg9B,sBAAuB,WACtB,MAAiB,KAAVlyB,EAAcqxB,EAAwB,MAI9Cc,iBAAkB,SAAUh6B,EAAM6D,GACjC,GAAIo2B,GAAQj6B,EAAK4D,aAKjB,OAJMiE,KACL7H,EAAO45B,EAAqBK,GAAUL,EAAqBK,IAAWj6B,EACtE25B,EAAgB35B,GAAS6D,GAEnB5G,MAIRi9B,iBAAkB,SAAU59B,GAI3B,MAHMuL,KACLqtB,EAAEiF,SAAW79B,GAEPW,MAIRy8B,WAAY,SAAUl6B,GACrB,GAAI46B,EACJ,IAAK56B,EACJ,GAAa,EAARqI,EACJ,IAAMuyB,IAAQ56B,GAEbk6B,EAAYU,IAAWV,EAAYU,GAAQ56B,EAAK46B,QAIjDrD,GAAMjvB,OAAQtI,EAAKu3B,EAAMY,QAG3B,OAAO16B,OAIRo9B,MAAO,SAAUC,GAChB,GAAIC,GAAYD,GAAcT,CAK9B,OAJKR,IACJA,EAAUgB,MAAOE,GAElBx7B,EAAM,EAAGw7B,GACFt9B,MAwCV,IAnCA8K,EAASjJ,QAASi4B,GAAQW,SAAW+B,EAAiBxyB,IACtD8vB,EAAMc,QAAUd,EAAMh4B,KACtBg4B,EAAMn1B,MAAQm1B,EAAM/uB,KAMpBktB,EAAE7G,MAAUA,GAAO6G,EAAE7G,KAAOsH,IAAiB,IAAKjzB,QAASozB,GAAO,IAAKpzB,QAASyzB,GAAWT,GAAc,GAAM,MAG/GR,EAAE54B,KAAO2D,EAAQ23B,QAAU33B,EAAQ3D,MAAQ44B,EAAE0C,QAAU1C,EAAE54B,KAGzD44B,EAAE0B,UAAYj9B,EAAOmB,KAAMo6B,EAAE5G,UAAY,KAAM1qB,cAAc7G,MAAO1B,KAAqB,IAGnE,MAAjB65B,EAAEsF,cACN/F,EAAQ2B,GAAKh5B,KAAM83B,EAAE7G,IAAIzqB,eACzBsxB,EAAEsF,eAAkB/F,GACjBA,EAAO,KAAQiB,GAAc,IAAOjB,EAAO,KAAQiB,GAAc,KAChEjB,EAAO,KAAwB,UAAfA,EAAO,GAAkB,GAAK,QAC7CiB,GAAc,KAA+B,UAAtBA,GAAc,GAAkB,GAAK,QAK7DR,EAAEnzB,MAAQmzB,EAAEgD,aAAiC,gBAAXhD,GAAEnzB,OACxCmzB,EAAEnzB,KAAOpI,EAAOqyB,MAAOkJ,EAAEnzB,KAAMmzB,EAAED,cAIlC4B,GAA+BP,GAAYpB,EAAGj1B,EAAS82B,GAGxC,IAAVlvB,EACJ,MAAOkvB,EAIRqC,GAAclE,EAAEjgB,OAGXmkB,GAAmC,IAApBz/B,EAAOm+B,UAC1Bn+B,EAAOyC,MAAM2E,QAAQ,aAItBm0B,EAAE54B,KAAO44B,EAAE54B,KAAKJ,cAGhBg5B,EAAEuF,YAAcvE,GAAWx4B,KAAMw3B,EAAE54B,MAInC28B,EAAW/D,EAAE7G,IAGP6G,EAAEuF,aAGFvF,EAAEnzB,OACNk3B,EAAa/D,EAAE7G,MAASwH,GAAYn4B,KAAMu7B,GAAa,IAAM,KAAQ/D,EAAEnzB,WAEhEmzB,GAAEnzB,MAILmzB,EAAEzmB,SAAU,IAChBymB,EAAE7G,IAAM0H,GAAIr4B,KAAMu7B,GAGjBA,EAASv2B,QAASqzB,GAAK,OAASH,MAGhCqD,GAAapD,GAAYn4B,KAAMu7B,GAAa,IAAM,KAAQ,KAAOrD,OAK/DV,EAAEwF,aACD/gC,EAAOo+B,aAAckB,IACzBlC,EAAMiD,iBAAkB,oBAAqBrgC,EAAOo+B,aAAckB,IAE9Dt/B,EAAOq+B,KAAMiB,IACjBlC,EAAMiD,iBAAkB,gBAAiBrgC,EAAOq+B,KAAMiB,MAKnD/D,EAAEnzB,MAAQmzB,EAAEuF,YAAcvF,EAAEiD,eAAgB,GAASl4B,EAAQk4B,cACjEpB,EAAMiD,iBAAkB,eAAgB9E,EAAEiD,aAI3CpB,EAAMiD,iBACL,SACA9E,EAAE0B,UAAW,IAAO1B,EAAEkD,QAASlD,EAAE0B,UAAU,IAC1C1B,EAAEkD,QAASlD,EAAE0B,UAAU,KAA8B,MAArB1B,EAAE0B,UAAW,GAAc,KAAOJ,GAAW,WAAa,IAC1FtB,EAAEkD,QAAS,KAIb,KAAM/4B,IAAK61B,GAAEyF,QACZ5D,EAAMiD,iBAAkB36B,EAAG61B,EAAEyF,QAASt7B,GAIvC,IAAK61B,EAAE0F,aAAgB1F,EAAE0F,WAAWx8B,KAAMm7B,EAAiBxC,EAAO7B,MAAQ,GAAmB,IAAVrtB,GAElF,MAAOkvB,GAAMsD,OAIdR,GAAW,OAGX,KAAMx6B,KAAOw4B,QAAS,EAAGj2B,MAAO,EAAG81B,SAAU,GAC5CX,EAAO13B,GAAK61B,EAAG71B,GAOhB,IAHAg6B,EAAYxC,GAA+BN,GAAYrB,EAAGj1B,EAAS82B,GAK5D,CACNA,EAAMx6B,WAAa,EAGd68B,GACJI,EAAmBz4B,QAAS,YAAcg2B,EAAO7B,IAG7CA,EAAEhyB,OAASgyB,EAAE3kB,QAAU,IAC3B4oB,EAAet4B,WAAW,WACzBk2B,EAAMsD,MAAM,YACVnF,EAAE3kB,SAGN,KACC1I,EAAQ,EACRwxB,EAAUwB,KAAMlB,EAAgB56B,GAC/B,MAAQ0C,GAET,KAAa,EAARoG,GAIJ,KAAMpG,EAHN1C,GAAM,GAAI0C,QArBZ1C,GAAM,GAAI,eA8BX,SAASA,GAAM44B,EAAQmD,EAAkBC,EAAWJ,GACnD,GAAIK,GAAWnD,EAASj2B,EAAO41B,EAAUyD,EACxCX,EAAaQ,CAGC,KAAVjzB,IAKLA,EAAQ,EAGHsxB,GACJ3oB,aAAc2oB,GAKfE,EAAYjgC,EAGZ8/B,EAAwByB,GAAW,GAGnC5D,EAAMx6B,WAAao7B,EAAS,EAAI,EAAI,EAG/BoD,IACJvD,EAAW0D,GAAqBhG,EAAG6B,EAAOgE,IAItCpD,GAAU,KAAgB,IAATA,GAA2B,MAAXA,GAGhCzC,EAAEwF,aACNO,EAAWlE,EAAM+C,kBAAkB,iBAC9BmB,IACJthC,EAAOo+B,aAAckB,GAAagC,GAEnCA,EAAWlE,EAAM+C,kBAAkB,QAC9BmB,IACJthC,EAAOq+B,KAAMiB,GAAagC,IAKZ,MAAXtD,GACJqD,GAAY,EACZV,EAAa,aAGS,MAAX3C,GACXqD,GAAY,EACZV,EAAa,gBAIbU,EAAYG,GAAajG,EAAGsC,GAC5B8C,EAAaU,EAAUnzB,MACvBgwB,EAAUmD,EAAUj5B,KACpBH,EAAQo5B,EAAUp5B,MAClBo5B,GAAap5B,KAKdA,EAAQ04B,GACH3C,IAAW2C,KACfA,EAAa,QACC,EAAT3C,IACJA,EAAS,KAMZZ,EAAMY,OAASA,EACfZ,EAAMuD,YAAeQ,GAAoBR,GAAe,GAGnDU,EACJjzB,EAASjH,YAAay4B,GAAmB1B,EAASyC,EAAYvD,IAE9DhvB,EAASqzB,WAAY7B,GAAmBxC,EAAOuD,EAAY14B,IAI5Dm1B,EAAM2C,WAAYA,GAClBA,EAAatgC,EAERggC,GACJI,EAAmBz4B,QAASi6B,EAAY,cAAgB,aACrDjE,EAAO7B,EAAG8F,EAAYnD,EAAUj2B,IAIpC63B,EAAiB/xB,SAAU6xB,GAAmBxC,EAAOuD,IAEhDlB,IACJI,EAAmBz4B,QAAS,gBAAkBg2B,EAAO7B,MAE3Cv7B,EAAOm+B,QAChBn+B,EAAOyC,MAAM2E,QAAQ,cAKxB,MAAOg2B,IAGRsE,UAAW,SAAUhN,EAAKzvB,GACzB,MAAOjF,GAAO0E,IAAKgwB,EAAKj1B,EAAWwF,EAAU,WAG9C08B,QAAS,SAAUjN,EAAKtsB,EAAMnD,GAC7B,MAAOjF,GAAO0E,IAAKgwB,EAAKtsB,EAAMnD,EAAU,UAS1C,SAASs8B,IAAqBhG,EAAG6B,EAAOgE,GACvC,GAAIQ,GAAeC,EAAIC,EAAen/B,EACrC6sB,EAAW+L,EAAE/L,SACbyN,EAAY1B,EAAE0B,UACd2B,EAAiBrD,EAAEqD,cAGpB,KAAMj8B,IAAQi8B,GACRj8B,IAAQy+B,KACZhE,EAAOwB,EAAej8B,IAAUy+B,EAAWz+B,GAK7C,OAA0B,MAAnBs6B,EAAW,GACjBA,EAAU9vB,QACL00B,IAAOpiC,IACXoiC,EAAKtG,EAAEiF,UAAYpD,EAAM+C,kBAAkB,gBAK7C,IAAK0B,EACJ,IAAMl/B,IAAQ6sB,GACb,GAAKA,EAAU7sB,IAAU6sB,EAAU7sB,GAAOoB,KAAM89B,GAAO,CACtD5E,EAAU5mB,QAAS1T,EACnB,OAMH,GAAKs6B,EAAW,IAAOmE,GACtBU,EAAgB7E,EAAW,OACrB,CAEN,IAAMt6B,IAAQy+B,GAAY,CACzB,IAAMnE,EAAW,IAAO1B,EAAEsD,WAAYl8B,EAAO,IAAMs6B,EAAU,IAAO,CACnE6E,EAAgBn/B,CAChB,OAEKi/B,IACLA,EAAgBj/B,GAIlBm/B,EAAgBA,GAAiBF,EAMlC,MAAKE,IACCA,IAAkB7E,EAAW,IACjCA,EAAU5mB,QAASyrB,GAEbV,EAAWU,IAJnB,EASD,QAASN,IAAajG,EAAGsC,GACxB,GAAIkE,GAAOC,EAASC,EAAM94B,EACzB01B,KACAn5B,EAAI,EAEJu3B,EAAY1B,EAAE0B,UAAUt8B,QACxB8uB,EAAOwN,EAAW,EAQnB,IALK1B,EAAE2G,aACNrE,EAAWtC,EAAE2G,WAAYrE,EAAUtC,EAAE5G,WAIjCsI,EAAW,GACf,IAAMgF,IAAQ1G,GAAEsD,WACfA,EAAYoD,EAAKh4B,eAAkBsxB,EAAEsD,WAAYoD,EAKnD,MAASD,EAAU/E,IAAYv3B,IAG9B,GAAiB,MAAZs8B,EAAkB,CAGtB,GAAc,MAATvS,GAAgBA,IAASuS,EAAU,CAMvC,GAHAC,EAAOpD,EAAYpP,EAAO,IAAMuS,IAAanD,EAAY,KAAOmD,IAG1DC,EACL,IAAMF,IAASlD,GAId,GADA11B,EAAM44B,EAAM91B,MAAM,KACb9C,EAAK,KAAQ64B,IAGjBC,EAAOpD,EAAYpP,EAAO,IAAMtmB,EAAK,KACpC01B,EAAY,KAAO11B,EAAK,KACb,CAEN84B,KAAS,EACbA,EAAOpD,EAAYkD,GAGRlD,EAAYkD,MAAY,IACnCC,EAAU74B,EAAK,GACf8zB,EAAUj3B,OAAQN,IAAK,EAAGs8B,GAG3B,OAOJ,GAAKC,KAAS,EAGb,GAAKA,GAAQ1G,EAAE,UACdsC,EAAWoE,EAAMpE,OAEjB,KACCA,EAAWoE,EAAMpE,GAChB,MAAQ/1B,GACT,OAASoG,MAAO,cAAejG,MAAOg6B,EAAOn6B,EAAI,sBAAwB2nB,EAAO,OAASuS,IAO7FvS,EAAOuS,EAIT,OAAS9zB,MAAO,UAAW9F,KAAMy1B,GAGlC79B,EAAOk/B,WACNT,SACC0D,OAAQ,6FAET3S,UACC2S,OAAQ,uBAETtD,YACCuD,cAAe,SAAUh4B,GAExB,MADApK,GAAO4J,WAAYQ,GACZA,MAMVpK,EAAOo/B,cAAe,SAAU,SAAU7D,GACpCA,EAAEzmB,QAAUrV,IAChB87B,EAAEzmB,OAAQ,GAENymB,EAAEsF,cACNtF,EAAE54B,KAAO,MACT44B,EAAEjgB,QAAS,KAKbtb,EAAOq/B,cAAe,SAAU,SAAS9D,GAGxC,GAAKA,EAAEsF,YAAc,CAEpB,GAAIsB,GACHE,EAAOxiC,EAASwiC,MAAQriC,EAAO,QAAQ,IAAMH,EAAS4J,eAEvD,QAECy3B,KAAM,SAAU70B,EAAGpH,GAElBk9B,EAAStiC,EAAS2I,cAAc,UAEhC25B,EAAO54B,OAAQ,EAEVgyB,EAAE+G,gBACNH,EAAOI,QAAUhH,EAAE+G,eAGpBH,EAAOj8B,IAAMq1B,EAAE7G,IAGfyN,EAAOK,OAASL,EAAOM,mBAAqB,SAAUp2B,EAAGq2B,IAEnDA,IAAYP,EAAOv/B,YAAc,kBAAkBmB,KAAMo+B,EAAOv/B,eAGpEu/B,EAAOK,OAASL,EAAOM,mBAAqB,KAGvCN,EAAO/9B,YACX+9B,EAAO/9B,WAAWgQ,YAAa+tB,GAIhCA,EAAS,KAGHO,GACLz9B,EAAU,IAAK,aAOlBo9B,EAAKpb,aAAckb,EAAQE,EAAKvxB,aAGjC4vB,MAAO,WACDyB,GACJA,EAAOK,OAAQ/iC,GAAW,OAM/B,IAAIkjC,OACHC,GAAS,mBAGV5iC,GAAOk/B,WACN2D,MAAO,WACPC,cAAe,WACd,GAAI79B,GAAW09B,GAAa5tB,OAAW/U,EAAOkT,QAAU,IAAQ+oB,IAEhE,OADA34B,MAAM2B,IAAa,EACZA,KAKTjF,EAAOo/B,cAAe,aAAc,SAAU7D,EAAGwH,EAAkB3F,GAElE,GAAI4F,GAAcC,EAAaC,EAC9BC,EAAW5H,EAAEsH,SAAU,IAAWD,GAAO7+B,KAAMw3B,EAAE7G,KAChD,MACkB,gBAAX6G,GAAEnzB,QAAwBmzB,EAAEiD,aAAe,IAAK39B,QAAQ,sCAAwC+hC,GAAO7+B,KAAMw3B,EAAEnzB,OAAU,OAIlI,OAAK+6B,IAAiC,UAArB5H,EAAE0B,UAAW,IAG7B+F,EAAezH,EAAEuH,cAAgB9iC,EAAOiE,WAAYs3B,EAAEuH,eACrDvH,EAAEuH,gBACFvH,EAAEuH,cAGEK,EACJ5H,EAAG4H,GAAa5H,EAAG4H,GAAWp6B,QAAS65B,GAAQ,KAAOI,GAC3CzH,EAAEsH,SAAU,IACvBtH,EAAE7G,MAASwH,GAAYn4B,KAAMw3B,EAAE7G,KAAQ,IAAM,KAAQ6G,EAAEsH,MAAQ,IAAMG,GAItEzH,EAAEsD,WAAW,eAAiB,WAI7B,MAHMqE,IACLljC,EAAOiI,MAAO+6B,EAAe,mBAEvBE,EAAmB,IAI3B3H,EAAE0B,UAAW,GAAM,OAGnBgG,EAAczjC,EAAQwjC,GACtBxjC,EAAQwjC,GAAiB,WACxBE,EAAoB59B,WAIrB83B,EAAMjvB,OAAO,WAEZ3O,EAAQwjC,GAAiBC,EAGpB1H,EAAGyH,KAEPzH,EAAEuH,cAAgBC,EAAiBD,cAGnCH,GAAaliC,KAAMuiC,IAIfE,GAAqBljC,EAAOiE,WAAYg/B,IAC5CA,EAAaC,EAAmB,IAGjCA,EAAoBD,EAAcxjC,IAI5B,UAtDR,GAyDD,IAAI2jC,IAAcC,GACjBC,GAAQ,EAERC,GAAmB/jC,EAAO8J,eAAiB,WAE1C,GAAIvB,EACJ,KAAMA,IAAOq7B,IACZA,GAAcr7B,GAAOtI,GAAW,GAKnC,SAAS+jC,MACR,IACC,MAAO,IAAIhkC,GAAOikC,eACjB,MAAO37B,KAGV,QAAS47B,MACR,IACC,MAAO,IAAIlkC,GAAO8J,cAAc,qBAC/B,MAAOxB,KAKV9H,EAAOy7B,aAAakI,IAAMnkC,EAAO8J,cAOhC,WACC,OAAQhG,KAAKg7B,SAAWkF,MAAuBE,MAGhDF,GAGDH,GAAerjC,EAAOy7B,aAAakI,MACnC3jC,EAAO6P,QAAQ+zB,OAASP,IAAkB,mBAAqBA,IAC/DA,GAAerjC,EAAO6P,QAAQ4kB,OAAS4O,GAGlCA,IAEJrjC,EAAOq/B,cAAc,SAAU9D,GAE9B,IAAMA,EAAEsF,aAAe7gC,EAAO6P,QAAQ+zB,KAAO,CAE5C,GAAI3+B,EAEJ,QACCi8B,KAAM,SAAUF,EAASjD,GAGxB,GAAI5hB,GAAQzW,EACXi+B,EAAMpI,EAAEoI,KAWT,IAPKpI,EAAEsI,SACNF,EAAIG,KAAMvI,EAAE54B,KAAM44B,EAAE7G,IAAK6G,EAAEhyB,MAAOgyB,EAAEsI,SAAUtI,EAAEzP,UAEhD6X,EAAIG,KAAMvI,EAAE54B,KAAM44B,EAAE7G,IAAK6G,EAAEhyB,OAIvBgyB,EAAEwI,UACN,IAAMr+B,IAAK61B,GAAEwI,UACZJ,EAAKj+B,GAAM61B,EAAEwI,UAAWr+B,EAKrB61B,GAAEiF,UAAYmD,EAAIpD,kBACtBoD,EAAIpD,iBAAkBhF,EAAEiF,UAQnBjF,EAAEsF,aAAgBG,EAAQ,sBAC/BA,EAAQ,oBAAsB,iBAI/B,KACC,IAAMt7B,IAAKs7B,GACV2C,EAAItD,iBAAkB36B,EAAGs7B,EAASt7B,IAElC,MAAOs+B,IAKTL,EAAIzC,KAAQ3F,EAAEuF,YAAcvF,EAAEnzB,MAAU,MAGxCnD,EAAW,SAAUoH,EAAGq2B,GACvB,GAAI1E,GAAQ2B,EAAiBgB,EAAYS,CAKzC,KAGC,GAAKn8B,IAAcy9B,GAA8B,IAAnBiB,EAAI/gC,YAcjC,GAXAqC,EAAWxF,EAGN0c,IACJwnB,EAAIlB,mBAAqBziC,EAAO2J,KAC3B45B,UACGH,IAAcjnB,IAKlBumB,EAEoB,IAAnBiB,EAAI/gC,YACR+gC,EAAIjD,YAEC,CACNU,KACApD,EAAS2F,EAAI3F,OACb2B,EAAkBgE,EAAIvD,wBAIW,gBAArBuD,GAAI7F,eACfsD,EAAUh3B,KAAOu5B,EAAI7F,aAKtB,KACC6C,EAAagD,EAAIhD,WAChB,MAAO74B,GAER64B,EAAa,GAQR3C,IAAUzC,EAAE+C,SAAY/C,EAAEsF,YAGT,OAAX7C,IACXA,EAAS,KAHTA,EAASoD,EAAUh3B,KAAO,IAAM,KAOlC,MAAO65B,GACFvB,GACL3E,EAAU,GAAIkG,GAKX7C,GACJrD,EAAUC,EAAQ2C,EAAYS,EAAWzB,IAIrCpE,EAAEhyB,MAGuB,IAAnBo6B,EAAI/gC,WAGfsE,WAAYjC,IAEZkX,IAAWmnB,GACNC,KAGEH,KACLA,MACApjC,EAAQR,GAAS0kC,OAAQX,KAG1BH,GAAcjnB,GAAWlX,GAE1B0+B,EAAIlB,mBAAqBx9B,GAjBzBA,KAqBFy7B,MAAO,WACDz7B,GACJA,EAAUxF,GAAW,OAO3B,IAAI0kC,IAAOC,GACVC,GAAW,yBACXC,GAAatnB,OAAQ,iBAAmBxb,EAAY,cAAe,KACnE+iC,GAAO,cACPC,IAAwBC,IACxBC,IACChG,KAAM,SAAU9mB,EAAM1N,GACrB,GAAIpE,GAAK6+B,EACRC,EAAQthC,KAAKuhC,YAAajtB,EAAM1N,GAChC4wB,EAAQwJ,GAAO7gC,KAAMyG,GACrB1D,EAASo+B,EAAMxuB,MACf7I,GAAS/G,GAAU,EACnBs+B,EAAQ,EACRC,EAAgB,EAEjB,IAAKjK,EAAQ,CAKZ,GAJAh1B,GAAOg1B,EAAM,GACb6J,EAAO7J,EAAM,KAAQ96B,EAAOu4B,UAAW3gB,GAAS,GAAK,MAGvC,OAAT+sB,GAAiBp3B,EAAQ,CAI7BA,EAAQvN,EAAO43B,IAAKgN,EAAMvhC,KAAMuU,GAAM,IAAU9R,GAAO,CAEvD,GAGCg/B,GAAQA,GAAS,KAGjBv3B,GAAgBu3B,EAChB9kC,EAAOyQ,MAAOm0B,EAAMvhC,KAAMuU,EAAMrK,EAAQo3B,SAI/BG,KAAWA,EAAQF,EAAMxuB,MAAQ5P,IAAqB,IAAVs+B,KAAiBC,GAGxEH,EAAMD,KAAOA,EACbC,EAAMr3B,MAAQA,EAEdq3B,EAAM9+B,IAAMg1B,EAAM,GAAKvtB,GAAUutB,EAAM,GAAK,GAAMh1B,EAAMA,EAEzD,MAAO8+B,KAKV,SAASI,MAIR,MAHA99B,YAAW,WACVi9B,GAAQ1kC,IAEA0kC,GAAQnkC,EAAOwL,MAGzB,QAASy5B,IAAcC,EAAWhmB,GACjClf,EAAOgF,KAAMka,EAAO,SAAUtH,EAAM1N,GACnC,GAAIi7B,IAAeT,GAAU9sB,QAAerX,OAAQmkC,GAAU,MAC7Dh3B,EAAQ,EACRlK,EAAS2hC,EAAW3hC,MACrB,MAAgBA,EAARkK,EAAgBA,IACvB,GAAKy3B,EAAYz3B,GAAQjJ,KAAMygC,EAAWttB,EAAM1N,GAG/C,SAMJ,QAASk7B,IAAW/hC,EAAMgiC,EAAY/+B,GACrC,GAAIoX,GACH4nB,EACA53B,EAAQ,EACRlK,EAASghC,GAAoBhhC,OAC7B4K,EAAWpO,EAAO2L,WAAWwC,OAAQ,iBAE7Bo3B,GAAKliC,OAEbkiC,EAAO,WACN,GAAKD,EACJ,OAAO,CAER,IAAIE,GAAcrB,IAASa,KAC1B31B,EAAY5E,KAAKC,IAAK,EAAGw6B,EAAUO,UAAYP,EAAUQ,SAAWF,GAEpEnY,EAAOhe,EAAY61B,EAAUQ,UAAY,EACzCC,EAAU,EAAItY,EACd3f,EAAQ,EACRlK,EAAS0hC,EAAUU,OAAOpiC,MAE3B,MAAgBA,EAARkK,EAAiBA,IACxBw3B,EAAUU,OAAQl4B,GAAQm4B,IAAKF,EAKhC,OAFAv3B,GAASsB,WAAYrM,GAAQ6hC,EAAWS,EAASt2B,IAElC,EAAVs2B,GAAeniC,EACZ6L,GAEPjB,EAASjH,YAAa9D,GAAQ6hC,KACvB,IAGTA,EAAY92B,EAASjJ,SACpB9B,KAAMA,EACN6b,MAAOlf,EAAOiG,UAAYo/B,GAC1BS,KAAM9lC,EAAOiG,QAAQ,GAAQ8/B,kBAAqBz/B,GAClD0/B,mBAAoBX,EACpBlI,gBAAiB72B,EACjBm/B,UAAWtB,IAASa,KACpBU,SAAUp/B,EAAQo/B,SAClBE,UACAf,YAAa,SAAUjtB,EAAM9R,GAC5B,GAAI8+B,GAAQ5kC,EAAOimC,MAAO5iC,EAAM6hC,EAAUY,KAAMluB,EAAM9R,EACpDo/B,EAAUY,KAAKC,cAAenuB,IAAUstB,EAAUY,KAAKI,OAEzD,OADAhB,GAAUU,OAAOnlC,KAAMmkC,GAChBA,GAERtuB,KAAM,SAAU6vB,GACf,GAAIz4B,GAAQ,EAGXlK,EAAS2iC,EAAUjB,EAAUU,OAAOpiC,OAAS,CAC9C,IAAK8hC,EACJ,MAAOhiC,KAGR,KADAgiC,GAAU,EACM9hC,EAARkK,EAAiBA,IACxBw3B,EAAUU,OAAQl4B,GAAQm4B,IAAK,EAUhC,OALKM,GACJ/3B,EAASjH,YAAa9D,GAAQ6hC,EAAWiB,IAEzC/3B,EAASqzB,WAAYp+B,GAAQ6hC,EAAWiB,IAElC7iC,QAGT4b,EAAQgmB,EAAUhmB,KAInB,KAFAknB,GAAYlnB,EAAOgmB,EAAUY,KAAKC,eAElBviC,EAARkK,EAAiBA,IAExB,GADAgQ,EAAS8mB,GAAqB92B,GAAQjJ,KAAMygC,EAAW7hC,EAAM6b,EAAOgmB,EAAUY,MAE7E,MAAOpoB,EAmBT,OAfAunB,IAAcC,EAAWhmB,GAEpBlf,EAAOiE,WAAYihC,EAAUY,KAAKv4B,QACtC23B,EAAUY,KAAKv4B,MAAM9I,KAAMpB,EAAM6hC,GAGlCllC,EAAO0W,GAAG2vB,MACTrmC,EAAOiG,OAAQs/B,GACdliC,KAAMA,EACNijC,KAAMpB,EACNpvB,MAAOovB,EAAUY,KAAKhwB,SAKjBovB,EAAUp2B,SAAUo2B,EAAUY,KAAKh3B,UACxC1J,KAAM8/B,EAAUY,KAAK1gC,KAAM8/B,EAAUY,KAAK/H,UAC1C1vB,KAAM62B,EAAUY,KAAKz3B,MACrBF,OAAQ+2B,EAAUY,KAAK33B,QAG1B,QAASi4B,IAAYlnB,EAAO6mB,GAC3B,GAAI77B,GAAO7D,EAAMqH,EAAOw4B,EAAQjwB,CAGhC,KAAMvI,IAASwR,GAed,GAdA7Y,EAAOrG,EAAO8J,UAAW4D,GACzBw4B,EAASH,EAAe1/B,GACxB6D,EAAQgV,EAAOxR,GACV1N,EAAO0G,QAASwD,KACpBg8B,EAASh8B,EAAO,GAChBA,EAAQgV,EAAOxR,GAAUxD,EAAO,IAG5BwD,IAAUrH,IACd6Y,EAAO7Y,GAAS6D,QACTgV,GAAOxR,IAGfuI,EAAQjW,EAAOq4B,SAAUhyB,GACpB4P,GAAS,UAAYA,GAAQ,CACjC/L,EAAQ+L,EAAM2kB,OAAQ1wB,SACfgV,GAAO7Y,EAId,KAAMqH,IAASxD,GACNwD,IAASwR,KAChBA,EAAOxR,GAAUxD,EAAOwD,GACxBq4B,EAAer4B,GAAUw4B,OAI3BH,GAAe1/B,GAAS6/B,EAK3BlmC,EAAOolC,UAAYplC,EAAOiG,OAAQm/B,IAEjCmB,QAAS,SAAUrnB,EAAOja,GACpBjF,EAAOiE,WAAYib,IACvBja,EAAWia,EACXA,GAAU,MAEVA,EAAQA,EAAMjT,MAAM,IAGrB,IAAI2L,GACHlK,EAAQ,EACRlK,EAAS0b,EAAM1b,MAEhB,MAAgBA,EAARkK,EAAiBA,IACxBkK,EAAOsH,EAAOxR,GACdg3B,GAAU9sB,GAAS8sB,GAAU9sB,OAC7B8sB,GAAU9sB,GAAOvB,QAASpR,IAI5BuhC,UAAW,SAAUvhC,EAAUyuB,GACzBA,EACJ8Q,GAAoBnuB,QAASpR,GAE7Bu/B,GAAoB/jC,KAAMwE,KAK7B,SAASw/B,IAAkBphC,EAAM6b,EAAO4mB,GAEvC,GAAIluB,GAAMlK,EAAOlK,EAChB0G,EAAOu8B,EAAUtO,EACjByM,EAAO3uB,EAAOywB,EACdJ,EAAOhjC,KACPmN,EAAQpN,EAAKoN,MACb8Q,KACAolB,KACA5O,EAAS10B,EAAKQ,UAAY6zB,GAAUr0B,EAG/ByiC,GAAKhwB,QACVG,EAAQjW,EAAOkW,YAAa7S,EAAM,MACX,MAAlB4S,EAAM2wB,WACV3wB,EAAM2wB,SAAW,EACjBF,EAAUzwB,EAAMtI,MAAMV,KACtBgJ,EAAMtI,MAAMV,KAAO,WACZgJ,EAAM2wB,UACXF,MAIHzwB,EAAM2wB,WAENN,EAAKn4B,OAAO,WAGXm4B,EAAKn4B,OAAO,WACX8H,EAAM2wB,WACA5mC,EAAO8V,MAAOzS,EAAM,MAAOG,QAChCyS,EAAMtI,MAAMV,YAOO,IAAlB5J,EAAKQ,WAAoB,UAAYqb,IAAS,SAAWA,MAK7D4mB,EAAKe,UAAap2B,EAAMo2B,SAAUp2B,EAAMq2B,UAAWr2B,EAAMs2B,WAIlB,WAAlC/mC,EAAO43B,IAAKv0B,EAAM,YACW,SAAhCrD,EAAO43B,IAAKv0B,EAAM,WAIbrD,EAAO6P,QAAQmC,wBAAkE,WAAxCgmB,GAAoB30B,EAAK2G,UAIvEyG,EAAM0D,KAAO,EAHb1D,EAAMiD,QAAU,iBAQdoyB,EAAKe,WACTp2B,EAAMo2B,SAAW,SACX7mC,EAAO6P,QAAQoC,kBACpBq0B,EAAKn4B,OAAO,WACXsC,EAAMo2B,SAAWf,EAAKe,SAAU,GAChCp2B,EAAMq2B,UAAYhB,EAAKe,SAAU,GACjCp2B,EAAMs2B,UAAYjB,EAAKe,SAAU,KAOpC,KAAMn5B,IAASwR,GAEd,GADAhV,EAAQgV,EAAOxR,GACV22B,GAAS5gC,KAAMyG,GAAU,CAG7B,SAFOgV,GAAOxR,GACdyqB,EAASA,GAAoB,WAAVjuB,EACdA,KAAY6tB,EAAS,OAAS,QAClC,QAED4O,GAAQlmC,KAAMiN,GAKhB,GADAlK,EAASmjC,EAAQnjC,OACH,CACbijC,EAAWzmC,EAAO0V,MAAOrS,EAAM,WAAcrD,EAAO0V,MAAOrS,EAAM,aAC5D,UAAYojC,KAChB1O,EAAS0O,EAAS1O,QAIdI,IACJsO,EAAS1O,QAAUA,GAEfA,EACJ/3B,EAAQqD,GAAOy0B,OAEfwO,EAAKlhC,KAAK,WACTpF,EAAQqD,GAAO60B,SAGjBoO,EAAKlhC,KAAK,WACT,GAAIwS,EACJ5X,GAAO2V,YAAatS,EAAM,SAC1B,KAAMuU,IAAQ2J,GACbvhB,EAAOyQ,MAAOpN,EAAMuU,EAAM2J,EAAM3J,KAGlC,KAAMlK,EAAQ,EAAYlK,EAARkK,EAAiBA,IAClCkK,EAAO+uB,EAASj5B,GAChBk3B,EAAQ0B,EAAKzB,YAAajtB,EAAMmgB,EAAS0O,EAAU7uB,GAAS,GAC5D2J,EAAM3J,GAAS6uB,EAAU7uB,IAAU5X,EAAOyQ,MAAOpN,EAAMuU,GAE/CA,IAAQ6uB,KACfA,EAAU7uB,GAASgtB,EAAMr3B,MACpBwqB,IACJ6M,EAAM9+B,IAAM8+B,EAAMr3B,MAClBq3B,EAAMr3B,MAAiB,UAATqK,GAA6B,WAATA,EAAoB,EAAI,KAO/D,QAASquB,IAAO5iC,EAAMiD,EAASsR,EAAM9R,EAAKogC,GACzC,MAAO,IAAID,IAAMhjC,UAAU1B,KAAM8B,EAAMiD,EAASsR,EAAM9R,EAAKogC,GAE5DlmC,EAAOimC,MAAQA,GAEfA,GAAMhjC,WACLE,YAAa8iC,GACb1kC,KAAM,SAAU8B,EAAMiD,EAASsR,EAAM9R,EAAKogC,EAAQvB,GACjDrhC,KAAKD,KAAOA,EACZC,KAAKsU,KAAOA,EACZtU,KAAK4iC,OAASA,GAAU,QACxB5iC,KAAKgD,QAAUA,EACfhD,KAAKiK,MAAQjK,KAAKkI,IAAMlI,KAAK8S,MAC7B9S,KAAKwC,IAAMA,EACXxC,KAAKqhC,KAAOA,IAAU3kC,EAAOu4B,UAAW3gB,GAAS,GAAK,OAEvDxB,IAAK,WACJ,GAAIH,GAAQgwB,GAAM9rB,UAAW7W,KAAKsU,KAElC,OAAO3B,IAASA,EAAMvR,IACrBuR,EAAMvR,IAAKpB,MACX2iC,GAAM9rB,UAAU8D,SAASvZ,IAAKpB,OAEhCuiC,IAAK,SAAUF,GACd,GAAIqB,GACH/wB,EAAQgwB,GAAM9rB,UAAW7W,KAAKsU,KAoB/B,OAjBCtU,MAAKwsB,IAAMkX,EADP1jC,KAAKgD,QAAQo/B,SACE1lC,EAAOkmC,OAAQ5iC,KAAK4iC,QACtCP,EAASriC,KAAKgD,QAAQo/B,SAAWC,EAAS,EAAG,EAAGriC,KAAKgD,QAAQo/B,UAG3CC,EAEpBriC,KAAKkI,KAAQlI,KAAKwC,IAAMxC,KAAKiK,OAAUy5B,EAAQ1jC,KAAKiK,MAE/CjK,KAAKgD,QAAQ2gC,MACjB3jC,KAAKgD,QAAQ2gC,KAAKxiC,KAAMnB,KAAKD,KAAMC,KAAKkI,IAAKlI,MAGzC2S,GAASA,EAAM0C,IACnB1C,EAAM0C,IAAKrV,MAEX2iC,GAAM9rB,UAAU8D,SAAStF,IAAKrV,MAExBA,OAIT2iC,GAAMhjC,UAAU1B,KAAK0B,UAAYgjC,GAAMhjC,UAEvCgjC,GAAM9rB,WACL8D,UACCvZ,IAAK,SAAUkgC,GACd,GAAIlnB,EAEJ,OAAiC,OAA5BknB,EAAMvhC,KAAMuhC,EAAMhtB,OACpBgtB,EAAMvhC,KAAKoN,OAA2C,MAAlCm0B,EAAMvhC,KAAKoN,MAAOm0B,EAAMhtB,OAQ/C8F,EAAS1d,EAAO43B,IAAKgN,EAAMvhC,KAAMuhC,EAAMhtB,KAAM,IAErC8F,GAAqB,SAAXA,EAAwBA,EAAJ,GAT9BknB,EAAMvhC,KAAMuhC,EAAMhtB,OAW3Be,IAAK,SAAUisB,GAGT5kC,EAAO0W,GAAGuwB,KAAMrC,EAAMhtB,MAC1B5X,EAAO0W,GAAGuwB,KAAMrC,EAAMhtB,MAAQgtB,GACnBA,EAAMvhC,KAAKoN,QAAgE,MAArDm0B,EAAMvhC,KAAKoN,MAAOzQ,EAAO84B,SAAU8L,EAAMhtB,QAAoB5X,EAAOq4B,SAAUuM,EAAMhtB,OACrH5X,EAAOyQ,MAAOm0B,EAAMvhC,KAAMuhC,EAAMhtB,KAAMgtB,EAAMp5B,IAAMo5B,EAAMD,MAExDC,EAAMvhC,KAAMuhC,EAAMhtB,MAASgtB,EAAMp5B,OASrCy6B,GAAM9rB,UAAUgG,UAAY8lB,GAAM9rB,UAAU4F,YAC3CpH,IAAK,SAAUisB,GACTA,EAAMvhC,KAAKQ,UAAY+gC,EAAMvhC,KAAKe,aACtCwgC,EAAMvhC,KAAMuhC,EAAMhtB,MAASgtB,EAAMp5B,OAKpCxL,EAAOgF,MAAO,SAAU,OAAQ,QAAU,SAAUU,EAAGW,GACtD,GAAI6gC,GAAQlnC,EAAOsB,GAAI+E,EACvBrG,GAAOsB,GAAI+E,GAAS,SAAU8gC,EAAOjB,EAAQjhC,GAC5C,MAAgB,OAATkiC,GAAkC,iBAAVA,GAC9BD,EAAM7hC,MAAO/B,KAAMgC,WACnBhC,KAAK8jC,QAASC,GAAOhhC,GAAM,GAAQ8gC,EAAOjB,EAAQjhC,MAIrDjF,EAAOsB,GAAG2E,QACTqhC,OAAQ,SAAUH,EAAOI,EAAIrB,EAAQjhC,GAGpC,MAAO3B,MAAK+b,OAAQqY,IAAWE,IAAK,UAAW,GAAIE,OAGjDhyB,MAAMshC,SAAUj2B,QAASo2B,GAAMJ,EAAOjB,EAAQjhC,IAEjDmiC,QAAS,SAAUxvB,EAAMuvB,EAAOjB,EAAQjhC,GACvC,GAAI0I,GAAQ3N,EAAOgI,cAAe4P,GACjC4vB,EAASxnC,EAAOmnC,MAAOA,EAAOjB,EAAQjhC,GACtCwiC,EAAc,WAEb,GAAInB,GAAOlB,GAAW9hC,KAAMtD,EAAOiG,UAAY2R,GAAQ4vB,EACvDC,GAAYC,OAAS,WACpBpB,EAAKhwB,MAAM,KAGP3I,GAAS3N,EAAO0V,MAAOpS,KAAM,YACjCgjC,EAAKhwB,MAAM,GAKd,OAFCmxB,GAAYC,OAASD,EAEf95B,GAAS65B,EAAO1xB,SAAU,EAChCxS,KAAK0B,KAAMyiC,GACXnkC,KAAKwS,MAAO0xB,EAAO1xB,MAAO2xB,IAE5BnxB,KAAM,SAAU3T,EAAMmU,EAAYqvB,GACjC,GAAIwB,GAAY,SAAU1xB,GACzB,GAAIK,GAAOL,EAAMK,WACVL,GAAMK,KACbA,EAAM6vB,GAYP,OATqB,gBAATxjC,KACXwjC,EAAUrvB,EACVA,EAAanU,EACbA,EAAOlD,GAEHqX,GAAcnU,KAAS,GAC3BW,KAAKwS,MAAOnT,GAAQ,SAGdW,KAAK0B,KAAK,WAChB,GAAI+Q,IAAU,EACbrI,EAAgB,MAAR/K,GAAgBA,EAAO,aAC/BilC,EAAS5nC,EAAO4nC,OAChBx/B,EAAOpI,EAAO0V,MAAOpS,KAEtB,IAAKoK,EACCtF,EAAMsF,IAAWtF,EAAMsF,GAAQ4I,MACnCqxB,EAAWv/B,EAAMsF,QAGlB,KAAMA,IAAStF,GACTA,EAAMsF,IAAWtF,EAAMsF,GAAQ4I,MAAQiuB,GAAKxgC,KAAM2J,IACtDi6B,EAAWv/B,EAAMsF,GAKpB,KAAMA,EAAQk6B,EAAOpkC,OAAQkK,KACvBk6B,EAAQl6B,GAAQrK,OAASC,MAAiB,MAARX,GAAgBilC,EAAQl6B,GAAQoI,QAAUnT,IAChFilC,EAAQl6B,GAAQ44B,KAAKhwB,KAAM6vB,GAC3BpwB,GAAU,EACV6xB,EAAO5hC,OAAQ0H,EAAO,KAOnBqI,IAAYowB,IAChBnmC,EAAO+V,QAASzS,KAAMX,MAIzB+kC,OAAQ,SAAU/kC,GAIjB,MAHKA,MAAS,IACbA,EAAOA,GAAQ,MAETW,KAAK0B,KAAK,WAChB,GAAI0I,GACHtF,EAAOpI,EAAO0V,MAAOpS,MACrBwS,EAAQ1N,EAAMzF,EAAO,SACrBsT,EAAQ7N,EAAMzF,EAAO,cACrBilC,EAAS5nC,EAAO4nC,OAChBpkC,EAASsS,EAAQA,EAAMtS,OAAS,CAajC,KAVA4E,EAAKs/B,QAAS,EAGd1nC,EAAO8V,MAAOxS,KAAMX,MAEfsT,GAASA,EAAMG,KAAOH,EAAMG,IAAIsxB,QACpCzxB,EAAMG,IAAIsxB,OAAOjjC,KAAMnB,MAIlBoK,EAAQk6B,EAAOpkC,OAAQkK,KACvBk6B,EAAQl6B,GAAQrK,OAASC,MAAQskC,EAAQl6B,GAAQoI,QAAUnT,IAC/DilC,EAAQl6B,GAAQ44B,KAAKhwB,MAAM,GAC3BsxB,EAAO5hC,OAAQ0H,EAAO,GAKxB,KAAMA,EAAQ,EAAWlK,EAARkK,EAAgBA,IAC3BoI,EAAOpI,IAAWoI,EAAOpI,GAAQg6B,QACrC5xB,EAAOpI,GAAQg6B,OAAOjjC,KAAMnB,YAKvB8E,GAAKs/B,WAMf,SAASL,IAAO1kC,EAAMklC,GACrB,GAAItoB,GACH3J,GAAUkyB,OAAQnlC,GAClB+C,EAAI,CAKL,KADAmiC,EAAeA,EAAc,EAAI,EACtB,EAAJniC,EAAQA,GAAK,EAAImiC,EACvBtoB,EAAQ8X,GAAW3xB,GACnBkQ,EAAO,SAAW2J,GAAU3J,EAAO,UAAY2J,GAAU5c,CAO1D,OAJKklC,KACJjyB,EAAMzE,QAAUyE,EAAM3B,MAAQtR,GAGxBiT,EAIR5V,EAAOgF,MACN+iC,UAAWV,GAAM,QACjBW,QAASX,GAAM,QACfY,YAAaZ,GAAM,UACnBa,QAAU/2B,QAAS,QACnBg3B,SAAWh3B,QAAS,QACpBi3B,YAAcj3B,QAAS,WACrB,SAAU9K,EAAM6Y,GAClBlf,EAAOsB,GAAI+E,GAAS,SAAU8gC,EAAOjB,EAAQjhC,GAC5C,MAAO3B,MAAK8jC,QAASloB,EAAOioB,EAAOjB,EAAQjhC,MAI7CjF,EAAOmnC,MAAQ,SAAUA,EAAOjB,EAAQ5kC,GACvC,GAAI4O,GAAMi3B,GAA0B,gBAAVA,GAAqBnnC,EAAOiG,UAAYkhC,IACjEpJ,SAAUz8B,IAAOA,GAAM4kC,GACtBlmC,EAAOiE,WAAYkjC,IAAWA,EAC/BzB,SAAUyB,EACVjB,OAAQ5kC,GAAM4kC,GAAUA,IAAWlmC,EAAOiE,WAAYiiC,IAAYA,EAwBnE,OArBAh2B,GAAIw1B,SAAW1lC,EAAO0W,GAAGrP,IAAM,EAA4B,gBAAjB6I,GAAIw1B,SAAwBx1B,EAAIw1B,SACzEx1B,EAAIw1B,WAAY1lC,GAAO0W,GAAGC,OAAS3W,EAAO0W,GAAGC,OAAQzG,EAAIw1B,UAAa1lC,EAAO0W,GAAGC,OAAOsH,UAGtE,MAAb/N,EAAI4F,OAAiB5F,EAAI4F,SAAU,KACvC5F,EAAI4F,MAAQ,MAIb5F,EAAIiW,IAAMjW,EAAI6tB,SAEd7tB,EAAI6tB,SAAW,WACT/9B,EAAOiE,WAAYiM,EAAIiW,MAC3BjW,EAAIiW,IAAI1hB,KAAMnB,MAGV4M,EAAI4F,OACR9V,EAAO+V,QAASzS,KAAM4M,EAAI4F,QAIrB5F,GAGRlQ,EAAOkmC,QACNmC,OAAQ,SAAUC,GACjB,MAAOA,IAERC,MAAO,SAAUD,GAChB,MAAO,GAAM79B,KAAK+9B,IAAKF,EAAE79B,KAAKg+B,IAAO,IAIvCzoC,EAAO4nC,UACP5nC,EAAO0W,GAAKuvB,GAAMhjC,UAAU1B,KAC5BvB,EAAO0W,GAAG6uB,KAAO,WAChB,GAAIc,GACHuB,EAAS5nC,EAAO4nC,OAChBliC,EAAI,CAIL,KAFAy+B,GAAQnkC,EAAOwL,MAEHo8B,EAAOpkC,OAAXkC,EAAmBA,IAC1B2gC,EAAQuB,EAAQliC,GAEV2gC,KAAWuB,EAAQliC,KAAQ2gC,GAChCuB,EAAO5hC,OAAQN,IAAK,EAIhBkiC,GAAOpkC,QACZxD,EAAO0W,GAAGJ,OAEX6tB,GAAQ1kC,GAGTO,EAAO0W,GAAG2vB,MAAQ,SAAUA,GACtBA,KAAWrmC,EAAO4nC,OAAOnnC,KAAM4lC,IACnCrmC,EAAO0W,GAAGnJ,SAIZvN,EAAO0W,GAAGgyB,SAAW,GAErB1oC,EAAO0W,GAAGnJ,MAAQ,WACX62B,KACLA,GAAUuE,YAAa3oC,EAAO0W,GAAG6uB,KAAMvlC,EAAO0W,GAAGgyB,YAInD1oC,EAAO0W,GAAGJ,KAAO,WAChBsyB,cAAexE,IACfA,GAAU,MAGXpkC,EAAO0W,GAAGC,QACTkyB,KAAM,IACNC,KAAM,IAEN7qB,SAAU,KAIXje,EAAO0W,GAAGuwB,QAELjnC,EAAOyc,MAAQzc,EAAOyc,KAAKwS,UAC/BjvB,EAAOyc,KAAKwS,QAAQ8Z,SAAW,SAAU1lC,GACxC,MAAOrD,GAAO6K,KAAK7K,EAAO4nC,OAAQ,SAAUtmC,GAC3C,MAAO+B,KAAS/B,EAAG+B,OACjBG,SAGLxD,EAAOsB,GAAG0nC,OAAS,SAAU1iC,GAC5B,GAAKhB,UAAU9B,OACd,MAAO8C,KAAY7G,EAClB6D,KACAA,KAAK0B,KAAK,SAAUU,GACnB1F,EAAOgpC,OAAOC,UAAW3lC,KAAMgD,EAASZ,IAI3C,IAAIud,GAASimB,EACZC,GAAQt9B,IAAK,EAAG0tB,KAAM,GACtBl2B,EAAOC,KAAM,GACbqc,EAAMtc,GAAQA,EAAKS,aAEpB,IAAM6b,EAON,MAHAsD,GAAUtD,EAAIlW,gBAGRzJ,EAAOyhB,SAAUwB,EAAS5f,UAMpBA,GAAK+lC,wBAA0BxpC,IAC1CupC,EAAM9lC,EAAK+lC,yBAEZF,EAAMG,GAAW1pB,IAEhB9T,IAAKs9B,EAAIt9B,KAASq9B,EAAII,aAAermB,EAAQ9C,YAAiB8C,EAAQ7C,WAAc,GACpFmZ,KAAM4P,EAAI5P,MAAS2P,EAAIK,aAAetmB,EAAQlD,aAAiBkD,EAAQjD,YAAc,KAX9EmpB,GAeTnpC,EAAOgpC,QAENC,UAAW,SAAU5lC,EAAMiD,EAASZ,GACnC,GAAIsxB,GAAWh3B,EAAO43B,IAAKv0B,EAAM,WAGf,YAAb2zB,IACJ3zB,EAAKoN,MAAMumB,SAAW,WAGvB,IAAIwS,GAAUxpC,EAAQqD,GACrBomC,EAAYD,EAAQR,SACpBU,EAAY1pC,EAAO43B,IAAKv0B,EAAM,OAC9BsmC,EAAa3pC,EAAO43B,IAAKv0B,EAAM,QAC/BumC,GAAmC,aAAb5S,GAAwC,UAAbA,IAA0Bh3B,EAAOwK,QAAQ,QAASk/B,EAAWC,IAAe,GAC7HzqB,KAAY2qB,KAAkBC,EAAQC,CAGlCH,IACJC,EAAcL,EAAQxS,WACtB8S,EAASD,EAAYh+B,IACrBk+B,EAAUF,EAAYtQ,OAEtBuQ,EAASniC,WAAY+hC,IAAe,EACpCK,EAAUpiC,WAAYgiC,IAAgB,GAGlC3pC,EAAOiE,WAAYqC,KACvBA,EAAUA,EAAQ7B,KAAMpB,EAAMqC,EAAG+jC,IAGd,MAAfnjC,EAAQuF,MACZqT,EAAMrT,IAAQvF,EAAQuF,IAAM49B,EAAU59B,IAAQi+B,GAE1B,MAAhBxjC,EAAQizB,OACZra,EAAMqa,KAASjzB,EAAQizB,KAAOkQ,EAAUlQ,KAASwQ,GAG7C,SAAWzjC,GACfA,EAAQ0jC,MAAMvlC,KAAMpB,EAAM6b,GAE1BsqB,EAAQ5R,IAAK1Y,KAMhBlf,EAAOsB,GAAG2E,QAET+wB,SAAU,WACT,GAAM1zB,KAAM,GAAZ,CAIA,GAAI2mC,GAAcjB,EACjBkB,GAAiBr+B,IAAK,EAAG0tB,KAAM,GAC/Bl2B,EAAOC,KAAM,EAwBd,OArBwC,UAAnCtD,EAAO43B,IAAKv0B,EAAM,YAEtB2lC,EAAS3lC,EAAK+lC,yBAGda,EAAe3mC,KAAK2mC,eAGpBjB,EAAS1lC,KAAK0lC,SACRhpC,EAAOgK,SAAUigC,EAAc,GAAK,UACzCC,EAAeD,EAAajB,UAI7BkB,EAAar+B,KAAQ7L,EAAO43B,IAAKqS,EAAc,GAAK,kBAAkB,GACtEC,EAAa3Q,MAAQv5B,EAAO43B,IAAKqS,EAAc,GAAK,mBAAmB,KAOvEp+B,IAAMm9B,EAAOn9B,IAAOq+B,EAAar+B,IAAM7L,EAAO43B,IAAKv0B,EAAM,aAAa,GACtEk2B,KAAMyP,EAAOzP,KAAO2Q,EAAa3Q,KAAOv5B,EAAO43B,IAAKv0B,EAAM,cAAc,MAI1E4mC,aAAc,WACb,MAAO3mC,MAAKuC,IAAI,WACf,GAAIokC,GAAe3mC,KAAK2mC,cAAgBpqC,EAAS4J,eACjD,OAAQwgC,IAAmBjqC,EAAOgK,SAAUigC,EAAc,SAAsD,WAA1CjqC,EAAO43B,IAAKqS,EAAc,YAC/FA,EAAeA,EAAaA,YAE7B,OAAOA,IAAgBpqC,EAAS4J,qBAOnCzJ,EAAOgF,MAAO+a,WAAY,cAAeI,UAAW,eAAgB,SAAU8d,EAAQrmB,GACrF,GAAI/L,GAAM,IAAI9H,KAAM6T,EAEpB5X,GAAOsB,GAAI28B,GAAW,SAAUxlB,GAC/B,MAAOzY,GAAOmL,OAAQ7H,KAAM,SAAUD,EAAM46B,EAAQxlB,GACnD,GAAIywB,GAAMG,GAAWhmC,EAErB,OAAKoV,KAAQhZ,EACLypC,EAAOtxB,IAAQsxB,GAAOA,EAAKtxB,GACjCsxB,EAAIrpC,SAAS4J,gBAAiBw0B,GAC9B56B,EAAM46B,IAGHiL,EACJA,EAAIiB,SACFt+B,EAAY7L,EAAQkpC,GAAMnpB,aAApBtH,EACP5M,EAAM4M,EAAMzY,EAAQkpC,GAAM/oB,aAI3B9c,EAAM46B,GAAWxlB,EAPlB,IASEwlB,EAAQxlB,EAAKnT,UAAU9B,OAAQ,QAIpC,SAAS6lC,IAAWhmC,GACnB,MAAOrD,GAAOwH,SAAUnE,GACvBA,EACkB,IAAlBA,EAAKQ,SACJR,EAAKua,aAAeva,EAAKwa,cACzB,EAGH7d,EAAOgF,MAAQolC,OAAQ,SAAUC,MAAO,SAAW,SAAUhkC,EAAM1D,GAClE3C,EAAOgF,MAAQw1B,QAAS,QAAUn0B,EAAMikC,QAAS3nC,EAAM,GAAI,QAAU0D,GAAQ,SAAUkkC,EAAcC,GAEpGxqC,EAAOsB,GAAIkpC,GAAa,SAAUjQ,EAAQrwB,GACzC,GAAIkB,GAAY9F,UAAU9B,SAAY+mC,GAAkC,iBAAXhQ,IAC5DvB,EAAQuR,IAAkBhQ,KAAW,GAAQrwB,KAAU,EAAO,SAAW,SAE1E,OAAOlK,GAAOmL,OAAQ7H,KAAM,SAAUD,EAAMV,EAAMuH,GACjD,GAAIyV,EAEJ,OAAK3f,GAAOwH,SAAUnE,GAIdA,EAAKxD,SAAS4J,gBAAiB,SAAWpD,GAI3B,IAAlBhD,EAAKQ,UACT8b,EAAMtc,EAAKoG,gBAIJgB,KAAKC,IACXrH,EAAK4D,KAAM,SAAWZ,GAAQsZ,EAAK,SAAWtZ,GAC9ChD,EAAK4D,KAAM,SAAWZ,GAAQsZ,EAAK,SAAWtZ,GAC9CsZ,EAAK,SAAWtZ,KAIX6D,IAAUzK,EAEhBO,EAAO43B,IAAKv0B,EAAMV,EAAMq2B,GAGxBh5B,EAAOyQ,MAAOpN,EAAMV,EAAMuH,EAAO8uB,IAChCr2B,EAAMyI,EAAYmvB,EAAS96B,EAAW2L,EAAW,WASvD5L,EAAOQ,OAASR,EAAOU,EAAIF,EAcJ,kBAAXyqC,SAAyBA,OAAOC,KAAOD,OAAOC,IAAI1qC,QAC7DyqC,OAAQ,YAAc,WAAc,MAAOzqC,OAGxCR"}
\ No newline at end of file
diff --git a/static/demo/components/jquery/package.json b/static/demo/components/jquery/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..f061e79bcf755aa7c0d539ea7c42cfb32fdeccec
--- /dev/null
+++ b/static/demo/components/jquery/package.json
@@ -0,0 +1,7 @@
+{
+  "name": "components-jquery",
+  "version": "1.9.1",
+  "description": "jQuery component",
+  "keywords": ["jquery"],
+  "main": "./jquery.js"
+}
diff --git a/static/demo/img/credits.txt b/static/demo/img/credits.txt
new file mode 100644
index 0000000000000000000000000000000000000000..52382c1bc4f30d86f0c584d5ad2d717d0f396fd6
--- /dev/null
+++ b/static/demo/img/credits.txt
@@ -0,0 +1,4 @@
+noun_project_122.svg: The Noun Project
+noun_project_2023.svg: ___Lo, from The Noun Project
+noun_project_5546.svg: Olivier Guin, from The Noun Project
+noun_project_868.svg: Boris Ruether, from The Noun Project
\ No newline at end of file
diff --git a/static/demo/img/noun_project_122_off.svg b/static/demo/img/noun_project_122_off.svg
new file mode 100755
index 0000000000000000000000000000000000000000..6a64383a531d115e5ebcc8a74092422e022cbe14
--- /dev/null
+++ b/static/demo/img/noun_project_122_off.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="55.973px" height="100px" viewBox="0 0 55.973 100" enable-background="new 0 0 55.973 100" xml:space="preserve">
+<path d="M27.986,0C12.531,0,0,12.53,0,27.986c0,5.089,1.43,9.82,3.731,13.973c6.873,12.382,8.693,19.335,9.814,26.064
+	c0.941,5.641,2.243,6.951,6.504,6.951c1.812,0,4.779,0,7.937,0s6.125,0,7.936,0c4.263,0,5.564-1.312,6.505-6.951
+	c1.121-6.729,2.942-13.683,9.815-26.064c2.302-4.152,3.73-8.884,3.73-13.973C55.973,12.53,43.442,0,27.986,0z" style="fill: #333333" />
+<path d="M37.986,77h-20c-0.828,0-1.5,0.671-1.5,1.5v1c0,0.829,0.672,1.5,1.5,1.5h20c0.828,0,1.5-0.671,1.5-1.5v-1
+	C39.486,77.671,38.814,77,37.986,77z" style="fill: #333333"/>
+<path d="M37.986,83h-20c-0.828,0-1.5,0.671-1.5,1.5v1c0,0.829,0.672,1.5,1.5,1.5h20c0.828,0,1.5-0.671,1.5-1.5v-1
+	C39.486,83.671,38.814,83,37.986,83z" style="fill: #333333"/>
+<path d="M37.986,89h-20c-0.828,0-1.5,0.671-1.5,1.5v1c0,0.829,0.672,1.5,1.5,1.5h20c0.828,0,1.5-0.671,1.5-1.5v-1
+	C39.486,89.671,38.814,89,37.986,89z" style="fill: #333333"/>
+<path d="M20.486,95h15c0,3-4,5-7.5,5S20.486,98,20.486,95z" style="fill: #333333"/>
+</svg>
diff --git a/static/demo/img/noun_project_122_on.svg b/static/demo/img/noun_project_122_on.svg
new file mode 100755
index 0000000000000000000000000000000000000000..96f2bccf9c87606acb79779552c8601a71b342e3
--- /dev/null
+++ b/static/demo/img/noun_project_122_on.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="55.973px" height="100px" viewBox="0 0 55.973 100" enable-background="new 0 0 55.973 100" xml:space="preserve">
+<path d="M27.986,0C12.531,0,0,12.53,0,27.986c0,5.089,1.43,9.82,3.731,13.973c6.873,12.382,8.693,19.335,9.814,26.064
+	c0.941,5.641,2.243,6.951,6.504,6.951c1.812,0,4.779,0,7.937,0s6.125,0,7.936,0c4.263,0,5.564-1.312,6.505-6.951
+	c1.121-6.729,2.942-13.683,9.815-26.064c2.302-4.152,3.73-8.884,3.73-13.973C55.973,12.53,43.442,0,27.986,0z" style="fill: #F6DF00" />
+<path d="M37.986,77h-20c-0.828,0-1.5,0.671-1.5,1.5v1c0,0.829,0.672,1.5,1.5,1.5h20c0.828,0,1.5-0.671,1.5-1.5v-1
+	C39.486,77.671,38.814,77,37.986,77z" style="fill: #F6DF00"/>
+<path d="M37.986,83h-20c-0.828,0-1.5,0.671-1.5,1.5v1c0,0.829,0.672,1.5,1.5,1.5h20c0.828,0,1.5-0.671,1.5-1.5v-1
+	C39.486,83.671,38.814,83,37.986,83z" style="fill: #F6DF00"/>
+<path d="M37.986,89h-20c-0.828,0-1.5,0.671-1.5,1.5v1c0,0.829,0.672,1.5,1.5,1.5h20c0.828,0,1.5-0.671,1.5-1.5v-1
+	C39.486,89.671,38.814,89,37.986,89z" style="fill: #F6DF00"/>
+<path d="M20.486,95h15c0,3-4,5-7.5,5S20.486,98,20.486,95z" style="fill: #F6DF00"/>
+</svg>
diff --git a/static/demo/img/noun_project_2023.svg b/static/demo/img/noun_project_2023.svg
new file mode 100755
index 0000000000000000000000000000000000000000..ecb90c6da48332c17c3ab9d64331ecd4cdf1338f
--- /dev/null
+++ b/static/demo/img/noun_project_2023.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Calque_1" x="0px" y="0px" width="39.4673123487px" height="100px" viewBox="0 0 163.129 413.55" enable-background="new 0 0 163.129 413.55" xml:space="preserve">
+<g>
+	<path d="M0,331.989c0-27.82,14.081-52.186,35.254-66.821l0,0V46.283C35.272,20.715,55.987,0.012,81.543,0l0,0   c25.556,0.012,46.271,20.715,46.276,46.283l0,0v218.872c21.204,14.637,35.31,39.002,35.31,66.834l0,0   c-0.019,45.044-36.542,81.543-81.586,81.562l0,0C36.487,413.532,0.013,377.033,0,331.989L0,331.989z M54.022,46.283v229.285   l-4.565,2.734c-18.384,11.053-30.694,30.828-30.694,53.687l0,0c0.055,34.687,28.094,62.744,62.78,62.812l0,0   c34.681-0.067,62.763-28.125,62.817-62.812l0,0c0-22.876-12.323-42.646-30.731-53.687l0,0l4.815-8.051h9.375h-9.375l-4.815,8.051   l-4.56-2.734V46.283c-0.018-15.197-12.328-27.49-27.526-27.521l0,0C66.345,18.792,54.034,31.085,54.022,46.283L54.022,46.283z" style="fill: #333333"/>
+</g>
+<path d="M95.532,293.866V140.827H68.97v153.039c-15.899,5.512-27.344,20.581-27.344,38.367c0,22.437,18.194,40.625,40.625,40.625  c22.442,0,40.625-18.188,40.625-40.625C122.876,314.447,111.444,299.377,95.532,293.866z" style="fill: #333333"/>
+</svg>
\ No newline at end of file
diff --git a/static/demo/img/noun_project_5546.svg b/static/demo/img/noun_project_5546.svg
new file mode 100755
index 0000000000000000000000000000000000000000..6a4aeaa87d8d0fdd3ff8f253cc4f04d78d83ee93
--- /dev/null
+++ b/static/demo/img/noun_project_5546.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Calque_1" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<path fill="#333333" d="M64.889,34.433c-6.933-8.276-13.482-16.092-13.482-25.93c0-0.309-0.25-0.56-0.561-0.56  c-0.309,0-0.56,0.251-0.56,0.56c0,9.838-6.547,17.655-13.479,25.93c-7.382,8.812-15.015,17.924-15.015,30.135  c0,16.055,12.491,28.16,29.054,28.16c16.568,0,29.062-12.105,29.062-28.16C79.908,52.357,72.273,43.245,64.889,34.433z   M53.109,84.434c-6.943,0,16.391-9.517,2.303-40.012c-3.579-6.588,2.35-4.244,4.674-1.854c7.072,7.232,13.201,13.48,13.201,23.254  C73.287,77.314,65.344,84.434,53.109,84.434z"/>
+</svg>
\ No newline at end of file
diff --git a/static/demo/img/noun_project_868.svg b/static/demo/img/noun_project_868.svg
new file mode 100755
index 0000000000000000000000000000000000000000..78ade01ef26c7290423e73852a762439a3a5b3f7
--- /dev/null
+++ b/static/demo/img/noun_project_868.svg
@@ -0,0 +1,29 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<g>
+	<path fill="#333333" d="M49.895,39.914c5.5,0,9.978,4.472,9.978,9.978c0,5.495-4.478,9.978-9.978,9.978   c-5.501,0-9.979-4.482-9.979-9.978C39.916,44.386,44.394,39.914,49.895,39.914 M49.895,29.936   c-11.023,0-19.956,8.935-19.956,19.956c0,11.016,8.933,19.956,19.956,19.956c11.02,0,19.955-8.94,19.955-19.956   C69.85,38.871,60.914,29.936,49.895,29.936L49.895,29.936z"/>
+</g>
+<g>
+	<path fill="#333333" d="M49.895,19.958c-2.756,0-4.992-2.233-4.992-4.991V4.989c0-2.76,2.236-4.989,4.992-4.989   c2.755,0,4.986,2.229,4.986,4.989v9.978C54.881,17.725,52.649,19.958,49.895,19.958L49.895,19.958z"/>
+</g>
+<g>
+	<path fill="#333333" d="M74.592,30.183c-1.276,0-2.554-0.483-3.528-1.456c-1.949-1.954-1.949-5.112,0-7.062l7.057-7.054   c1.944-1.949,5.103-1.949,7.052,0c1.949,1.952,1.949,5.11,0,7.054l-7.052,7.062C77.146,29.699,75.869,30.183,74.592,30.183   L74.592,30.183z"/>
+</g>
+<g>
+	<path fill="#333333" d="M94.797,54.883h-9.978c-2.756,0-4.992-2.231-4.992-4.986s2.236-4.989,4.992-4.989h9.978   c2.75,0,4.986,2.234,4.986,4.989S97.547,54.883,94.797,54.883L94.797,54.883z"/>
+</g>
+<g>
+	<path fill="#333333" d="M81.636,86.64c-1.279,0-2.554-0.488-3.525-1.466l-7.057-7.054c-1.949-1.949-1.949-5.107,0-7.049   c1.949-1.949,5.107-1.949,7.057,0l7.051,7.049c1.949,1.952,1.949,5.109,0,7.054C84.189,86.151,82.915,86.64,81.636,86.64   L81.636,86.64z"/>
+</g>
+<g>
+	<path fill="#333333" d="M49.879,99.786c-2.758,0-4.991-2.231-4.991-4.986v-9.979c0-2.755,2.233-4.991,4.991-4.991   s4.991,2.236,4.991,4.991V94.8C54.87,97.555,52.637,99.786,49.879,99.786L49.879,99.786z"/>
+</g>
+<g>
+	<path fill="#333333" d="M18.127,86.625c-1.279,0-2.554-0.483-3.526-1.461c-1.949-1.952-1.949-5.109,0-7.059l7.051-7.055   c1.949-1.949,5.107-1.949,7.057,0c1.949,1.954,1.949,5.112,0,7.055l-7.057,7.059C20.681,86.142,19.407,86.625,18.127,86.625   L18.127,86.625z"/>
+</g>
+<g>
+	<path fill="#333333" d="M14.967,54.868h-9.98C2.229,54.868,0,52.632,0,49.881c0-2.76,2.229-4.989,4.986-4.989h9.98   c2.752,0,4.989,2.229,4.989,4.989C19.956,52.632,17.719,54.868,14.967,54.868L14.967,54.868z"/>
+</g>
+<g>
+	<path fill="#333333" d="M25.204,30.178c-1.277,0-2.554-0.494-3.528-1.466l-7.057-7.051c-1.949-1.955-1.949-5.107,0-7.057   c1.949-1.944,5.107-1.944,7.057,0l7.054,7.057c1.949,1.949,1.949,5.107,0,7.051C27.752,29.684,26.478,30.178,25.204,30.178   L25.204,30.178z"/>
+</g>
+</svg>
\ No newline at end of file
diff --git a/static/demo/img/offline.png b/static/demo/img/offline.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1d3fcc1d1229ce09c0165f7eb11a4751f81b5a0
Binary files /dev/null and b/static/demo/img/offline.png differ
diff --git a/static/demo/img/roof_CLOSE.svg b/static/demo/img/roof_CLOSE.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ca0cbe5e37c7ae82e4ed82f5f946912c0e055251
--- /dev/null
+++ b/static/demo/img/roof_CLOSE.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<g id="Your_Icon">
+	<g>
+		<path d="M23.019,37.571c0,11.567,0,23.134,0,34.701c0,3.386,5.25,3.386,5.25,0c0-11.566,0-23.133,0-34.701
+			C28.269,34.186,23.019,34.186,23.019,37.571L23.019,37.571z"/>
+	</g>
+	<g>
+		<path d="M72.252,37.571c0,11.567,0,23.134,0,34.701c0,3.386,5.25,3.386,5.25,0c0-11.566,0-23.133,0-34.701
+			C77.502,34.186,72.252,34.186,72.252,37.571L72.252,37.571z"/>
+	</g>
+	<g>
+		<path d="M25.117,53.164c6.832-12.627,13.665-25.254,20.499-37.883c1.603-2.962-2.862-5.727-4.479-2.739
+			C34.305,25.17,27.471,37.797,20.638,50.425C19.033,53.387,23.5,56.152,25.117,53.164L25.117,53.164z"/>
+	</g>
+	<g>
+		<path d="M60.16,12.543c-1.617-2.988-6.084-0.223-4.479,2.739C62.514,27.91,69.348,40.537,76.18,53.165
+			c1.617,2.987,6.082,0.223,4.479-2.739C73.825,37.797,66.992,25.17,60.16,12.543L60.16,12.543z"/>
+	</g>
+</g>
+</svg>
diff --git a/static/demo/img/roof_OPEN.svg b/static/demo/img/roof_OPEN.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ec7a261ba5d443266432c0cdf028df32d6fc461b
--- /dev/null
+++ b/static/demo/img/roof_OPEN.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<g id="Your_Icon">
+	<g>
+		<path d="M23.019,37.571c0,11.567,0,23.134,0,34.701c0,3.386,5.25,3.386,5.25,0c0-11.566,0-23.133,0-34.701
+			C28.269,34.186,23.019,34.186,23.019,37.571L23.019,37.571z"/>
+	</g>
+	<g>
+		<path d="M72.252,37.571c0,11.567,0,23.134,0,34.701c0,3.386,5.25,3.386,5.25,0c0-11.566,0-23.133,0-34.701
+			C77.502,34.186,72.252,34.186,72.252,37.571L72.252,37.571z"/>
+	</g>
+	<g>
+		<path d="M80.848,47.736c-11.994-7.893-23.988-15.785-35.981-23.678c-2.838-1.867-5.465,2.681-2.65,4.533
+			C54.21,36.484,66.204,44.376,78.198,52.27C81.035,54.137,83.662,49.588,80.848,47.736L80.848,47.736z"/>
+	</g>
+	<g>
+		<path d="M22.325,52.27c11.993-7.893,23.987-15.785,35.981-23.678c2.813-1.852,0.188-6.4-2.65-4.533
+			c-11.993,7.893-23.987,15.785-35.981,23.678C16.86,49.588,19.487,54.137,22.325,52.27L22.325,52.27z"/>
+	</g>
+</g>
+</svg>
diff --git a/static/demo/index.html b/static/demo/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..70ceaf2472aeeae368fe4c26456fd940d743d5de
--- /dev/null
+++ b/static/demo/index.html
@@ -0,0 +1,184 @@
+<!doctype html>
+<html lang="en" ng-app="greenhouse">
+
+<head>
+    <meta charset="utf-8">
+    <!-- Custom Fonts -->
+    <link href='http://fonts.googleapis.com/css?family=Lato:300,400' rel='stylesheet' type='text/css'>
+    <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+
+    <link rel="stylesheet" href="/css/bootstrap/bootstrap.min.css" />
+    <link rel="stylesheet" href="/css/theme.css" />
+    <link rel="stylesheet" href="/css/bootstrap/bootstrap-responsive.min.css">
+    <title>Greenhouse</title>
+
+    <script src="components/angular/angular.js"></script>
+    <script src="components/d3/d3.js"></script>
+
+    <script src="js/app.js"></script>
+    <script src="js/config.js"></script>
+    <script src="js/controllers.js"></script>
+    <script src="js/services.js"></script>
+
+    <!-- Paho MQTT-JS -->
+    <script src="js/mqttws31.js"></script>
+
+    <script type="text/javascript">
+    var _gaq = _gaq || [];
+    _gaq.push(['_setAccount', 'UA-594061-11']);
+    _gaq.push(['_trackPageview']);
+
+    (function() {
+        var ga = document.createElement('script');
+        ga.type = 'text/javascript';
+        ga.async = true;
+        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(ga, s);
+    })();
+    </script>
+</head>
+
+<body>
+    <div class="navbar navbar-fixed-top">
+        <div class="navbar-inner">
+            <div class="container">
+                <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span>
+                </a> <a class="brand" href="/index.html">iot.eclipse.org</a>
+
+
+                <div class="nav-collapse">
+                    <ul class="nav">
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/frameworks.html">Services &amp; Frameworks</a>
+                                </li>
+                                <li><a href="/protocols.html">Protocols</a>
+                                </li>
+                                <li><a href="/tools.html">Tools</a>
+                                </li>
+                                <li class="divider"></li>
+                                <li><a href="/java"><strong>Open IoT Stack for Java</strong></a>
+                                </li>
+                            </ul>
+                        </li>
+
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Community <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/community.html#projects">Projects</a>
+                                </li>
+                                <li><a href="/community.html#news">News</a>
+                                </li>
+                                <li class="divider"></li>
+                                <li><a href="/open-iot-challenge">Open IoT Challenge </a>
+                                </li>
+                            </ul>
+                        </li>
+
+                        <li><a href="/ecosystem.html">Ecosystem</a>
+                        </li>
+                        <li class="dropdown active">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">See it live <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li class="active"><a href="/demo">Live Demo</a>
+                                </li>
+                                <li><a href="/sandbox.html">Sandbox</a>
+                                </li>
+                            </ul>
+                        </li>
+                    </ul>
+
+                    <ul class="nav pull-right">
+                        <li style="margin-left:0px;">
+                            <div style="padding-top: 20px">
+                                <div class="g-plusone" data-href="http://iot.eclipse.org/"></div>
+                            </div>
+                        </li>
+                    </ul>
+                </div>
+                <!--/.nav-collapse -->
+
+
+            </div>
+        </div>
+    </div>
+
+    <!-- Place this tag after the last +1 button tag. -->
+    <script type="text/javascript">
+    (function() {
+        var po = document.createElement('script');
+        po.type = 'text/javascript';
+        po.async = true;
+        po.src = 'https://apis.google.com/js/plusone.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(po, s);
+    })();
+    </script>
+
+    <div class="container">
+
+        <div style="
+				height:100%;
+				width:100%;
+				position:fixed;
+				left:0;
+				top:0;
+				z-index:100 !important;
+				background-color:black;
+				color: white;
+				text-align: center;
+				opacity: 0.5;
+				font-family: Lato,'Helvetica Neue',Helvetica,Arial,sans-serif;
+				font-size:48px;
+				padding-top:20%;
+				display:inline;
+				line-height: 1.2em !important;">DEMO IS OFFLINE
+            <br/>We are fixing it!</div>
+
+        <div ng-view></div>
+
+        <footer>
+            <ul class="nav nav-pills">
+                <li>
+                    <a href="#">Home</a>
+                </li>
+                <li>
+                    <a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a>
+                </li>
+                <li>
+                    <a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a>
+                </li>
+                <li>
+                    <a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a>
+                </li>
+                <li>
+                    <a href="http://www.eclipse.org/legal/" target="_blank">Legal</a>
+                </li>
+                <li>
+                    <a href="contact.html" data-toggle="modal" data-target="#contact-modal">Contact Us</a>
+                </li>
+                <li class="pull-right">
+                    Copyright © 2015 The Eclipse Foundation. All Rights Reserved.
+                </li>
+            </ul>
+        </footer>
+
+        <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;"></div>
+    </div>
+
+
+    <!-- Social share -->
+    <script src="http://platform.twitter.com/widgets.js"></script>
+    <style rel='stylesheet' type='text/css' href="components/angular-socialshare/angular-socialshare.min.css"></style>
+    <script src="components/angular-socialshare/angular-socialshare.min.js"></script>
+
+    <script src="/js/jquery.js"></script>
+    <script src="/js/bootstrap/bootstrap.min.js"></script>
+    <script src="/js/index.js"></script>
+
+
+</body>
+
+</html>
diff --git a/static/demo/js/app.js b/static/demo/js/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..24dc935c3d5960b0e2f2e5adcfe1d54e7d253509
--- /dev/null
+++ b/static/demo/js/app.js
@@ -0,0 +1,10 @@
+'use strict';
+
+/* App Module */
+
+var appmodule = angular.module('greenhouse', ['greenhouseServices', 'djds4rce.angular-socialshare']).
+  config(['$routeProvider', function($routeProvider) {
+  $routeProvider.
+      when('/devices/:deviceId', {templateUrl: 'partials/device-detail.html', controller: DeviceDetailCtrl}).
+      otherwise({redirectTo: '/devices/'+device_id});
+  }]);
\ No newline at end of file
diff --git a/static/demo/js/config.js b/static/demo/js/config.js
new file mode 100644
index 0000000000000000000000000000000000000000..a6e74168b5acb72ce9c7b662d860f78ff832fcc3
--- /dev/null
+++ b/static/demo/js/config.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var device_id = "#";
+var server_url = "http://iot.eclipse.org/m3da/clients";
+
+appmodule.factory('config', function() {
+	var config = {
+	    serverURL: "http://edge.m2mop.net",
+	    applicationName: "greenhouse",
+	    temperaturePath: "greenhouse.data.temperature",
+	    luminosityPath: "greenhouse.data.luminosity",
+	    humidityPath: "greenhouse.data.humidity",
+	    roofPath: "greenhouse.data.open",
+	    roofCmd: "greenhouse.data.toggleRoof"
+	};
+	return config;
+    });
\ No newline at end of file
diff --git a/static/demo/js/controllers.js b/static/demo/js/controllers.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e81f7f39609c4c0b48ed9364d380d29f9d6d03d
--- /dev/null
+++ b/static/demo/js/controllers.js
@@ -0,0 +1,72 @@
+'use strict';
+
+/* Controllers */
+
+function DeviceDetailCtrl($scope, $routeParams, $timeout, restService,
+    config) {
+
+    var dateFormat = d3.time.format("%c")
+
+    $scope.deviceId = $routeParams.deviceId
+    $scope.temperature = {
+        value: 0.0,
+        timestamp: dateFormat(new Date())
+    }
+    $scope.light = {
+        value: 'off',
+        timestamp: dateFormat(new Date()),
+    }
+    $scope.webcam = {
+        src: "http://benjamin-cabe.com:8082/index1.jpg"
+    }
+
+    var client = new Messaging.Client("ws://iot.eclipse.org/ws", "gh-" + new Date().getTime());
+    client.onConnectionLost = onConnectionLost;
+    client.onMessageArrived = onMessageArrived;
+    client.connect({
+        onSuccess: onConnect
+    });
+
+    function onConnect() {
+        // Once a connection has been made, make a subscription and send a message.
+        console.log("onConnect");
+        client.subscribe("javaonedemo/eclipse-greenhouse-ben-flat/sensors/#");
+    };
+
+    function onConnectionLost(responseObject) {
+        if (responseObject.errorCode !== 0) {
+            console.log("onConnectionLost:" + responseObject.errorMessage);
+            console.log("Reconnecting... [" + new Date() + "]");
+            client.connect({
+                onSuccess: function() {
+                    client.subscribe("javaonedemo/eclipse-greenhouse-ben-flat/sensors/#");
+                }
+            });
+        }
+    };
+
+    function onMessageArrived(message) {
+        var topic = message.destinationName;
+        var sensor = topic.substring(topic.lastIndexOf("/") + 1, topic.length);
+        //console.log("SENSOR: " + sensor);
+        if ($scope[sensor]) {
+            $scope[sensor].value = message.payloadString;
+            $scope[sensor].timestamp = dateFormat(new Date());
+            $scope.$apply();
+        }
+        //console.log("onMessageArrived: "+message.destinationName +": " +message.payloadString);
+    };
+
+    function tick() {
+            $scope.webcam.src = "http://www.benjamin-cabe.com/webcam.jpg#" + new Date().getTime();
+            $timeout(tick, 1000);
+        }
+        //tick();
+
+    $scope.switchLight = function() {
+        console.log('toggle');
+        var message = new Messaging.Message(($scope.light.value === "on") ? "off" : "on");
+        message.destinationName = "javaonedemo/eclipse-greenhouse-ben-flat/actuators/light";
+        client.send(message);
+    }
+}
diff --git a/static/demo/js/mqttws31.js b/static/demo/js/mqttws31.js
new file mode 100644
index 0000000000000000000000000000000000000000..4ca543c381a1feab2d80aea5105bfe550dea4303
--- /dev/null
+++ b/static/demo/js/mqttws31.js
@@ -0,0 +1,2170 @@
+// This is a copy of http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.javascript.git/plain/src/mqttws31.js?h=develop&id=def6ddccc226a0e4ef614ad788e9b9bf3aacf271
+
+/*******************************************************************************
+ * Copyright (c) 2013 IBM Corp.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
+ *
+ * The Eclipse Public License is available at
+ *    http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ *   http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *    Andrew Banks - initial API and implementation and initial documentation
+ *******************************************************************************/
+
+
+// Only expose a single object name in the global namespace.
+// Everything must go through this module. Global Messaging module
+// only has a single public function, client, which returns
+// a Messaging client object given connection details.
+
+/**
+ * Send and receive messages using web browsers.
+ * <p> 
+ * This programming interface lets a JavaScript client application use the MQTT V3.1 protocol to 
+ * connect to an MQTT-supporting messaging server.
+ *  
+ * The function supported includes:
+ * <ol>
+ * <li>Connecting to and disconnecting from a server. The server is identified by its host name and port number. 
+ * <li>Specifying options that relate to the communications link with the server, 
+ * for example the frequency of keep-alive heartbeats, and whether SSL/TLS is required.
+ * <li>Subscribing to and receiving messages from MQTT Topics.
+ * <li>Publishing messages to MQTT Topics.
+ * </ol>
+ * <p>
+ * The API consists of two main objects:
+ * <dl>
+ * <dt><b>{@link Messaging.Client}</b></dt>
+ * <dd>This contains methods that provide the functionality of the API,
+ * including provision of callbacks that notify the application when a message
+ * arrives from or is delivered to the messaging server,
+ * or when the status of its connection to the messaging server changes.</dd>
+ * <dt><b>{@link Messaging.Message}</b></dt>
+ * <dd>This encapsulates the payload of the message along with various attributes
+ * associated with its delivery, in particular the destination to which it has
+ * been (or is about to be) sent.</dd>
+ * </dl> 
+ * <p>
+ * The programming interface validates parameters passed to it, and will throw
+ * an Error containing an error message intended for developer use, if it detects
+ * an error with any parameter.
+ * <p>
+ * Example:
+ * 
+ * <code><pre>
+client = new Messaging.Client(location.hostname, Number(location.port), "clientId");
+client.onConnectionLost = onConnectionLost;
+client.onMessageArrived = onMessageArrived;
+client.connect({onSuccess:onConnect});
+
+function onConnect() {
+  // Once a connection has been made, make a subscription and send a message.
+  console.log("onConnect");
+  client.subscribe("/World");
+  message = new Messaging.Message("Hello");
+  message.destinationName = "/World";
+  client.send(message); 
+};
+function onConnectionLost(responseObject) {
+  if (responseObject.errorCode !== 0)
+	console.log("onConnectionLost:"+responseObject.errorMessage);
+};
+function onMessageArrived(message) {
+  console.log("onMessageArrived:"+message.payloadString);
+  client.disconnect(); 
+};	
+ * </pre></code>
+ * @namespace Messaging 
+ */
+
+Messaging = (function(global) {
+
+    // Private variables below, these are only visible inside the function closure
+    // which is used to define the module. 
+
+    var version = "@VERSION@";
+    var buildLevel = "@BUILDLEVEL@";
+
+    /** 
+     * Unique message type identifiers, with associated
+     * associated integer values.
+     * @private
+     */
+    var MESSAGE_TYPE = {
+        CONNECT: 1,
+        CONNACK: 2,
+        PUBLISH: 3,
+        PUBACK: 4,
+        PUBREC: 5,
+        PUBREL: 6,
+        PUBCOMP: 7,
+        SUBSCRIBE: 8,
+        SUBACK: 9,
+        UNSUBSCRIBE: 10,
+        UNSUBACK: 11,
+        PINGREQ: 12,
+        PINGRESP: 13,
+        DISCONNECT: 14
+    };
+
+    // Collection of utility methods used to simplify module code 
+    // and promote the DRY pattern.  
+
+    /**
+     * Validate an object's parameter names to ensure they
+     * match a list of expected variables name for this option
+     * type. Used to ensure option object passed into the API don't
+     * contain erroneous parameters.
+     * @param {Object} obj - User options object
+     * @param {Object} keys - valid keys and types that may exist in obj.
+     * @throws {Error} Invalid option parameter found.
+     * @private
+     */
+    var validate = function(obj, keys) {
+        for (key in obj) {
+            if (obj.hasOwnProperty(key)) {
+                if (keys.hasOwnProperty(key)) {
+                    if (typeof obj[key] !== keys[key])
+                        throw new Error(format(ERROR.INVALID_TYPE, [typeof obj[key], key]));
+                } else {
+                    var errorStr = "Unknown property, " + key + ". Valid properties are:";
+                    for (key in keys)
+                        if (keys.hasOwnProperty(key))
+                            errorStr = errorStr + " " + key;
+                    throw new Error(errorStr);
+                }
+            }
+        }
+    };
+
+    /**
+     * Return a new function which runs the user function bound
+     * to a fixed scope.
+     * @param {function} User function
+     * @param {object} Function scope
+     * @return {function} User function bound to another scope
+     * @private
+     */
+    var scope = function(f, scope) {
+        return function() {
+            return f.apply(scope, arguments);
+        };
+    };
+
+    /** 
+     * Unique message type identifiers, with associated
+     * associated integer values.
+     * @private
+     */
+    var ERROR = {
+        OK: {
+            code: 0,
+            text: "AMQJSC0000I OK."
+        },
+        CONNECT_TIMEOUT: {
+            code: 1,
+            text: "AMQJSC0001E Connect timed out."
+        },
+        SUBSCRIBE_TIMEOUT: {
+            code: 2,
+            text: "AMQJS0002E Subscribe timed out."
+        },
+        UNSUBSCRIBE_TIMEOUT: {
+            code: 3,
+            text: "AMQJS0003E Unsubscribe timed out."
+        },
+        PING_TIMEOUT: {
+            code: 4,
+            text: "AMQJS0004E Ping timed out."
+        },
+        INTERNAL_ERROR: {
+            code: 5,
+            text: "AMQJS0005E Internal error."
+        },
+        CONNACK_RETURNCODE: {
+            code: 6,
+            text: "AMQJS0006E Bad Connack return code:{0} {1}."
+        },
+        SOCKET_ERROR: {
+            code: 7,
+            text: "AMQJS0007E Socket error:{0}."
+        },
+        SOCKET_CLOSE: {
+            code: 8,
+            text: "AMQJS0008I Socket closed."
+        },
+        MALFORMED_UTF: {
+            code: 9,
+            text: "AMQJS0009E Malformed UTF data:{0} {1} {2}."
+        },
+        UNSUPPORTED: {
+            code: 10,
+            text: "AMQJS0010E {0} is not supported by this browser."
+        },
+        INVALID_STATE: {
+            code: 11,
+            text: "AMQJS0011E Invalid state {0}."
+        },
+        INVALID_TYPE: {
+            code: 12,
+            text: "AMQJS0012E Invalid type {0} for {1}."
+        },
+        INVALID_ARGUMENT: {
+            code: 13,
+            text: "AMQJS0013E Invalid argument {0} for {1}."
+        },
+        UNSUPPORTED_OPERATION: {
+            code: 14,
+            text: "AMQJS0014E Unsupported operation."
+        },
+        INVALID_STORED_DATA: {
+            code: 15,
+            text: "AMQJS0015E Invalid data in local storage key={0} value={1}."
+        },
+        INVALID_MQTT_MESSAGE_TYPE: {
+            code: 16,
+            text: "AMQJS0016E Invalid MQTT message type {0}."
+        },
+        MALFORMED_UNICODE: {
+            code: 17,
+            text: "AMQJS0017E Malformed Unicode string:{0} {1}."
+        },
+    };
+
+    /** CONNACK RC Meaning. */
+    var CONNACK_RC = {
+        0: "Connection Accepted",
+        1: "Connection Refused: unacceptable protocol version",
+        2: "Connection Refused: identifier rejected",
+        3: "Connection Refused: server unavailable",
+        4: "Connection Refused: bad user name or password",
+        5: "Connection Refused: not authorized"
+    };
+
+    /**
+     * Format an error message text.
+     * @private
+     * @param {error} ERROR.KEY value above.
+     * @param {substitutions} [array] substituted into the text.
+     * @return the text with the substitutions made.
+     */
+    var format = function(error, substitutions) {
+        var text = error.text;
+        if (substitutions) {
+            for (var i = 0; i < substitutions.length; i++) {
+                field = "{" + i + "}";
+                start = text.indexOf(field);
+                if (start > 0) {
+                    var part1 = text.substring(0, start);
+                    var part2 = text.substring(start + field.length);
+                    text = part1 + substitutions[i] + part2;
+                }
+            }
+        }
+        return text;
+    };
+
+    //MQTT protocol and version        6    M    Q    I    s    d    p    3
+    var MqttProtoIdentifier = [0x00, 0x06, 0x4d, 0x51, 0x49, 0x73, 0x64, 0x70, 0x03];
+
+    /**
+     * Construct an MQTT wire protocol message.
+     * @param type MQTT packet type.
+     * @param options optional wire message attributes.
+     *
+     * Optional properties
+     *
+     * messageIdentifier: message ID in the range [0..65535]
+     * payloadMessage:	Application Message - PUBLISH only
+     * connectStrings:	array of 0 or more Strings to be put into the CONNECT payload
+     * topics:			array of strings (SUBSCRIBE, UNSUBSCRIBE)
+     * requestQoS:		array of QoS values [0..2]
+     *
+     * "Flag" properties
+     * cleanSession:	true if present / false if absent (CONNECT)
+     * willMessage:  	true if present / false if absent (CONNECT)
+     * isRetained:		true if present / false if absent (CONNECT)
+     * userName:		true if present / false if absent (CONNECT)
+     * password:		true if present / false if absent (CONNECT)
+     * keepAliveInterval:	integer [0..65535]  (CONNECT)
+     *
+     * @private
+     * @ignore
+     */
+    var WireMessage = function(type, options) {
+        this.type = type;
+        for (name in options) {
+            if (options.hasOwnProperty(name)) {
+                this[name] = options[name];
+            }
+        }
+    };
+
+    WireMessage.prototype.encode = function() {
+        // Compute the first byte of the fixed header
+        var first = ((this.type & 0x0f) << 4);
+
+        /*
+         * Now calculate the length of the variable header + payload by adding up the lengths
+         * of all the component parts
+         */
+
+        remLength = 0;
+        topicStrLength = new Array();
+
+        // if the message contains a messageIdentifier then we need two bytes for that
+        if (this.messageIdentifier != undefined)
+            remLength += 2;
+
+        switch (this.type) {
+            // If this a Connect then we need to include 12 bytes for its header
+            case MESSAGE_TYPE.CONNECT:
+                remLength += MqttProtoIdentifier.length + 3;
+                remLength += UTF8Length(this.clientId) + 2;
+                if (this.willMessage != undefined) {
+                    remLength += UTF8Length(this.willMessage.destinationName) + 2;
+                    // Will message is always a string, sent as UTF-8 characters with a preceding length.
+                    var willMessagePayloadBytes = this.willMessage.payloadBytes;
+                    if (!(willMessagePayloadBytes instanceof Uint8Array))
+                        willMessagePayloadBytes = new Uint8Array(payloadBytes);
+                    remLength += willMessagePayloadBytes.byteLength + 2;
+                }
+                if (this.userName != undefined)
+                    remLength += UTF8Length(this.userName) + 2;
+                if (this.password != undefined)
+                    remLength += UTF8Length(this.password) + 2;
+                break;
+
+                // Subscribe, Unsubscribe can both contain topic strings
+            case MESSAGE_TYPE.SUBSCRIBE:
+                first |= 0x02; // Qos = 1;
+                for (var i = 0; i < this.topics.length; i++) {
+                    topicStrLength[i] = UTF8Length(this.topics[i]);
+                    remLength += topicStrLength[i] + 2;
+                }
+                remLength += this.requestedQos.length; // 1 byte for each topic's Qos
+                // QoS on Subscribe only
+                break;
+
+            case MESSAGE_TYPE.UNSUBSCRIBE:
+                first |= 0x02; // Qos = 1;
+                for (var i = 0; i < this.topics.length; i++) {
+                    topicStrLength[i] = UTF8Length(this.topics[i]);
+                    remLength += topicStrLength[i] + 2;
+                }
+                break;
+
+            case MESSAGE_TYPE.PUBLISH:
+                if (this.payloadMessage.duplicate) first |= 0x08;
+                first = first |= (this.payloadMessage.qos << 1);
+                if (this.payloadMessage.retained) first |= 0x01;
+                destinationNameLength = UTF8Length(this.payloadMessage.destinationName);
+                remLength += destinationNameLength + 2;
+                var payloadBytes = this.payloadMessage.payloadBytes;
+                remLength += payloadBytes.byteLength;
+                if (payloadBytes instanceof ArrayBuffer)
+                    payloadBytes = new Uint8Array(payloadBytes);
+                else if (!(payloadBytes instanceof Uint8Array))
+                    payloadBytes = new Uint8Array(payloadBytes.buffer);
+                break;
+
+            case MESSAGE_TYPE.DISCONNECT:
+                break;
+
+            default:
+                ;
+        }
+
+        // Now we can allocate a buffer for the message
+
+        var mbi = encodeMBI(remLength); // Convert the length to MQTT MBI format
+        var pos = mbi.length + 1; // Offset of start of variable header
+        var buffer = new ArrayBuffer(remLength + pos);
+        var byteStream = new Uint8Array(buffer); // view it as a sequence of bytes
+
+        //Write the fixed header into the buffer
+        byteStream[0] = first;
+        byteStream.set(mbi, 1);
+
+        // If this is a PUBLISH then the variable header starts with a topic
+        if (this.type == MESSAGE_TYPE.PUBLISH)
+            pos = writeString(this.payloadMessage.destinationName, destinationNameLength, byteStream, pos);
+        // If this is a CONNECT then the variable header contains the protocol name/version, flags and keepalive time
+
+        else if (this.type == MESSAGE_TYPE.CONNECT) {
+            byteStream.set(MqttProtoIdentifier, pos);
+            pos += MqttProtoIdentifier.length;
+            var connectFlags = 0;
+            if (this.cleanSession)
+                connectFlags = 0x02;
+            if (this.willMessage != undefined) {
+                connectFlags |= 0x04;
+                connectFlags |= (this.willMessage.qos << 3);
+                if (this.willMessage.retained) {
+                    connectFlags |= 0x20;
+                }
+            }
+            if (this.userName != undefined)
+                connectFlags |= 0x80;
+            if (this.password != undefined)
+                connectFlags |= 0x40;
+            byteStream[pos++] = connectFlags;
+            pos = writeUint16(this.keepAliveInterval, byteStream, pos);
+        }
+
+        // Output the messageIdentifier - if there is one
+        if (this.messageIdentifier != undefined)
+            pos = writeUint16(this.messageIdentifier, byteStream, pos);
+
+        switch (this.type) {
+            case MESSAGE_TYPE.CONNECT:
+                pos = writeString(this.clientId, UTF8Length(this.clientId), byteStream, pos);
+                if (this.willMessage != undefined) {
+                    pos = writeString(this.willMessage.destinationName, UTF8Length(this.willMessage.destinationName), byteStream, pos);
+                    pos = writeUint16(willMessagePayloadBytes.byteLength, byteStream, pos);
+                    byteStream.set(willMessagePayloadBytes, pos);
+                    pos += willMessagePayloadBytes.byteLength;
+
+                }
+                if (this.userName != undefined)
+                    pos = writeString(this.userName, UTF8Length(this.userName), byteStream, pos);
+                if (this.password != undefined)
+                    pos = writeString(this.password, UTF8Length(this.password), byteStream, pos);
+                break;
+
+            case MESSAGE_TYPE.PUBLISH:
+                // PUBLISH has a text or binary payload, if text do not add a 2 byte length field, just the UTF characters.	
+                byteStream.set(payloadBytes, pos);
+
+                break;
+
+                //    	    case MESSAGE_TYPE.PUBREC:	
+                //    	    case MESSAGE_TYPE.PUBREL:	
+                //    	    case MESSAGE_TYPE.PUBCOMP:	
+                //    	    	break;
+
+            case MESSAGE_TYPE.SUBSCRIBE:
+                // SUBSCRIBE has a list of topic strings and request QoS
+                for (var i = 0; i < this.topics.length; i++) {
+                    pos = writeString(this.topics[i], topicStrLength[i], byteStream, pos);
+                    byteStream[pos++] = this.requestedQos[i];
+                }
+                break;
+
+            case MESSAGE_TYPE.UNSUBSCRIBE:
+                // UNSUBSCRIBE has a list of topic strings
+                for (var i = 0; i < this.topics.length; i++)
+                    pos = writeString(this.topics[i], topicStrLength[i], byteStream, pos);
+                break;
+
+            default:
+                // Do nothing.
+        }
+
+        return buffer;
+    }
+
+    function decodeMessage(input, pos) {
+        var startingPos = pos;
+        var first = input[pos];
+        var type = first >> 4;
+        var messageInfo = first &= 0x0f;
+        pos += 1;
+
+
+        // Decode the remaining length (MBI format)
+
+        var digit;
+        var remLength = 0;
+        var multiplier = 1;
+        do {
+            if (pos == input.length) {
+                return [null, startingPos];
+            }
+            digit = input[pos++];
+            remLength += ((digit & 0x7F) * multiplier);
+            multiplier *= 128;
+        } while ((digit & 0x80) != 0);
+
+        var endPos = pos + remLength;
+        if (endPos > input.length) {
+            return [null, startingPos];
+        }
+
+        var wireMessage = new WireMessage(type);
+        switch (type) {
+            case MESSAGE_TYPE.CONNACK:
+                wireMessage.topicNameCompressionResponse = input[pos++];
+                wireMessage.returnCode = input[pos++];
+                break;
+
+            case MESSAGE_TYPE.PUBLISH:
+                var qos = (messageInfo >> 1) & 0x03;
+
+                var len = readUint16(input, pos);
+                pos += 2;
+                var topicName = parseUTF8(input, pos, len);
+                pos += len;
+                // If QoS 1 or 2 there will be a messageIdentifier
+                if (qos > 0) {
+                    wireMessage.messageIdentifier = readUint16(input, pos);
+                    pos += 2;
+                }
+
+                var message = new Messaging.Message(input.subarray(pos));
+                if ((messageInfo & 0x01) == 0x01)
+                    message.retained = true;
+                if ((messageInfo & 0x08) == 0x08)
+                    message.duplicate = true;
+                message.qos = qos;
+                message.destinationName = topicName;
+                wireMessage.payloadMessage = message;
+                break;
+
+            case MESSAGE_TYPE.PUBACK:
+            case MESSAGE_TYPE.PUBREC:
+            case MESSAGE_TYPE.PUBREL:
+            case MESSAGE_TYPE.PUBCOMP:
+            case MESSAGE_TYPE.UNSUBACK:
+                wireMessage.messageIdentifier = readUint16(input, pos);
+                break;
+
+            case MESSAGE_TYPE.SUBACK:
+                wireMessage.messageIdentifier = readUint16(input, pos);
+                pos += 2;
+                wireMessage.grantedQos = input.subarray(pos);
+                break;
+
+            default:
+                ;
+        }
+
+        return [wireMessage, endPos];
+    }
+
+    function writeUint16(input, buffer, offset) {
+        buffer[offset++] = input >> 8; //MSB
+        buffer[offset++] = input % 256; //LSB 
+        return offset;
+    }
+
+    function writeString(input, utf8Length, buffer, offset) {
+        offset = writeUint16(utf8Length, buffer, offset);
+        stringToUTF8(input, buffer, offset);
+        return offset + utf8Length;
+    }
+
+    function readUint16(buffer, offset) {
+        return 256 * buffer[offset] + buffer[offset + 1];
+    }
+
+    /**
+     * Encodes an MQTT Multi-Byte Integer
+     * @private
+     */
+    function encodeMBI(number) {
+        var output = new Array(1);
+        var numBytes = 0;
+
+        do {
+            var digit = number % 128;
+            number = number >> 7;
+            if (number > 0) {
+                digit |= 0x80;
+            }
+            output[numBytes++] = digit;
+        } while ((number > 0) && (numBytes < 4));
+
+        return output;
+    }
+
+    /**
+     * Takes a String and calculates its length in bytes when encoded in UTF8.
+     * @private
+     */
+    function UTF8Length(input) {
+        var output = 0;
+        for (var i = 0; i < input.length; i++) {
+            var charCode = input.charCodeAt(i);
+            if (charCode > 0x7FF) {
+                // Surrogate pair means its a 4 byte character
+                if (0xD800 <= charCode && charCode <= 0xDBFF) {
+                    i++;
+                    output++;
+                }
+                output += 3;
+            } else if (charCode > 0x7F)
+                output += 2;
+            else
+                output++;
+        }
+        return output;
+    }
+
+    /**
+     * Takes a String and writes it into an array as UTF8 encoded bytes.
+     * @private
+     */
+    function stringToUTF8(input, output, start) {
+        var pos = start;
+        for (var i = 0; i < input.length; i++) {
+            var charCode = input.charCodeAt(i);
+
+            // Check for a surrogate pair.
+            if (0xD800 <= charCode && charCode <= 0xDBFF) {
+                lowCharCode = input.charCodeAt(++i);
+                if (isNaN(lowCharCode)) {
+                    throw new Error(format(ERROR.MALFORMED_UNICODE, [charCode, lowCharCode]));
+                }
+                charCode = ((charCode - 0xD800) << 10) + (lowCharCode - 0xDC00) + 0x10000;
+
+            }
+
+            if (charCode <= 0x7F) {
+                output[pos++] = charCode;
+            } else if (charCode <= 0x7FF) {
+                output[pos++] = charCode >> 6 & 0x1F | 0xC0;
+                output[pos++] = charCode & 0x3F | 0x80;
+            } else if (charCode <= 0xFFFF) {
+                output[pos++] = charCode >> 12 & 0x0F | 0xE0;
+                output[pos++] = charCode >> 6 & 0x3F | 0x80;
+                output[pos++] = charCode & 0x3F | 0x80;
+            } else {
+                output[pos++] = charCode >> 18 & 0x07 | 0xF0;
+                output[pos++] = charCode >> 12 & 0x3F | 0x80;
+                output[pos++] = charCode >> 6 & 0x3F | 0x80;
+                output[pos++] = charCode & 0x3F | 0x80;
+            };
+        }
+        return output;
+    }
+
+    function parseUTF8(input, offset, length) {
+        var output = "";
+        var utf16;
+        var pos = offset;
+
+        while (pos < offset + length) {
+            var byte1 = input[pos++];
+            if (byte1 < 128)
+                utf16 = byte1;
+            else {
+                var byte2 = input[pos++] - 128;
+                if (byte2 < 0)
+                    throw new Error(format(ERROR.MALFORMED_UTF, [byte1.toString(16), byte2.toString(16), ""]));
+                if (byte1 < 0xE0) // 2 byte character
+                    utf16 = 64 * (byte1 - 0xC0) + byte2;
+                else {
+                    var byte3 = input[pos++] - 128;
+                    if (byte3 < 0)
+                        throw new Error(format(ERROR.MALFORMED_UTF, [byte1.toString(16), byte2.toString(16), byte3.toString(16)]));
+                    if (byte1 < 0xF0) // 3 byte character
+                        utf16 = 4096 * (byte1 - 0xE0) + 64 * byte2 + byte3;
+                    else {
+                        var byte4 = input[pos++] - 128;
+                        if (byte4 < 0)
+                            throw new Error(format(ERROR.MALFORMED_UTF, [byte1.toString(16), byte2.toString(16), byte3.toString(16), byte4.toString(16)]));
+                        if (byte1 < 0xF8) // 4 byte character 
+                            utf16 = 262144 * (byte1 - 0xF0) + 4096 * byte2 + 64 * byte3 + byte4;
+                        else // longer encodings are not supported  
+                            throw new Error(format(ERROR.MALFORMED_UTF, [byte1.toString(16), byte2.toString(16), byte3.toString(16), byte4.toString(16)]));
+                    }
+                }
+            }
+
+            if (utf16 > 0xFFFF) // 4 byte character - express as a surrogate pair
+            {
+                utf16 -= 0x10000;
+                output += String.fromCharCode(0xD800 + (utf16 >> 10)); // lead character
+                utf16 = 0xDC00 + (utf16 & 0x3FF); // trail character
+            }
+            output += String.fromCharCode(utf16);
+        }
+        return output;
+    }
+
+    /** 
+     * Repeat keepalive requests, monitor responses.
+     * @ignore
+     */
+    var Pinger = function(client, window, keepAliveInterval) {
+        this._client = client;
+        this._window = window;
+        this._keepAliveInterval = keepAliveInterval * 1000;
+        this.isReset = false;
+
+        var pingReq = new WireMessage(MESSAGE_TYPE.PINGREQ).encode();
+
+        var doTimeout = function(pinger) {
+            return function() {
+                return doPing.apply(pinger);
+            };
+        };
+
+        /** @ignore */
+        var doPing = function() {
+            if (!this.isReset) {
+                this._client._trace("Pinger.doPing", "Timed out");
+                this._client._disconnected(ERROR.PING_TIMEOUT.code, format(ERROR.PING_TIMEOUT));
+            } else {
+                this.isReset = false;
+                this._client._trace("Pinger.doPing", "send PINGREQ");
+                this._client.socket.send(pingReq);
+                this.timeout = this._window.setTimeout(doTimeout(this), this._keepAliveInterval);
+            }
+        }
+
+        this.reset = function() {
+            this.isReset = true;
+            this._window.clearTimeout(this.timeout);
+            if (this._keepAliveInterval > 0)
+                this.timeout = setTimeout(doTimeout(this), this._keepAliveInterval);
+        }
+
+        this.cancel = function() {
+            this._window.clearTimeout(this.timeout);
+        }
+    };
+
+    /**
+     * Monitor request completion.
+     * @ignore
+     */
+    var Timeout = function(client, window, timeoutSeconds, action, args) {
+        this._window = window;
+        if (!timeoutSeconds)
+            timeoutSeconds = 30;
+
+        var doTimeout = function(action, client, args) {
+            return function() {
+                return action.apply(client, args);
+            };
+        };
+        this.timeout = setTimeout(doTimeout(action, client, args), timeoutSeconds * 1000);
+
+        this.cancel = function() {
+            this._window.clearTimeout(this.timeout);
+        }
+    };
+
+    /*
+     * Internal implementation of the Websockets MQTT V3.1 client.
+     *
+     * @name Messaging.ClientImpl @constructor
+     * @param {String} host the DNS nameof the webSocket host.
+     * @param {Number} port the port number for that host.
+     * @param {String} clientId the MQ client identifier.
+     */
+    var ClientImpl = function(uri, host, port, path, clientId) {
+        // Check dependencies are satisfied in this browser.
+        if (!("WebSocket" in global && global["WebSocket"] !== null)) {
+            throw new Error(format(ERROR.UNSUPPORTED, ["WebSocket"]));
+        }
+        if (!("localStorage" in global && global["localStorage"] !== null)) {
+            throw new Error(format(ERROR.UNSUPPORTED, ["localStorage"]));
+        }
+        if (!("ArrayBuffer" in global && global["ArrayBuffer"] !== null)) {
+            throw new Error(format(ERROR.UNSUPPORTED, ["ArrayBuffer"]));
+        }
+        this._trace("Messaging.Client", uri, host, port, path, clientId);
+
+        this.host = host;
+        this.port = port;
+        this.path = path;
+        this.uri = uri;
+        this.clientId = clientId;
+
+        // Local storagekeys are qualified with the following string.
+        // The conditional inclusion of path in the key is for backward
+        // compatibility to when the path was not configurable and assumed to
+        // be /mqtt
+        this._localKey = host + ":" + port + (path != "/mqtt" ? ":" + path : "") + ":" + clientId + ":";
+
+        // Create private instance-only message queue
+        // Internal queue of messages to be sent, in sending order. 
+        this._msg_queue = [];
+
+        // Messages we have sent and are expecting a response for, indexed by their respective message ids. 
+        this._sentMessages = {};
+
+        // Messages we have received and acknowleged and are expecting a confirm message for
+        // indexed by their respective message ids. 
+        this._receivedMessages = {};
+
+        // Internal list of callbacks to be executed when messages
+        // have been successfully sent over web socket, e.g. disconnect
+        // when it doesn't have to wait for ACK, just message is dispatched.
+        this._notify_msg_sent = {};
+
+        // Unique identifier for SEND messages, incrementing
+        // counter as messages are sent.
+        this._message_identifier = 1;
+
+        // Used to determine the transmission sequence of stored sent messages.
+        this._sequence = 0;
+
+
+        // Load the local state, if any, from the saved version, only restore state relevant to this client.   	
+        for (key in localStorage)
+            if (key.indexOf("Sent:" + this._localKey) == 0 || key.indexOf("Received:" + this._localKey) == 0)
+                this.restore(key);
+    };
+
+    // Messaging Client public instance members. 
+    ClientImpl.prototype.host;
+    ClientImpl.prototype.port;
+    ClientImpl.prototype.path;
+    ClientImpl.prototype.uri;
+    ClientImpl.prototype.clientId;
+
+    // Messaging Client private instance members.
+    ClientImpl.prototype.socket;
+    /* true once we have received an acknowledgement to a CONNECT packet. */
+    ClientImpl.prototype.connected = false;
+    /* The largest message identifier allowed, may not be larger than 2**16 but 
+     * if set smaller reduces the maximum number of outbound messages allowed.
+     */
+    ClientImpl.prototype.maxMessageIdentifier = 65536;
+    ClientImpl.prototype.connectOptions;
+    ClientImpl.prototype.hostIndex;
+    ClientImpl.prototype.onConnectionLost;
+    ClientImpl.prototype.onMessageDelivered;
+    ClientImpl.prototype.onMessageArrived;
+    ClientImpl.prototype._msg_queue = null;
+    ClientImpl.prototype._connectTimeout;
+    /* The sendPinger monitors how long we allow before we send data to prove to the server that we are alive. */
+    ClientImpl.prototype.sendPinger = null;
+    /* The receivePinger monitors how long we allow before we require evidence that the server is alive. */
+    ClientImpl.prototype.receivePinger = null;
+
+    ClientImpl.prototype.receiveBuffer = null;
+
+    ClientImpl.prototype._traceBuffer = null;
+    ClientImpl.prototype._MAX_TRACE_ENTRIES = 100;
+
+    ClientImpl.prototype.connect = function(connectOptions) {
+        var connectOptionsMasked = this._traceMask(connectOptions, "password");
+        this._trace("Client.connect", connectOptionsMasked, this.socket, this.connected);
+
+        if (this.connected)
+            throw new Error(format(ERROR.INVALID_STATE, ["already connected"]));
+        if (this.socket)
+            throw new Error(format(ERROR.INVALID_STATE, ["already connected"]));
+
+        this.connectOptions = connectOptions;
+
+        if (connectOptions.uris) {
+            this.hostIndex = 0;
+            this._doConnect(connectOptions.uris[0]);
+        } else {
+            this._doConnect(this.uri);
+        }
+
+    };
+
+    ClientImpl.prototype.subscribe = function(filter, subscribeOptions) {
+        this._trace("Client.subscribe", filter, subscribeOptions);
+
+        if (!this.connected)
+            throw new Error(format(ERROR.INVALID_STATE, ["not connected"]));
+
+        var wireMessage = new WireMessage(MESSAGE_TYPE.SUBSCRIBE);
+        wireMessage.topics = [filter];
+        if (subscribeOptions.qos != undefined)
+            wireMessage.requestedQos = [subscribeOptions.qos];
+        else
+            wireMessage.requestedQos = [0];
+
+        if (subscribeOptions.onSuccess) {
+            wireMessage.callback = function() {
+                subscribeOptions.onSuccess({
+                    invocationContext: subscribeOptions.invocationContext
+                });
+            };
+        }
+        if (subscribeOptions.timeout) {
+            wireMessage.timeOut = new Timeout(this, window, subscribeOptions.timeout, subscribeOptions.onFailure, [{
+                invocationContext: subscribeOptions.invocationContext,
+                errorCode: ERROR.SUBSCRIBE_TIMEOUT.code,
+                errorMessage: format(ERROR.SUBSCRIBE_TIMEOUT)
+            }]);
+        }
+
+        // All subscriptions return a SUBACK. 
+        this._requires_ack(wireMessage);
+        this._schedule_message(wireMessage);
+    };
+
+    /** @ignore */
+    ClientImpl.prototype.unsubscribe = function(filter, unsubscribeOptions) {
+        this._trace("Client.unsubscribe", filter, unsubscribeOptions);
+
+        if (!this.connected)
+            throw new Error(format(ERROR.INVALID_STATE, ["not connected"]));
+
+        var wireMessage = new WireMessage(MESSAGE_TYPE.UNSUBSCRIBE);
+        wireMessage.topics = [filter];
+
+        if (unsubscribeOptions.onSuccess) {
+            wireMessage.callback = function() {
+                unsubscribeOptions.onSuccess({
+                    invocationContext: unsubscribeOptions.invocationContext
+                });
+            };
+        }
+        if (unsubscribeOptions.timeout) {
+            wireMessage.timeOut = new Timeout(this, window, unsubscribeOptions.timeout, unsubscribeOptions.onFailure, [{
+                invocationContext: unsubscribeOptions.invocationContext,
+                errorCode: ERROR.UNSUBSCRIBE_TIMEOUT.code,
+                errorMessage: format(ERROR.UNSUBSCRIBE_TIMEOUT)
+            }]);
+        }
+
+        // All unsubscribes return a SUBACK.         
+        this._requires_ack(wireMessage);
+        this._schedule_message(wireMessage);
+    };
+
+    ClientImpl.prototype.send = function(message) {
+        this._trace("Client.send", message);
+
+        if (!this.connected)
+            throw new Error(format(ERROR.INVALID_STATE, ["not connected"]));
+
+        wireMessage = new WireMessage(MESSAGE_TYPE.PUBLISH);
+        wireMessage.payloadMessage = message;
+
+        if (message.qos > 0)
+            this._requires_ack(wireMessage);
+        else if (this.onMessageDelivered)
+            this._notify_msg_sent[wireMessage] = this.onMessageDelivered(wireMessage.payloadMessage);
+        this._schedule_message(wireMessage);
+    };
+
+    ClientImpl.prototype.disconnect = function() {
+        this._trace("Client.disconnect");
+
+        if (!this.socket)
+            throw new Error(format(ERROR.INVALID_STATE, ["not connecting or connected"]));
+
+        wireMessage = new WireMessage(MESSAGE_TYPE.DISCONNECT);
+
+        // Run the disconnected call back as soon as the message has been sent,
+        // in case of a failure later on in the disconnect processing.
+        // as a consequence, the _disconected call back may be run several times.
+        this._notify_msg_sent[wireMessage] = scope(this._disconnected, this);
+
+        this._schedule_message(wireMessage);
+    };
+
+    ClientImpl.prototype.getTraceLog = function() {
+        if (this._traceBuffer !== null) {
+            this._trace("Client.getTraceLog", new Date());
+            this._trace("Client.getTraceLog in flight messages", this._sentMessages.length);
+            for (key in this._sentMessages)
+                this._trace("_sentMessages ", key, this._sentMessages[key]);
+            for (key in this._receivedMessages)
+                this._trace("_receivedMessages ", key, this._receivedMessages[key]);
+
+            return this._traceBuffer;
+        }
+    };
+
+    ClientImpl.prototype.startTrace = function() {
+        if (this._traceBuffer === null) {
+            this._traceBuffer = [];
+        }
+        this._trace("Client.startTrace", new Date(), version);
+    };
+
+    ClientImpl.prototype.stopTrace = function() {
+        delete this._traceBuffer;
+    };
+
+    ClientImpl.prototype._doConnect = function(wsurl) {
+        // When the socket is open, this client will send the CONNECT WireMessage using the saved parameters. 
+        if (this.connectOptions.useSSL) {
+            var uriParts = wsurl.split(":");
+            uriParts[0] = "wss";
+            wsurl = uriParts.join(":");
+        }
+        this.connected = false;
+        this.socket = new WebSocket(wsurl, "mqttv3.1");
+        this.socket.binaryType = 'arraybuffer';
+
+        this.socket.onopen = scope(this._on_socket_open, this);
+        this.socket.onmessage = scope(this._on_socket_message, this);
+        this.socket.onerror = scope(this._on_socket_error, this);
+        this.socket.onclose = scope(this._on_socket_close, this);
+
+        this.sendPinger = new Pinger(this, window, this.connectOptions.keepAliveInterval);
+        this.receivePinger = new Pinger(this, window, this.connectOptions.keepAliveInterval);
+
+        this._connectTimeout = new Timeout(this, window, this.connectOptions.timeout, this._disconnected, [ERROR.CONNECT_TIMEOUT.code, format(ERROR.CONNECT_TIMEOUT)]);
+    };
+
+
+    // Schedule a new message to be sent over the WebSockets
+    // connection. CONNECT messages cause WebSocket connection
+    // to be started. All other messages are queued internally
+    // until this has happened. When WS connection starts, process
+    // all outstanding messages. 
+    ClientImpl.prototype._schedule_message = function(message) {
+        this._msg_queue.push(message);
+        // Process outstanding messages in the queue if we have an  open socket, and have received CONNACK. 
+        if (this.connected) {
+            this._process_queue();
+        }
+    };
+
+    ClientImpl.prototype.store = function(prefix, wireMessage) {
+        storedMessage = {
+            type: wireMessage.type,
+            messageIdentifier: wireMessage.messageIdentifier,
+            version: 1
+        };
+
+        switch (wireMessage.type) {
+            case MESSAGE_TYPE.PUBLISH:
+                if (wireMessage.pubRecReceived)
+                    storedMessage.pubRecReceived = true;
+
+                // Convert the payload to a hex string.
+                storedMessage.payloadMessage = {};
+                var hex = "";
+                var messageBytes = wireMessage.payloadMessage.payloadBytes;
+                for (var i = 0; i < messageBytes.length; i++) {
+                    if (messageBytes[i] <= 0xF)
+                        hex = hex + "0" + messageBytes[i].toString(16);
+                    else
+                        hex = hex + messageBytes[i].toString(16);
+                }
+                storedMessage.payloadMessage.payloadHex = hex;
+
+                storedMessage.payloadMessage.qos = wireMessage.payloadMessage.qos;
+                storedMessage.payloadMessage.destinationName = wireMessage.payloadMessage.destinationName;
+                if (wireMessage.payloadMessage.duplicate)
+                    storedMessage.payloadMessage.duplicate = true;
+                if (wireMessage.payloadMessage.retained)
+                    storedMessage.payloadMessage.retained = true;
+
+                // Add a sequence number to sent messages.
+                if (prefix.indexOf("Sent:") == 0) {
+                    if (wireMessage.sequence === undefined)
+                        wireMessage.sequence = ++this._sequence;
+                    storedMessage.sequence = wireMessage.sequence;
+                }
+                break;
+
+            default:
+                throw Error(format(ERROR.INVALID_STORED_DATA, [key, storedMessage]));
+        }
+        localStorage.setItem(prefix + this._localKey + wireMessage.messageIdentifier, JSON.stringify(storedMessage));
+    };
+
+    ClientImpl.prototype.restore = function(key) {
+        var value = localStorage.getItem(key);
+        var storedMessage = JSON.parse(value);
+
+        var wireMessage = new WireMessage(storedMessage.type, storedMessage);
+
+        switch (storedMessage.type) {
+            case MESSAGE_TYPE.PUBLISH:
+                // Replace the payload message with a Message object.
+                var hex = storedMessage.payloadMessage.payloadHex;
+                var buffer = new ArrayBuffer((hex.length) / 2);
+                var byteStream = new Uint8Array(buffer);
+                var i = 0;
+                while (hex.length >= 2) {
+                    var x = parseInt(hex.substring(0, 2), 16);
+                    hex = hex.substring(2, hex.length);
+                    byteStream[i++] = x;
+                }
+                var payloadMessage = new Messaging.Message(byteStream);
+
+                payloadMessage.qos = storedMessage.payloadMessage.qos;
+                payloadMessage.destinationName = storedMessage.payloadMessage.destinationName;
+                if (storedMessage.payloadMessage.duplicate)
+                    payloadMessage.duplicate = true;
+                if (storedMessage.payloadMessage.retained)
+                    payloadMessage.retained = true;
+                wireMessage.payloadMessage = payloadMessage;
+
+                break;
+
+            default:
+                throw Error(format(ERROR.INVALID_STORED_DATA, [key, value]));
+        }
+
+        if (key.indexOf("Sent:" + this._localKey) == 0) {
+            this._sentMessages[wireMessage.messageIdentifier] = wireMessage;
+        } else if (key.indexOf("Received:" + this._localKey) == 0) {
+            this._receivedMessages[wireMessage.messageIdentifier] = wireMessage;
+        }
+    };
+
+    ClientImpl.prototype._process_queue = function() {
+        var message = null;
+        // Process messages in order they were added
+        var fifo = this._msg_queue.reverse();
+
+        // Send all queued messages down socket connection
+        while ((message = fifo.pop())) {
+            this._socket_send(message);
+            // Notify listeners that message was successfully sent
+            if (this._notify_msg_sent[message]) {
+                this._notify_msg_sent[message]();
+                delete this._notify_msg_sent[message];
+            }
+        }
+    };
+
+    /**
+     * Expect an ACK response for this message. Add message to the set of in progress
+     * messages and set an unused identifier in this message.
+     * @ignore
+     */
+    ClientImpl.prototype._requires_ack = function(wireMessage) {
+        var messageCount = Object.keys(this._sentMessages).length;
+        if (messageCount > this.maxMessageIdentifier)
+            throw Error("Too many messages:" + messageCount);
+
+        while (this._sentMessages[this._message_identifier] !== undefined) {
+            this._message_identifier++;
+        }
+        wireMessage.messageIdentifier = this._message_identifier;
+        this._sentMessages[wireMessage.messageIdentifier] = wireMessage;
+        if (wireMessage.type === MESSAGE_TYPE.PUBLISH) {
+            this.store("Sent:", wireMessage);
+        }
+        if (this._message_identifier === this.maxMessageIdentifier) {
+            this._message_identifier = 1;
+        }
+    };
+
+    /** 
+     * Called when the underlying websocket has been opened.
+     * @ignore
+     */
+    ClientImpl.prototype._on_socket_open = function() {
+        // Create the CONNECT message object.
+        var wireMessage = new WireMessage(MESSAGE_TYPE.CONNECT, this.connectOptions);
+        wireMessage.clientId = this.clientId;
+        this._socket_send(wireMessage);
+    };
+
+    /** 
+     * Called when the underlying websocket has received a complete packet.
+     * @ignore
+     */
+    ClientImpl.prototype._on_socket_message = function(event) {
+        this._trace("Client._on_socket_message", event.data);
+        // Reset the receive ping timer, we now have evidence the server is alive.
+        this.receivePinger.reset();
+        var messages = this._deframeMessages(event.data);
+        for (var i = 0; i < messages.length; i += 1) {
+            this._handleMessage(messages[i]);
+        }
+    }
+
+    ClientImpl.prototype._deframeMessages = function(data) {
+        var byteArray = new Uint8Array(data);
+        if (this.receiveBuffer) {
+            var newData = new Uint8Array(this.receiveBuffer.length + byteArray.length);
+            newData.set(this.receiveBuffer);
+            newData.set(byteArray, this.receiveBuffer.length);
+            byteArray = newData;
+            delete this.receiveBuffer;
+        }
+        try {
+            var offset = 0;
+            var messages = [];
+            while (offset < byteArray.length) {
+                var result = decodeMessage(byteArray, offset);
+                var wireMessage = result[0];
+                offset = result[1];
+                if (wireMessage !== null) {
+                    messages.push(wireMessage);
+                } else {
+                    break;
+                }
+            }
+            if (offset < byteArray.length) {
+                this.receiveBuffer = byteArray.subarray(offset);
+            }
+        } catch (error) {
+            this._disconnected(ERROR.INTERNAL_ERROR.code, format(ERROR.INTERNAL_ERROR, [error.message]));
+            return;
+        }
+        return messages;
+    }
+
+    ClientImpl.prototype._handleMessage = function(wireMessage) {
+
+        this._trace("Client._handleMessage", wireMessage);
+
+        try {
+            switch (wireMessage.type) {
+                case MESSAGE_TYPE.CONNACK:
+                    this._connectTimeout.cancel();
+
+                    // If we have started using clean session then clear up the local state.
+                    if (this.connectOptions.cleanSession) {
+                        for (key in this._sentMessages) {
+                            var sentMessage = this._sentMessages[key];
+                            localStorage.removeItem("Sent:" + this._localKey + sentMessage.messageIdentifier);
+                        }
+                        this._sentMessages = {};
+
+                        for (key in this._receivedMessages) {
+                            var receivedMessage = this._receivedMessages[key];
+                            localStorage.removeItem("Received:" + this._localKey + receivedMessage.messageIdentifier);
+                        }
+                        this._receivedMessages = {};
+                    }
+                    // Client connected and ready for business.
+                    if (wireMessage.returnCode === 0) {
+                        this.connected = true;
+                        // Jump to the end of the list of uris and stop looking for a good host.
+                        if (this.connectOptions.uris)
+                            this.hostIndex = this.connectOptions.uris.length;
+                    } else {
+                        this._disconnected(ERROR.CONNACK_RETURNCODE.code, format(ERROR.CONNACK_RETURNCODE, [wireMessage.returnCode, CONNACK_RC[wireMessage.returnCode]]));
+                        break;
+                    }
+
+                    // Resend messages.
+                    var sequencedMessages = new Array();
+                    for (var msgId in this._sentMessages) {
+                        if (this._sentMessages.hasOwnProperty(msgId))
+                            sequencedMessages.push(this._sentMessages[msgId]);
+                    }
+
+                    // Sort sentMessages into the original sent order.
+                    var sequencedMessages = sequencedMessages.sort(function(a, b) {
+                        return a.sequence - b.sequence;
+                    });
+                    for (var i = 0, len = sequencedMessages.length; i < len; i++) {
+                        var sentMessage = sequencedMessages[i];
+                        if (sentMessage.type == MESSAGE_TYPE.PUBLISH && sentMessage.pubRecReceived) {
+                            var pubRelMessage = new WireMessage(MESSAGE_TYPE.PUBREL, {
+                                messageIdentifier: sentMessage.messageIdentifier
+                            });
+                            this._schedule_message(pubRelMessage);
+                        } else {
+                            this._schedule_message(sentMessage);
+                        };
+                    }
+
+                    // Execute the connectOptions.onSuccess callback if there is one.
+                    if (this.connectOptions.onSuccess) {
+                        this.connectOptions.onSuccess({
+                            invocationContext: this.connectOptions.invocationContext
+                        });
+                    }
+
+                    // Process all queued messages now that the connection is established. 
+                    this._process_queue();
+                    break;
+
+                case MESSAGE_TYPE.PUBLISH:
+                    this._receivePublish(wireMessage);
+                    break;
+
+                case MESSAGE_TYPE.PUBACK:
+                    var sentMessage = this._sentMessages[wireMessage.messageIdentifier];
+                    // If this is a re flow of a PUBACK after we have restarted receivedMessage will not exist.
+                    if (sentMessage) {
+                        delete this._sentMessages[wireMessage.messageIdentifier];
+                        localStorage.removeItem("Sent:" + this._localKey + wireMessage.messageIdentifier);
+                        if (this.onMessageDelivered)
+                            this.onMessageDelivered(sentMessage.payloadMessage);
+                    }
+                    break;
+
+                case MESSAGE_TYPE.PUBREC:
+                    var sentMessage = this._sentMessages[wireMessage.messageIdentifier];
+                    // If this is a re flow of a PUBREC after we have restarted receivedMessage will not exist.
+                    if (sentMessage) {
+                        sentMessage.pubRecReceived = true;
+                        var pubRelMessage = new WireMessage(MESSAGE_TYPE.PUBREL, {
+                            messageIdentifier: wireMessage.messageIdentifier
+                        });
+                        this.store("Sent:", sentMessage);
+                        this._schedule_message(pubRelMessage);
+                    }
+                    break;
+
+                case MESSAGE_TYPE.PUBREL:
+                    var receivedMessage = this._receivedMessages[wireMessage.messageIdentifier];
+                    localStorage.removeItem("Received:" + this._localKey + wireMessage.messageIdentifier);
+                    // If this is a re flow of a PUBREL after we have restarted receivedMessage will not exist.
+                    if (receivedMessage) {
+                        this._receiveMessage(receivedMessage);
+                        delete this._receivedMessages[wireMessage.messageIdentifier];
+                    }
+                    // Always flow PubComp, we may have previously flowed PubComp but the server lost it and restarted.
+                    pubCompMessage = new WireMessage(MESSAGE_TYPE.PUBCOMP, {
+                        messageIdentifier: wireMessage.messageIdentifier
+                    });
+                    this._schedule_message(pubCompMessage);
+
+
+                    break;
+
+                case MESSAGE_TYPE.PUBCOMP:
+                    var sentMessage = this._sentMessages[wireMessage.messageIdentifier];
+                    delete this._sentMessages[wireMessage.messageIdentifier];
+                    localStorage.removeItem("Sent:" + this._localKey + wireMessage.messageIdentifier);
+                    if (this.onMessageDelivered)
+                        this.onMessageDelivered(sentMessage.payloadMessage);
+                    break;
+
+                case MESSAGE_TYPE.SUBACK:
+                    var sentMessage = this._sentMessages[wireMessage.messageIdentifier];
+                    if (sentMessage) {
+                        if (sentMessage.timeOut)
+                            sentMessage.timeOut.cancel();
+                        if (sentMessage.callback) {
+                            sentMessage.callback();
+                        }
+                        delete this._sentMessages[wireMessage.messageIdentifier];
+                    }
+                    break;
+
+                case MESSAGE_TYPE.UNSUBACK:
+                    var sentMessage = this._sentMessages[wireMessage.messageIdentifier];
+                    if (sentMessage) {
+                        if (sentMessage.timeOut)
+                            sentMessage.timeOut.cancel();
+                        if (sentMessage.callback) {
+                            sentMessage.callback();
+                        }
+                        delete this._sentMessages[wireMessage.messageIdentifier];
+                    }
+
+                    break;
+
+                case MESSAGE_TYPE.PINGRESP:
+                    /* The sendPinger or receivePinger may have sent a ping, the receivePinger has already been reset. */
+                    this.sendPinger.reset();
+                    break;
+
+                case MESSAGE_TYPE.DISCONNECT:
+                    // Clients do not expect to receive disconnect packets.
+                    this._disconnected(ERROR.INVALID_MQTT_MESSAGE_TYPE.code, format(ERROR.INVALID_MQTT_MESSAGE_TYPE, [wireMessage.type]));
+                    break;
+
+                default:
+                    this._disconnected(ERROR.INVALID_MQTT_MESSAGE_TYPE.code, format(ERROR.INVALID_MQTT_MESSAGE_TYPE, [wireMessage.type]));
+            };
+        } catch (error) {
+            this._disconnected(ERROR.INTERNAL_ERROR.code, format(ERROR.INTERNAL_ERROR, [error.message]));
+            return;
+        }
+    };
+
+    /** @ignore */
+    ClientImpl.prototype._on_socket_error = function(error) {
+        this._disconnected(ERROR.SOCKET_ERROR.code, format(ERROR.SOCKET_ERROR, [error.data]));
+    };
+
+    /** @ignore */
+    ClientImpl.prototype._on_socket_close = function() {
+        this._disconnected(ERROR.SOCKET_CLOSE.code, format(ERROR.SOCKET_CLOSE));
+    };
+
+    /** @ignore */
+    ClientImpl.prototype._socket_send = function(wireMessage) {
+
+        if (wireMessage.type == 1) {
+            var wireMessageMasked = this._traceMask(wireMessage, "password");
+            this._trace("Client._socket_send", wireMessageMasked);
+        } else this._trace("Client._socket_send", wireMessage);
+
+        this.socket.send(wireMessage.encode());
+        /* We have proved to the server we are alive. */
+        this.sendPinger.reset();
+    };
+
+    /** @ignore */
+    ClientImpl.prototype._receivePublish = function(wireMessage) {
+        switch (wireMessage.payloadMessage.qos) {
+            case "undefined":
+            case 0:
+                this._receiveMessage(wireMessage);
+                break;
+
+            case 1:
+                var pubAckMessage = new WireMessage(MESSAGE_TYPE.PUBACK, {
+                    messageIdentifier: wireMessage.messageIdentifier
+                });
+                this._schedule_message(pubAckMessage);
+                this._receiveMessage(wireMessage);
+                break;
+
+            case 2:
+                this._receivedMessages[wireMessage.messageIdentifier] = wireMessage;
+                this.store("Received:", wireMessage);
+                var pubRecMessage = new WireMessage(MESSAGE_TYPE.PUBREC, {
+                    messageIdentifier: wireMessage.messageIdentifier
+                });
+                this._schedule_message(pubRecMessage);
+
+                break;
+
+            default:
+                throw Error("Invaild qos=" + wireMmessage.payloadMessage.qos);
+        };
+    };
+
+    /** @ignore */
+    ClientImpl.prototype._receiveMessage = function(wireMessage) {
+        if (this.onMessageArrived) {
+            this.onMessageArrived(wireMessage.payloadMessage);
+        }
+    };
+
+    /**
+     * Client has disconnected either at its own request or because the server
+     * or network disconnected it. Remove all non-durable state.
+     * @param {errorCode} [number] the error number.
+     * @param {errorText} [string] the error text.
+     * @ignore
+     */
+    ClientImpl.prototype._disconnected = function(errorCode, errorText) {
+        this._trace("Client._disconnected", errorCode, errorText);
+
+        this.sendPinger.cancel();
+        this.receivePinger.cancel();
+        if (this._connectTimeout)
+            this._connectTimeout.cancel();
+        // Clear message buffers.
+        this._msg_queue = [];
+        this._notify_msg_sent = {};
+
+        if (this.socket) {
+            // Cancel all socket callbacks so that they cannot be driven again by this socket.
+            this.socket.onopen = null;
+            this.socket.onmessage = null;
+            this.socket.onerror = null;
+            this.socket.onclose = null;
+            if (this.socket.readyState === 1)
+                this.socket.close();
+            delete this.socket;
+        }
+
+        if (this.connectOptions.uris && this.hostIndex < this.connectOptions.uris.length - 1) {
+            // Try the next host.
+            this.hostIndex++;
+            this._doConnect(this.connectOptions.uris[this.hostIndex]);
+
+        } else {
+
+            if (errorCode === undefined) {
+                errorCode = ERROR.OK.code;
+                errorText = format(ERROR.OK);
+            }
+
+            // Run any application callbacks last as they may attempt to reconnect and hence create a new socket.
+            if (this.connected) {
+                this.connected = false;
+                // Execute the connectionLostCallback if there is one, and we were connected.       
+                if (this.onConnectionLost)
+                    this.onConnectionLost({
+                        errorCode: errorCode,
+                        errorMessage: errorText
+                    });
+            } else {
+                // Otherwise we never had a connection, so indicate that the connect has failed.
+                if (this.connectOptions.onFailure)
+                    this.connectOptions.onFailure({
+                        invocationContext: this.connectOptions.invocationContext,
+                        errorCode: errorCode,
+                        errorMessage: errorText
+                    });
+            }
+        }
+    };
+
+    /** @ignore */
+    ClientImpl.prototype._trace = function() {
+        if (this._traceBuffer !== null) {
+            for (var i = 0, max = arguments.length; i < max; i++) {
+                if (this._traceBuffer.length == this._MAX_TRACE_ENTRIES) {
+                    this._traceBuffer.shift();
+                }
+                if (i === 0) this._traceBuffer.push(arguments[i]);
+                else if (typeof arguments[i] === "undefined") this._traceBuffer.push(arguments[i]);
+                else this._traceBuffer.push("  " + JSON.stringify(arguments[i]));
+            };
+        };
+    };
+
+    /** @ignore */
+    ClientImpl.prototype._traceMask = function(traceObject, masked) {
+        var traceObjectMasked = {};
+        for (var attr in traceObject) {
+            if (traceObject.hasOwnProperty(attr)) {
+                if (attr == masked)
+                    traceObjectMasked[attr] = "******";
+                else
+                    traceObjectMasked[attr] = traceObject[attr];
+            }
+        }
+        return traceObjectMasked;
+    };
+
+    // ------------------------------------------------------------------------
+    // Public Programming interface.
+    // ------------------------------------------------------------------------
+
+    /** 
+     * The JavaScript application communicates to the server using a {@link Messaging.Client} object.
+     * <p>
+     * Most applications will create just one Client object and then call its connect() method,
+     * however applications can create more than one Client object if they wish.
+     * In this case the combination of host, port and clientId attributes must be different for each Client object.
+     * <p>
+     * The send, subscribe and unsubscribe methods are implemented as asynchronous JavaScript methods
+     * (even though the underlying protocol exchange might be synchronous in nature).
+     * This means they signal their completion by calling back to the application,
+     * via Success or Failure callback functions provided by the application on the method in question.
+     * Such callbacks are called at most once per method invocation and do not persist beyond the lifetime
+     * of the script that made the invocation.
+     * <p>
+     * In contrast there are some callback functions, most notably <i>onMessageArrived</i>,
+     * that are defined on the {@link Messaging.Client} object.
+     * These may get called multiple times, and aren't directly related to specific method invocations made by the client.
+     *
+     * @name Messaging.Client
+     *
+     * @constructor
+     *
+     * @param {string} host - the address of the messaging server, as a fully qualified WebSocket URI, as a DNS name or dotted decimal IP address.
+     * @param {number} port - the port number to connect to - only required if host is not a URI
+     * @param {string} path - the path on the host to connect to - only used if host is not a URI. Default: '/mqtt'.
+     * @param {string} clientId - the Messaging client identifier, between 1 and 23 characters in length.
+     *
+     * @property {string} host - <i>read only</i> the server's DNS hostname or dotted decimal IP address.
+     * @property {number} port - <i>read only</i> the server's port.
+     * @property {string} path - <i>read only</i> the server's path.
+     * @property {string} clientId - <i>read only</i> used when connecting to the server.
+     * @property {function} onConnectionLost - called when a connection has been lost.
+     *                            after a connect() method has succeeded.
+     *                            Establish the call back used when a connection has been lost. The connection may be
+     *                            lost because the client initiates a disconnect or because the server or network
+     *                            cause the client to be disconnected. The disconnect call back may be called without
+     *                            the connectionComplete call back being invoked if, for example the client fails to
+     *                            connect.
+     *                            A single response object parameter is passed to the onConnectionLost callback containing the following fields:
+     *                            <ol>
+     *                            <li>errorCode
+     *                            <li>errorMessage
+     *                            </ol>
+     * @property {function} onMessageDelivered called when a message has been delivered.
+     *                            All processing that this Client will ever do has been completed. So, for example,
+     *                            in the case of a Qos=2 message sent by this client, the PubComp flow has been received from the server
+     *                            and the message has been removed from persistent storage before this callback is invoked.
+     *                            Parameters passed to the onMessageDelivered callback are:
+     *                            <ol>
+     *                            <li>{@link Messaging.Message} that was delivered.
+     *                            </ol>
+     * @property {function} onMessageArrived called when a message has arrived in this Messaging.client.
+     *                            Parameters passed to the onMessageArrived callback are:
+     *                            <ol>
+     *                            <li>{@link Messaging.Message} that has arrived.
+     *                            </ol>
+     */
+    var Client = function(host, port, path, clientId) {
+
+        var uri;
+
+        if (typeof host !== "string")
+            throw new Error(format(ERROR.INVALID_TYPE, [typeof host, "host"]));
+
+        if (arguments.length == 2) {
+            // host: must be full ws:// uri
+            // port: clientId
+            clientId = port;
+            uri = host;
+            var match = uri.match(/^(wss?):\/\/((\[(.+)\])|([^\/]+?))(:(\d+))?(\/.*)$/);
+            if (match) {
+                host = match[4] || match[2];
+                port = parseInt(match[7]);
+                path = match[8];
+            } else {
+                throw new Error(format(ERROR.INVALID_ARGUMENT, [host, "host"]));
+            }
+        } else {
+            if (arguments.length == 3) {
+                clientId = path;
+                path = "/mqtt";
+            }
+            if (typeof port !== "number" || port < 0)
+                throw new Error(format(ERROR.INVALID_TYPE, [typeof port, "port"]));
+            if (typeof path !== "string")
+                throw new Error(format(ERROR.INVALID_TYPE, [typeof path, "path"]));
+
+            var ipv6 = (host.indexOf(":") != -1);
+            uri = "ws://" + (ipv6 ? "[" + host + "]" : host) + ":" + port + path;
+        }
+
+        var clientIdLength = 0;
+        for (var i = 0; i < clientId.length; i++) {
+            var charCode = clientId.charCodeAt(i);
+            if (0xD800 <= charCode && charCode <= 0xDBFF) {
+                i++; // Surrogate pair.
+            }
+            clientIdLength++;
+        }
+        if (typeof clientId !== "string" || clientIdLength < 1 | clientIdLength > 23)
+            throw new Error(format(ERROR.INVALID_ARGUMENT, [clientId, "clientId"]));
+
+        var client = new ClientImpl(uri, host, port, path, clientId);
+        this._getHost = function() {
+            return host;
+        };
+        this._setHost = function() {
+            throw new Error(format(ERROR.UNSUPPORTED_OPERATION));
+        };
+
+        this._getPort = function() {
+            return port;
+        };
+        this._setPort = function() {
+            throw new Error(format(ERROR.UNSUPPORTED_OPERATION));
+        };
+
+        this._getPath = function() {
+            return path;
+        };
+        this._setPath = function() {
+            throw new Error(format(ERROR.UNSUPPORTED_OPERATION));
+        };
+
+        this._getURI = function() {
+            return uri;
+        };
+        this._setURI = function() {
+            throw new Error(format(ERROR.UNSUPPORTED_OPERATION));
+        };
+
+        this._getClientId = function() {
+            return client.clientId;
+        };
+        this._setClientId = function() {
+            throw new Error(format(ERROR.UNSUPPORTED_OPERATION));
+        };
+
+        this._getOnConnectionLost = function() {
+            return client.onConnectionLost;
+        };
+        this._setOnConnectionLost = function(newOnConnectionLost) {
+            if (typeof newOnConnectionLost === "function")
+                client.onConnectionLost = newOnConnectionLost;
+            else
+                throw new Error(format(ERROR.INVALID_TYPE, [typeof newOnConnectionLost, "onConnectionLost"]));
+        };
+
+        this._getOnMessageDelivered = function() {
+            return client.onMessageDelivered;
+        };
+        this._setOnMessageDelivered = function(newOnMessageDelivered) {
+            if (typeof newOnMessageDelivered === "function")
+                client.onMessageDelivered = newOnMessageDelivered;
+            else
+                throw new Error(format(ERROR.INVALID_TYPE, [typeof newOnMessageDelivered, "onMessageDelivered"]));
+        };
+
+        this._getOnMessageArrived = function() {
+            return client.onMessageArrived;
+        };
+        this._setOnMessageArrived = function(newOnMessageArrived) {
+            if (typeof newOnMessageArrived === "function")
+                client.onMessageArrived = newOnMessageArrived;
+            else
+                throw new Error(format(ERROR.INVALID_TYPE, [typeof newOnMessageArrived, "onMessageArrived"]));
+        };
+
+        /** 
+         * Connect this Messaging client to its server.
+         *
+         * @name Messaging.Client#connect
+         * @function
+         * @param {Object} connectOptions - attributes used with the connection.
+         * @param {number} connectOptions.timeout - If the connect has not succeeded within this
+         *                    number of seconds, it is deemed to have failed.
+         *                    The default is 30 seconds.
+         * @param {string} connectOptions.userName - Authentication username for this connection.
+         * @param {string} connectOptions.password - Authentication password for this connection.
+         * @param {Messaging.Message} connectOptions.willMessage - sent by the server when the client
+         *                    disconnects abnormally.
+         * @param {Number} connectOptions.keepAliveInterval - the server disconnects this client if
+         *                    there is no activity for this number of seconds.
+         *                    The default value of 60 seconds is assumed if not set.
+         * @param {boolean} connectOptions.cleanSession - if true(default) the client and server
+         *                    persistent state is deleted on successful connect.
+         * @param {boolean} connectOptions.useSSL - if present and true, use an SSL Websocket connection.
+         * @param {object} connectOptions.invocationContext - passed to the onSuccess callback or onFailure callback.
+         * @param {function} connectOptions.onSuccess - called when the connect acknowledgement
+         *                    has been received from the server.
+         * A single response object parameter is passed to the onSuccess callback containing the following fields:
+         * <ol>
+         * <li>invocationContext as passed in to the onSuccess method in the connectOptions.
+         * </ol>
+         * @config {function} [onFailure] called when the connect request has failed or timed out.
+         * A single response object parameter is passed to the onFailure callback containing the following fields:
+         * <ol>
+         * <li>invocationContext as passed in to the onFailure method in the connectOptions.
+         * <li>errorCode a number indicating the nature of the error.
+         * <li>errorMessage text describing the error.
+         * </ol>
+         * @config {Array} [hosts] If present this contains either a set of hostnames or fully qualified
+         * WebSocket URIs (ws://example.com:1883/mqtt), that are tried in order in place
+         * of the host and port paramater on the construtor. The hosts are tried one at at time in order until
+         * one of then succeeds.
+         * @config {Array} [ports] If present the set of ports matching the hosts. If hosts contains URIs, this property
+         * is not used.
+         * @throws {InvalidState} if the client is not in disconnected state. The client must have received connectionLost
+         * or disconnected before calling connect for a second or subsequent time.
+         */
+        this.connect = function(connectOptions) {
+            connectOptions = connectOptions || {};
+            validate(connectOptions, {
+                timeout: "number",
+                userName: "string",
+                password: "string",
+                willMessage: "object",
+                keepAliveInterval: "number",
+                cleanSession: "boolean",
+                useSSL: "boolean",
+                invocationContext: "object",
+                onSuccess: "function",
+                onFailure: "function",
+                hosts: "object",
+                ports: "object"
+            });
+
+            // If no keep alive interval is set, assume 60 seconds.
+            if (connectOptions.keepAliveInterval === undefined)
+                connectOptions.keepAliveInterval = 60;
+
+            if (connectOptions.willMessage) {
+                if (!(connectOptions.willMessage instanceof Message))
+                    throw new Error(format(ERROR.INVALID_TYPE, [connectOptions.willMessage, "connectOptions.willMessage"]));
+                // The will message must have a payload that can be represented as a string.
+                // Cause the willMessage to throw an exception if this is not the case.
+                connectOptions.willMessage.stringPayload;
+
+                if (typeof connectOptions.willMessage.destinationName === "undefined")
+                    throw new Error(format(ERROR.INVALID_TYPE, [typeof connectOptions.willMessage.destinationName, "connectOptions.willMessage.destinationName"]));
+            }
+            if (typeof connectOptions.cleanSession === "undefined")
+                connectOptions.cleanSession = true;
+            if (connectOptions.hosts) {
+
+                if (!(connectOptions.hosts instanceof Array))
+                    throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.hosts, "connectOptions.hosts"]));
+                if (connectOptions.hosts.length < 1)
+                    throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.hosts, "connectOptions.hosts"]));
+
+                var usingURIs = false;
+                for (var i = 0; i < connectOptions.hosts.length; i++) {
+                    if (typeof connectOptions.hosts[i] !== "string")
+                        throw new Error(format(ERROR.INVALID_TYPE, [typeof connectOptions.hosts[i], "connectOptions.hosts[" + i + "]"]));
+                    if (/^(wss?):\/\/((\[(.+)\])|([^\/]+?))(:(\d+))?(\/.*)$/.test(connectOptions.hosts[i])) {
+                        if (i == 0) {
+                            usingURIs = true;
+                        } else if (!usingURIs) {
+                            throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.hosts[i], "connectOptions.hosts[" + i + "]"]));
+                        }
+                    } else if (usingURIs) {
+                        throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.hosts[i], "connectOptions.hosts[" + i + "]"]));
+                    }
+                }
+
+                if (!usingURIs) {
+                    if (!connectOptions.ports)
+                        throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.ports, "connectOptions.ports"]));
+                    if (!(connectOptions.ports instanceof Array))
+                        throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.ports, "connectOptions.ports"]));
+                    if (connectOptions.hosts.length != connectOptions.ports.length)
+                        throw new Error(format(ERROR.INVALID_ARGUMENT, [connectOptions.ports, "connectOptions.ports"]));
+
+                    connectOptions.uris = [];
+
+                    for (var i = 0; i < connectOptions.hosts.length; i++) {
+                        if (typeof connectOptions.ports[i] !== "number" || connectOptions.ports[i] < 0)
+                            throw new Error(format(ERROR.INVALID_TYPE, [typeof connectOptions.ports[i], "connectOptions.ports[" + i + "]"]));
+                        var host = connectOptions.hosts[i];
+                        var port = connectOptions.ports[i];
+
+                        var ipv6 = (host.indexOf(":") != -1);
+                        uri = "ws://" + (ipv6 ? "[" + host + "]" : host) + ":" + port + path;
+                        connectOptions.uris.push(uri);
+                    }
+                } else {
+                    connectOptions.uris = connectOptions.hosts;
+                }
+            }
+
+            client.connect(connectOptions);
+        };
+
+        /** 
+         * Subscribe for messages, request receipt of a copy of messages sent to the destinations described by the filter.
+         *
+         * @name Messaging.Client#subscribe
+         * @function
+         * @param {string} filter describing the destinations to receive messages from.
+         * <br>
+         * @param {object} subscribeOptions - used to control the subscription
+         *
+         * @param {number} subscribeOptions.qos - the maiximum qos of any publications sent
+         *                                  as a result of making this subscription.
+         * @param {object} subscribeOptions.invocationContext - passed to the onSuccess callback
+         *                                  or onFailure callback.
+         * @param {function} subscribeOptions.onSuccess - called when the subscribe acknowledgement
+         *                                  has been received from the server.
+         *                                  A single response object parameter is passed to the onSuccess callback containing the following fields:
+         *                                  <ol>
+         *                                  <li>invocationContext if set in the subscribeOptions.
+         *                                  </ol>
+         * @param {function} subscribeOptions.onFailure - called when the subscribe request has failed or timed out.
+         *                                  A single response object parameter is passed to the onFailure callback containing the following fields:
+         *                                  <ol>
+         *                                  <li>invocationContext - if set in the subscribeOptions.
+         *                                  <li>errorCode - a number indicating the nature of the error.
+         *                                  <li>errorMessage - text describing the error.
+         *                                  </ol>
+         * @param {number} subscribeOptions.timeout - which, if present, determines the number of
+         *                                  seconds after which the onFailure calback is called.
+         *                                  The presence of a timeout does not prevent the onSuccess
+         *                                  callback from being called when the subscribe completes.
+         * @throws {InvalidState} if the client is not in connected state.
+         */
+        this.subscribe = function(filter, subscribeOptions) {
+            if (typeof filter !== "string")
+                throw new Error("Invalid argument:" + filter);
+            subscribeOptions = subscribeOptions || {};
+            validate(subscribeOptions, {
+                qos: "number",
+                invocationContext: "object",
+                onSuccess: "function",
+                onFailure: "function",
+                timeout: "number"
+            });
+            if (subscribeOptions.timeout && !subscribeOptions.onFailure)
+                throw new Error("subscribeOptions.timeout specified with no onFailure callback.");
+            if (typeof subscribeOptions.qos !== "undefined" && !(subscribeOptions.qos === 0 || subscribeOptions.qos === 1 || subscribeOptions.qos === 2))
+                throw new Error(format(ERROR.INVALID_ARGUMENT, [subscribeOptions.qos, "subscribeOptions.qos"]));
+            client.subscribe(filter, subscribeOptions);
+        };
+
+        /**
+		 * Unsubscribe for messages, stop receiving messages sent to destinations described by the filter.
+		 * 
+		 * @name Messaging.Client#unsubscribe
+		 * @function
+		 * @param {string} filter - describing the destinations to receive messages from.
+		 * @param {object} unsubscribeOptions - used to control the subscription
+		 * @param {object} unsubscribeOptions.invocationContext - passed to the onSuccess callback 
+		                                      or onFailure callback.
+		 * @param {function} unsubscribeOptions.onSuccess - called when the unsubscribe acknowledgement has been received from the server.
+		 *                                    A single response object parameter is passed to the 
+		 *                                    onSuccess callback containing the following fields:
+		 *                                    <ol>
+		 *                                    <li>invocationContext - if set in the unsubscribeOptions.     
+		 *                                    </ol>
+		 * @param {function} unsubscribeOptions.onFailure called when the unsubscribe request has failed or timed out.
+		 *                                    A single response object parameter is passed to the onFailure callback containing the following fields:
+		 *                                    <ol>
+		 *                                    <li>invocationContext - if set in the unsubscribeOptions.       
+		 *                                    <li>errorCode - a number indicating the nature of the error.
+		 *                                    <li>errorMessage - text describing the error.      
+		 *                                    </ol>
+		 * @param {number} unsubscribeOptions.timeout - which, if present, determines the number of seconds
+		 *                                    after which the onFailure callback is called. The presence of
+		 *                                    a timeout does not prevent the onSuccess callback from being
+		 *                                    called when the unsubscribe completes
+		 * @throws {InvalidState} if the client is not in connected state.
+		 */
+        this.unsubscribe = function(filter, unsubscribeOptions) {
+            if (typeof filter !== "string")
+                throw new Error("Invalid argument:" + filter);
+            unsubscribeOptions = unsubscribeOptions || {};
+            validate(unsubscribeOptions, {
+                invocationContext: "object",
+                onSuccess: "function",
+                onFailure: "function",
+                timeout: "number"
+            });
+            if (unsubscribeOptions.timeout && !unsubscribeOptions.onFailure)
+                throw new Error("unsubscribeOptions.timeout specified with no onFailure callback.");
+            client.unsubscribe(filter, unsubscribeOptions);
+        };
+
+        /**
+		 * Send a message to the consumers of the destination in the Message.
+		 * 
+		 * @name Messaging.Client#send
+		 * @function 
+		 * @param {Messaging.Message} message to send.
+		 
+		 * @throws {InvalidState} if the client is not connected.
+		 */
+        this.send = function(message) {
+            if (!(message instanceof Message))
+                throw new Error("Invalid argument:" + typeof message);
+            if (typeof message.destinationName === "undefined")
+                throw new Error("Invalid parameter Message.destinationName:" + message.destinationName);
+
+            client.send(message);
+        };
+
+        /** 
+         * Normal disconnect of this Messaging client from its server.
+         *
+         * @name Messaging.Client#disconnect
+         * @function
+         * @throws {InvalidState} if the client is already disconnected.
+         */
+        this.disconnect = function() {
+            client.disconnect();
+        };
+
+        /** 
+         * Get the contents of the trace log.
+         *
+         * @name Messaging.Client#getTraceLog
+         * @function
+         * @return {Object[]} tracebuffer containing the time ordered trace records.
+         */
+        this.getTraceLog = function() {
+            return client.getTraceLog();
+        }
+
+        /** 
+         * Start tracing.
+         *
+         * @name Messaging.Client#startTrace
+         * @function
+         */
+        this.startTrace = function() {
+            client.startTrace();
+        };
+
+        /** 
+         * Stop tracing.
+         *
+         * @name Messaging.Client#stopTrace
+         * @function
+         */
+        this.stopTrace = function() {
+            client.stopTrace();
+        };
+    };
+
+    Client.prototype = {
+        get host() {
+            return this._getHost();
+        },
+        set host(newHost) {
+            this._setHost(newHost);
+        },
+
+        get port() {
+            return this._getPort();
+        },
+        set port(newPort) {
+            this._setPort(newPort);
+        },
+
+        get path() {
+            return this._getPath();
+        },
+        set path(newPath) {
+            this._setPath(newPath);
+        },
+
+        get clientId() {
+            return this._getClientId();
+        },
+        set clientId(newClientId) {
+            this._setClientId(newClientId);
+        },
+
+        get onConnectionLost() {
+            return this._getOnConnectionLost();
+        },
+        set onConnectionLost(newOnConnectionLost) {
+            this._setOnConnectionLost(newOnConnectionLost);
+        },
+
+        get onMessageDelivered() {
+            return this._getOnMessageDelivered();
+        },
+        set onMessageDelivered(newOnMessageDelivered) {
+            this._setOnMessageDelivered(newOnMessageDelivered);
+        },
+
+        get onMessageArrived() {
+            return this._getOnMessageArrived();
+        },
+        set onMessageArrived(newOnMessageArrived) {
+            this._setOnMessageArrived(newOnMessageArrived);
+        }
+    };
+
+    /** 
+     * An application message, sent or received.
+     * <p>
+     * All attributes may be null, which implies the default values.
+     *
+     * @name Messaging.Message
+     * @constructor
+     * @param {String|ArrayBuffer} payload The message data to be sent.
+     * <p>
+     * @property {string} payloadString <i>read only</i> The payload as a string if the payload consists of valid UTF-8 characters.
+     * @property {ArrayBuffer} payloadBytes <i>read only</i> The payload as an ArrayBuffer.
+     * <p>
+     * @property {string} destinationName <b>mandatory</b> The name of the destination to which the message is to be sent
+     *                    (for messages about to be sent) or the name of the destination from which the message has been received.
+     *                    (for messages received by the onMessage function).
+     * <p>
+     * @property {number} qos The Quality of Service used to deliver the message.
+     * <dl>
+     *     <dt>0 Best effort (default).
+     *     <dt>1 At least once.
+     *     <dt>2 Exactly once.
+     * </dl>
+     * <p>
+     * @property {Boolean} retained If true, the message is to be retained by the server and delivered
+     *                     to both current and future subscriptions.
+     *                     If false the server only delivers the message to current subscribers, this is the default for new Messages.
+     *                     A received message has the retained boolean set to true if the message was published
+     *                     with the retained boolean set to true
+     *                     and the subscrption was made after the message has been published.
+     * <p>
+     * @property {Boolean} duplicate <i>read only</i> If true, this message might be a duplicate of one which has already been received.
+     *                     This is only set on messages received from the server.
+     *
+     */
+    var Message = function(newPayload) {
+        var payload;
+        if (typeof newPayload === "string" || newPayload instanceof ArrayBuffer || newPayload instanceof Int8Array || newPayload instanceof Uint8Array || newPayload instanceof Int16Array || newPayload instanceof Uint16Array || newPayload instanceof Int32Array || newPayload instanceof Uint32Array || newPayload instanceof Float32Array || newPayload instanceof Float64Array) {
+            payload = newPayload;
+        } else {
+            throw (format(ERROR.INVALID_ARGUMENT, [newPayload, "newPayload"]));
+        }
+
+        this._getPayloadString = function() {
+            if (typeof payload === "string")
+                return payload;
+            else
+                return parseUTF8(payload, 0, payload.length);
+        };
+
+        this._getPayloadBytes = function() {
+            if (typeof payload === "string") {
+                var buffer = new ArrayBuffer(UTF8Length(payload));
+                var byteStream = new Uint8Array(buffer);
+                stringToUTF8(payload, byteStream, 0);
+
+                return byteStream;
+            } else {
+                return payload;
+            };
+        };
+
+        var destinationName = undefined;
+        this._getDestinationName = function() {
+            return destinationName;
+        };
+        this._setDestinationName = function(newDestinationName) {
+            if (typeof newDestinationName === "string")
+                destinationName = newDestinationName;
+            else
+                throw new Error(format(ERROR.INVALID_ARGUMENT, [newDestinationName, "newDestinationName"]));
+        };
+
+        var qos = 0;
+        this._getQos = function() {
+            return qos;
+        };
+        this._setQos = function(newQos) {
+            if (newQos === 0 || newQos === 1 || newQos === 2)
+                qos = newQos;
+            else
+                throw new Error("Invalid argument:" + newQos);
+        };
+
+        var retained = false;
+        this._getRetained = function() {
+            return retained;
+        };
+        this._setRetained = function(newRetained) {
+            if (typeof newRetained === "boolean")
+                retained = newRetained;
+            else
+                throw new Error(format(ERROR.INVALID_ARGUMENT, [newRetained, "newRetained"]));
+        };
+
+        var duplicate = false;
+        this._getDuplicate = function() {
+            return duplicate;
+        };
+        this._setDuplicate = function(newDuplicate) {
+            duplicate = newDuplicate;
+        };
+    };
+
+    Message.prototype = {
+        get payloadString() {
+            return this._getPayloadString();
+        },
+        get payloadBytes() {
+            return this._getPayloadBytes();
+        },
+
+        get destinationName() {
+            return this._getDestinationName();
+        },
+        set destinationName(newDestinationName) {
+            this._setDestinationName(newDestinationName);
+        },
+
+        get qos() {
+            return this._getQos();
+        },
+        set qos(newQos) {
+            this._setQos(newQos);
+        },
+
+        get retained() {
+            return this._getRetained();
+        },
+        set retained(newRetained) {
+            this._setRetained(newRetained);
+        },
+
+        get duplicate() {
+            return this._getDuplicate();
+        },
+        set duplicate(newDuplicate) {
+            this._setDuplicate(newDuplicate);
+        }
+    };
+
+    // Module contents.
+    return {
+        Client: Client,
+        Message: Message
+    };
+})(window);
\ No newline at end of file
diff --git a/static/demo/js/services.js b/static/demo/js/services.js
new file mode 100644
index 0000000000000000000000000000000000000000..20fc91ea6d66316ebf52a7a6184d87cc6045c201
--- /dev/null
+++ b/static/demo/js/services.js
@@ -0,0 +1,44 @@
+'use strict';
+
+/* Services */
+
+angular.module('greenhouseServices', []).
+factory('restService', function($http){
+	var services = {}
+
+	services.getDeviceData = function(deviceId, successHandler, errorHandler){
+		$http.get(server_url+"/"+deviceId+"/data")
+		.success(function (data){
+			
+			var response = {
+				temperature: {},
+				luminosity: {},
+				humidity: {},
+				open: {}
+			};
+
+			response.temperature.value = data["greenhouse.data.temperature"][0].value[0];
+			response.temperature.timestamp = data["greenhouse.data.temperature"][0].timestamp;
+
+			response.luminosity.value = parseFloat(data["greenhouse.data.luminosity"][0].value[0]).toFixed(1);
+			response.luminosity.timestamp = data["greenhouse.data.luminosity"][0].timestamp;
+
+			response.humidity.value = parseFloat(data["greenhouse.data.humidity"][0].value[0]).toFixed(1);
+			response.humidity.timestamp = data["greenhouse.data.humidity"][0].timestamp;
+
+			response.open.value=(data["greenhouse.data.open"][0].value[0])?"CLOSE":"OPEN";
+			response.open.timestamp = data["greenhouse.data.open"][0].timestamp;
+
+			successHandler(response);
+		})
+		.error(errorHandler);
+	};
+
+	services.sendData = function(deviceId, command, successHandler, errorHandler){
+		$http.post(server_url+"/"+deviceId+"/data", command)
+		.success(successHandler)
+		.error(errorHandler);
+	};
+
+	return services
+});
diff --git a/static/demo/partials/device-detail.html b/static/demo/partials/device-detail.html
new file mode 100644
index 0000000000000000000000000000000000000000..f63c0c7cec21b8b4ce2e951224df80e90ca4b93e
--- /dev/null
+++ b/static/demo/partials/device-detail.html
@@ -0,0 +1,114 @@
+<div class="well">
+	<div class="page-header">
+		<h1>
+			Live Eclipse IoT demonstrator
+			<small>
+				A greenhouse that reports its status and can be controlled remotely.
+			</small>
+		</h1>
+	</div>
+
+	<div class="lead">
+		<p>
+			The demonstration below features a greenhouse connected to iot.eclipse.org's public <a href="/sandbox.html">MQTT broker</a> via a Raspberry Pi gateway running <a href="https://eclipse.org/kura" target="_blank">Eclipse Kura</a>.
+		</p>
+		<p>
+			The user interface is using MQTT over WebSockets for displaying sensors data available on the broker, as well as to send a command for switching the LED on/off.
+		</p>
+
+	</div>
+</div>
+
+<div class="row">
+
+	<div class="span6 offset1">
+		<ul class="thumbnails">
+			<li class="span3">
+				<div style="text-align: center">
+					<embed src="img/noun_project_2023.svg" type="image/svg+xml"/>
+					<h1>
+						{{temperature.value}}
+						<small>°C</small>
+					</h1>
+					<p>
+						<small>{{temperature.timestamp}}</small>
+					</p>
+				</div>
+			</li>
+			<li class="span3">
+				<div style="text-align: center">
+					<img src="img/noun_project_122_{{light.value}}.svg" type="image/svg+xml"/>
+					<h1>
+						<button class="btn btn-large" ng-click="switchLight();" onclick="_gaq.push(['_trackPageview', '/demo/switchLight']);"> <strong>TOGGLE</strong>
+						</button>
+					</h1>
+					<p>
+						<small>&nbsp;</small>
+					</p>
+				</div>
+			</li>
+			<li class="span6">
+				<div style="text-align: center">
+					<p>
+						<a twitter data-lang="en" data-count='horizontal' data-url='http://iot.eclipse.org/demo' data-via='EclipseIoT' data-size="large" data-text="Check out this cool #IoT live demo of a connected greenhouse! #mqtt #kura" ></a>
+					</p>
+				</div>
+			</li>
+		</ul>
+	</div>
+	<div class="span4">
+		<ul class="thumbnails">
+			<li>
+				<div class="thumbnail" style="text-align: center">
+					<img src="{{webcam.src}}" width="320" height="240"/>
+					<h1>Live stream</h1>
+					<p>
+						<small>{{webcam.timestamp}}</small>
+					</p>
+				</div>
+			</li>
+		</ul>
+	</div>
+
+<!-- 	<div class="span6">
+		<div class="well">
+			<p class="lead">Same demo, improved by other open-source projects</p>
+			<table class="table">
+				<tr>
+					<td style="font-size:4em; width:1em;"> <i class="icon-certificate"></i>
+					</td>
+					<td>Coming soon!</td>
+				</tr>
+ 				<tr>
+					<td style="font-size:4em; width:1em;"> <i class="icon-certificate"></i>
+					</td>
+					<td>Demo2</td>
+				</tr>
+				<tr>
+					<td style="font-size:4em; width:1em;">
+						<i class="icon-certificate"></i>
+					</td>
+					<td>Demo3</td>
+				</tr> 
+			</table>
+		</div>
+	</div>
+
+	<div class="span6">
+		<div class="well">
+			<p class="lead">Same demo, running on commercial M2M platforms</p>
+			<table class="table">
+				<tr>
+					<td style="font-size:4em; width:1em;">
+						<small>
+							<a href="http://airvantage.github.io/devkit/app" target="_blank">
+								<img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=843&amp;size=small" style="padding:5px;" alt="Sierra Wireless"></a>
+						</small>
+					</td>
+					<td><a href="http://airvantage.github.io/devkit/app" target="_blank">Example</a> running on AirVantage M2M Cloud Platform. You can also order an open developer kit from <a href="http://airvantage.github.io/devkit" target="_blank">http://airvantage.github.io/devkit</a></td>
+				</tr>
+			</table>
+		</div>
+	</div> -->
+
+</div>
diff --git a/static/documents/2014-04-08-MQTT-Interop-test-day-report.html b/static/documents/2014-04-08-MQTT-Interop-test-day-report.html
new file mode 100644
index 0000000000000000000000000000000000000000..d1197a42caee8ef67104dcb4b412de0bf8246717
--- /dev/null
+++ b/static/documents/2014-04-08-MQTT-Interop-test-day-report.html
@@ -0,0 +1,205 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>iot.eclipse.org &mdash; Protocols</title>
+    <meta name="description" content="iot.eclipse.org is also a window on the protocols of choice for IoT and M2M solutions development: MQTT, CoAP, Lightweight M2M, ETSI M2M  ...">
+    <meta name="author" content="Eclipse.org">
+    <link rel="author" href="humans.txt" />
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+    <!-- Custom Fonts -->
+    <link href='http://fonts.googleapis.com/css?family=Lato:300,400' rel='stylesheet' type='text/css'>
+    <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+
+    <!-- Le styles -->
+    <link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
+    <link href="/css/theme.css" rel="stylesheet">
+    <link href="/css/bootstrap/bootstrap-responsive.min.css" rel="stylesheet">
+
+    <script type="text/javascript">
+    var _gaq = _gaq || [];
+    _gaq.push(['_setAccount', 'UA-594061-11']);
+    _gaq.push(['_trackPageview']);
+
+    (function() {
+        var ga = document.createElement('script');
+        ga.type = 'text/javascript';
+        ga.async = true;
+        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(ga, s);
+    })();
+    </script>
+
+</head>
+
+<body>
+
+    <div class="navbar navbar-fixed-top">
+        <div class="navbar-inner">
+            <div class="container">
+                <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span>
+                </a> <a class="brand" href="/index.html">iot.eclipse.org</a>
+                <div class="nav-collapse">
+                    <ul class="nav">
+                        <li><a href="/frameworks.html">Services &amp; Frameworks</a>
+                        </li>
+                        <li><a href="/protocols.html">Protocols</a>
+                        </li>
+                        <li><a href="/tools.html">Tools</a>
+                        </li>
+                        <li><a href="/community.html">Community</a>
+                        </li>
+                        <li><a href="/ecosystem.html">Ecosystem</a>
+                        </li>
+                        <li><a href="/demo">Live demo</a>
+                        </li>
+                        <li class="divider-vertical"></li>
+                    </ul>
+                    <ul class="nav pull-right">
+                        <li>
+                            <div style="padding-top: 20px;">
+                                <div class="g-plusone" data-href="http://iot.eclipse.org/"></div>
+                            </div>
+                        </li>
+                    </ul>
+                </div>
+                <!--/.nav-collapse -->
+            </div>
+        </div>
+    </div>
+
+    <!-- Place this tag after the last +1 button tag. -->
+    <script type="text/javascript">
+    (function() {
+        var po = document.createElement('script');
+        po.type = 'text/javascript';
+        po.async = true;
+        po.src = 'https://apis.google.com/js/plusone.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(po, s);
+    })();
+    </script>
+    <div class="container">
+        <div class="well">
+            <div class="page-header">
+                <h1>
+				MQTT Interop Test Day Report 
+				<small>March 17, 2014<br/>Burlingame, California</small>
+				</h1> Hosted by: Eclipse IoT Working Group, <a href="http://iot.eclipse.org/">iot.eclipse.org</a>
+                <br/> Report prepared by: Ian Skerrett, Eclipse Foundation
+            </div>
+            <div class="lead">
+                <p>The first MQTT Interop Test Day was held March 17, 2014 in Burlingame, CA. A total of 15 different products and organizations participated in the event, resulting in 65 different test pairing between the different products.</p>
+                <p>The purpose of the first test day was to provide feedback and validation on the proposed OASIS MQTT specification and to provide initial feedback to the participants on their implementation of the MQTT 3.1.1 specification. Overall, the participants declared the event to be a success.</p>
+            </div>
+        </div>
+        <h2>Introduction to MQTT</h2>
+        <p>MQTT is a messaging protocol that has been developed specifically for the Internet of Things. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios.</p>
+        <p>MQTT was initially developed by IBM and Eurotech. In November 2012, IBM announced it would contribute the client implementation of MQTT to the Eclipse Paho open source project. In March 2013, IBM, Eurotech and others began the standardization process of MQTT within the OASIS standards group. The OASIS Technical Committee has released a <a href="https://www.oasis-open.org/committees/documents.php">draft specification</a> of MQTT 3.1.1. The completion of the standardization process is expected in the Fall 2014, resulting in the MQTT 3.1.1 specification being published. </p>
+        <h2>Participants in the Test Day</h2>
+        <p>The following companies and products participated in the testing day:</p>
+        <ul>
+            <li>Eurotech</li>
+            <li>2lemetry Platform</li>
+            <li>Sierra Wireless AirVantage</li>
+            <li>ClearBlade</li>
+            <li>HiveMQ</li>
+            <li>WSO2 ESB and WSO2 Message Broker</li>
+            <li>JBoss A-MQ, Apache ActiveMQ, Apache Camel</li>
+            <li>Litmus Automation Loop</li>
+            <li>Xively</li>
+            <li>IBM Node-RED</li>
+            <li>Software AG Universal Messaging</li>
+            <li>Eclipse Kura</li>
+            <li>Eclipse Paho</li>
+            <li>IBM MessageSight</li>
+            <li>RabbitMQ</li>
+            <li>OpenPicus</li>
+        </ul>
+        <h2>Testing Approach</h2>
+        <p>Each product was identified as being a MQTT client or MQTT broker. A schedule was developed to allow for testing between the different MQTT clients and brokers. Each testing pair were allocated approximately 30 minutes to complete the test. Most products participated in at least 5-6 test pairings.</p>
+        <p>Each participating product were provided advanced access to test clients and test brokers. The code for this test clients and brokers is available at <a href="https://wiki.eclipse.org/Interop_Testing_Plan">https://wiki.eclipse.org/Interop_Testing_Plan</a>
+        </p>
+        <h2>Test Plan</h2>
+        <p>Each test pairing were asked to complete the following tests:</p>
+        <ol>
+            <li>Connect to an MQTT server using the MQTT 3.1.1 standard (connect packet has protocol name MQTT and version 4)</li>
+            <li>Send and receive messages with all three QoS levels (0, 1 and 2).</li>
+            <li>Receive messages queued up for a non-cleansession client on reconnect. Each QoS should be sent and received. Queueing up QoS 0 messages is optional.</li>
+            <li>Set and receive retained messages at each QoS. Retained messages are set by publishing with the retained flag set. They are received by subscribing to a matching topic filter.</li>
+            <li>Unsetting retained messages. Sending publish with zero length payload and retained flag should remove any existing retained message for that topic.</li>
+            <li>Setting and receiving will messages. Ending the session (for example by closing the socket) without sending a disconnect should cause a will message to be sent by the server.</li>
+            <li>More than one subscription matching a publication topic. A server may send one message per matching subscription each at the QoS corresponding to the subscription, or one message for the publication at the highest QoS.</li>
+            <li>Keepalive processing. When no other messages are being sent/received, PINGs should be. For example, set the keepalive interval to 10 seconds, connect and send no messages. The session should be kept alive by PINGs from the client.</li>
+        </ol>
+        <p>Optional Tests</p>
+        <ol>
+            <li>0-length clientid. The server may accept 0-length clientids. If so, the connect must be with cleansession True. Connecting with cleansession=False should be rejected.</li>
+            <li>$topics. Subscribing to a wildcard such as # should not return any topics starting with $. This is to enable $ topics to be used for server specific purposes.</li>
+            <li>Subscribe failure. Subscribe may now return 0x80 if it has failed for any reason. That reason would be server specific.</li>
+        </ol>
+        <h2>Test Results</h2>
+        <p>Overall, 65 test pairings were reported. A total of 55% of these test pairings were considered successful. This is considered a good result considering the maturity of the specification, the variety of implementations of the 3.1.1 specification and the fact this was the first time for doing the interoperability testing.</p>
+        <p>Detailed test results will not be reported since the purpose of the session was to not certify an implementation. The findings of each test pairing will be used by each participant to ensure future conformance to the OASIS MQTT specification. Overall, the results will be used to validate the MQTT specification and standardization.</p>
+
+        <h2>Quotes from Participants</h2>
+        <h3><i class="icon-arrow-right"></i> 2lemetry</h3>
+        <p>&quot;As a company that relies on interoperability with MQTT, the Eclipse Interop Test Day provided a great way to validate our services with other clients,&quot; said Chris Chiappone, CTO of 2lemetry. &quot;Eclipse also did a great job creating a conformance test suite prior to the event, which helped us successfully pre-test client and server compliance.”</p>
+
+        <h3><i class="icon-arrow-right"></i> Xively</h3>
+        <p>“We believe that standardization and interoperability are critical to accelerating innovation in today’s early-stage Internet of Things market,” said Mario Finocchiaro, Director of Xively Business Development for LogMeIn. “The inaugural MQTT interoperability event proved to be a great opportunity for collaboration between emerging IoT leaders, while showing promise for encouraging and empowering broader commercial IoT adoption. Congratulations to Eclipse for bringing it all together.”</p>
+
+        <h3><i class="icon-arrow-right"></i> ClearBlade</h3>
+        <p>“The MQTT Interop Day was extremely valuable in bringing together both specification and implementation leaders, and reconfirming our objectives as a unified community. The ClearBlade enterprise platform was built on the foundation and belief that strong open standards and interoperation create enterprise value, and that is achieved with this level of industry collaboration.” </p>
+
+        <h3><i class="icon-arrow-right"></i> Red Hat</h3>
+        <p>&quot;The Internet-of-Things (IoT) will require open standards to make it a reality. That is why Red Hat JBoss A-MQ, an open source enterprise message broker, supports open protocol standards such as AMQP 1.0 and MQTT. Red Hat has demonstrated its commitment to the MQTT standard by successfully taking part in the MQTT Interoperability Test Day at EclipseCon this year. JBoss A-MQ supports MQTT across TCP/TLS and WebSockets, and allows for an MQTT client to interoperate with other clients connected to JBoss A-MQ, regardless of the protocol that client is using.” - Rob Davies, director of software engineering, Red Hat</p>
+
+        <h3><i class="icon-arrow-right"></i> Eurotech</h3>
+        <p>“It has been really exciting to see so many companies investing in high quality MQTT implementations. The interoperability test has been a huge success and is a testament to how quickly the community is growing around this IoT protocol. We’re looking forward to completing the MQTT standardization process within the OASIS standards body and continuing the comprehensive activities within the IoT Working Group of the Eclipse Foundation. With Eurotech there at the very beginning of the protocol definition, it’s gratifying to see acceptance building so quickly now as MQTT helps to enable the Internet of Things.”</p>
+
+        <h3><i class="icon-arrow-right"></i> IBM</h3>
+        <p>"The mix of MQTT technologies represented, ranging from open source to commercial, and the successes achieved at the event demonstrate the vibrancy of the MQTT ecosystem and means we will be well positioned as we move toward a ratified standard. Interoperability of technology in this space is vital for the Internet of Things ecosystem." - Dave Locke, IBM senior inventor and co-lead of the Eclipse Paho project.</p>
+
+        <h2>Conclusion</h2>
+        <p>The MQTT Interop Test Day was considered an overall success in achieving the goals and purpose. The consensus of the group was to run a future Test Day later in 2014 to validate the final MQTT 3.1.1 specification.</p>
+
+        <hr>
+        <footer>
+            <ul class="nav nav-pills">
+                <li><a href="index.html">Home</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/" target="_blank">Legal</a>
+                </li>
+                <li><a href="contact.html" data-toggle="modal" data-target="#contact-modal">Contact Us</a>
+                </li>
+                <li class="pull-right">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</li>
+            </ul>
+        </footer>
+        <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;"></div>
+    </div>
+    <!-- /container -->
+
+    <!-- JS is at the end of the document so the pages load faster -->
+    <script src="js/jquery.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/index.js"></script>
+
+
+</body>
+
+</html>
diff --git a/static/documents/2014-04-08-MQTT-Interop-test-day-report.pdf b/static/documents/2014-04-08-MQTT-Interop-test-day-report.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..bc1f776a8bc8e8a28b49c3c46fd6b4afb4ff1f49
Binary files /dev/null and b/static/documents/2014-04-08-MQTT-Interop-test-day-report.pdf differ
diff --git a/static/ecosystem.html b/static/ecosystem.html
new file mode 100755
index 0000000000000000000000000000000000000000..c5873371f70a12ecd4515de5835dbcae8d4ad85e
--- /dev/null
+++ b/static/ecosystem.html
@@ -0,0 +1,475 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>iot.eclipse.org &mdash; Ecosystem</title>
+  <meta name="description" content="iot.eclipse.org is all about getting the M2M developers involved in what is happening in the different Eclipse projects">
+  <meta name="author" content="Eclipse.org">
+  <link rel="author" href="humans.txt" />
+
+  <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+  <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+  <!-- Custom Fonts -->
+  <link href='http://fonts.googleapis.com/css?family=Lato:300,400' rel='stylesheet' type='text/css'>
+  <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+
+  <!-- Le styles -->
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+</head>
+
+<body>
+
+  <header>
+
+
+    <nav class="navbar navbar-default">
+      <div class="container">
+        <!-- Brand and toggle get grouped for better mobile display -->
+        <div class="navbar-header">
+          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+            <span class="sr-only">Toggle navigation</span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <a class="navbar-brand" href="/">
+            <img alt="Brand" src="/assets/images/iot-logo.png">
+          </a>
+        </div>
+
+        <!-- Collect the nav links, forms, and other content for toggling -->
+        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+          <ul class="nav navbar-nav navbar-right">
+            <li><a href="/getting-started">Getting Started</a>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="/standards">Standards</a>
+                </li>
+                <li><a href="/frameworks">Services &amp; Frameworks</a>
+                </li>
+                <li><a href="/projects">All the projects</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="#">Resources</a>
+                </li>
+                <li><a href="#">News</a>
+                </li>
+                <li><a href="#">Events</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="/ecosystem">Working Group</a>
+            </li>
+            <li style="  padding-top: 15px; padding-left: 8px;">
+              <div class="g-plusone" data-size="medium" data-href="http://iot.eclipse.org"></div>
+            </li>
+          </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+      </div>
+      <!-- /.container-fluid -->
+    </nav>
+
+
+  </header>
+
+
+  <!-- Place this tag after the last +1 button tag. -->
+  <script type="text/javascript">
+  (function() {
+    var po = document.createElement('script');
+    po.type = 'text/javascript';
+    po.async = true;
+    po.src = 'https://apis.google.com/js/plusone.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(po, s);
+  })();
+  </script>
+
+  <main class="main">
+
+    <div class="well">
+
+      <div class="container">
+
+        <h1>
+          About Us
+        </h1>
+
+        <div>
+          <p class="lead">Eclipse IoT Working Group is a collaboration between organizations and individuals who share the goal of creating an open IoT. 
+          The collaboration focuses on the development, promotion and adoption of open source IoT technology. Many of our members provide a wide range of projects and services built on top of Eclipse IoT technology.</p>
+        </div>
+      </div>
+    </div>
+
+    <section class="first">
+      <div class="container">
+
+        <div class="row">
+          <div class="col-md-6">
+            <h1 class="purple">Membership benefits</h1>
+
+            <p>
+              <ul>
+                <li>Lorem ipsum Non cupidatat anim eiusmod quis mollit.</li>
+                <li>Lorem ipsum Sunt et laborum.</li>
+                <li>Lorem ipsum Consequat irure velit sunt.</li>
+              </ul>
+            </p>
+
+          </div>
+
+          <div class="col-md-6">
+            <h1 class="purple">Contact us</h1>
+
+            <p>Lorem ipsum Commodo consectetur aute ullamco laboris mollit laboris eu sunt nulla esse eiusmod officia ad Duis cupidatat aliquip dolor amet commodo sit irure adipisicing nulla qui elit.</p>
+
+          </div>
+
+
+        </div>
+
+
+    </section>
+
+    <section class="second">
+      <div class="container">
+
+        <h1 class="purple">Steering committee members</h1>
+
+        <div id="sc-members">
+          <!-- Eurotech -->
+          <div class="row members-info" id="member-eurotech">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=968">
+                <img src="images/ecosystem/logo-eurotech.png" alt="Eurotech" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <h4>Eurotech</h4>
+                <p>Eurotech believes in open, standards-based systems to deliver on the promise of the Internet of Things, and works with world-class partners and organizations to evangelize that strategy, including as a founding member of the IoT Working Group in the Eclipse Foundation and OASIS MQTT Technical Committee. Eurotech has contributed the Kura project to the Eclipse Foundation and actively participates in many associated projects and activities.</p>
+
+                <p>Eurotech solutions combine software, application framework, hardware, and device cloud services that drive business success. A global leader in connecting distributed devices that make up the Internet of Things, Eurotech collaborates with progressive customers, partners, and integrators to bring rugged, reliable and cost effective device and data management solutions to market. Combining technology excellence with domain expertise allows Eurotech to meet the needs of key market segments including healthcare, security, transportation, energy, and industrial. </p>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.eurotech.com/en/products/software+services/everyware+software+framework/what+esf+is" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="https://www.youtube.com/watch?v=PXlDJMK7yqg" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- Sierra Wireless -->
+          <div class="row members-info" id="member-sierra">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=843">
+                <img src="images/ecosystem/logo-sierra.png" alt="Sierra Wireless" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <h4>Sierra Wireless</h4>
+                <p>Sierra Wireless is the global leader in machine-to-machine (M2M) devices and cloud services, delivering intelligent wireless solutions that simplify the connected world. We offer the industry's most comprehensive portfolio of 2G, 3G and 4G embedded modules and gateways, seamlessly integrated with our secure M2M cloud services.</p>
+                <p>Sierra Wireless is deeply involved in the Eclipse IoT community: we founded the IoT Working Group, and are contributing to several projects including Wakaama, Californium, LDT,… The Eclipse IoT technologies are also used in our AirVantage M2M Cloud.</p>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.sierrawireless.com/productsandservices/AirVantage_M2M_Cloud.aspx" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="https://www.youtube.com/watch?v=_rizLAUgLSA" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+        </div>
+
+        <h1 class="purple" style="margin-top: 2em;">Participating members</h1>
+
+        <div id="other-members">
+
+          <!-- 2lemetry -->
+          <div class="row members-info" id="member-2lemetry">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=1100">
+                <img src="images/ecosystem/logo-2lemetry.png" alt="2lemetry" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <h4>2lemetry</h4>
+                <p>2lemetry is an IoT platform and solutions company that powers the connected enterprise, tying people, processes, data and devices together—transforming raw data into real-time actionable intelligence.</p>
+
+                <p>2lemetry's ThingFabric platform acts as an IoT version of Enterprise Application Integration (EAI) middleware solutions, providing device connectivity at scale, cross-communication, data brokering and storage. We also help companies make sense of the captured data by offering actionable data intelligence through predictive computational models and a configurable rules engine.
+                  <br/> The ThingFabric platform has a unique protocol-agnostic architecture that enables native support of multiple protocols (like MQTT, CoAP, STOMP, and M3DA), even allowing the customer to upload their own homegrown, proprietary or legacy protocols.</p>
+
+                <p>2lemetry actively contributes to the Paho project around objective-c and MQTT.</p>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://2lemetry.com" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="https://vimeo.com/channels/521569" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- Actuate -->
+          <div class="row members-info" id="member-actuate">
+            <div class="col-md-4 mb-logo">
+              <a href="#">
+                <img src="images/ecosystem/logo-actuate.png" alt="Actuate" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <h4>Actuate</h4>
+                <p> In 2004, Actuate co-founded -- and continues as its sole sponsor – the top-level Eclipse BIRT Project – an open source, Java-based IDE. BIRT is used as a workbench by more than 3.5 million developers around the globe, to reduce development time and significantly improve the efficacy of their customer-facing applications. BIRT has been downloaded over 13 million times since its inception. Please visit developer.actuate.com.</p>
+
+                <p>On the commercial side, Actuate provides BIRT Designer Pro™ and BIRT iHub™ deployment software – to developers and IT departments of mid-size to global-brand enterprises, as well as to ISVs/OEMs. These organizations use BIRT to build scalable, secure solutions that provide valuable insights from data, and improve brand loyalty. These customers have delivered personalized analytics and insights to more than 200 million of their own customers, partners and employees.</p>
+
+                <p>Actuate also offers BIRT Analytics™ self-service, predictive analytics software for business analysts and marketers to enhance customer engagement using Big Data. The Actuate Customer Communications Suite™ empowers organizations to easily transform, process, personalize, archive and deliver high volume content and individualized correspondence. The Actuate PDF Accessibility Appliance™ is used to convert PDFs into documents that vision-impaired customers can “read.” Actuate is headquartered in Silicon Valley with more than 5,000 enterprise customers in financial services, technology and government.</p>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.actuate.com" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="http://blogs.actuate.com/creating-an-iot-dashboard-with-birt/" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- Bitreactive -->
+          <div class="row members-info" id="member-bitreactive">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=1103">
+                <img src="images/ecosystem/logo-bitreactive.png" alt="Bitreactive" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <h4>Bitreactive</h4>
+                <p>Bitreactive makes Reactive Blocks, a tool designed to accelerate and simplify M2M and IoT software development. Its benefits are especially well suited for applications that run autonomously on gateways. Functionality that is often used is provided by dedicated building blocks, for instance for protocols like MQTT or Modbus, access to data collection APIs or processing and buffering of data. The tool checks if applications work correctly with regard to their behavior, and detects a range of errors automatically that are hard to find by traditional testing.</p>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.bitreactive.com/" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="http://www.bitreactive.com/technology/" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- Bosch -->
+          <div class="row members-info" id="member-bosch">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=979">
+                <img src="images/ecosystem/logo-bosch.png" alt="Bosch" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <h4>Bosch Software Innovations GmbH</h4>
+                <p>Bosch Software Innovations GmbH, the Bosch Group's software and systems house, designs, develops, and operates innovative software and system solutions that help our customers around the world both in the Internet of Things and in the traditional enterprise environment. We place particular focus on the topics of mobility, energy, manufacturing, and smart home.
+                  <br/> The focus of the Eclipse Vorto project, which has been proposed by Bosch Software Innovations, is the standardization of so called information models. These information models are abstract descriptions of real world devices.
+                  <br/> In addition Bosch Software innovations is a member of the IoT Working Group and is a contributor to various open source projects (e.g. Californium, Wakaama) in the IoT context.</p>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.bosch.com/" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li>&nbsp;</li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- dc-square -->
+          <div class="row members-info" id="member-dcsquare">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=1122">
+                <img src="images/ecosystem/logo-dcsquare.png" width="150" alt="dc-square" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <h4>dc-square</h4>
+                <p>dc-square is a company based in Southern Germany building software solutions for the Internet of Things. Our product HiveMQ is a MQTT broker for the enterprise, which makes it possible to connect thousands and millions of devices over wired or wireless networks with very efficient bandwidth usage and push technology. Our focus is on providing IoT building blocks for the enterprise and advice on, consult on or implement IoT solutions for companies around them. Therefore HiveMQ is build from the ground up with security, scalability and extensibility in mind. HiveMQ has an open plugin system for customizations of general behavior and permissions as well as the possibility to cluster and bridge with other instances for high availability and high scalability scenarios. All our solutions are perfectly suitable for running in the Cloud (Amazon, Azure) as well as on own infrastructure.</p>
+
+                <p>dc-square is very engaged in promoting and supporting open IoT technologies at national and international conferences and magazines with talks and articles about Eclipse IoT technologies.</p>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.hivemq.com/" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="http://www.hivemq.com/demos/websocket-client/" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+
+          <!-- dc-square -->
+          <div class="row members-info" id="member-gadgetkeeper">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=1152">
+                <img src="images/ecosystem/logo-gadgetkeeper.png" width="200" alt="GadgetKeeper" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <h4>GadgetKeeper</h4>
+                <p>GadgetKeeper is an Internet Of Things platform allowing the rapid creation if IoT solutions to connect your sensors, devices, equipment ("Things") with people and systems.</p>
+
+                <p>GadgetKeeper's technology eliminates complexity by simplifying and standardizing the way information is managed and exchanged so that physical and virtual assets and services can work together as one integrated system.</p>
+
+                <p>GadgetKeeper provides you with foundational IoT building blocks (compete object model for things/services, templates and versioning, reach data types, programmable business logic) and services (data storage, time series, multiple communication protocols, integration with external services, life-cycle management and elastic scalability) allowing you to focus on product innovation rather than on enabling infrastructure.</p>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://gadgetkeeper.com" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="http://gadgetkeeper.com/demo" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+
+          <!-- IBH Systems -->
+          <div class="row members-info" id="member-ibh">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=1086">
+                <img src="images/ecosystem/logo-ibh.png" alt="IBH Systems" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <h4>IBH Systems</h4>
+                <p>IBH SYSTEMS GmbH is the lead developer of the Eclipse SCADA system, a true open source SCADA platform.</p>
+                <p>Eclipse SCADA offers a fully featured SCADA platform from the integration of field devices, over middleware functionality, to HMI components. It provides a communication abstraction layer, monitoring and archival services, a visual interface and a sophisticated system to configure complex SCADA installations. As the lead developer, IBH SYSTEMS GmbH offers consulting, custom development and integration for Eclipse SCADA.</p>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://ibh-systems.com/" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="https://www.youtube.com/watch?v=UYlmzuwBV30" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- openHAB -->
+          <div class="row members-info" id="member-openhab">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=1120">
+                <img src="images/ecosystem/logo-openhab.png" alt="openHAB" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <h4>openHAB</h4>
+                <p>openHAB UG (haftungsbeschränkt) is the company behind the open-source home automation solution openHAB and believes that an open-source stack is the only right answer for home gateways. openHAB UG therefore initiated the Eclipse SmartHome project and is the lead developer behind it.</p>
+
+                <p>The Eclipse SmartHome project is a framework that allows building smart home solutions that have a strong focus on heterogeneous environments, i.e. solutions that deal with the integration of different protocols or standards. Its purpose is to provide a uniform access to devices and information and to facilitate different kinds of interactions with them.</p>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.openhab.org/" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="https://www.youtube.com/watch?v=ZCOQhe5KiD4" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+        </div>
+      </div>
+    </section>
+
+    <footer>
+
+      <div class="container">
+        <div class="row">
+          <div class="col-md-6">
+            <nav>
+              <ul class="list-inline menu">
+                <li><a href="#">Technology</a>
+                </li>
+                <li><a href="#">Community</a>
+                </li>
+                <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                  <ul class="dropdown-menu">
+                    <li><a href="#">Resources</a>
+                    </li>
+                    <li><a href="#">News</a>
+                    </li>
+                    <li><a href="#">Events</a>
+                    </li>
+                  </ul>
+                  <li><a href="/ecosystem">Members</a>
+                  </li>
+                  <li><a href="#">Getting Started</a>
+                  </li>
+              </ul>
+            </nav>
+            <div class="socials">
+              <a href="#" class="social-facebook">&nbsp;</a>
+              <a href="#" class="social-twitter">&nbsp;</a>
+              <a href="#" class="social-youtube">&nbsp;</a>
+              <a href="#" class="social-share">&nbsp;</a>
+            </div>
+          </div>
+          <div class="col-md-6">
+            <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+          </div>
+        </div>
+      </div>
+
+
+    </footer>
+
+    <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;">
+    </div>
+
+    </div>
+    <!-- /container -->
+
+    <!-- JS is at the end of the document so the pages load faster -->
+    <script src="js/jquery.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/ecosystem.min.js"></script>
+    <script src="js/shuffle.js"></script>
+
+    <script type="text/javascript">
+    $(document).ready(function() {
+      // Shuffle SC members
+      $('#sc-members').shuffle();
+
+      // Shuffle other members
+      $('#other-members').shuffle();
+    });
+    </script>
+
+</body>
+
+</html>
diff --git a/static/frameworks.html b/static/frameworks.html
new file mode 100644
index 0000000000000000000000000000000000000000..b08e92d3a8de9cf7fb2b91574a9691501fbb1051
--- /dev/null
+++ b/static/frameworks.html
@@ -0,0 +1,224 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>iot.eclipse.org &mdash; Services &amp; Frameworks</title>
+  <meta name="description" content="iot.eclipse.org gives you information about the services and frameworks being developed for easing IoT and M2M development">
+  <meta name="author" content="Eclipse.org">
+  <link rel="author" href="humans.txt" />
+
+  <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+  <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+  <!-- Le styles -->
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+</head>
+
+<body>
+
+  <header>
+
+
+    <nav class="navbar navbar-default">
+      <div class="container">
+        <!-- Brand and toggle get grouped for better mobile display -->
+        <div class="navbar-header">
+          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+            <span class="sr-only">Toggle navigation</span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <a class="navbar-brand" href="/">
+            <img alt="Brand" src="/assets/images/iot-logo.png">
+          </a>
+        </div>
+
+        <!-- Collect the nav links, forms, and other content for toggling -->
+        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+          <ul class="nav navbar-nav navbar-right">
+            <li><a href="/getting-started">Getting Started</a>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="/standards">Standards</a>
+                </li>
+                <li><a href="/frameworks">Services &amp; Frameworks</a>
+                </li>
+                <li><a href="/projects">All the projects</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="#">Resources</a>
+                </li>
+                <li><a href="#">News</a>
+                </li>
+                <li><a href="#">Events</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="/ecosystem">Working Group</a>
+            </li>
+            <li style="  padding-top: 15px; padding-left: 8px;">
+              <div class="g-plusone" data-size="medium" data-href="http://iot.eclipse.org"></div>
+            </li>
+          </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+      </div>
+      <!-- /.container-fluid -->
+    </nav>
+
+  </header>
+
+  <main class="main">
+
+    <div class="well">
+
+      <div class="container">
+
+        <h1>IoT Services &amp; Frameworks</h1>
+
+        <p class="lead">The IoT Working Group fosters the creation of extensible services and frameworks that enable IoT applications on top of open APIs.</p>
+
+      </div>
+
+    </div>
+
+
+    <section class="first">
+      <div class="container">
+
+        <h1 id="frameworks-vision" class="purple">Vision</h1>
+
+
+        <div class="row">
+          <div class="col-md-6">
+            <p>A vast majority of today's IoT solutions are designed in an ad hoc manner. Depending on the business domain and on the targeted platform (OS, H/W capabilities, &hellip;) very different and often incompatible architectures are implemented.</p>
+            <p>We want to provide a set of services and frameworks that application developers can use for building M2M and IoT applications. These services will enable features such as device management, wired/wireless communication, vertical solutions like home automation, &hellip;</p>
+          </div>
+          <p class="col-md-6">
+            <img src="images/frameworks/frameworks-vision.png" class="img-responsive">
+          </p>
+        </div>
+      </div>
+    </section>
+
+
+
+    <section class="second">
+      <div class="container">
+
+        <h1 id="Frameworks+for+M2M+Gateways" class="purple">Frameworks for IoT Gateways</h1>
+        <p>IoT Gateways help manage the interaction between sensors and actuators, and the enteprise and cloud services. Implementing these types of gateways requires specialized knowledge in communication protocols, device management, software update, and hardware configurations. We believe a better way to build IoT gateways is to use a set of common services that can be reused in IoT applications.</p>
+        <p>We have two frameworks for building IoT gateways: Kura and Mihini.</p>
+        <ul>
+          <li><a href="https://eclipse.org/kura"><strong>Kura</strong></a> is a set of Java and OSGi services that are most commonly required for IoT gateways, including I/O services, Data Services, Cloud Services, Newtorking, etc. </li>
+          <li><a href="https://eclipse.org/mihini"><strong>Mihini</strong></a>, written in the Lua scripting language, provides low-level connectivity management to ensure that a reliable network connection is available, acts as an abstraction layer for underlying hardware and enables smart business data transmission between devices and servers, including the ability to consolidate data locally and use bandwidth-efficient communication protocols.
+          </li>
+        </ul>
+      </div>
+    </section>
+
+
+
+    <section class="third">
+      <div class="container">
+
+        <h1 id="Industry+Services" class="purple">Industry Services</h1>
+
+        <p>Building M2M and IoT applications for specific industries also requires specific services to be available. Providing developers with some of the basic building blocks makes it easier to develop and deploy these types of applications.</p>
+        <p>Eclipse IoT currently has the following industry services:</p>
+        <ul>
+          <li>The <a href="https://eclipse.org/smarthome"><strong>SmartHome</strong></a> project is a framework that allows building smart home solutions that have a strong focus on heterogeneous environments, i.e. solutions that deal with the integration of different protocols or standards. Its purpose is to provide a uniform access to devices and information and to facilitate different kinds of interactions with them. This framework consists of a set of OSGi bundles that can be deployed on an OSGi runtime and which defines OSGi services as extension points.
+          </li>
+          <li><a href="https://eclipse.org/eclipsescada"><strong>Eclipse SCADA</strong></a> is a way to connect different industrial devices to a common communication system and post-process as well as visualize the data to operating personnel. It provides a SCADA system that includes a communication service, monitoring system, data archive and data visualization capability</li>
+
+        </ul>
+      </div>
+    </section>
+
+
+
+    <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;">
+    </div>
+
+  </main>
+
+  <footer>
+
+    <div class="container">
+      <div class="row">
+        <div class="col-md-6">
+          <nav>
+            <ul class="list-inline menu">
+              <li><a href="#">Technology</a>
+              </li>
+              <li><a href="#">Community</a>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </nav>
+          <div class="socials">
+            <a href="#" class="social-facebook">&nbsp;</a>
+            <a href="#" class="social-twitter">&nbsp;</a>
+            <a href="#" class="social-youtube">&nbsp;</a>
+            <a href="#" class="social-share">&nbsp;</a>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+        </div>
+      </div>
+    </div>
+
+
+  </footer>
+
+
+
+  <!-- JS is at the end of the document so the pages load faster -->
+  <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
+  <!-- Include all compiled plugins (below), or include individual files as needed -->
+  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
+
+  <script src="js/index.js"></script>
+
+
+</body>
+
+</html>
diff --git a/static/getting-started.html b/static/getting-started.html
new file mode 100644
index 0000000000000000000000000000000000000000..f0f3ab1d83b27936e3413ca76f4ded4ada4c3229
--- /dev/null
+++ b/static/getting-started.html
@@ -0,0 +1,295 @@
+<!DOCTYPE html>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>iot.eclipse.org &mdash; Getting Started</title>
+  <meta name="description" content="Learn how to get started with Eclipse IoT thanks to our catalog of online resources">
+  <meta name="author" content="Eclipse.org">
+  <link rel="author" href="humans.txt" />
+
+  <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+  <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+  <!-- Le styles -->
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+  <link href="/assets/css/jquery.oembed.css" rel="stylesheet">
+
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+
+
+  <!-- Placez cette balise dans l'en-tête ou juste avant la balise de fermeture du corps de texte. -->
+  <script src="https://apis.google.com/js/platform.js" async defer></script>
+
+</head>
+
+<body>
+
+
+  <header>
+
+    <nav class="navbar navbar-default">
+      <div class="container">
+        <!-- Brand and toggle get grouped for better mobile display -->
+        <div class="navbar-header">
+          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+            <span class="sr-only">Toggle navigation</span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <a class="navbar-brand" href="/">
+            <img alt="Brand" src="/assets/images/iot-logo.png">
+          </a>
+        </div>
+
+        <!-- Collect the nav links, forms, and other content for toggling -->
+        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+          <ul class="nav navbar-nav navbar-right">
+            <li><a href="/getting-started">Getting Started</a>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="/standards">Standards</a>
+                </li>
+                <li><a href="/frameworks">Services &amp; Frameworks</a>
+                </li>
+                <li><a href="/projects">All the projects</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="#">Resources</a>
+                </li>
+                <li><a href="#">News</a>
+                </li>
+                <li><a href="#">Events</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="/ecosystem">Working Group</a>
+            </li>
+            <li style="min-width: 100px; padding-top: 15px; padding-left: 8px;">
+              <div class="g-plusone" data-size="medium" data-href="http://iot.eclipse.org"></div>
+            </li>
+          </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+      </div>
+      <!-- /.container-fluid -->
+    </nav>
+
+
+  </header>
+
+
+
+  <main class="main">
+
+    <div class="well">
+
+      <div class="container">
+        <h1>Getting started</h1>
+
+        <p class="lead">We think open source is key for the Internet of Things, and we want to get you started as simply as possible.</p>
+        <p class="lead">
+          On this page you will find useful resources like <a href="#videos">videos</a> and <a href="#presentations">presentations</a> given at various conferences, <a href="#tutorials">tutorials</a>, as well as a list of server <a href="#sandboxes">sandboxes</a> you can use to connect your devices.</p>
+        </p>
+
+      </div>
+
+    </div>
+
+    <section class="first">
+      <div class="container">
+        <div class="row">
+          <div class="col-md-8">
+            xxxx
+          </div>
+          <div class="col-md-4">
+            xxxx
+          </div>
+
+        </div>
+      </div>
+
+    </section>
+
+    <section class="second">
+      <div class="container">
+
+        <div class="row">
+
+          <div class="col-md-6">
+            <section class="subsection-header videos">
+              <h2 id="videos">Videos</h2>
+              <div class="grey-box">
+                <iframe width="100%" height="315" src="http://www.youtube.com/embed/videoseries?list=PL0D6A9FF9237853DF&amp;hl=fr_FR" frameborder="0" allowfullscreen></iframe>
+              </div>
+            </section>
+          </div>
+          <div class="col-md-6">
+            <section class="subsection-header presentations">
+
+              <h2 id="presentations">Presentations</h2>
+
+              <a href="http://slideshare.net/kartben/endtoend-iot-solutions-with-java-and-the-eclipse-iot-stack-39711940" class="embed"></a>
+
+
+            </section>
+          </div>
+
+        </div>
+
+
+      </div>
+
+    </section>
+
+    <section class="third">
+      <div class="container">
+
+
+        <div class="row">
+
+          <h1 class="purple" id="sandboxes">Sandboxes</h1>
+
+          <div id="mqtt" class="col-md-6">
+            <h2>MQTT</h2>
+            <p>You can make use of this <a href="http://mqtt.org/">MQTT</a> server with client code from the <a href="http://eclipse.org/paho/">Paho
+            project</a>, the Eclipse MQTT view from Paho, or from one of the other client APIs listed on the <a href="http://mqtt.org/downloads">MQTT.org downloads</a> page.
+            </p>
+
+            <p>
+              Access the server using the hostname
+              <code>iot.eclipse.org</code> and port
+              <code>1883</code> .
+            </p>
+            <p>
+              Some live statistics are available via <a href="https://xively.com/feeds/59871/">Xively</a> and an HTTP bridge with a list of topics is deployed at <a href="http://eclipse.mqttbridge.com">http://eclipse.mqttbridge.com</a>. This server is running the Open Source <a href="http://mosquitto.org/">Mosquitto broker</a> in its version 1.3.1.
+            </p>
+          </div>
+
+
+          <div id="coap" class="col-md-6">
+            <h2>CoAP</h2>
+            <p>A CoAP server exposing test resources is available at: <code>coap://iot.eclipse.org:5683/</code>.</p>
+            <p>It should be used by anyone interested in testing a CoAP client implementation against another endpoint, and more generally by anyone interested in understanding the key concepts of the CoAP protocol.</p>
+            <p>
+              This server is running <a href="https://projects.eclipse.org/projects/technology.californium">Eclipse Californium</a>.
+            </p>
+          </div>
+
+        </div>
+
+        <div class="row">
+          <div id="lwm2m" class="col-md-6">
+            <h2>Lightweight M2M (LWM2M)</h2>
+            <p>In order to test LWM2M communication scenarios, we host a LWM2M server.</p>
+            <p>You can make use of this server with the <a href="https://projects.eclipse.org/projects/technology.wakaama">Wakaama
+            project</a>
+            </p>
+
+            <p>
+              The LWM2M server is available at: <code>coap://leshan.eclipse.org:5683</code> (both IPv4 and IPv6 are available)
+              <br> A web interface allows to interact with registered LWM2M clients: <a href="http://leshan.eclipse.org/"><code>http://leshan.eclipse.org</code></a>.
+            </p>
+            <p>
+              This server is running the Open Source <a href="http:///github.com/jvermillard/leshan">Leshan server</a>.
+            </p>
+          </div>
+
+        </div>
+
+
+      </div>
+
+    </section>
+
+
+  </main>
+
+
+  <footer>
+
+    <div class="container">
+      <div class="row">
+        <div class="col-md-6">
+          <nav>
+            <ul class="list-inline menu">
+              <li><a href="#">Technology</a>
+              </li>
+              <li><a href="#">Community</a>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </nav>
+          <div class="socials">
+            <a href="#" class="social-facebook">&nbsp;</a>
+            <a href="#" class="social-twitter">&nbsp;</a>
+            <a href="#" class="social-youtube">&nbsp;</a>
+            <a href="#" class="social-share">&nbsp;</a>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+        </div>
+      </div>
+    </div>
+
+
+  </footer>
+
+
+  <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;">
+  </div>
+
+  </div>
+  <!-- /container -->
+
+
+
+  <!-- JS is at the end of the document so the pages load faster -->
+  <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
+  <!-- Include all compiled plugins (below), or include individual files as needed -->
+  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
+
+  <script src="/assets/js/jquery.oembed.js"></script>
+  <script src="/js/getting-started.js"></script>
+
+
+</body>
+
+</html>
diff --git a/static/gruntfile.js b/static/gruntfile.js
new file mode 100644
index 0000000000000000000000000000000000000000..9575e3dc385b326f744a7fe8a2b900a2dea676fb
--- /dev/null
+++ b/static/gruntfile.js
@@ -0,0 +1,50 @@
+module.exports = function(grunt) {
+
+    // Project configuration.
+    grunt.initConfig({
+        pkg: grunt.file.readJSON('package.json'),
+
+        sass: {
+            dist: {
+                options: {
+                    outputStyle: 'nested',
+                    includePaths: ['assets/stylesheets', require('node-bourbon').includePaths]
+                },
+                files: {
+                    'assets/css/bootstrap.css': 'assets/stylesheets/bootstrap.scss'
+                }
+            }
+        },
+
+        watch: {
+            grunt: {
+                files: ['Gruntfile.js']
+            },
+
+            sass: {
+                files: 'assets/stylesheets/**/*.scss',
+                tasks: ['sass'],
+                options: {
+                    livereload: true
+                }
+            },
+
+            html: {
+                files: ['*.html', '**/*.html'],
+                options: {
+                    livereload: true
+                }
+            }
+        }
+    });
+
+    // Load the plugin that provides the "uglify" task.
+    grunt.loadNpmTasks('grunt-contrib-uglify');
+    grunt.loadNpmTasks('grunt-sass');
+    grunt.loadNpmTasks('grunt-contrib-watch');
+
+    // Default task(s).
+    grunt.registerTask('build', ['sass']);
+    grunt.registerTask('default', ['build', 'watch']);
+
+};
diff --git a/static/humans.txt b/static/humans.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f2933d80e677b481c84f0c8fc11d26afdc997444
--- /dev/null
+++ b/static/humans.txt
@@ -0,0 +1,12 @@
+/* TEAM */
+	Curator: Benjamin Cabé (@kartben)
+	Web designer: Thomas Abenoza
+
+/* THANKS */
+	Misc. contributions: Andy Piper (@andypiper)	
+
+/* SITE */
+	Last update: 2015/03/01
+	Language: English
+	Standards: HTML5, CSS3,..
+	Components: Twitter Bootstrap, jQuery
\ No newline at end of file
diff --git a/static/images/_home/iotchallenge_background.jpg b/static/images/_home/iotchallenge_background.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..84f7121e5e664296a31bea651440ebe5a52ae7dc
Binary files /dev/null and b/static/images/_home/iotchallenge_background.jpg differ
diff --git a/static/images/_home/iotchallenge_text_overlay.png b/static/images/_home/iotchallenge_text_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc3706cb7f1cb0975c9c18ab11c1e7f063d13bfa
Binary files /dev/null and b/static/images/_home/iotchallenge_text_overlay.png differ
diff --git a/static/images/_home/javalaunch_background.jpg b/static/images/_home/javalaunch_background.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..330ca18270fa121fe8f7232af55c1b277630da2b
Binary files /dev/null and b/static/images/_home/javalaunch_background.jpg differ
diff --git a/static/images/_home/javalaunch_background.png b/static/images/_home/javalaunch_background.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7071c41b3c0b96df4390c7c9c34f04a89ef2316
Binary files /dev/null and b/static/images/_home/javalaunch_background.png differ
diff --git a/static/images/_home/javalaunch_background_text_overlay.png b/static/images/_home/javalaunch_background_text_overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3dec76524940ca428fa7856ea9227b6b9fb69e9
Binary files /dev/null and b/static/images/_home/javalaunch_background_text_overlay.png differ
diff --git a/static/images/ecosystem/logo-2lemetry.gif b/static/images/ecosystem/logo-2lemetry.gif
new file mode 100644
index 0000000000000000000000000000000000000000..2ba6cf1a5e9115fecf5067849dcb561a6b1d9c3f
Binary files /dev/null and b/static/images/ecosystem/logo-2lemetry.gif differ
diff --git a/static/images/ecosystem/logo-2lemetry.png b/static/images/ecosystem/logo-2lemetry.png
new file mode 100644
index 0000000000000000000000000000000000000000..9077df2d86b48647652fc31a88d582c07d6e92bb
Binary files /dev/null and b/static/images/ecosystem/logo-2lemetry.png differ
diff --git a/static/images/ecosystem/logo-actuate.png b/static/images/ecosystem/logo-actuate.png
new file mode 100644
index 0000000000000000000000000000000000000000..36866b83c0cde114a0de20e44cb3c9f0888f46c2
Binary files /dev/null and b/static/images/ecosystem/logo-actuate.png differ
diff --git a/static/images/ecosystem/logo-axeda.gif b/static/images/ecosystem/logo-axeda.gif
new file mode 100644
index 0000000000000000000000000000000000000000..1ab4eb4420a7d5fe961f1fe56c6e2bcb6225820b
Binary files /dev/null and b/static/images/ecosystem/logo-axeda.gif differ
diff --git a/static/images/ecosystem/logo-axeda.png b/static/images/ecosystem/logo-axeda.png
new file mode 100644
index 0000000000000000000000000000000000000000..9cbf148cecc86fbedf756a5460345be4ddf6acb9
Binary files /dev/null and b/static/images/ecosystem/logo-axeda.png differ
diff --git a/static/images/ecosystem/logo-bandxi.gif b/static/images/ecosystem/logo-bandxi.gif
new file mode 100644
index 0000000000000000000000000000000000000000..07815352fb2537236594cfeef2cfeeb91bc0e4b4
Binary files /dev/null and b/static/images/ecosystem/logo-bandxi.gif differ
diff --git a/static/images/ecosystem/logo-bitreactive.png b/static/images/ecosystem/logo-bitreactive.png
new file mode 100644
index 0000000000000000000000000000000000000000..88d12ecf3b6841241e3c96f140a78f6c309a2c15
Binary files /dev/null and b/static/images/ecosystem/logo-bitreactive.png differ
diff --git a/static/images/ecosystem/logo-bosch.png b/static/images/ecosystem/logo-bosch.png
new file mode 100644
index 0000000000000000000000000000000000000000..d64f7eea7afd6e71846e0b7bf52bb90acc2ebbd9
Binary files /dev/null and b/static/images/ecosystem/logo-bosch.png differ
diff --git a/static/images/ecosystem/logo-canonical.png b/static/images/ecosystem/logo-canonical.png
new file mode 100644
index 0000000000000000000000000000000000000000..95964fedf7e8ebfcc2218b527723a7d2716dfd55
Binary files /dev/null and b/static/images/ecosystem/logo-canonical.png differ
diff --git a/static/images/ecosystem/logo-dcsquare.png b/static/images/ecosystem/logo-dcsquare.png
new file mode 100644
index 0000000000000000000000000000000000000000..06a412b27dca318545dd93ec01c3f1e085d0b825
Binary files /dev/null and b/static/images/ecosystem/logo-dcsquare.png differ
diff --git a/static/images/ecosystem/logo-dtag.png b/static/images/ecosystem/logo-dtag.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f0db3f1fd88bdba764e09bd3db1e65d4941f0f5
Binary files /dev/null and b/static/images/ecosystem/logo-dtag.png differ
diff --git a/static/images/ecosystem/logo-eurotech.gif b/static/images/ecosystem/logo-eurotech.gif
new file mode 100644
index 0000000000000000000000000000000000000000..57fdddde9acd934c94c44976d14e9b7b34b392c4
Binary files /dev/null and b/static/images/ecosystem/logo-eurotech.gif differ
diff --git a/static/images/ecosystem/logo-eurotech.png b/static/images/ecosystem/logo-eurotech.png
new file mode 100644
index 0000000000000000000000000000000000000000..7045c551d3cb2b5b5e851e04d86a7cfa03245ed3
Binary files /dev/null and b/static/images/ecosystem/logo-eurotech.png differ
diff --git a/static/images/ecosystem/logo-gadgetkeeper.png b/static/images/ecosystem/logo-gadgetkeeper.png
new file mode 100644
index 0000000000000000000000000000000000000000..da9d9edad4ac715a34e71e9c5db3e2eb4e654435
Binary files /dev/null and b/static/images/ecosystem/logo-gadgetkeeper.png differ
diff --git a/static/images/ecosystem/logo-ibh.gif b/static/images/ecosystem/logo-ibh.gif
new file mode 100644
index 0000000000000000000000000000000000000000..88d7fc4901ba827e0ed652bfc1fc91a55e781c8b
Binary files /dev/null and b/static/images/ecosystem/logo-ibh.gif differ
diff --git a/static/images/ecosystem/logo-ibh.png b/static/images/ecosystem/logo-ibh.png
new file mode 100644
index 0000000000000000000000000000000000000000..22e248cf05ca6605f0b13a98fe0e880a49d28309
Binary files /dev/null and b/static/images/ecosystem/logo-ibh.png differ
diff --git a/static/images/ecosystem/logo-ibm.gif b/static/images/ecosystem/logo-ibm.gif
new file mode 100644
index 0000000000000000000000000000000000000000..b31ef3b687770f14d72944f51e558ed7dcbe9222
Binary files /dev/null and b/static/images/ecosystem/logo-ibm.gif differ
diff --git a/static/images/ecosystem/logo-ibm.png b/static/images/ecosystem/logo-ibm.png
new file mode 100644
index 0000000000000000000000000000000000000000..91e0ed2bff8f0aac5f77f23273861abcc6c0286f
Binary files /dev/null and b/static/images/ecosystem/logo-ibm.png differ
diff --git a/static/images/ecosystem/logo-itemis.png b/static/images/ecosystem/logo-itemis.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b921c4885e479b064ab1eb0096a406562967db2
Binary files /dev/null and b/static/images/ecosystem/logo-itemis.png differ
diff --git a/static/images/ecosystem/logo-laas.png b/static/images/ecosystem/logo-laas.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8f55b5d7775af1bf6cd870acede8a9e4690e9c9
Binary files /dev/null and b/static/images/ecosystem/logo-laas.png differ
diff --git a/static/images/ecosystem/logo-litmus.png b/static/images/ecosystem/logo-litmus.png
new file mode 100644
index 0000000000000000000000000000000000000000..a114376f5b13237f2031b806f28dad39ccf52779
Binary files /dev/null and b/static/images/ecosystem/logo-litmus.png differ
diff --git a/static/images/ecosystem/logo-m2m-alliance.gif b/static/images/ecosystem/logo-m2m-alliance.gif
new file mode 100644
index 0000000000000000000000000000000000000000..14bae234a95115bb18069cb08fe4a9722132f3c8
Binary files /dev/null and b/static/images/ecosystem/logo-m2m-alliance.gif differ
diff --git a/static/images/ecosystem/logo-m2m-alliance.png b/static/images/ecosystem/logo-m2m-alliance.png
new file mode 100644
index 0000000000000000000000000000000000000000..2aa62154abc47ebfe79a924dc776dcbbdcbf2705
Binary files /dev/null and b/static/images/ecosystem/logo-m2m-alliance.png differ
diff --git a/static/images/ecosystem/logo-openhab.png b/static/images/ecosystem/logo-openhab.png
new file mode 100644
index 0000000000000000000000000000000000000000..50f5112588168df6762e204bee74fe0701e21fda
Binary files /dev/null and b/static/images/ecosystem/logo-openhab.png differ
diff --git a/static/images/ecosystem/logo-oracle.png b/static/images/ecosystem/logo-oracle.png
new file mode 100644
index 0000000000000000000000000000000000000000..370a808820516e52744eb1d3256f6e640d38c940
Binary files /dev/null and b/static/images/ecosystem/logo-oracle.png differ
diff --git a/static/images/ecosystem/logo-sierra.gif b/static/images/ecosystem/logo-sierra.gif
new file mode 100644
index 0000000000000000000000000000000000000000..15de7857f3feb31d5ab7cccf2cc8df19261686f8
Binary files /dev/null and b/static/images/ecosystem/logo-sierra.gif differ
diff --git a/static/images/ecosystem/logo-sierra.png b/static/images/ecosystem/logo-sierra.png
new file mode 100644
index 0000000000000000000000000000000000000000..f032fc17438474c45ab019df1b1b609f58af109e
Binary files /dev/null and b/static/images/ecosystem/logo-sierra.png differ
diff --git a/static/images/ecosystem/logo-ubuntu.png b/static/images/ecosystem/logo-ubuntu.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb5849acc26a1a8a47051fea3c7b7aad5e0f0d9f
Binary files /dev/null and b/static/images/ecosystem/logo-ubuntu.png differ
diff --git a/static/images/frameworks/frameworks-vision.png b/static/images/frameworks/frameworks-vision.png
new file mode 100644
index 0000000000000000000000000000000000000000..40888f479a19be1446b1409cecf98b9efbddda84
Binary files /dev/null and b/static/images/frameworks/frameworks-vision.png differ
diff --git a/static/images/frameworks/m2m-fwk-overview.png b/static/images/frameworks/m2m-fwk-overview.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4997bc029b51f8fa984ef2c311e801ef62ace3b
Binary files /dev/null and b/static/images/frameworks/m2m-fwk-overview.png differ
diff --git a/static/images/layout/members-info-link-sep-a.gif b/static/images/layout/members-info-link-sep-a.gif
new file mode 100644
index 0000000000000000000000000000000000000000..4299eade0945c8c90c67ef90ea5751cddd35d68a
Binary files /dev/null and b/static/images/layout/members-info-link-sep-a.gif differ
diff --git a/static/images/layout/members-info-link-sep-b.gif b/static/images/layout/members-info-link-sep-b.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6cbe777022942769c0136c36ab444c122f62b350
Binary files /dev/null and b/static/images/layout/members-info-link-sep-b.gif differ
diff --git a/static/images/layout/members-info-top-left.gif b/static/images/layout/members-info-top-left.gif
new file mode 100644
index 0000000000000000000000000000000000000000..d39198fae973ffb055e2607219428f94febaed16
Binary files /dev/null and b/static/images/layout/members-info-top-left.gif differ
diff --git a/static/images/layout/section-heading-end.gif b/static/images/layout/section-heading-end.gif
new file mode 100644
index 0000000000000000000000000000000000000000..615544457a0ea0c6528e9fc2c4e349ce85ddadaf
Binary files /dev/null and b/static/images/layout/section-heading-end.gif differ
diff --git a/static/images/layout/section-heading-grey-end.gif b/static/images/layout/section-heading-grey-end.gif
new file mode 100644
index 0000000000000000000000000000000000000000..2f8ef72ad69eb32548eff76fee6f46a3f011db64
Binary files /dev/null and b/static/images/layout/section-heading-grey-end.gif differ
diff --git a/static/images/protocols/omadm-simulator.png b/static/images/protocols/omadm-simulator.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cc7d9f757bca77850f81ac4d09b088c4cf0028e
Binary files /dev/null and b/static/images/protocols/omadm-simulator.png differ
diff --git a/static/images/protocols/protocols-vision.png b/static/images/protocols/protocols-vision.png
new file mode 100644
index 0000000000000000000000000000000000000000..625473c451d1ab9d31a88c470abe2acff3ca7df1
Binary files /dev/null and b/static/images/protocols/protocols-vision.png differ
diff --git a/static/images/tools/ldt.png b/static/images/tools/ldt.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffc55148b98e6ea67858d6a94356dd6dc7110c42
Binary files /dev/null and b/static/images/tools/ldt.png differ
diff --git a/static/images/tools/tools-vision.png b/static/images/tools/tools-vision.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5261b55292c2607ebe43a0f6b46ccbaf3920f5d
Binary files /dev/null and b/static/images/tools/tools-vision.png differ
diff --git a/static/index-javaone.html b/static/index-javaone.html
new file mode 100644
index 0000000000000000000000000000000000000000..6380e954dd7b0b9dfb5a9a27559280cd49382c83
--- /dev/null
+++ b/static/index-javaone.html
@@ -0,0 +1,293 @@
+<!DOCTYPE html>
+<html itemscope itemtype="http://schema.org/Article" lang="en">
+
+<head>
+    <!-- Add the following three tags inside head. -->
+    <meta itemprop="name" content="iot.eclipse.org - IoT development made simple">
+    <meta itemprop="description" content="iot.eclipse.org is where you can learn about the technologies developed at Eclipse to make Internet of Things (IoT) development simpler.
+
+These technologies aim at establishing an open, end-to-end, IoT stack.">
+    <meta itemprop="image" content="http://iot.eclipse.org/site_preview.jpg">
+
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>iot.eclipse.org &mdash; IoT development made simple</title>
+    <meta name="description" content="iot.eclipse.org developer portal: open source tools, frameworks and protocols for IoT and M2M developers">
+    <meta name="author" content="Eclipse.org">
+    <link rel="author" href="humans.txt" />
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+    <!-- Custom Fonts -->
+    <link href='http://fonts.googleapis.com/css?family=Lato:300,400' rel='stylesheet' type='text/css'>
+    <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+
+    <!-- Le styles -->
+    <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet">
+    <link href="css/theme.css" rel="stylesheet">
+    <link href="css/bootstrap/bootstrap-responsive.min.css" rel="stylesheet">
+
+    <script type="text/javascript">
+    var _gaq = _gaq || [];
+    _gaq.push(['_setAccount', 'UA-594061-11']);
+    _gaq.push(['_trackPageview']);
+
+    (function() {
+        var ga = document.createElement('script');
+        ga.type = 'text/javascript';
+        ga.async = true;
+        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(ga, s);
+    })();
+    </script>
+</head>
+
+<body class="index">
+
+    <div class="navbar navbar-fixed-top">
+        <div class="navbar-inner">
+            <div class="container">
+                <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span>
+                </a> <a class="brand" href="index.html">iot.eclipse.org</a>
+                <div class="nav-collapse">
+                    <ul class="nav">
+                        <li><a href="frameworks.html">Services & Frameworks</a>
+                        </li>
+                        <li><a href="protocols.html">Protocols</a>
+                        </li>
+                        <li><a href="tools.html">Tools</a>
+                        </li>
+                        <li><a href="community.html">Community</a>
+                        </li>
+                        <li><a href="/ecosystem.html">Ecosystem</a>
+                        </li>
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">See it live <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/demo" class="active">Live Demo</a>
+                                </li>
+                                <li><a href="/sandbox.html">Sandbox</a>
+                                </li>
+                            </ul>
+                        </li>
+                    </ul>
+                    <ul class="nav pull-right">
+                        <li>
+                            <div style="padding-top: 20px;">
+                                <div class="g-plusone" data-href="http://iot.eclipse.org/"></div>
+                            </div>
+                        </li>
+                    </ul>
+                </div>
+                <!--/.nav-collapse -->
+            </div>
+        </div>
+    </div>
+
+    <!-- Place this tag after the last +1 button tag. -->
+    <script type="text/javascript">
+    (function() {
+        var po = document.createElement('script');
+        po.type = 'text/javascript';
+        po.async = true;
+        po.src = 'https://apis.google.com/js/plusone.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(po, s);
+    })();
+    </script>
+
+
+    <div class="container">
+        <div class="row">
+            <div class="span6" id="catchline">
+                <h2>iot.eclipse.org</h2>
+                <p class="lead">
+                    This portal is where you can learn about the technologies developed at <a href="http://www.eclipse.org" target="_blank">Eclipse</a> to make Internet of Things (<a href="#" rel="popover" data-content="Technology that supports wired or wireless communication between machines." data-original-title="IoT" id="iot-definition">IoT</a>) development simpler.
+
+                </p>
+                <p class="lead">Our technologies aim at establishing an open IoT/M2M platform to be used by anyone.</p>
+            </div>
+
+            <div class="span5 offset1">
+                <div id="java-launch">
+                    <a href="/java">
+                        <img alt="Open IoT Stack for Java" src="/images/_home/javalaunch_background_text_overlay.png">
+                    </a>
+                </div>
+            </div>
+        </div>
+
+        <!-- Example row of columns -->
+        <div class="row" style="margin-top: 4em;">
+            <div class="span4 home-box" id="home-frameworks">
+                <h2>
+					<a href="frameworks.html"><i class="icon-cogs"></i>Services &amp; Frameworks</a>
+				</h2>
+                <p class="lead">Deliver extensible runtimes and services enabling IoT/M2M applications.</p>
+                <p>We provide a set of services and frameworks enabling features such as device managment, software update, vertical solutions,&nbsp;&hellip;</p>
+                <p>
+                    <a class="btn" href="frameworks.html">More »</a>
+                </p>
+            </div>
+
+            <div class="span4 home-box" id="home-protocols">
+                <h2>
+					<a href="protocols.html"><i class="icon-comments"></i>Protocols</a><br/>&nbsp;
+				</h2>
+                <p class="lead">Provide Open Source implementations of standard IoT/M2M protocols.</p>
+                <p>Currently, we provide tools and libraries for
+                    <a href="protocols.html#mqtt">MQTT</a> and
+                    <a href="protocols.html#coap">CoAP</a>, as well as
+                    <a href="protocols.html#oma-dm">OMA-DM</a> and
+                    <a href="protocols.html#oma-lwm2m">OMA LWM2M</a> Device Management protocols
+                    <p>
+                        <a class="btn" href="protocols.html">More »</a>
+                    </p>
+            </div>
+
+            <div class="span4 home-box" id="home-tools">
+                <h2>
+					<a href="tools.html"><i class="icon-briefcase"></i>Tools</a><br/>&nbsp;
+				</h2>
+                <p class="lead">Package a "one-stop shop" IDE for IoT/M2M developers.</p>
+                <p>
+                    We believe that Lua is a language very well-tailored for the Internet of Things, therefore an IDE for Lua development is <a href="tools.html#ldt">available</a>.
+                </p>
+                <p>
+                    <a class="btn" href="tools.html">More »</a>
+                </p>
+            </div>
+            <div class="span4 offset2 home-box" id="home-community">
+
+                <h2>
+					<a href="community.html"><i class="icon-bullhorn"></i>Community<br/>&nbsp;</a>
+				</h2>
+                <p class="lead">Get in touch with us, learn about future events&hellip;
+                </p>
+                <p>
+                    <a class="btn" href="community.html">More »</a>
+                </p>
+            </div>
+
+
+            <div class="span4 home-box" id="home-sandbox">
+                <h2>
+					<a href="sandbox.html"><i class="icon-inbox"></i>Sandbox<br/>&nbsp;</a>
+				</h2>
+                <p class="lead">Connect your IoT devices to test servers.</p>
+                <p>In order to simplify the evaluation of the open IoT stack developed at Eclipse, we provide sandboxes for your devices to communicate with.</p>
+                <p>
+                    <a class="btn" href="sandbox.html">More »</a>
+                </p>
+            </div>
+
+
+        </div>
+
+        <h2>Our Members</h2>
+        <div class="well">
+
+            <h4>Steering Committee </h4>
+            <table class="table">
+                <tr>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=968"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=968&amp;size=small" style="padding:5px;" alt="Eurotech"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=656"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=656&amp;size=small" style="padding:5px;" alt="IBM"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=843"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=843&amp;size=small" style="padding:5px;" alt="Sierra Wireless"></a></small>
+                    </td>
+                </tr>
+
+            </table>
+
+
+            <h4>
+			Participating Members
+		</h4>
+            <table class="table">
+                <tr>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1100"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1100&amp;size=small" style="padding:5px;" alt="2lemetry"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=652"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=652&amp;size=small" style="padding:5px;" alt="Actuate"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="#"><img align="left" width="120" src="http://m2mworldnews.com/WordPress/wp-content/uploads/2011/05/axeda_logo.jpg" style="padding:5px;" alt="Axeda"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1103"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1103&amp;size=small" style="padding:5px;" alt="Bitreactive"></a></small>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=901"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=901&amp;size=small" style="padding:5px;" alt="Cisco"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1122"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1122&amp;size=small" style="padding:5px;" alt="dc-square GmbH"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1086"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1086&amp;size=small" style="padding:5px;" alt="IBH SYSTEMS GmbH"></a></small>
+                    </td>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1120"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1120&amp;size=small" style="padding:5px;" alt="openHAB UG"></a></small>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <small><a href="http://eclipse.org/membership/showMember.php?member_id=1101"><img align="left" width="120" src="http://eclipse.org/membership/scripts/get_image.php?id=1101&amp;size=small" style="padding:5px;" alt="M2M Alliance"></a></small>
+                    </td>
+                    <td>
+                    </td>
+                    <td>
+                    </td>
+                    <td>
+                    </td>
+                </tr>
+            </table>
+
+        </div>
+    </div>
+    <hr>
+
+    <footer>
+        <ul class="nav nav-pills">
+            <li><a href="#">Home</a>
+            </li>
+            <li><a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a>
+            </li>
+            <li><a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a>
+            </li>
+            <li><a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a>
+            </li>
+            <li><a href="http://www.eclipse.org/legal/" target="_blank">Legal</a>
+            </li>
+            <li><a href="contact.html" data-toggle="modal" data-target="#contact-modal">Contact Us</a>
+            </li>
+            <li class="pull-right">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</li>
+        </ul>
+    </footer>
+
+    <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;">
+    </div>
+
+    </div>
+    <!-- /container -->
+
+
+    <!-- JS is at the end of the document so the pages load faster -->
+    <script src="js/jquery.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/shuffle.js"></script>
+    <script src="js/index.js"></script>
+
+</body>
+
+</html>
diff --git a/index.html b/static/index.html
similarity index 100%
rename from index.html
rename to static/index.html
diff --git a/static/java/config.codekit b/static/java/config.codekit
new file mode 100644
index 0000000000000000000000000000000000000000..3cafac82a58f28e778bfc50b5098a04af47ed42b
--- /dev/null
+++ b/static/java/config.codekit
@@ -0,0 +1,1053 @@
+{
+"CodeKitInfo": "This is a CodeKit 2.x project configuration file. It is designed to sync project settings across multiple machines. MODIFYING THE CONTENTS OF THIS FILE IS A POOR LIFE DECISION. If you do so, you will likely cause CodeKit to crash. This file is not useful unless accompanied by the project that created it in CodeKit 2. This file is not backwards-compatible with CodeKit 1.x. For more information, see: http:\/\/incident57.com\/codekit",
+"creatorBuild": "17018",
+"files": {
+	"\/images\/discover-bg.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 49855,
+		"inputAbbreviatedPath": "\/images\/discover-bg.jpg",
+		"outputAbbreviatedPath": "\/images\/discover-bg.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/footer-bg.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 49272,
+		"inputAbbreviatedPath": "\/images\/footer-bg.jpg",
+		"outputAbbreviatedPath": "\/images\/footer-bg.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/header-bg.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 582504,
+		"inputAbbreviatedPath": "\/images\/header-bg.jpg",
+		"outputAbbreviatedPath": "\/images\/header-bg.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/icon-connect.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 28479,
+		"inputAbbreviatedPath": "\/images\/icon-connect.jpg",
+		"outputAbbreviatedPath": "\/images\/icon-connect.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/icon-download.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 37179,
+		"inputAbbreviatedPath": "\/images\/icon-download.jpg",
+		"outputAbbreviatedPath": "\/images\/icon-download.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/icon-live.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 39609,
+		"inputAbbreviatedPath": "\/images\/icon-live.jpg",
+		"outputAbbreviatedPath": "\/images\/icon-live.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/icon-tutorial.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 18018,
+		"inputAbbreviatedPath": "\/images\/icon-tutorial.jpg",
+		"outputAbbreviatedPath": "\/images\/icon-tutorial.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/logo-01.png": {
+		"fileType": 32768,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 8386,
+		"inputAbbreviatedPath": "\/images\/logo-01.png",
+		"outputAbbreviatedPath": "\/images\/logo-01.png",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/logo-02.png": {
+		"fileType": 32768,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 5556,
+		"inputAbbreviatedPath": "\/images\/logo-02.png",
+		"outputAbbreviatedPath": "\/images\/logo-02.png",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/logo-2lemetry.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 7322,
+		"inputAbbreviatedPath": "\/images\/logo-2lemetry.jpg",
+		"outputAbbreviatedPath": "\/images\/logo-2lemetry.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/logo-actuate.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 5307,
+		"inputAbbreviatedPath": "\/images\/logo-actuate.jpg",
+		"outputAbbreviatedPath": "\/images\/logo-actuate.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/logo-axeda.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 9093,
+		"inputAbbreviatedPath": "\/images\/logo-axeda.jpg",
+		"outputAbbreviatedPath": "\/images\/logo-axeda.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/logo-bitreactive.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 4391,
+		"inputAbbreviatedPath": "\/images\/logo-bitreactive.jpg",
+		"outputAbbreviatedPath": "\/images\/logo-bitreactive.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/logo-eurotech.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 6567,
+		"inputAbbreviatedPath": "\/images\/logo-eurotech.jpg",
+		"outputAbbreviatedPath": "\/images\/logo-eurotech.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/logo-ibm.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 8139,
+		"inputAbbreviatedPath": "\/images\/logo-ibm.jpg",
+		"outputAbbreviatedPath": "\/images\/logo-ibm.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/logo-sierra.jpg": {
+		"fileType": 16384,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 8273,
+		"inputAbbreviatedPath": "\/images\/logo-sierra.jpg",
+		"outputAbbreviatedPath": "\/images\/logo-sierra.jpg",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/images\/m2m_eclipse_logo.png": {
+		"fileType": 32768,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"initialSize": 1303,
+		"inputAbbreviatedPath": "\/images\/m2m_eclipse_logo.png",
+		"outputAbbreviatedPath": "\/images\/m2m_eclipse_logo.png",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"processed": 0
+		},
+	"\/index.html": {
+		"fileType": 8192,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/index.html",
+		"outputAbbreviatedPath": "No Output Path",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0
+		},
+	"\/js\/bootstrap\/bootstrap.min.js": {
+		"fileType": 64,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/js\/bootstrap\/bootstrap.min.js",
+		"outputAbbreviatedPath": "\/js\/bootstrap\/min\/bootstrap.min-ck.js",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"outputStyle": 1,
+		"syntaxCheckerStyle": 1
+		},
+	"\/js\/bootstrap\/min\/bootstrap.min-min.js": {
+		"fileType": 64,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/js\/bootstrap\/min\/bootstrap.min-min.js",
+		"outputAbbreviatedPath": "\/js\/bootstrap\/min\/min\/bootstrap.min-min-ck.js",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"outputStyle": 1,
+		"syntaxCheckerStyle": 1
+		},
+	"\/js\/index.js": {
+		"fileType": 64,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/js\/index.js",
+		"outputAbbreviatedPath": "\/js\/min\/index-ck.js",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"outputStyle": 1,
+		"syntaxCheckerStyle": 1
+		},
+	"\/js\/jquery.min.js": {
+		"fileType": 64,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/js\/jquery.min.js",
+		"outputAbbreviatedPath": "\/js\/min\/jquery.min-ck.js",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"outputStyle": 1,
+		"syntaxCheckerStyle": 1
+		},
+	"\/js\/min\/jquery.min-min.js": {
+		"fileType": 64,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/js\/min\/jquery.min-min.js",
+		"outputAbbreviatedPath": "\/js\/min\/min\/jquery.min-min-ck.js",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"outputStyle": 1,
+		"syntaxCheckerStyle": 1
+		},
+	"\/js\/shuffle.js": {
+		"fileType": 64,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/js\/shuffle.js",
+		"outputAbbreviatedPath": "\/js\/min\/shuffle-ck.js",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0,
+		"outputStyle": 1,
+		"syntaxCheckerStyle": 1
+		},
+	"\/stylesheet\/bootstrap\/bootstrap-responsive.min.css": {
+		"fileType": 16,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/stylesheet\/bootstrap\/bootstrap-responsive.min.css",
+		"outputAbbreviatedPath": "No Output Path",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0
+		},
+	"\/stylesheet\/bootstrap\/bootstrap.min.css": {
+		"fileType": 16,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/stylesheet\/bootstrap\/bootstrap.min.css",
+		"outputAbbreviatedPath": "No Output Path",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0
+		},
+	"\/stylesheet\/font-awesome.min.css": {
+		"fileType": 16,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/stylesheet\/font-awesome.min.css",
+		"outputAbbreviatedPath": "No Output Path",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0
+		},
+	"\/stylesheet\/theme.css": {
+		"fileType": 16,
+		"ignore": 0,
+		"ignoreWasSetByUser": 0,
+		"inputAbbreviatedPath": "\/stylesheet\/theme.css",
+		"outputAbbreviatedPath": "No Output Path",
+		"outputPathIsOutsideProject": 0,
+		"outputPathIsSetByUser": 0
+		}
+	},
+"hooks": [
+	],
+"lastSavedByUser": "Benjamin CABE",
+"manualImportLinks": {
+	},
+"projectAttributes": {
+	"bowerAbbreviatedPath": "",
+	"displayValue": "iot2",
+	"displayValueWasSetByUser": 0,
+	"iconImageName": "pencil_orange"
+	},
+"projectSettings": {
+	"alwaysUseExternalServer": 0,
+	"animateCSSInjections": 1,
+	"autoApplyPSLanguageSettingsStyle": 0,
+	"autoprefixerBrowserString": "> 1%, last 2 versions, Firefox ESR, Opera 12.1",
+	"autoSyncProjectSettingsFile": 1,
+	"browserRefreshDelay": 0,
+	"coffeeAutoOutputPathRelativePath": "",
+	"coffeeAutoOutputPathReplace1": "",
+	"coffeeAutoOutputPathReplace2": "",
+	"coffeeAutoOutputPathStyle": 0,
+	"coffeeCreateSourceMap": 0,
+	"coffeeLintFlags2": {
+		"arrow_spacing": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"camel_case_classes": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"colon_assignment_spacing": {
+			"active": 0,
+			"flagValue": 1
+			},
+		"cyclomatic_complexity": {
+			"active": 0,
+			"flagValue": 10
+			},
+		"duplicate_key": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"empty_constructor_needs_parens": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"indentation": {
+			"active": 1,
+			"flagValue": 2
+			},
+		"line_endings": {
+			"active": 0,
+			"flagValue": 0
+			},
+		"max_line_length": {
+			"active": 0,
+			"flagValue": 150
+			},
+		"missing_fat_arrows": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"newlines_after_classes": {
+			"active": 0,
+			"flagValue": 3
+			},
+		"no_backticks": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"no_debugger": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"no_empty_functions": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"no_empty_param_list": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"no_implicit_braces": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"no_implicit_parens": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"no_interpolation_in_single_quotes": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"no_plusplus": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"no_stand_alone_at": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"no_tabs": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"no_throwing_strings": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"no_trailing_semicolons": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"no_trailing_whitespace": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"no_unnecessary_double_quotes": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"no_unnecessary_fat_arrows": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"non_empty_constructor_needs_parens": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"space_operators": {
+			"active": 0,
+			"flagValue": -1
+			}
+		},
+	"coffeeMinifyOutput": 1,
+	"coffeeOutputStyle": 0,
+	"coffeeSyntaxCheckerStyle": 1,
+	"externalServerAddress": "http:\/\/localhost:8888",
+	"externalServerPreviewPathAddition": "",
+	"genericWebpageFileExtensionsString": "html, htm, shtml, shtm, xhtml, php, jsp, asp, aspx, erb, ctp",
+	"hamlAutoOutputPathRelativePath": "",
+	"hamlAutoOutputPathReplace1": "",
+	"hamlAutoOutputPathReplace2": "",
+	"hamlAutoOutputPathStyle": 0,
+	"hamlEscapeHTMLCharacters": 0,
+	"hamlNoEscapeInAttributes": 0,
+	"hamlOutputFormat": 2,
+	"hamlOutputStyle": 0,
+	"hamlUseCDATA": 0,
+	"hamlUseDoubleQuotes": 0,
+	"hamlUseUnixNewlines": 0,
+	"jadeAutoOutputPathRelativePath": "",
+	"jadeAutoOutputPathReplace1": "",
+	"jadeAutoOutputPathReplace2": "",
+	"jadeAutoOutputPathStyle": 0,
+	"jadeCompileDebug": 1,
+	"jadeOutputStyle": 0,
+	"javascriptAutoOutputPathRelativePath": "\/min",
+	"javascriptAutoOutputPathReplace1": "",
+	"javascriptAutoOutputPathReplace2": "",
+	"javascriptAutoOutputPathStyle": 2,
+	"javascriptCreateSourceMap": 1,
+	"javascriptOutputStyle": 1,
+	"javascriptOutputSuffix": "-ck",
+	"javascriptSyntaxCheckerStyle": 1,
+	"jsCheckerReservedNamesString": "",
+	"jsHintFlags2": {
+		"asi": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"bitwise": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"boss": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"browser": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"camelcase": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"couch": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"curly": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"debug": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"devel": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"dojo": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"eqeqeq": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"eqnull": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"es3": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"esnext": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"evil": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"expr": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"forin": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"freeze": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"funcscope": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"globalstrict": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"immed": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"indent": {
+			"active": 0,
+			"flagValue": 4
+			},
+		"iterator": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"jquery": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"lastsemic": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"latedef": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"laxbreak": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"laxcomma": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"loopfunc": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"maxcomplexity": {
+			"active": 0,
+			"flagValue": 10
+			},
+		"maxdepth": {
+			"active": 0,
+			"flagValue": 3
+			},
+		"maxlen": {
+			"active": 0,
+			"flagValue": 150
+			},
+		"maxparams": {
+			"active": 0,
+			"flagValue": 3
+			},
+		"maxstatements": {
+			"active": 0,
+			"flagValue": 4
+			},
+		"mootools": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"moz": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"multistr": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"newcap": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"noarg": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"node": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"noempty": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"nonbsp": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"nonew": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"nonstandard": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"notypeof": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"noyield": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"onecase": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"phantom": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"plusplus": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"proto": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"prototypejs": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"regexp": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"rhino": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"scripturl": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"shadow": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"shelljs": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"strict": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"sub": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"supernew": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"typed": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"undef": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"unused": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"withstmt": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"worker": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"wsh": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"yui": {
+			"active": 0,
+			"flagValue": -1
+			}
+		},
+	"jsLintFlags2": {
+		"ass": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"bitwise": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"browser": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"closure": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"continue": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"debug": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"devel": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"eqeq": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"evil": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"forin": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"indent": {
+			"active": 0,
+			"flagValue": 4
+			},
+		"maxlen": {
+			"active": 0,
+			"flagValue": 150
+			},
+		"newcap": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"node": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"nomen": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"plusplus": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"properties": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"regexp": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"rhino": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"sloppy": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"stupid": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"sub": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"todo": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"unparam": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"vars": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"white": {
+			"active": 0,
+			"flagValue": -1
+			}
+		},
+	"kitAutoOutputPathRelativePath": "",
+	"kitAutoOutputPathReplace1": "",
+	"kitAutoOutputPathReplace2": "",
+	"kitAutoOutputPathStyle": 0,
+	"lessAllowInsecureImports": 0,
+	"lessAutoOutputPathRelativePath": "..\/css",
+	"lessAutoOutputPathReplace1": "less",
+	"lessAutoOutputPathReplace2": "css",
+	"lessAutoOutputPathStyle": 2,
+	"lessCreateSourceMap": 0,
+	"lessDisableJavascript": 0,
+	"lessIeCompatibility": 1,
+	"lessOutputStyle": 0,
+	"lessRelativeURLS": 0,
+	"lessStrictImports": 0,
+	"lessStrictMath": 0,
+	"lessStrictUnits": 0,
+	"markdownAutoOutputPathRelativePath": "",
+	"markdownAutoOutputPathReplace1": "",
+	"markdownAutoOutputPathReplace2": "",
+	"markdownAutoOutputPathStyle": 0,
+	"markdownEnableFootnotes": 0,
+	"markdownEnableSmartyPants": 1,
+	"markdownExpandTabs": 1,
+	"reloadFileURLs": 0,
+	"sassAutoOutputPathRelativePath": "..\/css",
+	"sassAutoOutputPathReplace1": "sass",
+	"sassAutoOutputPathReplace2": "css",
+	"sassAutoOutputPathStyle": 2,
+	"sassCreateSourceMap": 0,
+	"sassDebugStyle": 0,
+	"sassDecimalPrecision": 5,
+	"sassOutputStyle": 0,
+	"sassUseLibsass": 0,
+	"shouldRunAutoprefixer": 0,
+	"shouldRunBless": 0,
+	"skippedItemsString": ".svn, .git, .hg, log, _logs, _cache, cache, logs",
+	"slimAutoOutputPathRelativePath": "",
+	"slimAutoOutputPathReplace1": "",
+	"slimAutoOutputPathReplace2": "",
+	"slimAutoOutputPathStyle": 0,
+	"slimCompileOnly": 0,
+	"slimLogicless": 0,
+	"slimOutputStyle": 1,
+	"slimRailsCompatible": 0,
+	"stylusAutoOutputPathRelativePath": "..\/css",
+	"stylusAutoOutputPathReplace1": "stylus",
+	"stylusAutoOutputPathReplace2": "css",
+	"stylusAutoOutputPathStyle": 2,
+	"stylusDebugStyle": 0,
+	"stylusImportCSS": 0,
+	"stylusOutputStyle": 0,
+	"stylusResolveRelativeURLS": 0,
+	"typescriptAutoOutputPathRelativePath": "\/js",
+	"typescriptAutoOutputPathReplace1": "",
+	"typescriptAutoOutputPathReplace2": "",
+	"typescriptAutoOutputPathStyle": 2,
+	"typescriptCreateDeclarationFile": 0,
+	"typescriptCreateSourceMap": 0,
+	"typescriptMinifyOutput": 0,
+	"typescriptModuleType": 0,
+	"typescriptNoImplicitAny": 0,
+	"typescriptNoResolve": 0,
+	"typescriptRemoveComments": 0,
+	"typescriptTargetECMAVersion": 0,
+	"uglifyDefinesString": "",
+	"uglifyFlags2": {
+		"ascii-only": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"booleans": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"bracketize": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"cascade": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"comments": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"comparisons": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"compress": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"conditionals": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"dead_code": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"drop_debugger": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"eval": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"evaluate": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"hoist_funs": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"hoist_vars": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"if_return": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"indent-level": {
+			"active": 0,
+			"flagValue": 4
+			},
+		"indent-start": {
+			"active": 0,
+			"flagValue": 0
+			},
+		"inline-script": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"join_vars": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"loops": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"mangle": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"max-line-len": {
+			"active": 1,
+			"flagValue": 32000
+			},
+		"properties": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"quote-keys": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"screw-ie8": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"semicolons": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"sequences": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"sort": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"space-colon": {
+			"active": 1,
+			"flagValue": -1
+			},
+		"toplevel": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"unsafe": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"unused": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"warnings": {
+			"active": 0,
+			"flagValue": -1
+			},
+		"width": {
+			"active": 1,
+			"flagValue": 80
+			}
+		},
+	"uglifyReservedNamesString": "$",
+	"websiteRelativeRoot": ""
+	},
+"settingsFileVersion": "2"
+}
\ No newline at end of file
diff --git a/static/java/demo/app/css/.gitkeep b/static/java/demo/app/css/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/static/java/demo/app/css/animation.css b/static/java/demo/app/css/animation.css
new file mode 100644
index 0000000000000000000000000000000000000000..ac5a9562fbd637637048f00b8a8eb86e6dbb4f88
--- /dev/null
+++ b/static/java/demo/app/css/animation.css
@@ -0,0 +1,85 @@
+/*
+   Animation example, for spinners
+*/
+.animate-spin {
+  -moz-animation: spin 2s infinite linear;
+  -o-animation: spin 2s infinite linear;
+  -webkit-animation: spin 2s infinite linear;
+  animation: spin 2s infinite linear;
+  display: inline-block;
+}
+@-moz-keyframes spin {
+  0% {
+    -moz-transform: rotate(0deg);
+    -o-transform: rotate(0deg);
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+
+  100% {
+    -moz-transform: rotate(359deg);
+    -o-transform: rotate(359deg);
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+@-webkit-keyframes spin {
+  0% {
+    -moz-transform: rotate(0deg);
+    -o-transform: rotate(0deg);
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+
+  100% {
+    -moz-transform: rotate(359deg);
+    -o-transform: rotate(359deg);
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+@-o-keyframes spin {
+  0% {
+    -moz-transform: rotate(0deg);
+    -o-transform: rotate(0deg);
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+
+  100% {
+    -moz-transform: rotate(359deg);
+    -o-transform: rotate(359deg);
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+@-ms-keyframes spin {
+  0% {
+    -moz-transform: rotate(0deg);
+    -o-transform: rotate(0deg);
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+
+  100% {
+    -moz-transform: rotate(359deg);
+    -o-transform: rotate(359deg);
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
+@keyframes spin {
+  0% {
+    -moz-transform: rotate(0deg);
+    -o-transform: rotate(0deg);
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+
+  100% {
+    -moz-transform: rotate(359deg);
+    -o-transform: rotate(359deg);
+    -webkit-transform: rotate(359deg);
+    transform: rotate(359deg);
+  }
+}
diff --git a/static/java/demo/app/css/app.css b/static/java/demo/app/css/app.css
new file mode 100644
index 0000000000000000000000000000000000000000..d9913983af08c7d8e9ca8cce893b15820219d946
--- /dev/null
+++ b/static/java/demo/app/css/app.css
@@ -0,0 +1,155 @@
+/* app css stylesheet */
+
+.menu {
+  list-style: none;
+  border-bottom: 0.1em solid black;
+  margin-bottom: 2em;
+  padding: 0 0 0.5em;
+}
+
+.menu:before {
+  content: "[";
+}
+
+.menu:after {
+  content: "]";
+}
+
+.menu > li {
+  display: inline;
+}
+
+.menu > li:before {
+  content: "|";
+  padding-right: 0.3em;
+}
+
+.menu > li:nth-child(1):before {
+  content: "";
+  padding: 0;
+}
+
+
+/** SLIDERS **/
+rzslider span.pointer {
+  background-color: transparent;
+}
+
+rzslider span.pointer:after {
+  top: 8px;
+  left: 8px;
+  width: 16px;
+  height: 16px;
+}
+
+rzslider span.bar {
+  background: #0;
+}
+
+rzslider span.bubble {
+  color: black;
+}
+
+/** OTHER **/
+
+.greenhouse {
+  padding: 2em;
+  margin: 1em;
+  border-radius: 0.5em;
+}
+
+.simulator {
+  background: #aef5a7;
+}
+
+.remote {
+  background: #d5f5a7;
+}
+
+.greenhouse-field {
+  margin-top: 1em;
+}
+
+#greenhouse-pulse {
+  text-align: right;
+  font-size: 2em;
+  margin-bottom: -.5em;
+  margin-top: -.5em;
+}
+
+.greenhouse_light_icon {
+  font-size: 2em;
+  vertical-align: -.3em;
+}
+
+.greenhouse_light_icon.on {
+  color: yellow;
+}
+
+.remote label {
+  height: 3em;
+}
+
+.remote .greenhouse_light_icon {
+  font-size: 4em;
+  vertical-align: -0.9em;
+  float: right;
+}
+
+.remote .temperature {
+  font-family: monospace;
+  font-size: 3em;
+  float: right;
+  margin-top: -.2em;
+}
+
+
+#add-greenhouse {
+  text-align: center;
+  background: lightgray;
+}
+
+#add-greenhouse:before {
+  content: "+";
+  font-size: 4em;
+  font-weight: 900;
+  display: block;
+}
+
+/** Blinking pulse (a bit hackish) **/
+
+@keyframes blink {  
+    0% { color: red; }
+    30% { color: red; }
+    100% { color: black; }
+}
+
+@-webkit-keyframes blink {
+    0% { color: red; }
+    30% { color: red; }
+    100% { color: black; }
+}
+
+@keyframes blink2 {  
+    0% { color: red; }
+    30% { color: red; }
+    100% { color: black; }
+}
+
+@-webkit-keyframes blink2 {
+    0% { color: red; }
+    30% { color: red; }
+    100% { color: black; }
+}
+
+.blink {
+    -webkit-animation: blink 0.5s linear ;
+    -moz-animation: blink 0.5s linear ;
+    animation: blink 0.5s linear ;
+} 
+
+.blink2 {
+    -webkit-animation: blink2 0.5s linear ;
+    -moz-animation: blink2 0.5s linear ;
+    animation: blink2  0.5s linear ;
+} 
\ No newline at end of file
diff --git a/static/java/demo/app/css/fontello-codes.css b/static/java/demo/app/css/fontello-codes.css
new file mode 100644
index 0000000000000000000000000000000000000000..03af7652baa3d5f8c698065abf06d9c38e66acd5
--- /dev/null
+++ b/static/java/demo/app/css/fontello-codes.css
@@ -0,0 +1,2 @@
+
+.icon-lightbulb-1:before { content: '\e801'; } /* '' */
\ No newline at end of file
diff --git a/static/java/demo/app/css/fontello-embedded.css b/static/java/demo/app/css/fontello-embedded.css
new file mode 100644
index 0000000000000000000000000000000000000000..0d6c103955babb0d346ef4253c056e911e57ccdd
--- /dev/null
+++ b/static/java/demo/app/css/fontello-embedded.css
@@ -0,0 +1,55 @@
+@font-face {
+  font-family: 'fontello';
+  src: url('../font/fontello.eot?31138458');
+  src: url('../font/fontello.eot?31138458#iefix') format('embedded-opentype'),
+       url('../font/fontello.svg?31138458#fontello') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+@font-face {
+  font-family: 'fontello';
+  src: url('data:application/octet-stream;base64,d09GRgABAAAAAAqIAA4AAAAAEYgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEQAAABWPeNIXGNtYXAAAAGIAAAAOAAAAUrQExm2Y3Z0IAAAAcAAAAAUAAAAHAZL/5JmcGdtAAAB1AAABPkAAAmRigp4O2dhc3AAAAbQAAAACAAAAAgAAAAQZ2x5ZgAABtgAAAE3AAABWHKhbxFoZWFkAAAIEAAAADQAAAA2AUr6j2hoZWEAAAhEAAAAIAAAACQF7QNSaG10eAAACGQAAAAIAAAACAYjAABsb2NhAAAIbAAAAAYAAAAGAKwAAG1heHAAAAh0AAAAIAAAACAA6goPbmFtZQAACJQAAAF3AAACzcydGhxwb3N0AAAKDAAAACIAAAA0+h3gQnByZXAAAAowAAAAVgAAAFaSoZr/eJxjYGQWYpzAwMrAwVTFtIeBgaEHQjM+YDBkZGJgYGJgZWbACgLSXFMYHF4wvmBkDvqfxRDFzMMQABRmBMkBAMIUCr14nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGF4w/v8PUgChJRig6oGAkY1hxAMAZOoGr3icY2BAA0YMRsw8/zeAMAAQuAPheJydVdl201YUlTxkcBI6ZKCgDtfcOFDryoQpGDBpKsV2IR0cCK0EHaQMdOSdxz7ra45Cu1Yf+bTufT0ktHSttiyWz75HW2fYOudGHCMqfRqIa9ShkpcDqaw9lkr3SVzXdS+PlQwGcV22Ek9Jm6idJEpq3exQLvFY6ypZJ1gn4+UgVk9VnmegDOIUHmVJRBtEG6mXJkniieMniRZnEB8lSSAloxCn0shQQjUaxFLVoUzp0KvXE3HTQMpGox51WFT3Q8UnxzWn1KwDRipXOcIV69VGvhunAy97kMQ6wbOthzEeeKx+lCqQipHpyD92Sk6UhoFUcdShVuLoMJNf95FMKs1ApoxiRaXugbjd/XTbFjE9dDq+LkqVRqq6uc4omu3R8aiDKA/Zxumk3NDZ9vDlGVNUq11xs+1AZg1cSslsdJ9EAB0mUuPpAU41nAKpGfVHxdnnzwESyVyUqjxVMod6A5kzO3txMe1uJ6uycKSfBzJvdnbjnYdDp1eHf9H6F0zhzEeP4mJ+PkL6UGp+Ik4kpUZYzPKnhh9xVyBCuTGICxfK4FOEOXRF2tlmXeO1MfaGz/lKqWE9Cdroo/h+Cv1OJCscZ1Gj9UiczWPXda3cZ1BLtbsXOzKvQ5Ui7u8LC64z54RhnhYLVV+e+d4FNP8GiGf8QN40hUv7lilKtG+boky7aIoK7RJUpV02xRTtiimmac+aYob2HVPM0p4zMuP/y9znkfsc3vGQm/Zd5KZ9D7lp30du2g+Qm1YhN20duWkvIDetRm7aVaM6dgQaBmkXUhVB0DSy+mHcVpv1QNaMNHxpYPIuYsj66kRHnbW1yh/Ff3XiCwdyaaKnuyIXm+Iur9sWPjzd7quPmkbdsNX4xpHyMB5Gehya0Fn5zeG/7U3dLpruMqoy6AEVTArAAGXtQALTOtsJpPWap/jyB2BchnjOSkO1VJ87hqbv5Xlf97E58b7H7cYut1x3eQlZ1g1yY/bw31Jkqusf5S2tVCdHrCsnj1VrGEMqvCi6vpKUe7S1G78oqbLyXpTWyueTkJs9gxtCW7buYbAjTGnKJR5eU6UoPdRSjrJDLG8pyjzglIsLWobEuA51D2prxOmhehgbCyGGobS9EHBIKV0V37TKd/Eeq2vY6PjFFeHpenISEZ/iKvtR8FTXRv3oDtq8Zt0ygylVqqf7jE+xr9v2UVlppI6zF7dUB9c06xo5FdNP5GvgdG84aN0DPVR8NEEjVTXH6MYoYzSWNeXfBHQxVn7DaNVi+z3cT52kVay5S5jsmxP34LS7/Sr7tZxbRtb91wa9beSKnyMxvy0K/DsHYrdkDdQ7k4EYC8hZ0BjGFiZ3GK6DbcRt9j8mp//fhoVFclc7Grt56sPVk1Eld9nyuMtNdlnXozZH1U4a+wiNLQ835tjhciy2xGBBtv7B/zHuAXdpUQLg0MhlmIjadKGe6uHqHquxbThXEgF2zbHjdAB6AC5B3xy71vMJgPXcI+cuwH1yCHbIIfiUHILPyLkF8Dk5BF+QQzAgh2CXnDsAD8gheEgOwR45BI/I2QT4khyCr8ghiMkhSMi5DfCYHIIn5BB8TQ7BN0auTmT+lgfZAPrOoptAqZ0aHNo4ZEauTdj7PFj2gUVkH1pE6pGR6xPqUx4s9XuLSP3BIlJ/NHJjQv2JB0v92SJSf7GI1GfGl5kjKa8OnvOODv4El+qtXgAAAAABAAH//wAPeJw1jM1OwkAYAL/9WrpL6Q+FQmlZKBayEGwaA6UNaApRIsYQhCAhBg8ePPQtfCUfwvdSjPEwh0kmAxLA9ydmkgZjeIRX2C+2R0JZNBRO1VSIjLdAmcyonEvkbDLBHBRgVGEnKBRgDwDqHcgy7gGxhMvTy+H5abO6v54FF36bN+1i+dKKM6mN1KYG0nrN/kfpGij6gUjjVEz+iLAvUtvHujNO0oykySSOMDAwjRNn1CbUVn5z0Q3EaJvn+SaRpm7QkTzDcFnPLUWjq6LXI9Q1DA+DjjtbCct6oB9spdQVIbL1ep2JL5XxJCSaZuBNi6lopW9ZDwez98lx3gyzlunbpllrlXXd4y7HjsM9XS+3aqZp+yZfDPn8OA0r1cNud1C8QjgdLKNGI1r6VCOV4XmoMperPxu/LHMAeJxjYGRgYABiwcTWjnh+m68M3MwvgCIM5799nw6h94czMPzfwGTHzAPkcjAwgUQBXbsMTXicY2BkYGAO+p/FEMX8goHh/18mOwagCApgAgCEbQVEA+gAAAI7AAAAAAAAAKwAAAABAAAAAgBdAAMAAAAAAAIAEgAfAG4AAABkCZEAAAAAeJx1kMtqwkAUhv/x0otCW1rotrMqSmm8YDeCIFh0026kuC0xxiQSMzIZBV+j79CH6Uv0WfqbjKUoTZjMd745c+ZkAFzjGwL588SRs8AZo5wLOEXPcpH+2XKJ/GK5jCreLJ/Qv1uu4AGB5Spu8MEKonTOaIFPywJX4tJyARfiznKR/tFyidyzXMateLV8Qu9ZrmAiUstV3IuvgVptdRSERtYGddlutjpyupWKKkrcWLprEyqdyr6cq8T4cawcTy33PPaDdezqfbifJ75OI5XIltPcq5Gf+No1/mxXPd0EbWPmcq7VUg5thlxptfA944TGrLqNxt/zMIDCCltoRLyqEAYSNdo65zaaaKFDmjJDMjPPipDARUzjYs0dYbaSMu5zzBkltD4zYrIDj9/lkR+TAu6PWUUfrR7GE9LujCjzkn057O4wa0RKskw3s7Pf3lNseFqb1nDXrkuddSUxPKgheR+7tQWNR+9kt2Jou2jw/ef/fgDdX4RLAHicY2BigAAuBuwAKM/IxJ2TmZ5RklSak6RryMAAACYrBDgAAEu4AMhSWLEBAY5ZuQgACABjILABI0SwAyNwsgQoCUVSRLIKAgcqsQYBRLEkAYhRWLBAiFixBgNEsSYBiFFYuAQAiFixBgFEWVlZWbgB/4WwBI2xBQBEAAA=') format('woff'),
+       url('data:application/octet-stream;base64,AAEAAAAOAIAAAwBgT1MvMj3jSFwAAADsAAAAVmNtYXDQExm2AAABRAAAAUpjdnQgBkv/kgAAB4AAAAAcZnBnbYoKeDsAAAecAAAJkWdhc3AAAAAQAAAHeAAAAAhnbHlmcqFvEQAAApAAAAFYaGVhZAFK+o8AAAPoAAAANmhoZWEF7QNSAAAEIAAAACRobXR4BiMAAAAABEQAAAAIbG9jYQCsAAAAAARMAAAABm1heHAA6goPAAAEVAAAACBuYW1lzJ0aHAAABHQAAALNcG9zdPod4EIAAAdEAAAANHByZXCSoZr/AAARMAAAAFYAAQMSAZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6AHoAQNS/2oAWgMMAFAAAAABAAAAAAAAAAAAAwAAAAMAAAAcAAEAAAAAAEQAAwABAAAAHAAEACgAAAAGAAQAAQACAADoAf//AAAAAOgB//8AABgAAAEAAAAAAAAAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAA/7ACPgMMADMASgBcAFNAUFcBBwguKiYXEw8GAQQCQgAHCAQIBwRoAwEBBAIEAQJoAAYACAcGCFsABQUAUwAAAApDAAQEAlMAAgILAkRbWVVUT05HRjs6IiEfHhwbFAkQKxE0PgMeAgcUBw4CBxYVFAcWFRQHFhUUBiMOAiYnIiY3NDcmNTQ3JjU0Ny4CJyY3FB8CFhczNjc+ATc2NTQuAiIOAjc0NhcyHgEHFAYiJjc0JiMiJjJQaGhoTjYDORkiIAMaDg4ZCCQZCy4yMAkaJAEHGQ4OGgIiIBk6RyYREUgHfwhHBhYGJiY+TExMPibECggcNiwBDAwOAjwdCAoCETdgPiQCKDpkNVc/Gyw+HQ8fFA8PFR0QDQ0aHBkcAiAXHBoNDRAdFQ8PFB8PHEAqHD9XOSwSE1VRUVUGGgUsOShELhgYLkQfBwwBEiodCAoKCBkcCgABAAAAAQAAEWGFiF8PPPUACwPoAAAAAM/295cAAAAAz/a/VwAA/7ACPgMMAAAACAACAAAAAAAAAAEAAANS/2oAWgPoAAD//QI+AAEAAAAAAAAAAAAAAAAAAAACA+gAAAI7AAAAAAAAAKwAAAABAAAAAgBdAAMAAAAAAAIAEgAfAG4AAABkCZEAAAAAAAAAEgDeAAEAAAAAAAAANQAAAAEAAAAAAAEACAA1AAEAAAAAAAIABwA9AAEAAAAAAAMACABEAAEAAAAAAAQACABMAAEAAAAAAAUACwBUAAEAAAAAAAYACABfAAEAAAAAAAoAKwBnAAEAAAAAAAsAEwCSAAMAAQQJAAAAagClAAMAAQQJAAEAEAEPAAMAAQQJAAIADgEfAAMAAQQJAAMAEAEtAAMAAQQJAAQAEAE9AAMAAQQJAAUAFgFNAAMAAQQJAAYAEAFjAAMAAQQJAAoAVgFzAAMAAQQJAAsAJgHJQ29weXJpZ2h0IChDKSAyMDE0IGJ5IG9yaWdpbmFsIGF1dGhvcnMgQCBmb250ZWxsby5jb21mb250ZWxsb1JlZ3VsYXJmb250ZWxsb2ZvbnRlbGxvVmVyc2lvbiAxLjBmb250ZWxsb0dlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMQA0ACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAQILbGlnaHRidWxiLTEAAAABAAH//wAPAAAAAAAAAAAAAAAAAAAAAAAyADIDDP+wAwz/sLAALLAgYGYtsAEsIGQgsMBQsAQmWrAERVtYISMhG4pYILBQUFghsEBZGyCwOFBYIbA4WVkgsApFYWSwKFBYIbAKRSCwMFBYIbAwWRsgsMBQWCBmIIqKYSCwClBYYBsgsCBQWCGwCmAbILA2UFghsDZgG2BZWVkbsAArWVkjsABQWGVZWS2wAiwgRSCwBCVhZCCwBUNQWLAFI0KwBiNCGyEhWbABYC2wAywjISMhIGSxBWJCILAGI0KyCgACKiEgsAZDIIogirAAK7EwBSWKUVhgUBthUllYI1khILBAU1iwACsbIbBAWSOwAFBYZVktsAQssAdDK7IAAgBDYEItsAUssAcjQiMgsAAjQmGwgGKwAWCwBCotsAYsICBFILACRWOwAUViYESwAWAtsAcsICBFILAAKyOxAgQlYCBFiiNhIGQgsCBQWCGwABuwMFBYsCAbsEBZWSOwAFBYZVmwAyUjYUREsAFgLbAILLEFBUWwAWFELbAJLLABYCAgsAlDSrAAUFggsAkjQlmwCkNKsABSWCCwCiNCWS2wCiwguAQAYiC4BABjiiNhsAtDYCCKYCCwCyNCIy2wCyxLVFixBwFEWSSwDWUjeC2wDCxLUVhLU1ixBwFEWRshWSSwE2UjeC2wDSyxAAxDVVixDAxDsAFhQrAKK1mwAEOwAiVCsQkCJUKxCgIlQrABFiMgsAMlUFixAQBDYLAEJUKKiiCKI2GwCSohI7ABYSCKI2GwCSohG7EBAENgsAIlQrACJWGwCSohWbAJQ0ewCkNHYLCAYiCwAkVjsAFFYmCxAAATI0SwAUOwAD6yAQEBQ2BCLbAOLLEABUVUWACwDCNCIGCwAWG1DQ0BAAsAQkKKYLENBSuwbSsbIlktsA8ssQAOKy2wECyxAQ4rLbARLLECDistsBIssQMOKy2wEyyxBA4rLbAULLEFDistsBUssQYOKy2wFiyxBw4rLbAXLLEIDistsBgssQkOKy2wGSywCCuxAAVFVFgAsAwjQiBgsAFhtQ0NAQALAEJCimCxDQUrsG0rGyJZLbAaLLEAGSstsBsssQEZKy2wHCyxAhkrLbAdLLEDGSstsB4ssQQZKy2wHyyxBRkrLbAgLLEGGSstsCEssQcZKy2wIiyxCBkrLbAjLLEJGSstsCQsIDywAWAtsCUsIGCwDWAgQyOwAWBDsAIlYbABYLAkKiEtsCYssCUrsCUqLbAnLCAgRyAgsAJFY7ABRWJgI2E4IyCKVVggRyAgsAJFY7ABRWJgI2E4GyFZLbAoLLEABUVUWACwARawJyqwARUwGyJZLbApLLAIK7EABUVUWACwARawJyqwARUwGyJZLbAqLCA1sAFgLbArLACwA0VjsAFFYrAAK7ACRWOwAUVisAArsAAWtAAAAAAARD4jOLEqARUqLbAsLCA8IEcgsAJFY7ABRWJgsABDYTgtsC0sLhc8LbAuLCA8IEcgsAJFY7ABRWJgsABDYbABQ2M4LbAvLLECABYlIC4gR7AAI0KwAiVJiopHI0cjYSBYYhshWbABI0KyLgEBFRQqLbAwLLAAFrAEJbAEJUcjRyNhsAZFK2WKLiMgIDyKOC2wMSywABawBCWwBCUgLkcjRyNhILAEI0KwBkUrILBgUFggsEBRWLMCIAMgG7MCJgMaWUJCIyCwCEMgiiNHI0cjYSNGYLAEQ7CAYmAgsAArIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbCAYmEjICCwBCYjRmE4GyOwCENGsAIlsAhDRyNHI2FgILAEQ7CAYmAjILAAKyOwBENgsAArsAUlYbAFJbCAYrAEJmEgsAQlYGQjsAMlYGRQWCEbIyFZIyAgsAQmI0ZhOFktsDIssAAWICAgsAUmIC5HI0cjYSM8OC2wMyywABYgsAgjQiAgIEYjR7AAKyNhOC2wNCywABawAyWwAiVHI0cjYbAAVFguIDwjIRuwAiWwAiVHI0cjYSCwBSWwBCVHI0cjYbAGJbAFJUmwAiVhsAFFYyMgWGIbIVljsAFFYmAjLiMgIDyKOCMhWS2wNSywABYgsAhDIC5HI0cjYSBgsCBgZrCAYiMgIDyKOC2wNiwjIC5GsAIlRlJYIDxZLrEmARQrLbA3LCMgLkawAiVGUFggPFkusSYBFCstsDgsIyAuRrACJUZSWCA8WSMgLkawAiVGUFggPFkusSYBFCstsDkssDArIyAuRrACJUZSWCA8WS6xJgEUKy2wOiywMSuKICA8sAQjQoo4IyAuRrACJUZSWCA8WS6xJgEUK7AEQy6wJistsDsssAAWsAQlsAQmIC5HI0cjYbAGRSsjIDwgLiM4sSYBFCstsDwssQgEJUKwABawBCWwBCUgLkcjRyNhILAEI0KwBkUrILBgUFggsEBRWLMCIAMgG7MCJgMaWUJCIyBHsARDsIBiYCCwACsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsIBiYbACJUZhOCMgPCM4GyEgIEYjR7AAKyNhOCFZsSYBFCstsD0ssDArLrEmARQrLbA+LLAxKyEjICA8sAQjQiM4sSYBFCuwBEMusCYrLbA/LLAAFSBHsAAjQrIAAQEVFBMusCwqLbBALLAAFSBHsAAjQrIAAQEVFBMusCwqLbBBLLEAARQTsC0qLbBCLLAvKi2wQyywABZFIyAuIEaKI2E4sSYBFCstsEQssAgjQrBDKy2wRSyyAAA8Ky2wRiyyAAE8Ky2wRyyyAQA8Ky2wSCyyAQE8Ky2wSSyyAAA9Ky2wSiyyAAE9Ky2wSyyyAQA9Ky2wTCyyAQE9Ky2wTSyyAAA5Ky2wTiyyAAE5Ky2wTyyyAQA5Ky2wUCyyAQE5Ky2wUSyyAAA7Ky2wUiyyAAE7Ky2wUyyyAQA7Ky2wVCyyAQE7Ky2wVSyyAAA+Ky2wViyyAAE+Ky2wVyyyAQA+Ky2wWCyyAQE+Ky2wWSyyAAA6Ky2wWiyyAAE6Ky2wWyyyAQA6Ky2wXCyyAQE6Ky2wXSywMisusSYBFCstsF4ssDIrsDYrLbBfLLAyK7A3Ky2wYCywABawMiuwOCstsGEssDMrLrEmARQrLbBiLLAzK7A2Ky2wYyywMyuwNystsGQssDMrsDgrLbBlLLA0Ky6xJgEUKy2wZiywNCuwNistsGcssDQrsDcrLbBoLLA0K7A4Ky2waSywNSsusSYBFCstsGossDUrsDYrLbBrLLA1K7A3Ky2wbCywNSuwOCstsG0sK7AIZbADJFB4sAEVMC0AAABLuADIUlixAQGOWbkIAAgAYyCwASNEsAMjcLIEKAlFUkSyCgIHKrEGAUSxJAGIUViwQIhYsQYDRLEmAYhRWLgEAIhYsQYBRFlZWVm4Af+FsASNsQUARAAA') format('truetype');
+}
+/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
+/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
+/*
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+  @font-face {
+    font-family: 'fontello';
+    src: url('../font/fontello.svg?31138458#fontello') format('svg');
+  }
+}
+*/
+ 
+ [class^="icon-"]:before, [class*=" icon-"]:before {
+  font-family: "fontello";
+  font-style: normal;
+  font-weight: normal;
+  speak: none;
+ 
+  display: inline-block;
+  text-decoration: inherit;
+  width: 1em;
+  margin-right: .2em;
+  text-align: center;
+  /* opacity: .8; */
+ 
+  /* For safety - reset parent styles, that can break glyph codes*/
+  font-variant: normal;
+  text-transform: none;
+     
+  /* fix buttons height, for twitter bootstrap */
+  line-height: 1em;
+ 
+  /* Animation center compensation - margins should be symmetric */
+  /* remove if not needed */
+  margin-left: .2em;
+ 
+  /* you can be more comfortable with increased icons size */
+  /* font-size: 120%; */
+ 
+  /* Uncomment for 3D effect */
+  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
+}
+.icon-lightbulb-1:before { content: '\e801'; } /* '' */
\ No newline at end of file
diff --git a/static/java/demo/app/css/fontello-ie7-codes.css b/static/java/demo/app/css/fontello-ie7-codes.css
new file mode 100644
index 0000000000000000000000000000000000000000..15d6fcc8c3c14976eb2b36d0eadbd7eaceade500
--- /dev/null
+++ b/static/java/demo/app/css/fontello-ie7-codes.css
@@ -0,0 +1,2 @@
+
+.icon-lightbulb-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe801;&nbsp;'); }
\ No newline at end of file
diff --git a/static/java/demo/app/css/fontello-ie7.css b/static/java/demo/app/css/fontello-ie7.css
new file mode 100644
index 0000000000000000000000000000000000000000..86bd250a42a0b581c36f54dd4e98f9b072f11526
--- /dev/null
+++ b/static/java/demo/app/css/fontello-ie7.css
@@ -0,0 +1,13 @@
+[class^="icon-"], [class*=" icon-"] {
+  font-family: 'fontello';
+  font-style: normal;
+  font-weight: normal;
+ 
+  /* fix buttons height */
+  line-height: 1em;
+ 
+  /* you can be more comfortable with increased icons size */
+  /* font-size: 120%; */
+}
+ 
+.icon-lightbulb-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe801;&nbsp;'); }
\ No newline at end of file
diff --git a/static/java/demo/app/css/fontello.css b/static/java/demo/app/css/fontello.css
new file mode 100644
index 0000000000000000000000000000000000000000..93583c6f36f9dabb0bb5abaddb9547493a65c480
--- /dev/null
+++ b/static/java/demo/app/css/fontello.css
@@ -0,0 +1,53 @@
+@font-face {
+  font-family: 'fontello';
+  src: url('../font/fontello.eot?70911392');
+  src: url('../font/fontello.eot?70911392#iefix') format('embedded-opentype'),
+       url('../font/fontello.woff?70911392') format('woff'),
+       url('../font/fontello.ttf?70911392') format('truetype'),
+       url('../font/fontello.svg?70911392#fontello') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
+/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
+/*
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+  @font-face {
+    font-family: 'fontello';
+    src: url('../font/fontello.svg?70911392#fontello') format('svg');
+  }
+}
+*/
+ 
+ [class^="icon-"]:before, [class*=" icon-"]:before {
+  font-family: "fontello";
+  font-style: normal;
+  font-weight: normal;
+  speak: none;
+ 
+  display: inline-block;
+  text-decoration: inherit;
+  width: 1em;
+  margin-right: .2em;
+  text-align: center;
+  /* opacity: .8; */
+ 
+  /* For safety - reset parent styles, that can break glyph codes*/
+  font-variant: normal;
+  text-transform: none;
+     
+  /* fix buttons height, for twitter bootstrap */
+  line-height: 1em;
+ 
+  /* Animation center compensation - margins should be symmetric */
+  /* remove if not needed */
+  margin-left: .2em;
+ 
+  /* you can be more comfortable with increased icons size */
+  /* font-size: 120%; */
+ 
+  /* Uncomment for 3D effect */
+  /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
+}
+ 
+.icon-lightbulb-1:before { content: '\e801'; } /* '' */
\ No newline at end of file
diff --git a/static/java/demo/app/font/fontello.eot b/static/java/demo/app/font/fontello.eot
new file mode 100644
index 0000000000000000000000000000000000000000..816d2c9485d1f29b0b66defa12e6223445774027
Binary files /dev/null and b/static/java/demo/app/font/fontello.eot differ
diff --git a/static/java/demo/app/font/fontello.svg b/static/java/demo/app/font/fontello.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d368031c47970bd8461332e4615ef2a6d1103c5e
--- /dev/null
+++ b/static/java/demo/app/font/fontello.svg
@@ -0,0 +1,12 @@
+<?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>Copyright (C) 2014 by original authors @ fontello.com</metadata>
+<defs>
+<font id="fontello" horiz-adv-x="1000" >
+<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
+<missing-glyph horiz-adv-x="1000" />
+<glyph glyph-name="lightbulb-1" unicode="&#xe801;" d="m0 529q0 55 25 103t65 79 92 49 104 19 104-19 91-49 66-79 24-103q0-87-57-150-25-27-42-49t-33-53-19-60q26-15 26-46 0-20-14-35 14-15 14-36 0-29-25-45 8-13 8-26 0-26-18-40t-43-14q-11-25-34-39t-48-15-49 15-33 39q-26 0-44 14t-17 40q0 13 7 26-25 16-25 45 0 21 14 36-14 15-14 35 0 31 26 46-2 28-19 60t-33 53-41 49q-58 63-58 150z m71 0q0-57 38-101 6-6 17-18t17-19q72-85 79-166h127q8 81 79 166 6 6 17 19t17 18q38 44 38 101 0 40-19 74t-50 57-69 35-76 12-76-12-69-35-50-57-20-74z m197 71q0 7 5 13t13 5q28 0 55-9t49-30 21-50q0-8-6-13t-12-5-13 5-5 13q0 25-30 39t-59 14q-8 0-13 5t-5 13z" horiz-adv-x="571.4" />
+</font>
+</defs>
+</svg>
\ No newline at end of file
diff --git a/static/java/demo/app/font/fontello.ttf b/static/java/demo/app/font/fontello.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..93a831adf7845abd9d74d60f011f9d8f44f424be
Binary files /dev/null and b/static/java/demo/app/font/fontello.ttf differ
diff --git a/static/java/demo/app/font/fontello.woff b/static/java/demo/app/font/fontello.woff
new file mode 100644
index 0000000000000000000000000000000000000000..8f2c3ea67d48fb754d6c55c0124845069b8f8e2d
Binary files /dev/null and b/static/java/demo/app/font/fontello.woff differ
diff --git a/static/java/demo/app/img/.gitkeep b/static/java/demo/app/img/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/static/java/demo/app/img/greenhouse.png b/static/java/demo/app/img/greenhouse.png
new file mode 100644
index 0000000000000000000000000000000000000000..a82407739a4ed88caf5f08f3ff00cab20abb9b8f
Binary files /dev/null and b/static/java/demo/app/img/greenhouse.png differ
diff --git a/static/java/demo/app/index-async.html b/static/java/demo/app/index-async.html
new file mode 100644
index 0000000000000000000000000000000000000000..ae63286a5f8f326ddae25b444e5b1770f9d7e67b
--- /dev/null
+++ b/static/java/demo/app/index-async.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <link rel="stylesheet" href="bower_components/html5-boilerplate/css/normalize.css">
+  <link rel="stylesheet" href="bower_components/html5-boilerplate/css/main.css">
+  <style>
+    [ng-cloak] {
+      display: none;
+    }
+  </style>
+  <script src="bower_components/html5-boilerplate/js/vendor/modernizr-2.6.2.min.js"></script>
+  <script>
+    // include angular loader, which allows the files to load in any order
+    //@@NG_LOADER_START@@
+    // You need to run `npm run update-index-async` to inject the angular async code here
+    //@@NG_LOADER_END@@
+
+    // include a third-party async loader library
+    /*!
+     * $script.js v1.3
+     * https://github.com/ded/script.js
+     * Copyright: @ded & @fat - Dustin Diaz, Jacob Thornton 2011
+     * Follow our software http://twitter.com/dedfat
+     * License: MIT
+     */
+    !function(a,b,c){function t(a,c){var e=b.createElement("script"),f=j;e.onload=e.onerror=e[o]=function(){e[m]&&!/^c|loade/.test(e[m])||f||(e.onload=e[o]=null,f=1,c())},e.async=1,e.src=a,d.insertBefore(e,d.firstChild)}function q(a,b){p(a,function(a){return!b(a)})}var d=b.getElementsByTagName("head")[0],e={},f={},g={},h={},i="string",j=!1,k="push",l="DOMContentLoaded",m="readyState",n="addEventListener",o="onreadystatechange",p=function(a,b){for(var c=0,d=a.length;c<d;++c)if(!b(a[c]))return j;return 1};!b[m]&&b[n]&&(b[n](l,function r(){b.removeEventListener(l,r,j),b[m]="complete"},j),b[m]="loading");var s=function(a,b,d){function o(){if(!--m){e[l]=1,j&&j();for(var a in g)p(a.split("|"),n)&&!q(g[a],n)&&(g[a]=[])}}function n(a){return a.call?a():e[a]}a=a[k]?a:[a];var i=b&&b.call,j=i?b:d,l=i?a.join(""):b,m=a.length;c(function(){q(a,function(a){h[a]?(l&&(f[l]=1),o()):(h[a]=1,l&&(f[l]=1),t(s.path?s.path+a+".js":a,o))})},0);return s};s.get=t,s.ready=function(a,b,c){a=a[k]?a:[a];var d=[];!q(a,function(a){e[a]||d[k](a)})&&p(a,function(a){return e[a]})?b():!function(a){g[a]=g[a]||[],g[a][k](b),c&&c(d)}(a.join("|"));return s};var u=a.$script;s.noConflict=function(){a.$script=u;return this},typeof module!="undefined"&&module.exports?module.exports=s:a.$script=s}(this,document,setTimeout)
+
+    // load all of the dependencies asynchronously.
+    $script([
+      'bower_components/angular/angular.js',
+      'bower_components/angular-route/angular-route.js',
+      'js/app.js',
+      'js/services.js',
+      'js/controllers.js',
+      'js/filters.js',
+      'js/directives.js'
+    ], function() {
+      // when all is done, execute bootstrap angular application
+      angular.bootstrap(document, ['myApp']);
+    });
+  </script>
+  <title>My AngularJS App</title>
+  <link rel="stylesheet" href="css/app.css">
+</head>
+<body ng-cloak>
+  <ul class="menu">
+    <li><a href="#/view1">view1</a></li>
+    <li><a href="#/view2">view2</a></li>
+  </ul>
+
+  <div ng-view></div>
+
+  <div>Angular seed app: v<span app-version></span></div>
+
+</body>
+</html>
diff --git a/static/java/demo/app/index.html b/static/java/demo/app/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..a765c983d17d6eae22aac5c273dac0be246812f9
--- /dev/null
+++ b/static/java/demo/app/index.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html lang="en" ng-app="myApp" class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html lang="en" ng-app="myApp" class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html lang="en" ng-app="myApp" class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html lang="en" ng-app="myApp" class="no-js"> <!--<![endif]-->
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Eclipse IoT Greenhouse</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link rel="stylesheet" href="bower_components/html5-boilerplate/css/normalize.css">
+  <link rel="stylesheet" href="bower_components/html5-boilerplate/css/main.css">
+
+  <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet"/>
+  <link rel="stylesheet" href="bower_components/angularjs-slider/dist/rzslider.css"/>
+  <link rel="stylesheet" href="css/app.css"/>
+
+  <script src="bower_components/html5-boilerplate/js/vendor/modernizr-2.6.2.min.js"></script>
+  </head>
+<body>
+  <!--[if lt IE 7]>
+      <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+  <![endif]-->
+
+  <div ng-view></div>
+
+  <!-- In production use:
+  <script src="//ajax.googleapis.com/ajax/libs/angularjs/x.x.x/angular.min.js"></script>
+  -->
+
+    <script src="http://platform.twitter.com/widgets.js"></script>
+
+  <script src="bower_components/angular/angular.js"></script>
+  <script src="bower_components/angular-route/angular-route.js"></script>
+  <script src="js/app.js"></script>
+  <script src="js/services.js"></script>
+  <script src="js/controllers.js"></script>
+  <script src="js/filters.js"></script>
+  <script src="js/directives.js"></script>
+
+  <script src="js/ui-bootstrap-tpls-0.11.0.min.js"></script>
+
+  <script src="bower_components/angularjs-slider/rzslider.js"></script>
+
+  <!-- Social share -->
+  <style rel='stylesheet' type='text/css' href="bower_components/angular-socialshare/angular-socialshare.min.css"></style>
+  <script src="bower_components/angular-socialshare/angular-socialshare.min.js"></script>
+
+  <!-- MQTT over WebSockets -->
+  <script src="http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.javascript.git/plain/src/mqttws31.js?id=v1.0.0"></script>
+
+  <!-- fontello -->
+  <link rel="stylesheet" href="css/fontello.css">
+  <link rel="stylesheet" href="css/animation.css"><!--[if IE 7]><link rel="stylesheet" href="css/fontello-ie7.css"><![endif]-->
+
+</body>
+</html>
diff --git a/static/java/demo/app/js/app.js b/static/java/demo/app/js/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..53ba49cd54589c810100e27a0a7f0c8ce23fa1a3
--- /dev/null
+++ b/static/java/demo/app/js/app.js
@@ -0,0 +1,41 @@
+'use strict';
+
+
+// Declare app level module which depends on filters, and services
+angular.module('myApp', [
+    'ngRoute',
+    'myApp.filters',
+    'myApp.services',
+    'myApp.directives',
+    'myApp.controllers',
+
+    'rzModule', // angularjs-slider
+
+    'ui.bootstrap',
+    'djds4rce.angular-socialshare'
+]).
+config(['$routeProvider', '$locationProvider',
+    function($routeProvider, $locationProvider) {
+//        $locationProvider.html5Mode(true).hashPrefix('!');
+
+        $routeProvider.when('/greenhouses', {
+            templateUrl: 'partials/greenhouses-list.html',
+            controller: 'GreenhousesListController'
+        });
+
+        $routeProvider.when('/greenhouses/remote/:remoteName', {
+            templateUrl: 'partials/greenhouses-list.html',
+            controller: 'GreenhousesListController'
+        });
+
+        $routeProvider.when('/greenhouses/simulator/:simulatorName', {
+            templateUrl: 'partials/greenhouses-list.html',
+            controller: 'GreenhousesListController'
+        });
+
+        $routeProvider.otherwise({
+            redirectTo: '/greenhouses'
+        });
+
+    }
+]);
\ No newline at end of file
diff --git a/static/java/demo/app/js/controllers.js b/static/java/demo/app/js/controllers.js
new file mode 100644
index 0000000000000000000000000000000000000000..3564ff928d3887767439d5be3fed14977e5d8316
--- /dev/null
+++ b/static/java/demo/app/js/controllers.js
@@ -0,0 +1,164 @@
+'use strict';
+
+/* Controllers */
+
+angular.module('myApp.controllers', [])
+    .controller('GreenhousesListController', ['$scope', '$timeout', 'appSettings', '$http', '$routeParams',
+
+        function($scope, $timeout, appSettings, $http, $routeParams) {
+            if (angular.isUndefined($routeParams.simulatorName) &&
+                angular.isUndefined($routeParams.remoteName)) {
+                $scope.multi = true;
+            }
+
+            /**
+             * MQTT Initialization
+             **/
+
+            console.log(appSettings);
+
+            var client = new Paho.MQTT.Client("ws://iot.eclipse.org/ws", "gh-" + new Date().getTime());
+            client.onConnectionLost = function(responseObject) {
+                if (responseObject.errorCode !== 0) {
+                    console.log("onConnectionLost:" + responseObject.errorMessage);
+                    console.log("Reconnecting... [" + new Date() + "]");
+                    client.connect({
+                        onSuccess: function() {
+                            client.subscribe(appSettings.topic_prefix + "+/+/#");
+                        }
+                    });
+                }
+            };
+
+            client.onMessageArrived = function(message) {
+                var topic = message.destinationName;
+                var topicFragments = topic.split('/');
+                // topicFragments[0] == {appSetting.topic_prefix}
+                // topicFragments[1] == {unique_id}
+                // topicFragments[2] == "actuators"
+                // topicFragments[3] == {actuatorName} (e.g. light)
+
+                var uniqueId = topicFragments[1];
+                var actuatorName = topicFragments[3];
+
+                // simulators lookup to update light states
+                if (topicFragments[2] === "actuators") {
+                    for (var i in $scope.greenhouse_simulators) {
+                        var greenhouse = $scope.greenhouse_simulators[i];
+                        if (greenhouse.name === uniqueId) {
+                            if (topicFragments[3] === "light") {
+                                greenhouse.lightState = message.payloadString;
+                                // publish on sensors/light to acknowledge that
+                                // the state change is successful
+                                var message = new Paho.MQTT.Message(greenhouse.lightState);
+                                message.destinationName = appSettings.topic_prefix + greenhouse.name + "/sensors/light";
+                                message.retained = true;
+                                client.send(message);
+                            }
+
+                            $scope.$apply();
+                            break;
+                        }
+                    }
+                }
+
+                // remotes lookup to update temperatures
+                if (topicFragments[2] === "sensors") {
+                    for (var i in $scope.greenhouse_remotes) {
+                        var greenhouse = $scope.greenhouse_remotes[i];
+                        if (greenhouse.name === uniqueId) {
+                            if (topicFragments[3] === "temperature") {
+                                if ("blink2" === greenhouse.pulse)
+                                    greenhouse.pulse = "blink";
+                                else
+                                    greenhouse.pulse = "blink2";
+                                greenhouse.temperature = message.payloadString;
+                            } else if (topicFragments[3] === "light") {
+                                greenhouse.lightState = message.payloadString;
+                            }
+
+                            $scope.$apply();
+                            break;
+                        }
+                    }
+                }
+            };
+
+            client.connect({
+                onSuccess: function() {
+                    $scope.$apply(function() {
+                        if (angular.isDefined($routeParams.simulatorName)) {
+                            $scope.addGreenhouseSimulator($routeParams.simulatorName);
+                            $scope.simulatorName = $routeParams.simulatorName;
+                        } else if (angular.isDefined($routeParams.remoteName)) {
+                            $scope.addGreenhouseRemote($routeParams.remoteName);
+                            $scope.remoteName = $routeParams.remoteName;
+                        }
+                    });
+                    client.subscribe(appSettings.topic_prefix + "+/+/#");
+                }
+            });
+
+            $scope.greenhouse_simulators = [];
+            $scope.addGreenhouseSimulator = function(name) {
+                if (name === undefined) {
+                    name = randomMAC();
+                }
+
+                var greenhouse = {
+                    name: name,
+                    temperature: Math.floor((Math.random() * 10) + 20),
+                    refreshInterval: 2,
+                };
+
+                var publishTemperatureRegularly = function() {
+                    if ("blink2" === greenhouse.pulse)
+                        greenhouse.pulse = "blink";
+                    else
+                        greenhouse.pulse = "blink2";
+
+                    var message = new Paho.MQTT.Message("" + greenhouse.temperature);
+                    message.destinationName = appSettings.topic_prefix + greenhouse.name + "/sensors/temperature";
+                    client.send(message);
+
+                    greenhouse.timer = $timeout(publishTemperatureRegularly, greenhouse.refreshInterval * 1000);
+                }
+
+                publishTemperatureRegularly();
+
+                $scope.greenhouse_simulators.push(greenhouse);
+            };
+
+            $scope.greenhouse_remotes = [];
+            $scope.addGreenhouseRemote = function(name) {
+                if (name === undefined) {
+                    name = randomMAC();
+                }
+
+                var greenhouse = {
+                    name: name,
+                    toggleLight: function() {
+                        var message = new Paho.MQTT.Message((this.lightState === "on") ? "off" : "on");
+                        message.destinationName = appSettings.topic_prefix + this.name + "/actuators/light";
+                        client.send(message);
+                    }
+                };
+
+                $scope.greenhouse_remotes.push(greenhouse);
+
+            }
+        }
+
+    ]);
+
+// do not declare globally?
+function randomMAC() {
+    var name = '54:52:00';
+
+    for (var i = 0; i < 6; i++) {
+        if (i % 2 === 0) name += ':';
+        name += Math.floor(Math.random() * 16).toString(16);
+    }
+
+    return name;
+}
\ No newline at end of file
diff --git a/static/java/demo/app/js/directives.js b/static/java/demo/app/js/directives.js
new file mode 100644
index 0000000000000000000000000000000000000000..5874e03939dc0a689cd43c2f9d8cf7b558759191
--- /dev/null
+++ b/static/java/demo/app/js/directives.js
@@ -0,0 +1,11 @@
+'use strict';
+
+/* Directives */
+angular.module('myApp.directives', []).
+directive('appVersion', ['version',
+    function(version) {
+        return function(scope, elm, attrs) {
+            elm.text(version);
+        };
+    }
+]);
diff --git a/static/java/demo/app/js/filters.js b/static/java/demo/app/js/filters.js
new file mode 100644
index 0000000000000000000000000000000000000000..e350b3bfd627d4533d84e6e544b86e0e97950f03
--- /dev/null
+++ b/static/java/demo/app/js/filters.js
@@ -0,0 +1,11 @@
+'use strict';
+
+/* Filters */
+angular.module('myApp.filters', []).
+filter('interpolate', ['version',
+    function(version) {
+        return function(text) {
+            return String(text).replace(/\%VERSION\%/mg, version);
+        };
+    }
+]);
\ No newline at end of file
diff --git a/static/java/demo/app/js/services.js b/static/java/demo/app/js/services.js
new file mode 100644
index 0000000000000000000000000000000000000000..400b5c60277fba2cce4b2fc701429e9778e08a62
--- /dev/null
+++ b/static/java/demo/app/js/services.js
@@ -0,0 +1,11 @@
+'use strict';
+
+/* Services */
+
+
+// Demonstrate how to register services
+// In this case it is a simple value service.
+angular.module('myApp.services', []).
+constant('appSettings', {
+    topic_prefix: "javaonedemo/"
+});
\ No newline at end of file
diff --git a/static/java/demo/app/js/ui-bootstrap-tpls-0.11.0.min.js b/static/java/demo/app/js/ui-bootstrap-tpls-0.11.0.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..fa6a8613174cfc4bad968a1a7136aedffeacedbf
--- /dev/null
+++ b/static/java/demo/app/js/ui-bootstrap-tpls-0.11.0.min.js
@@ -0,0 +1,10 @@
+/*
+ * angular-ui-bootstrap
+ * http://angular-ui.github.io/bootstrap/
+
+ * Version: 0.11.0 - 2014-05-01
+ * License: MIT
+ */
+angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(a,b,c){function d(a){for(var b in a)if(void 0!==f.style[b])return a[b]}var e=function(d,f,g){g=g||{};var h=a.defer(),i=e[g.animation?"animationEndEventName":"transitionEndEventName"],j=function(){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(f)?d.addClass(f):angular.isFunction(f)?f(d):angular.isObject(f)&&d.css(f),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},f=document.createElement("trans"),g={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},h={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return e.transitionEndEventName=d(g),e.animationEndEventName=d(h),e}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function(a){return{link:function(b,c,d){function e(b){function d(){j===e&&(j=void 0)}var e=a(c,b);return j&&j.cancel(),j=e,e.then(d,d),e}function f(){k?(k=!1,g()):(c.removeClass("collapse").addClass("collapsing"),e({height:c[0].scrollHeight+"px"}).then(g))}function g(){c.removeClass("collapsing"),c.addClass("collapse in"),c.css({height:"auto"})}function h(){if(k)k=!1,i(),c.css({height:0});else{c.css({height:c[0].scrollHeight+"px"});{c[0].offsetWidth}c.removeClass("collapse in").addClass("collapsing"),e({height:0}).then(i)}}function i(){c.removeClass("collapsing"),c.addClass("collapse")}var j,k=!0;b.$watch(d.collapse,function(a){a?h():f()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,function(){}))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$transition",function(a,b,c){function d(){e();var c=+a.interval;!isNaN(c)&&c>=0&&(g=b(f,c))}function e(){g&&(b.cancel(g),g=null)}function f(){h?(a.next(),d()):a.pause()}var g,h,i=this,j=i.slides=a.slides=[],k=-1;i.currentSlide=null;var l=!1;i.select=a.select=function(e,f){function g(){if(!l){if(i.currentSlide&&angular.isString(f)&&!a.noTransition&&e.$element){e.$element.addClass(f);{e.$element[0].offsetWidth}angular.forEach(j,function(a){angular.extend(a,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(e,{direction:f,active:!0,entering:!0}),angular.extend(i.currentSlide||{},{direction:f,leaving:!0}),a.$currentTransition=c(e.$element,{}),function(b,c){a.$currentTransition.then(function(){h(b,c)},function(){h(b,c)})}(e,i.currentSlide)}else h(e,i.currentSlide);i.currentSlide=e,k=m,d()}}function h(b,c){angular.extend(b,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(c||{},{direction:"",active:!1,leaving:!1,entering:!1}),a.$currentTransition=null}var m=j.indexOf(e);void 0===f&&(f=m>k?"next":"prev"),e&&e!==i.currentSlide&&(a.$currentTransition?(a.$currentTransition.cancel(),b(g)):g())},a.$on("$destroy",function(){l=!0}),i.indexOfSlide=function(a){return j.indexOf(a)},a.next=function(){var b=(k+1)%j.length;return a.$currentTransition?void 0:i.select(j[b],"next")},a.prev=function(){var b=0>k-1?j.length-1:k-1;return a.$currentTransition?void 0:i.select(j[b],"prev")},a.isActive=function(a){return i.currentSlide===a},a.$watch("interval",d),a.$on("$destroy",e),a.play=function(){h||(h=!0,d())},a.pause=function(){a.noPause||(h=!1,e())},i.addSlide=function(b,c){b.$element=c,j.push(b),1===j.length||b.active?(i.select(j[j.length-1]),1==j.length&&a.play()):b.active=!1},i.removeSlide=function(a){var b=j.indexOf(a);j.splice(b,1),j.length>0&&a.active?i.select(b>=j.length?j[b-1]:j[b]):k>b&&k--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(a,b){function c(a,b,c){return 1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}this.parsers={};var d={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:a.DATETIME_FORMATS.MONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.MONTH.indexOf(b)}},MMM:{regex:a.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.SHORTMONTH.indexOf(b)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:a.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:a.DATETIME_FORMATS.SHORTDAY.join("|")}};this.createParser=function(a){var c=[],e=a.split("");return angular.forEach(d,function(b,d){var f=a.indexOf(d);if(f>-1){a=a.split(""),e[f]="("+b.regex+")",a[f]="$";for(var g=f+1,h=f+d.length;h>g;g++)e[g]="",a[g]="$";a=a.join(""),c.push({index:f,apply:b.apply})}}),{regex:new RegExp("^"+e.join("")+"$"),map:b(c,"index")}},this.parse=function(b,d){if(!angular.isString(b))return b;d=a.DATETIME_FORMATS[d]||d,this.parsers[d]||(this.parsers[d]=this.createParser(d));var e=this.parsers[d],f=e.regex,g=e.map,h=b.match(f);if(h&&h.length){for(var i,j={year:1900,month:0,date:1,hours:0},k=1,l=h.length;l>k;k++){var m=g[k-1];m.apply&&m.apply.call(j,h[k])}return c(j.year,j.month,j.date)&&(i=new Date(j.year,j.month,j.date,j.hours)),i}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange"],function(c,e){i[c]=angular.isDefined(b[c])?8>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):h[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=h[d]?new Date(h[d]):null}),a.datepickerMode=a.datepickerMode||h.datepickerMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),this.activeDate=angular.isDefined(b.initDate)?a.$parent.$eval(b.initDate):new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$modelValue){var a=new Date(j.$modelValue),b=!isNaN(a);b?this.activeDate=a:f.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),j.$setValidity("date",b)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$modelValue?new Date(j.$modelValue):null;j.$setValidity("date-disabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$modelValue?new Date(j.$modelValue):null;return{date:a,label:g(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$modelValue?new Date(j.$modelValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){e(function(){i.element[0].focus()},0,!1)};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){var c=new Array(b),d=new Date(a),e=0;for(d.setHours(12);b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=h(b.rows[0][0].date),p=b.rows.length;b.weekNumbers.push(o++)<p;);}},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},e.handleKeyDown=function(a){var b=e.activeDate.getDate();if("left"===a)b-=1;else if("up"===a)b-=7;else if("right"===a)b+=1;else if("down"===a)b+=7;else if("pageup"===a||"pagedown"===a){var c=e.activeDate.getMonth()+("pageup"===a?-1:1);e.activeDate.setMonth(c,1),b=Math.min(f(e.activeDate.getFullYear(),e.activeDate.getMonth()),b)}else"home"===a?b=1:"end"===a&&(b=f(e.activeDate.getFullYear(),e.activeDate.getMonth()));e.activeDate.setDate(b)},e.refreshView()}}}]).directive("monthpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/month.html",require:"^datepicker",link:function(b,c,d,e){e.step={years:1},e.element=c,e._refreshView=function(){for(var c=new Array(12),d=e.activeDate.getFullYear(),f=0;12>f;f++)c[f]=angular.extend(e.createDateObject(new Date(d,f,1),e.formatMonth),{uid:b.uniqueId+"-"+f});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(c,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a){var b=e.activeDate.getMonth();if("left"===a)b-=1;else if("up"===a)b-=3;else if("right"===a)b+=1;else if("down"===a)b+=3;else if("pageup"===a||"pagedown"===a){var c=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(c)}else"home"===a?b=0:"end"===a&&(b=11);e.activeDate.setMonth(b)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b=new Array(f),c=0,g=e(d.activeDate.getFullYear());f>c;c++)b[c]=angular.extend(d.createDateObject(new Date(g+c,0,1),d.formatYear),{uid:a.uniqueId+"-"+c});a.title=[b[0].label,b[f-1].label].join(" - "),a.rows=d.split(b,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a){var b=d.activeDate.getFullYear();"left"===a?b-=1:"up"===a?b-=5:"right"===a?b+=1:"down"===a?b+=5:"pageup"===a||"pagedown"===a?b+=("pageup"===a?-1:1)*d.step.years:"home"===a?b=e(d.activeDate.getFullYear()):"end"===a&&(b=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(b)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&"},link:function(h,i,j,k){function l(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function m(a){if(a){if(angular.isDate(a)&&!isNaN(a))return k.$setValidity("date",!0),a;if(angular.isString(a)){var b=f.parse(a,n)||new Date(a);return isNaN(b)?void k.$setValidity("date",!1):(k.$setValidity("date",!0),b)}return void k.$setValidity("date",!1)}return k.$setValidity("date",!0),null}var n,o=angular.isDefined(j.closeOnDateSelection)?h.$parent.$eval(j.closeOnDateSelection):g.closeOnDateSelection,p=angular.isDefined(j.datepickerAppendToBody)?h.$parent.$eval(j.datepickerAppendToBody):g.appendToBody;h.showButtonBar=angular.isDefined(j.showButtonBar)?h.$parent.$eval(j.showButtonBar):g.showButtonBar,h.getText=function(a){return h[a+"Text"]||g[a+"Text"]},j.$observe("datepickerPopup",function(a){n=a||g.datepickerPopup,k.$render()});var q=angular.element("<div datepicker-popup-wrap><div datepicker></div></div>");q.attr({"ng-model":"date","ng-change":"dateSelection()"});var r=angular.element(q.children()[0]);j.datepickerOptions&&angular.forEach(h.$parent.$eval(j.datepickerOptions),function(a,b){r.attr(l(b),a)}),angular.forEach(["minDate","maxDate"],function(a){j[a]&&(h.$parent.$watch(b(j[a]),function(b){h[a]=b}),r.attr(l(a),a))}),j.dateDisabled&&r.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),k.$parsers.unshift(m),h.dateSelection=function(a){angular.isDefined(a)&&(h.date=a),k.$setViewValue(h.date),k.$render(),o&&(h.isOpen=!1,i[0].focus())},i.bind("input change keyup",function(){h.$apply(function(){h.date=k.$modelValue})}),k.$render=function(){var a=k.$viewValue?e(k.$viewValue,n):"";i.val(a),h.date=m(k.$modelValue)};var s=function(a){h.isOpen&&a.target!==i[0]&&h.$apply(function(){h.isOpen=!1})},t=function(a){h.keydown(a)};i.bind("keydown",t),h.keydown=function(a){27===a.which?(a.preventDefault(),a.stopPropagation(),h.close()):40!==a.which||h.isOpen||(h.isOpen=!0)},h.$watch("isOpen",function(a){a?(h.$broadcast("datepicker.focus"),h.position=p?d.offset(i):d.position(i),h.position.top=h.position.top+i.prop("offsetHeight"),c.bind("click",s)):c.unbind("click",s)}),h.select=function(a){if("today"===a){var b=new Date;angular.isDate(k.$modelValue)?(a=new Date(k.$modelValue),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}h.dateSelection(a)},h.close=function(){h.isOpen=!1,i[0].focus()};var u=a(q)(h);p?c.find("body").append(u):i.after(u),h.$on("$destroy",function(){u.remove(),i.unbind("keydown",t),c.unbind("click",s)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",[]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document",function(a){var b=null;this.open=function(e){b||(a.bind("click",c),a.bind("keydown",d)),b&&b!==e&&(b.isOpen=!1),b=e},this.close=function(e){b===e&&(b=null,a.unbind("click",c),a.unbind("keydown",d))};var c=function(a){a&&a.isDefaultPrevented()||b.$apply(function(){b.isOpen=!1})},d=function(a){27===a.which&&(b.focusToggleElement(),c())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate",function(a,b,c,d,e,f){var g,h=this,i=a.$new(),j=d.openClass,k=angular.noop,l=b.onToggle?c(b.onToggle):angular.noop;this.init=function(d){h.$element=d,b.isOpen&&(g=c(b.isOpen),k=g.assign,a.$watch(g,function(a){i.isOpen=!!a}))},this.toggle=function(a){return i.isOpen=arguments.length?!!a:!i.isOpen},this.isOpen=function(){return i.isOpen},i.focusToggleElement=function(){h.toggleElement&&h.toggleElement[0].focus()},i.$watch("isOpen",function(b,c){f[b?"addClass":"removeClass"](h.$element,j),b?(i.focusToggleElement(),e.open(i)):e.close(i),k(a,b),angular.isDefined(b)&&b!==c&&l(a,{open:!!b})}),a.$on("$locationChangeSuccess",function(){i.isOpen=!1}),a.$on("$destroy",function(){i.$destroy()})}]).directive("dropdown",function(){return{restrict:"CA",controller:"DropdownController",link:function(a,b,c,d){d.init(b)}}}).directive("dropdownToggle",function(){return{restrict:"CA",require:"?^dropdown",link:function(a,b,c,d){if(d){d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c<a.length;c++)if(b==a[c].key)return a[c]},keys:function(){for(var b=[],c=0;c<a.length;c++)b.push(a[c].key);return b},top:function(){return a[a.length-1]},remove:function(b){for(var c=-1,d=0;d<a.length;d++)if(b==a[d].key){c=d;break}return a.splice(c,1)[0]},removeTop:function(){return a.splice(a.length-1,1)[0]},length:function(){return a.length}}}}}).directive("modalBackdrop",["$timeout",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/modal/backdrop.html",link:function(b){b.animate=!1,a(function(){b.animate=!0})}}}]).directive("modalWindow",["$modalStack","$timeout",function(a,b){return{restrict:"EA",scope:{index:"@",animate:"="},replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"template/modal/window.html"},link:function(c,d,e){d.addClass(e.windowClass||""),c.size=e.size,b(function(){c.animate=!0,d[0].focus()}),c.close=function(b){var c=a.getTop();c&&c.value.backdrop&&"static"!=c.value.backdrop&&b.target===b.currentTarget&&(b.preventDefault(),b.stopPropagation(),a.dismiss(c.key,"backdrop click"))}}}}]).factory("$modalStack",["$transition","$timeout","$document","$compile","$rootScope","$$stackedMap",function(a,b,c,d,e,f){function g(){for(var a=-1,b=n.keys(),c=0;c<b.length;c++)n.get(b[c]).value.backdrop&&(a=c);return a}function h(a){var b=c.find("body").eq(0),d=n.get(a).value;n.remove(a),j(d.modalDomEl,d.modalScope,300,function(){d.modalScope.$destroy(),b.toggleClass(m,n.length()>0),i()})}function i(){if(k&&-1==g()){var a=l;j(k,l,150,function(){a.$destroy(),a=null}),k=void 0,l=void 0}}function j(c,d,e,f){function g(){g.done||(g.done=!0,c.remove(),f&&f())}d.animate=!1;var h=a.transitionEndEventName;if(h){var i=b(g,e);c.bind(h,function(){b.cancel(i),g(),d.$apply()})}else b(g,0)}var k,l,m="modal-open",n=f.createNew(),o={};return e.$watch(g,function(a){l&&(l.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=n.top(),b&&b.value.keyboard&&(a.preventDefault(),e.$apply(function(){o.dismiss(b.key,"escape key press")})))}),o.open=function(a,b){n.add(a,{deferred:b.deferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var f=c.find("body").eq(0),h=g();h>=0&&!k&&(l=e.$new(!0),l.index=h,k=d("<div modal-backdrop></div>")(l),f.append(k));var i=angular.element("<div modal-window></div>");i.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:n.length()-1,animate:"animate"}).html(b.content);var j=d(i)(b.scope);n.top().value.modalDomEl=j,f.append(j),f.addClass(m)},o.close=function(a,b){var c=n.get(a).value;c&&(c.deferred.resolve(b),h(a))},o.dismiss=function(a,b){var c=n.get(a).value;c&&(c.deferred.reject(b),h(a))},o.dismissAll=function(a){for(var b=this.getTop();b;)this.dismiss(b.key,a),b=this.getTop()},o.getTop=function(){return n.top()},o}]).provider("$modal",function(){var a={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?d.when(a.template):e.get(a.templateUrl,{cache:f}).then(function(a){return a.data})}function j(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var k={};return k.open=function(b){var e=d.defer(),f=d.defer(),k={result:e.promise,opened:f.promise,close:function(a){h.close(k,a)},dismiss:function(a){h.dismiss(k,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var l=d.all([i(b)].concat(j(b.resolve)));return l.then(function(a){var d=(b.scope||c).$new();d.$close=k.close,d.$dismiss=k.dismiss;var f,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=k,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),f=g(b.controller,i)),h.open(k,{scope:d,deferred:e,content:a[0],backdrop:b.backdrop,keyboard:b.keyboard,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size})},function(a){e.reject(a)}),l.then(function(){f.resolve(!0)},function(){f.reject(!1)}),k},k}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(f,g){e=f,this.config=g,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=g.itemsPerPage},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b){a.page!==b&&b>0&&b<=a.totalPages&&(e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages},a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render()});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";
+return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate",function(e,f,g,h,i,j,k){return function(e,l,m){function n(a){var b=a||o.trigger||m,d=c[b]||b;return{show:b,hide:d}}var o=angular.extend({},b,d),p=a(e),q=k.startSymbol(),r=k.endSymbol(),s="<div "+p+'-popup title="'+q+"tt_title"+r+'" content="'+q+"tt_content"+r+'" placement="'+q+"tt_placement"+r+'" animation="tt_animation" is-open="tt_isOpen"></div>';return{restrict:"EA",scope:!0,compile:function(){var a=f(s);return function(b,c,d){function f(){b.tt_isOpen?m():k()}function k(){(!y||b.$eval(d[l+"Enable"]))&&(b.tt_popupDelay?v||(v=g(p,b.tt_popupDelay,!1),v.then(function(a){a()})):p()())}function m(){b.$apply(function(){q()})}function p(){return v=null,u&&(g.cancel(u),u=null),b.tt_content?(r(),t.css({top:0,left:0,display:"block"}),w?i.find("body").append(t):c.after(t),z(),b.tt_isOpen=!0,b.$digest(),z):angular.noop}function q(){b.tt_isOpen=!1,g.cancel(v),v=null,b.tt_animation?u||(u=g(s,500)):s()}function r(){t&&s(),t=a(b,function(){}),b.$digest()}function s(){u=null,t&&(t.remove(),t=null)}var t,u,v,w=angular.isDefined(o.appendToBody)?o.appendToBody:!1,x=n(void 0),y=angular.isDefined(d[l+"Enable"]),z=function(){var a=j.positionElements(c,t,b.tt_placement,w);a.top+="px",a.left+="px",t.css(a)};b.tt_isOpen=!1,d.$observe(e,function(a){b.tt_content=a,!a&&b.tt_isOpen&&q()}),d.$observe(l+"Title",function(a){b.tt_title=a}),d.$observe(l+"Placement",function(a){b.tt_placement=angular.isDefined(a)?a:o.placement}),d.$observe(l+"PopupDelay",function(a){var c=parseInt(a,10);b.tt_popupDelay=isNaN(c)?o.popupDelay:c});var A=function(){c.unbind(x.show,k),c.unbind(x.hide,m)};d.$observe(l+"Trigger",function(a){A(),x=n(a),x.show===x.hide?c.bind(x.show,f):(c.bind(x.show,k),c.bind(x.hide,m))});var B=b.$eval(d[l+"Animation"]);b.tt_animation=angular.isDefined(B)?!!B:o.animation,d.$observe(l+"AppendToBody",function(a){w=angular.isDefined(a)?h(a)(b):w}),w&&b.$on("$locationChangeSuccess",function(){b.tt_isOpen&&q()}),b.$on("$destroy",function(){g.cancel(u),g.cancel(v),A(),s()})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function(a){return a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.$watch("value",function(c){b.percent=+(100*c/a.max).toFixed(2)}),b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(f)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff},a[b]);return a},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length?a.active=!0:a.active&&b.select(a)},b.removeTab=function(a){var d=c.indexOf(a);if(a.active&&c.length>1){var e=d==c.length-1?d-1:d+1;b.select(c[e])}c.splice(d,1)}}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse",function(a){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(b,c,d){return function(b,c,e,f){b.$watch("active",function(a){a&&f.select(b)}),b.disabled=!1,e.disabled&&b.$parent.$watch(a(e.disabled),function(a){b.disabled=!!a}),b.select=function(){b.disabled||(b.active=!0)},f.addTab(b),b.$on("$destroy",function(){f.removeTab(b)}),b.$transcludeFn=d}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===p[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a}function j(a){k(),o.$setViewValue(new Date(n)),l(a)}function k(){o.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=n.getHours(),d=n.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),a.minutes="m"===b?d:i(d),a.meridian=n.getHours()<12?p[0]:p[1]}function m(a){var b=new Date(n.getTime()+6e4*a);n.setHours(b.getHours(),b.getMinutes()),j()}var n=new Date,o={$setViewValue:angular.noop},p=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){o=c,o.$render=this.render;var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var q=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){q=parseInt(a,10)});var r=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){r=parseInt(a,10)}),a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,o.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(n.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){o.$setViewValue(null),o.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(n.setHours(a),j("h")):d(!0)},b.bind("blur",function(){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(n.setMinutes(a),j("m")):d(void 0,!0)},c.bind("blur",function(){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var a=o.$modelValue?new Date(o.$modelValue):null;isNaN(a)?(o.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(n=a),k(),l())},a.incrementHours=function(){m(60*q)},a.decrementHours=function(){m(60*-q)},a.incrementMinutes=function(){m(r)},a.decrementMinutes=function(){m(-r)},a.toggleMeridian=function(){m(720*(n.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?i.$eval(k.typeaheadAppendToBody):!1,u=b(k.ngModel).assign,v=g.parse(k.typeahead),w=i.$new();i.$on("$destroy",function(){w.$destroy()});var x="typeahead-"+w.$id+"-"+Math.floor(1e4*Math.random());j.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":x});var y=angular.element("<div typeahead-popup></div>");y.attr({id:x,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&y.attr("template-url",k.typeaheadTemplateUrl);var z=function(){w.matches=[],w.activeIdx=-1,j.attr("aria-expanded",!1)},A=function(a){return x+"-option-"+a};w.$watch("activeIdx",function(a){0>a?j.removeAttr("aria-activedescendant"):j.attr("aria-activedescendant",A(a))});var B=function(a){var b={$viewValue:a};q(i,!0),c.when(v.source(i,b)).then(function(c){var d=a===l.$viewValue;if(d&&m)if(c.length>0){w.activeIdx=0,w.matches.length=0;for(var e=0;e<c.length;e++)b[v.itemName]=c[e],w.matches.push({id:A(e),label:v.viewMapper(w,b),model:c[e]});w.query=a,w.position=t?f.offset(j):f.position(j),w.position.top=w.position.top+j.prop("offsetHeight"),j.attr("aria-expanded",!0)}else z();d&&q(i,!1)},function(){z(),q(i,!1)})};z(),w.query=void 0;var C;l.$parsers.unshift(function(a){return m=!0,a&&a.length>=n?o>0?(C&&d.cancel(C),C=d(function(){B(a)},o)):B(a):(q(i,!1),z()),p?a:a?void l.$setValidity("editable",!1):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return s?(d.$model=a,s(i,d)):(d[v.itemName]=a,b=v.viewMapper(i,d),d[v.itemName]=void 0,c=v.viewMapper(i,d),b!==c?b:a)}),w.select=function(a){var b,c,e={};e[v.itemName]=c=w.matches[a].model,b=v.modelMapper(i,e),u(i,b),l.$setValidity("editable",!0),r(i,{$item:c,$model:b,$label:v.viewMapper(i,e)}),z(),d(function(){j[0].focus()},0,!1)},j.bind("keydown",function(a){0!==w.matches.length&&-1!==h.indexOf(a.which)&&(a.preventDefault(),40===a.which?(w.activeIdx=(w.activeIdx+1)%w.matches.length,w.$digest()):38===a.which?(w.activeIdx=(w.activeIdx?w.activeIdx:w.matches.length)-1,w.$digest()):13===a.which||9===a.which?w.$apply(function(){w.select(w.activeIdx)}):27===a.which&&(a.stopPropagation(),z(),w.$digest()))}),j.bind("blur",function(){m=!1});var D=function(a){j[0]!==a.target&&(z(),w.$digest())};e.bind("click",D),i.$on("$destroy",function(){e.unbind("click",D)});var E=a(y)(w);t?e.find("body").append(E):j.after(E)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function(a,b,c,d){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(e,f,g){var h=d(g.templateUrl)(e.$parent)||"template/typeahead/typeahead-match.html";a.get(h,{cache:b}).success(function(a){f.replaceWith(c(a.trim())(e))})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"<strong>$&</strong>"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'<div class="panel panel-default">\n  <div class="panel-heading">\n    <h4 class="panel-title">\n      <a class="accordion-toggle" ng-click="toggleOpen()" accordion-transclude="heading"><span ng-class="{\'text-muted\': isDisabled}">{{heading}}</span></a>\n    </h4>\n  </div>\n  <div class="panel-collapse" collapse="!isOpen">\n	  <div class="panel-body" ng-transclude></div>\n  </div>\n</div>')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'<div class="panel-group" ng-transclude></div>')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'<div class="alert" ng-class="{\'alert-{{type || \'warning\'}}\': true, \'alert-dismissable\': closeable}" role="alert">\n    <button ng-show="closeable" type="button" class="close" ng-click="close()">\n        <span aria-hidden="true">&times;</span>\n        <span class="sr-only">Close</span>\n    </button>\n    <div ng-transclude></div>\n</div>\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'<div ng-mouseenter="pause()" ng-mouseleave="play()" class="carousel" ng-swipe-right="prev()" ng-swipe-left="next()">\n    <ol class="carousel-indicators" ng-show="slides.length > 1">\n        <li ng-repeat="slide in slides track by $index" ng-class="{active: isActive(slide)}" ng-click="select(slide)"></li>\n    </ol>\n    <div class="carousel-inner" ng-transclude></div>\n    <a class="left carousel-control" ng-click="prev()" ng-show="slides.length > 1"><span class="glyphicon glyphicon-chevron-left"></span></a>\n    <a class="right carousel-control" ng-click="next()" ng-show="slides.length > 1"><span class="glyphicon glyphicon-chevron-right"></span></a>\n</div>\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html","<div ng-class=\"{\n    'active': leaving || (active && !entering),\n    'prev': (next || active) && direction=='prev',\n    'next': (next || active) && direction=='next',\n    'right': direction=='prev',\n    'left': direction=='next'\n  }\" class=\"item text-center\" ng-transclude></div>\n")}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'<div ng-switch="datepickerMode" role="application" ng-keydown="keydown($event)">\n  <daypicker ng-switch-when="day" tabindex="0"></daypicker>\n  <monthpicker ng-switch-when="month" tabindex="0"></monthpicker>\n  <yearpicker ng-switch-when="year" tabindex="0"></yearpicker>\n</div>')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'<table role="grid" aria-labelledby="{{uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th colspan="{{5 + showWeeks}}"><button id="{{uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n    <tr>\n      <th ng-show="showWeeks" class="text-center"></th>\n      <th ng-repeat="label in labels track by $index" class="text-center"><small aria-label="{{label.full}}">{{label.abbr}}</small></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr ng-repeat="row in rows track by $index">\n      <td ng-show="showWeeks" class="text-center h6"><em>{{ weekNumbers[$index] }}</em></td>\n      <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{dt.uid}}" aria-disabled="{{!!dt.disabled}}">\n        <button type="button" style="width:100%;" class="btn btn-default btn-sm" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="{\'text-muted\': dt.secondary, \'text-info\': dt.current}">{{dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'<table role="grid" aria-labelledby="{{uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th><button id="{{uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr ng-repeat="row in rows track by $index">\n      <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{dt.uid}}" aria-disabled="{{!!dt.disabled}}">\n        <button type="button" style="width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="{\'text-info\': dt.current}">{{dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'<ul class="dropdown-menu" ng-style="{display: (isOpen && \'block\') || \'none\', top: position.top+\'px\', left: position.left+\'px\'}" ng-keydown="keydown($event)">\n	<li ng-transclude></li>\n	<li ng-if="showButtonBar" style="padding:10px 9px 2px">\n		<span class="btn-group">\n			<button type="button" class="btn btn-sm btn-info" ng-click="select(\'today\')">{{ getText(\'current\') }}</button>\n			<button type="button" class="btn btn-sm btn-danger" ng-click="select(null)">{{ getText(\'clear\') }}</button>\n		</span>\n		<button type="button" class="btn btn-sm btn-success pull-right" ng-click="close()">{{ getText(\'close\') }}</button>\n	</li>\n</ul>\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'<table role="grid" aria-labelledby="{{uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n  <thead>\n    <tr>\n      <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n      <th colspan="3"><button id="{{uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n      <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr ng-repeat="row in rows track by $index">\n      <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{dt.uid}}" aria-disabled="{{!!dt.disabled}}">\n        <button type="button" style="width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="{\'text-info\': dt.current}">{{dt.label}}</span></button>\n      </td>\n    </tr>\n  </tbody>\n</table>\n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'<div class="modal-backdrop fade"\n     ng-class="{in: animate}"\n     ng-style="{\'z-index\': 1040 + (index && 1 || 0) + index*10}"\n></div>\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'<div tabindex="-1" role="dialog" class="modal fade" ng-class="{in: animate}" ng-style="{\'z-index\': 1050 + index*10, display: \'block\'}" ng-click="close($event)">\n    <div class="modal-dialog" ng-class="{\'modal-sm\': size == \'sm\', \'modal-lg\': size == \'lg\'}"><div class="modal-content" ng-transclude></div></div>\n</div>')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'<ul class="pager">\n  <li ng-class="{disabled: noPrevious(), previous: align}"><a href ng-click="selectPage(page - 1)">{{getText(\'previous\')}}</a></li>\n  <li ng-class="{disabled: noNext(), next: align}"><a href ng-click="selectPage(page + 1)">{{getText(\'next\')}}</a></li>\n</ul>')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'<ul class="pagination">\n  <li ng-if="boundaryLinks" ng-class="{disabled: noPrevious()}"><a href ng-click="selectPage(1)">{{getText(\'first\')}}</a></li>\n  <li ng-if="directionLinks" ng-class="{disabled: noPrevious()}"><a href ng-click="selectPage(page - 1)">{{getText(\'previous\')}}</a></li>\n  <li ng-repeat="page in pages track by $index" ng-class="{active: page.active}"><a href ng-click="selectPage(page.number)">{{page.text}}</a></li>\n  <li ng-if="directionLinks" ng-class="{disabled: noNext()}"><a href ng-click="selectPage(page + 1)">{{getText(\'next\')}}</a></li>\n  <li ng-if="boundaryLinks" ng-class="{disabled: noNext()}"><a href ng-click="selectPage(totalPages)">{{getText(\'last\')}}</a></li>\n</ul>')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'<div class="tooltip {{placement}}" ng-class="{ in: isOpen(), fade: animation() }">\n  <div class="tooltip-arrow"></div>\n  <div class="tooltip-inner" bind-html-unsafe="content"></div>\n</div>\n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'<div class="tooltip {{placement}}" ng-class="{ in: isOpen(), fade: animation() }">\n  <div class="tooltip-arrow"></div>\n  <div class="tooltip-inner" ng-bind="content"></div>\n</div>\n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'<div class="popover {{placement}}" ng-class="{ in: isOpen(), fade: animation() }">\n  <div class="arrow"></div>\n\n  <div class="popover-inner">\n      <h3 class="popover-title" ng-bind="title" ng-show="title"></h3>\n      <div class="popover-content" ng-bind="content"></div>\n  </div>\n</div>\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'<div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: percent + \'%\'}" aria-valuetext="{{percent | number:0}}%" ng-transclude></div>')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'<div class="progress" ng-transclude></div>')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'<div class="progress">\n  <div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: percent + \'%\'}" aria-valuetext="{{percent | number:0}}%" ng-transclude></div>\n</div>')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'<span ng-mouseleave="reset()" ng-keydown="onKeydown($event)" tabindex="0" role="slider" aria-valuemin="0" aria-valuemax="{{range.length}}" aria-valuenow="{{value}}">\n    <i ng-repeat="r in range track by $index" ng-mouseenter="enter($index + 1)" ng-click="rate($index + 1)" class="glyphicon" ng-class="$index < value && (r.stateOn || \'glyphicon-star\') || (r.stateOff || \'glyphicon-star-empty\')">\n        <span class="sr-only">({{ $index < value ? \'*\' : \' \' }})</span>\n    </i>\n</span>')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'<li ng-class="{active: active, disabled: disabled}">\n  <a ng-click="select()" tab-heading-transclude>{{heading}}</a>\n</li>\n')}]),angular.module("template/tabs/tabset-titles.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset-titles.html","<ul class=\"nav {{type && 'nav-' + type}}\" ng-class=\"{'nav-stacked': vertical}\">\n</ul>\n")}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'\n<div>\n  <ul class="nav nav-{{type || \'tabs\'}}" ng-class="{\'nav-stacked\': vertical, \'nav-justified\': justified}" ng-transclude></ul>\n  <div class="tab-content">\n    <div class="tab-pane" \n         ng-repeat="tab in tabs" \n         ng-class="{active: tab.active}"\n         tab-content-transclude="tab">\n    </div>\n  </div>\n</div>\n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'<table>\n	<tbody>\n		<tr class="text-center">\n			<td><a ng-click="incrementHours()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n			<td>&nbsp;</td>\n			<td><a ng-click="incrementMinutes()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n			<td ng-show="showMeridian"></td>\n		</tr>\n		<tr>\n			<td style="width:50px;" class="form-group" ng-class="{\'has-error\': invalidHours}">\n				<input type="text" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-mousewheel="incrementHours()" ng-readonly="readonlyInput" maxlength="2">\n			</td>\n			<td>:</td>\n			<td style="width:50px;" class="form-group" ng-class="{\'has-error\': invalidMinutes}">\n				<input type="text" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="readonlyInput" maxlength="2">\n			</td>\n			<td ng-show="showMeridian"><button type="button" class="btn btn-default text-center" ng-click="toggleMeridian()">{{meridian}}</button></td>\n		</tr>\n		<tr class="text-center">\n			<td><a ng-click="decrementHours()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n			<td>&nbsp;</td>\n			<td><a ng-click="decrementMinutes()" class="btn btn-link"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n			<td ng-show="showMeridian"></td>\n		</tr>\n	</tbody>\n</table>\n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'<a tabindex="-1" bind-html-unsafe="match.label | typeaheadHighlight:query"></a>')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'<ul class="dropdown-menu" ng-if="isOpen()" ng-style="{top: position.top+\'px\', left: position.left+\'px\'}" style="display: block;" role="listbox" aria-hidden="{{!isOpen()}}">\n    <li ng-repeat="match in matches track by $index" ng-class="{active: isActive($index) }" ng-mouseenter="selectActive($index)" ng-click="selectMatch($index)" role="option" id="{{match.id}}">\n        <div typeahead-match index="$index" match="match" query="query" template-url="templateUrl"></div>\n    </li>\n</ul>')
+}]);
\ No newline at end of file
diff --git a/static/java/demo/app/partials/greenhouses-list.html b/static/java/demo/app/partials/greenhouses-list.html
new file mode 100644
index 0000000000000000000000000000000000000000..708a5003db7809466ce91e61289099f89837ae57
--- /dev/null
+++ b/static/java/demo/app/partials/greenhouses-list.html
@@ -0,0 +1,77 @@
+<!-- <p>There are currently {{greenhouses.length}} active greenhouses in your simulation</p> -->
+<div class="container">
+	<ul class="row" style="list-style:none; padding-left:0;">
+		<li ng-repeat="greenhouse in greenhouse_simulators" class="col-md-4">
+			<div class="greenhouse simulator">
+
+				<div class="greenhouse-field" id="greenhouse-pulse">
+					<span class="glyphicon glyphicon-cloud-upload {{greenhouse.pulse}}"></span>
+				</div>
+
+				<div class="greenhouse-field" id="greenhouse-name">
+					<label for="name_{{$index+1}}">Name: {{ simulatorName }}</label>
+					<input ng-if="multi" id="name_{{$index+1}}" type="text" class="form-control" ng-model="greenhouse.name" />
+				</div>
+				
+				<div class="greenhouse-field" id="greenhouse-temperature">
+					<label for="temperature_{{$index+1}}">Temperature:</label>
+					<rzslider
+					id="temperature_{{$index+1}}"
+					rz-slider-floor="20"
+					rz-slider-ceil="30"
+					rz-slider-step="0.25"
+					rz-slider-precision="2"
+					rz-slider-model="greenhouse.temperature"></rzslider>
+				</div>
+				<div class="greenhouse-field" id="greenhouse-refreshInterval">
+					<label for="refreshInterval{{$index+1}}">Update interval (in sec):</label>
+					<rzslider
+					id="refreshInterval_{{$index+1}}"
+					rz-slider-floor="0.2"
+					rz-slider-ceil="10.0"
+					rz-slider-step="0.2"
+					rz-slider-precision="1"
+					rz-slider-model="greenhouse.refreshInterval"></rzslider>
+				</div>
+
+				<div class="greenhouse-field" id="greenhouse-light">
+					<label for="light_{{$index+1}}">Light state:</label>
+					<span id="light_{{$index+1}}" class="glyphicon icon-lightbulb-1 greenhouse_light_icon {{greenhouse.lightState}}"></span>
+				</div>
+			</div>
+		</li>
+
+		<li ng-repeat="greenhouse in greenhouse_remotes" class="col-md-4">
+			<div class="greenhouse remote">
+				<div class="greenhouse-field" id="greenhouse-name">
+					<label for="name_{{$index+1}}">Name: {{ remoteName }}</label>
+					<input ng-if="multi" id="name_{{$index+1}}" type="text" class="form-control" ng-model="greenhouse.name" />
+				</div>
+
+				<div class="greenhouse-field" id="greenhouse-temperature">
+					<label for="temperature_{{$index+1}}">Temperature:</label>
+					<div ng-bind="greenhouse.temperature" class="temperature {{greenhouse.pulse}}" />
+				</div>
+
+				<div class="greenhouse-field" id="greenhouse-light">
+					<label for="light_{{$index+1}}">Light state:</label>
+					<span id="light_{{$index+1}}" class="glyphicon icon-lightbulb-1 greenhouse_light_icon {{greenhouse.lightState}}" ng-click="greenhouse.toggleLight()"></span>
+				</div>
+
+				<a twitter data-lang="en" data-count='horizontal' data-url='http://iot.eclipse.org/java' data-via='eclipseiot' data-size="large" data-text="Cool greenhouse demo powered by the Eclipse IoT stack for Java on booth #5615. Check it out! #JavaOne" ></a>
+
+			</div>
+
+
+		</li>
+
+		<li class="col-md-4" ng-if="multi">
+			<div ng-click="addGreenhouseSimulator()" class="greenhouse" id="add-greenhouse">Add a Greenhouse Simulator</div>
+		</li>
+
+		<li class="col-md-4" ng-if="multi">
+			<div ng-click="addGreenhouseRemote()" class="greenhouse" id="add-greenhouse">Add a Greenhouse Remote</div>
+		</li>
+
+	</ul>
+</div>
\ No newline at end of file
diff --git a/static/java/demo/bower.json b/static/java/demo/bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..0f9b17afc5f3e5ea7944fb9f4623ea22ef1dfcff
--- /dev/null
+++ b/static/java/demo/bower.json
@@ -0,0 +1,18 @@
+{
+    "name": "mqtt-greenhouse-simulator",
+    "description": "A web-based simulator of greenhouses talking MQTT",
+    "version": "0.0.0",
+    "homepage": "https://github.com/kartben/mqtt-greenhouse-simulator",
+    "license": "MIT",
+    "private": true,
+    "dependencies": {
+        "angular": "1.2.x",
+        "angular-route": "1.2.x",
+        "angular-loader": "1.2.x",
+        "angular-mocks": "~1.2.x",
+        "html5-boilerplate": "~4.3.0",
+        "angularjs-slider": "0.1.5",
+        "angular-ui-bootstrap": "0.11.0",
+        "angular-socialshare": "0.0.2"
+    }
+}
\ No newline at end of file
diff --git a/static/java/demo/org.eclipse.greenhouse.iot-0.1.0.dp b/static/java/demo/org.eclipse.greenhouse.iot-0.1.0.dp
new file mode 100644
index 0000000000000000000000000000000000000000..f9465cd5a602c1901b06977db3380644572b0dca
Binary files /dev/null and b/static/java/demo/org.eclipse.greenhouse.iot-0.1.0.dp differ
diff --git a/static/java/demo/package.json b/static/java/demo/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..cf1a61b6e6cbebc0f81e43a2fd97e184eb873b3c
--- /dev/null
+++ b/static/java/demo/package.json
@@ -0,0 +1,34 @@
+{
+    "name": "mqtt-greenhouse-simulator",
+    "private": true,
+    "version": "0.0.0",
+    "description": "A web-based simulator of greenhouses talking MQTT",
+    "repository": "https://github.com/kartben/mqtt-greenhouse-simulator",
+    "license": "MIT",
+    "devDependencies": {
+        "karma": "~0.10",
+        "protractor": "~0.20.1",
+        "http-server": "^0.6.1",
+        "bower": "^1.3.1",
+        "shelljs": "^0.2.6",
+        "karma-junit-reporter": "^0.2.2"
+    },
+    "scripts": {
+        "postinstall": "bower install",
+
+        "prestart": "npm install",
+        "start": "http-server -a localhost -p 8000",
+
+        "pretest": "npm install",
+        "test": "karma start test/karma.conf.js",
+        "test-single-run": "karma start test/karma.conf.js  --single-run",
+
+        "preupdate-webdriver": "npm install",
+        "update-webdriver": "webdriver-manager update",
+
+        "preprotractor": "npm run update-webdriver",
+        "protractor": "protractor test/protractor-conf.js",
+
+        "update-index-async": "node -e \"require('shelljs/global'); sed('-i', /\\/\\/@@NG_LOADER_START@@[\\s\\S]*\\/\\/@@NG_LOADER_END@@/, '//@@NG_LOADER_START@@\\n' + cat('app/bower_components/angular-loader/angular-loader.min.js') + '\\n//@@NG_LOADER_END@@', 'app/index-async.html');\""
+    }
+}
\ No newline at end of file
diff --git a/static/java/discover.html b/static/java/discover.html
new file mode 100644
index 0000000000000000000000000000000000000000..0275537d912f3d21ea9e36fe1e3acb8ef541340c
--- /dev/null
+++ b/static/java/discover.html
@@ -0,0 +1,347 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>iot.eclipse.org &mdash; Protocols</title>
+  <meta name="description" content="iot.eclipse.org is also a window on the protocols of choice for IoT and M2M solutions development: MQTT, CoAP, Lightweight M2M, ETSI M2M  ...">
+  <meta name="author" content="Eclipse.org">
+  <link rel="author" href="humans.txt" />
+  <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+  <!--[if lt IE 9]>
+        <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+  <!-- Custom Fonts -->
+  <link href='http://fonts.googleapis.com/css?family=Lato:300,400' rel='stylesheet' type='text/css'>
+  <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+
+  <!-- 
+<link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
+<link href="/css/theme.css" rel="stylesheet">
+<link href="/css/bootstrap/bootstrap-responsive.min.css" rel="stylesheet">
+<link href="../stylesheet/prism.css" rel="stylesheet" />
+ -->
+
+  <!-- Bootstrap -->
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+</head>
+
+<body>
+
+
+  <header>
+    <nav class="navbar">
+      <div class="container">
+        <div class="row">
+          <div class="col-sm-2">
+            <a href="/"><img src="/assets/images/iot-logo.png">
+            </a>
+          </div>
+          <div class="col-sm-10">
+            <ul class="list-inline right menu">
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+                <ul class="dropdown-menu">
+                  <li><a href="/standards">Standards</a>
+                  </li>
+                  <li><a href="/frameworks">Services &amp; Frameworks</a>
+                  </li>
+                  <li><a href="/projects">All the projects</a>
+                  </li>
+                </ul>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+              </li>
+              <li><a href="/ecosystem">Members</a>
+              </li>
+              <li><a href="#">Getting Started</a>
+              </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </nav>
+  </header>
+
+
+  <!-- Place this tag after the last +1 button tag. -->
+  <script type="text/javascript">
+  (function() {
+    var po = document.createElement('script');
+    po.type = 'text/javascript';
+    po.async = true;
+    po.src = 'https://apis.google.com/js/plusone.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(po, s);
+  })();
+  </script>
+
+  <main class="main">
+    <section class="first">
+      <div class="container">
+
+        <div id="companies">
+
+          <!-- Actuate -->
+          <div class="row members-info" id="member-actuate">
+            <div class="col-md-4 mb-logo">
+              <a href="#">
+                <img src="/images/ecosystem/logo-actuate.png" alt="Actuate" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <p> Internet of Things offers numerous opportunities for developers to create new solutions using data from devices connected to the Internet. The challenge is to establish a set of standards to make effective use of the many different sources of data. Eclipse’s new Open IoT Stack for Java will make it easier for the over 3.5 million BIRT developers to access, visualize and analyze IoT data to deliver actionable information to enhance customer experience and improve operations.</p>
+                <h5>Nobby Akiha – Senior Vice President of Marketing at Actuate Corporation.</h5>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.actuate.com" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="http://blogs.actuate.com/creating-an-iot-dashboard-with-birt/" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- Bitreactive -->
+          <div class="row members-info" id="member-bitreactive">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=1103">
+                <img src="/images/ecosystem/logo-bitreactive.png" alt="Bitreactive" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <p>The Open IoT Stack for Java is an ideal platform to enable interoperability and reduce fragmentation. Our tool Reactive Blocks supports application development with Eclipse IoT technologies like MQTT, Kura and CoAP since they provide proven and standardized solutions.</p>
+                <h5>Jone Rasmussen – General Manager of Bitreactive</h5>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.bitreactive.com/" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="http://www.bitreactive.com/technology/" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- Canonical -->
+          <div class="row members-info" id="member-canonical">
+            <div class="col-md-4 mb-logo">
+              <a href="#">
+                <img src="/images/ecosystem/logo-ubuntu.png" alt="Bitreactive" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <p>Ubuntu is collaborating with the Eclipse foundation on making sure developers can easily use any of their IoT solutions both on the cloud and the embedded space.</p>
+                <h5>Maarten Ectors – IoT Strategy Director of Canonical</h5>
+              </div>
+            </div>
+          </div>
+
+          <!-- dc-square -->
+          <div class="row members-info" id="member-dcsquare">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=1122">
+                <img src="/images/ecosystem/logo-dcsquare.png" width="150" alt="dc-square" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <p>The open IoT stack from Eclipse helps our HiveMQ customers to build their MQTT client applications on proven and rock stable solutions like Eclipse Paho and Eclipse Kura. This gives them the advantage to start from day one with their applications instead of implementing low-level wire protocols themselves.</p>
+                <h5>Dominik Obermaier – CTO, dc-square GmbH</h5>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.hivemq.com/" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="http://www.hivemq.com/demos/websocket-client/" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- DT -->
+          <div class="row members-info" id="member-dtag">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=1139">
+                <img src="/images/ecosystem/logo-dtag.png" alt="Deutsche Telekom" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <p>Telekom has been an Eclipse Foundation solution member since July this year. We are convinced that we will take the development of our QIVICON Smart Home solution further forward with the support of the large developer community and its outstanding know-how. To do so we are integrating the Eclipse Smart Home project into our core platform. As we would like to promote Eclipse's work at the same time, we have not only joined the IoT working group but are also contributing to the Eclipse Smart Home project by actively participating in the open source project's development</p>
+                <h5>Holger Knöpke – Head of Connected Home, Deutsche Telekom.</h5>
+              </div>
+            </div>
+          </div>
+
+          <!-- Eurotech -->
+          <div class="row members-info" id="member-eurotech">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=968">
+                <img src="/images/ecosystem/logo-eurotech.png" alt="Eurotech" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <p>Even before co-founding the Eclipse Foundation M2M (now IoT) Working Group, Eurotech embraced the open source philosophy. We have invested our development resources into creating and donating the Kura project to the community while also delivering it as a fully supported commercial offering through the Everyware Software Framework. We appreciate the innovations and contributions of the talented and generous Eclipse community and look forward to exciting enhancements and revolutionary projects in the coming days, months and years.</p>
+                <h5>Marco Carrer – VP of Software Development for Eurotech</h5>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://www.eurotech.com/en/products/software+services/everyware+software+framework/what+esf+is" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="https://www.youtube.com/watch?v=PXlDJMK7yqg" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- IBH Systems -->
+          <div class="row members-info" id="member-ibh">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=1086">
+                <img src="/images/ecosystem/logo-ibh.png" alt="IBH Systems" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <p>IBH SYSTEMS uses Eclipse SCADA as the strategic platform to realize ours customers projects. It can play to it strengths especially in environments where the customer wants to have full control over the software and be able to customize it in any way. Additionally our approach to modularization means that a developer only needs to use what he actually requires. This in turn allows other open source, or even commercial projects to reuse our high quality implementations of industrial protocols, like Modbus or IEC 60870-5-104, without the need of integrating the whole Eclipse SCADA stack.</p>
+                <h5>Jens Reimann – IBH Systems</h5>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://ibh-systems.com/" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="https://www.youtube.com/watch?v=UYlmzuwBV30" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- IBM -->
+          <div class="row members-info" id="member-ibm">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=656">
+                <img src="/images/ecosystem/logo-ibm.png" alt="IBM" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <p>As the Internet of Things evolves, developers need greater access to technologies and standards to deliver innovative products and services to market. Our involvement in the Eclipse Paho project, alongside the Oasis standardization effort for MQTT, will accelerate the development of Internet of Things solutions across industries. IBM MessageSight and IBM Internet of Things Foundation beta are built on MQTT, enabling the open source community, and promoting flexibility and choice for clients.</p>
+                <h5>Michael Curry – VP, IBM</h5>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://ibm.com/" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="#" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+
+          <!-- Oracle -->
+          <div class="row members-info" id="member-oracle">
+            <div class="col-md-4 mb-logo">
+              <a href="http://eclipse.org/membership/showMember.php?member_id=721">
+                <img src="/images/ecosystem/logo-oracle.png" alt="Oracle" />
+              </a>
+            </div>
+            <div class="col-md-8 mb-info">
+              <div class="mb-info-container">
+                <p>At Oracle, we are working hard to make Java the number one platform for the Internet of Things. The Eclipse Foundation’s Open IoT Stack for Java is a fantastic and welcome example of Java developers building another innovative and diverse ecosystem, this time for IoT solutions.</p>
+                <h5>Benjamin Wesson – Vice President, Product Development, Oracle</h5>
+              </div>
+              <ul class="mb-links clearfix">
+                <li class="read-more"><a href="http://oracle.com/" target="_blank">Read more <i class="icon-chevron-right"></i></a>
+                </li>
+                <li><a href="#" target="_blank">View Demo <i class="icon-eye-open"></i></a>
+                </li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+  </main>
+
+
+
+
+
+  <footer>
+
+    <div class="container">
+      <div class="row">
+        <div class="col-md-6">
+          <nav>
+            <ul class="list-inline menu">
+              <li><a href="#">Technology</a>
+              </li>
+              <li><a href="#">Community</a>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </nav>
+          <div class="socials">
+            <a href="#" class="social-facebook">&nbsp;</a>
+            <a href="#" class="social-twitter">&nbsp;</a>
+            <a href="#" class="social-youtube">&nbsp;</a>
+            <a href="#" class="social-share">&nbsp;</a>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+        </div>
+      </div>
+    </div>
+
+
+  </footer>
+
+  <!-- JS is at the end of the document so the pages load faster -->
+  <script src="/js/jquery.js"></script>
+  <script src="/js/bootstrap/bootstrap.min.js"></script>
+  <script src="/js/index.js"></script>
+  <script src="/js/shuffle.js"></script>
+  <script src="../js/prism.js"></script>
+  <script type="text/javascript">
+  $(document).ready(function() {
+    $('#companies').shuffle();
+  });
+  </script>
+</body>
+
+</html>
diff --git a/static/java/download/index.html b/static/java/download/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..42fb0652c4c27808fb24bc07e5dbc30cbde59f67
--- /dev/null
+++ b/static/java/download/index.html
@@ -0,0 +1,222 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>iot.eclipse.org &mdash; Download the Open IoT stack for Java</title>
+    <meta name="description" content="Download the Open IoT stack for Java">
+    <meta name="author" content="Eclipse.org">
+    <link rel="author" href="humans.txt" />
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+    <!-- Custom Fonts -->
+    <link href='http://fonts.googleapis.com/css?family=Lato:300,400' rel='stylesheet' type='text/css'>
+    <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+
+    <!-- Le styles -->
+    <link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
+    <link href="/css/theme.css" rel="stylesheet">
+    <link href="/css/bootstrap/bootstrap-responsive.min.css" rel="stylesheet">
+    <link href="../stylesheet/prism.css" rel="stylesheet" />
+    <link href="../stylesheet/bootstrap-lightbox.min.css" rel="stylesheet" />
+
+    <style type="text/css">
+    .container h4 {
+        margin-left: 3em;
+    }
+    .container h4:before {
+        content: "> ";
+    }
+    img.fleft {
+        float: left;
+        width: 200px;
+        margin-right: 2em;
+        margin-bottom: 1em;
+    }
+    </style>
+
+    <script type="text/javascript">
+    var _gaq = _gaq || [];
+    _gaq.push(['_setAccount', 'UA-594061-11']);
+    _gaq.push(['_trackPageview']);
+
+    (function() {
+        var ga = document.createElement('script');
+        ga.type = 'text/javascript';
+        ga.async = true;
+        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(ga, s);
+    })();
+    </script>
+
+</head>
+
+<body>
+
+    <div class="navbar navbar-fixed-top">
+        <div class="navbar-inner">
+            <div class="container">
+                <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span>
+                </a> <a class="brand" href="/index.html">iot.eclipse.org</a>
+                <div class="nav-collapse">
+                    <ul class="nav">
+                        <li><a href="/frameworks.html">Services & Frameworks</a>
+                        </li>
+                        <li><a href="/protocols.html">Protocols</a>
+                        </li>
+                        <li><a href="/tools.html">Tools</a>
+                        </li>
+                        <li><a href="/community.html">Community</a>
+                        </li>
+                        <li><a href="/ecosystem.html">Ecosystem</a>
+                        </li>
+                        <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">See it live <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/demo" class="active">Live Demo</a>
+                                </li>
+                                <li><a href="/sandbox.html">Sandbox</a>
+                                </li>
+                            </ul>
+                        </li>
+                    </ul>
+                    <ul class="nav pull-right">
+                        <li>
+                            <div style="padding-top: 20px;">
+                                <div class="g-plusone" data-href="http://iot.eclipse.org/"></div>
+                            </div>
+                        </li>
+                    </ul>
+                </div>
+                <!--/.nav-collapse -->
+            </div>
+        </div>
+    </div>
+
+    <!-- Place this tag after the last +1 button tag. -->
+    <script type="text/javascript">
+    (function() {
+        var po = document.createElement('script');
+        po.type = 'text/javascript';
+        po.async = true;
+        po.src = 'https://apis.google.com/js/plusone.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(po, s);
+    })();
+    </script>
+
+
+
+    <div class="container">
+
+
+        <div class="well">
+            <div class="page-header">
+                <h1>
+	          Download
+	        </h1>
+            </div>
+
+            <div>
+                <p class="lead">Starting building your IoT solutions using the Open IoT Stack for Java thanks to our open-source software components.</p>
+            </div>
+        </div>
+
+
+        <!-- Example row of columns -->
+        <div class="row">
+
+            <div id="kura" class="span6">
+                <h2>Kura</h2>
+                <p>Kura offers a Java/OSGi-based container for IoT applications running in service gateways.</p>
+                <p>You can download ready-to-use Kura distributions for popular IoT platforms like Raspberry Pi and BeagleBone Black <a href="https://www.eclipse.org/kura/downloads.php#debian_packages" target="_blank">here</a>.</p>
+            </div>
+
+            <div id="smarthome" class="span6">
+                <h2>SmartHome</h2>
+                <p>Eclipse SmartHome is designed as a set of OSGi bundles that can be run on any OSGi container, such as Eclipse Equinox or Apache Felix.</p>
+                <p>You can download the Eclipse SmartHome Designer <a href="https://www.eclipse.org/smarthome/download.html" target="_blank">here</a>.
+            </div>
+
+        </div>
+
+        <div class="row">
+
+            <div id="californium" class="span6">
+                <h2>Californium</h2>
+                <p>Eclipse Californium is a powerful CoAP framework targetting back-end services and stronger Internet of Things devices.
+                </p>
+                <p>You can use Californium in your Java-based IoT project by using the Maven artifacts available <a href="https://repo.eclipse.org/content/groups/californium/" target="_blank">here</a>.
+            </div>
+
+            <div id="paho" class="span6">
+                <h2>Paho</h2>
+                <p>The Eclipse Paho project provides open-source implementations of MQTT clients and tools.
+                </p>
+                <p>You can use the Java client in your Java SE project by following the instructions <a href="https://www.eclipse.org/paho/clients/java/" target="_blank">here</a>.
+                    <br> For Android, you may want to check out the <a href="https://www.eclipse.org/paho/clients/android/" target="_blank">ready-to-use Android service</a>.
+            </div>
+
+        </div>
+
+        <div class="row">
+
+            <div id="om2m" class="span6">
+                <h2>OM2M</h2>
+                <p>The OM2M project, is an open source implementation of the ETSI M2M standard.
+                </p>
+                <p>You can check out the source code from <a href="http://git.eclipse.org/c/om2m" target="_blank">OM2M's git repo</a>.
+            </div>
+
+            <div id="scada" class="span6">
+                <h2>Eclipse SCADA</h2>
+                <p>Eclipse SCADA provides a state of the art open source SCADA system, from communication system, to monitoring, data archiving and advanced GUIs.
+                </p>
+                <p>You can download Eclipse SCADA <a href="https://www.eclipse.org/eclipsescada/downloads.html" target="_blank">here</a>.
+            </div>
+
+        </div>
+
+
+
+
+
+        <hr>
+        <footer>
+            <ul class="nav nav-pills">
+                <li><a href="index.html">Home</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/" target="_blank">Legal</a>
+                </li>
+                <li><a href="contact.html" data-toggle="modal" data-target="#contact-modal">Contact Us</a>
+                </li>
+                <li class="pull-right">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</li>
+            </ul>
+        </footer>
+        <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;"></div>
+    </div>
+    <!-- /container -->
+
+    <!-- JS is at the end of the document so the pages load faster -->
+    <script src="/js/jquery.js"></script>
+    <script src="/js/bootstrap/bootstrap.min.js"></script>
+    <script src="/js/index.js"></script>
+
+    <script src="../js/prism.js"></script>
+    <script src="../js/bootstrap-lightbox.min.js"></script>
+
+
+</body>
+
+</html>
diff --git a/static/java/fonts/FontAwesome.otf b/static/java/fonts/FontAwesome.otf
new file mode 100644
index 0000000000000000000000000000000000000000..81c9ad949b47f64afeca5642ee2494b6e3147f44
Binary files /dev/null and b/static/java/fonts/FontAwesome.otf differ
diff --git a/static/java/fonts/fontawesome-webfont.eot b/static/java/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000000000000000000000000000000000000..84677bc0c5f37f1fac9d87548c4554b5c91717cf
Binary files /dev/null and b/static/java/fonts/fontawesome-webfont.eot differ
diff --git a/static/java/fonts/fontawesome-webfont.svg b/static/java/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d907b25ae60ec7e3d32e4027aa6e6b7595de97af
--- /dev/null
+++ b/static/java/fonts/fontawesome-webfont.svg
@@ -0,0 +1,520 @@
+<?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="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" "  horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#xd8;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" horiz-adv-x="1537" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" horiz-adv-x="1537" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -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 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.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.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1536 160q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5v-960z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.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.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -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 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1792" />
+<glyph unicode="&#xf117;" horiz-adv-x="1792" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.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.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+<glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
+<glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
+<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
+<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
+<glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
+<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" />
+<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+<glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" />
+<glyph unicode="&#xf1a1;" horiz-adv-x="1984" d="M831 572q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98zM1292 711q56 0 96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96q0 57 41.5 98t97.5 41zM1984 722q0 -62 -31 -114t-83 -82q5 -33 5 -61 q0 -121 -68.5 -230.5t-197.5 -193.5q-125 -82 -285.5 -125.5t-335.5 -43.5q-176 0 -336.5 43.5t-284.5 125.5q-129 84 -197.5 193t-68.5 231q0 29 5 66q-48 31 -77 81.5t-29 109.5q0 94 66 160t160 66q83 0 148 -55q248 158 592 164l134 423q4 14 17.5 21.5t28.5 4.5 l347 -82q22 50 68.5 81t102.5 31q77 0 131.5 -54.5t54.5 -131.5t-54.5 -132t-131.5 -55q-76 0 -130.5 54t-55.5 131l-315 74l-116 -366q327 -14 560 -166q64 58 151 58q94 0 160 -66t66 -160zM1664 1459q-45 0 -77 -32t-32 -77t32 -77t77 -32t77 32t32 77t-32 77t-77 32z M77 722q0 -67 51 -111q49 131 180 235q-36 25 -82 25q-62 0 -105.5 -43.5t-43.5 -105.5zM1567 105q112 73 171.5 166t59.5 194t-59.5 193.5t-171.5 165.5q-116 75 -265.5 115.5t-313.5 40.5t-313.5 -40.5t-265.5 -115.5q-112 -73 -171.5 -165.5t-59.5 -193.5t59.5 -194 t171.5 -166q116 -75 265.5 -115.5t313.5 -40.5t313.5 40.5t265.5 115.5zM1850 605q57 46 57 117q0 62 -43.5 105.5t-105.5 43.5q-49 0 -86 -28q131 -105 178 -238zM1258 237q11 11 27 11t27 -11t11 -27.5t-11 -27.5q-99 -99 -319 -99h-2q-220 0 -319 99q-11 11 -11 27.5 t11 27.5t27 11t27 -11q77 -77 265 -77h2q188 0 265 77z" />
+<glyph unicode="&#xf1a2;" d="M950 393q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18t8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51zM671 613q0 -37 -26 -64t-63 -27t-63 27t-26 64t26 63t63 26t63 -26t26 -63zM1214 1049q-29 0 -50 21t-21 50 q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21zM1216 1408q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227v894q0 133 94 227t226 94h896zM1321 596q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48 q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43q-51 0 -87 -36.5t-36 -87.5q0 -37 19.5 -67.5t52.5 -45.5 q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54zM971 702q37 0 63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64t26 63t63 26z" />
+<glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -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 103 t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+<glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
+<glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
+<glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
+<glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" />
+<glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" />
+<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
+<glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
+<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" />
+<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
+<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" />
+<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
+<glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
+<glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
+<glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " />
+<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
+<glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
+<glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+<glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1bd;" d="M1397 1408q58 0 98.5 -40.5t40.5 -98.5v-1258q0 -58 -40.5 -98.5t-98.5 -40.5h-1258q-58 0 -98.5 40.5t-40.5 98.5v1258q0 58 40.5 98.5t98.5 40.5h1258zM1465 11v1258q0 28 -20 48t-48 20h-1258q-28 0 -48 -20t-20 -48v-1258q0 -28 20 -48t48 -20h1258q28 0 48 20t20 48 zM694 749l188 -387l533 145v-496q0 -7 -5.5 -12.5t-12.5 -5.5h-1258q-7 0 -12.5 5.5t-5.5 12.5v141l711 195l-212 439q4 1 12 2.5t12 1.5q170 32 303.5 21.5t221 -46t143.5 -94.5q27 -28 -25 -42q-64 -16 -256 -62l-97 198q-111 7 -240 -16zM1397 1287q7 0 12.5 -5.5 t5.5 -12.5v-428q-85 30 -188 52q-294 64 -645 12l-18 -3l-65 134h-233l85 -190q-132 -51 -230 -137v560q0 7 5.5 12.5t12.5 5.5h1258zM286 387q-14 -3 -26 4.5t-14 21.5q-24 203 166 305l129 -270z" />
+<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
+<glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
+<glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
+<glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" />
+<glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" />
+<glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+<glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+<glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
+<glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
+<glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+<glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
+<glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
+<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" />
+<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" />
+<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
+<glyph unicode="&#xf1d4;" d="M825 547l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150l323 -589v-435h134v436zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
+<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
+<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
+<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
+<glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" />
+<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+<glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+<glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+<glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
+<glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
+<glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
+<glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
+<glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+<glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
+<glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+<glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
+<glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1ed;" horiz-adv-x="1792" d="M1112 1090q0 159 -237 159h-70q-32 0 -59.5 -21.5t-34.5 -52.5l-63 -276q-2 -5 -2 -16q0 -24 17 -39.5t41 -15.5h53q69 0 128.5 13t112.5 41t83.5 81.5t30.5 126.5zM1716 938q0 -265 -220 -428q-219 -161 -612 -161h-61q-32 0 -59 -21.5t-34 -52.5l-73 -316 q-8 -36 -40.5 -61.5t-69.5 -25.5h-213q-31 0 -53 20t-22 51q0 10 13 65h151q34 0 64 23.5t38 56.5l73 316q8 33 37.5 57t63.5 24h61q390 0 607 160t217 421q0 129 -51 207q183 -92 183 -335zM1533 1123q0 -264 -221 -428q-218 -161 -612 -161h-60q-32 0 -59.5 -22t-34.5 -53 l-73 -315q-8 -36 -40 -61.5t-69 -25.5h-214q-31 0 -52.5 19.5t-21.5 51.5q0 8 2 20l300 1301q8 36 40.5 61.5t69.5 25.5h444q68 0 125 -4t120.5 -15t113.5 -30t96.5 -50.5t77.5 -74t49.5 -103.5t18.5 -136z" />
+<glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" />
+<glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
+<glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+<glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M322 689h-15q-19 0 -19 18q0 28 19 85q5 15 15 19.5t28 4.5q77 0 77 -49q0 -41 -30.5 -59.5t-74.5 -18.5zM664 528q-47 0 -47 29q0 62 123 62l3 -3q-5 -88 -79 -88zM1438 687h-15q-19 0 -19 19q0 28 19 85q5 15 14.5 19t28.5 4q77 0 77 -49q0 -41 -30.5 -59.5 t-74.5 -18.5zM1780 527q-47 0 -47 30q0 62 123 62l3 -3q-5 -89 -79 -89zM373 894h-128q-8 0 -14.5 -4t-8.5 -7.5t-7 -12.5q-3 -7 -45 -190t-42 -192q0 -7 5.5 -12.5t13.5 -5.5h62q25 0 32.5 34.5l15 69t32.5 34.5q47 0 87.5 7.5t80.5 24.5t63.5 52.5t23.5 84.5 q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM719 798q-38 0 -74 -6q-2 0 -8.5 -1t-9 -1.5l-7.5 -1.5t-7.5 -2t-6.5 -3t-6.5 -4t-5 -5t-4.5 -7t-4 -9q-9 -29 -9 -39t9 -10q5 0 21.5 5t19.5 6q30 8 58 8q74 0 74 -36q0 -11 -10 -14q-8 -2 -18 -3t-21.5 -1.5t-17.5 -1.5 q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5q0 -38 26 -59.5t64 -21.5q24 0 45.5 6.5t33 13t38.5 23.5q-3 -7 -3 -15t5.5 -13.5t12.5 -5.5h56q1 1 7 3.5t7.5 3.5t5 3.5t5 5.5t2.5 8l45 194q4 13 4 30q0 81 -145 81zM1247 793h-74q-22 0 -39 -23q-5 -7 -29.5 -51 t-46.5 -81.5t-26 -38.5l-5 4q0 77 -27 166q-1 5 -3.5 8.5t-6 6.5t-6.5 5t-8.5 3t-8.5 1.5t-9.5 1t-9 0.5h-10h-8.5q-38 0 -38 -21l1 -5q5 -53 25 -151t25 -143q2 -16 2 -24q0 -19 -30.5 -61.5t-30.5 -58.5q0 -13 40 -13q61 0 76 25l245 415q10 20 10 26q0 9 -8 9zM1489 892 h-129q-18 0 -29 -23q-6 -13 -46.5 -191.5t-40.5 -190.5q0 -20 43 -20h7.5h9h9t9.5 1t8.5 2t8.5 3t6.5 4.5t5.5 6t3 8.5l21 91q2 10 10.5 17t19.5 7q47 0 87.5 7t80.5 24.5t63.5 52.5t23.5 84q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM1835 798q-26 0 -74 -6 q-38 -6 -48 -16q-7 -8 -11 -19q-8 -24 -8 -39q0 -10 8 -10q1 0 41 12q30 8 58 8q74 0 74 -36q0 -12 -10 -14q-4 -1 -57 -7q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5t26 -58.5t64 -21.5q24 0 45 6t34 13t38 24q-3 -15 -3 -16q0 -5 2 -8.5t6.5 -5.5t8 -3.5 t10.5 -2t9.5 -0.5h9.5h8q42 0 48 25l45 194q3 15 3 31q0 81 -145 81zM2157 889h-55q-25 0 -33 -40q-10 -44 -36.5 -167t-42.5 -190v-5q0 -16 16 -18h1h57q10 0 18.5 6.5t10.5 16.5l83 374h-1l1 5q0 7 -5.5 12.5t-13.5 5.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048 q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
+<glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+<glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+<glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
+<glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+<glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
+<glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
+<glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
+<glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
+<glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
+<glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
+<glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
+<glyph unicode="&#xf20d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf20e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/static/java/fonts/fontawesome-webfont.ttf b/static/java/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..96a3639cdde5e8ab459c6380e3b9524ee81641dc
Binary files /dev/null and b/static/java/fonts/fontawesome-webfont.ttf differ
diff --git a/static/java/fonts/fontawesome-webfont.woff b/static/java/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000000000000000000000000000000000000..628b6a52a87e62c6f22426e17c01f6a303aa194e
Binary files /dev/null and b/static/java/fonts/fontawesome-webfont.woff differ
diff --git a/static/java/images/discover-bg.png b/static/java/images/discover-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..67f95e0f13d5bb36231664e65f67ca2721be686b
Binary files /dev/null and b/static/java/images/discover-bg.png differ
diff --git a/static/java/images/footer-bg.png b/static/java/images/footer-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a6ee73cebe8767be0c42b8156c9e4f7e446f60c
Binary files /dev/null and b/static/java/images/footer-bg.png differ
diff --git a/static/java/images/header-bg.png b/static/java/images/header-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..86bfd33afaee16a067add4435c0603302cded376
Binary files /dev/null and b/static/java/images/header-bg.png differ
diff --git a/static/java/images/icon-connect.jpg b/static/java/images/icon-connect.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..c3542d88521a99a1a093417ff9a5a589c072021f
Binary files /dev/null and b/static/java/images/icon-connect.jpg differ
diff --git a/static/java/images/icon-download.jpg b/static/java/images/icon-download.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..2ec9f6823043ebe04d0f2d15a7f8332b07357bb6
Binary files /dev/null and b/static/java/images/icon-download.jpg differ
diff --git a/static/java/images/icon-live.jpg b/static/java/images/icon-live.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7aff3ed85fa0ce968630e077ec791379a0f900b1
Binary files /dev/null and b/static/java/images/icon-live.jpg differ
diff --git a/static/java/images/icon-tutorial.jpg b/static/java/images/icon-tutorial.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..99fa9437ddda5a538e23ced83683210ee6590917
Binary files /dev/null and b/static/java/images/icon-tutorial.jpg differ
diff --git a/static/java/images/logo-01.png b/static/java/images/logo-01.png
new file mode 100644
index 0000000000000000000000000000000000000000..547630522aa9c706f8d7e85dcb015d3e1877fccf
Binary files /dev/null and b/static/java/images/logo-01.png differ
diff --git a/static/java/images/logo-02.png b/static/java/images/logo-02.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d39aff89cf33268232e4652cdc6f091ae21546d
Binary files /dev/null and b/static/java/images/logo-02.png differ
diff --git a/static/java/images/logo-2lemetry.jpg b/static/java/images/logo-2lemetry.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..74294fe0d978cac6c96b6eae365c75482f6e2828
Binary files /dev/null and b/static/java/images/logo-2lemetry.jpg differ
diff --git a/static/java/images/logo-actuate.jpg b/static/java/images/logo-actuate.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..5147f1fabc4d0fd059757080b062ad2da43847af
Binary files /dev/null and b/static/java/images/logo-actuate.jpg differ
diff --git a/static/java/images/logo-axeda.jpg b/static/java/images/logo-axeda.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..1a8ea8c0ba412cf81f9dd9bc232d929a6c2c92c3
Binary files /dev/null and b/static/java/images/logo-axeda.jpg differ
diff --git a/static/java/images/logo-bitreactive.jpg b/static/java/images/logo-bitreactive.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..68bfa1f6c78d57adb599ae8e27c4382488a51c2e
Binary files /dev/null and b/static/java/images/logo-bitreactive.jpg differ
diff --git a/static/java/images/logo-eurotech.jpg b/static/java/images/logo-eurotech.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..53f26451c7b920cfdd37c98608bb5c554b0ff3de
Binary files /dev/null and b/static/java/images/logo-eurotech.jpg differ
diff --git a/static/java/images/logo-ibm.jpg b/static/java/images/logo-ibm.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..27eeaed62a253eee4876f4f281fb9c530cdf398b
Binary files /dev/null and b/static/java/images/logo-ibm.jpg differ
diff --git a/static/java/images/logo-sierra.jpg b/static/java/images/logo-sierra.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..cc7ae9ca04282e35ed5d320b55ec91b18ba607c4
Binary files /dev/null and b/static/java/images/logo-sierra.jpg differ
diff --git a/static/java/images/m2m_eclipse_logo.png b/static/java/images/m2m_eclipse_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b50fb1e3ff2a392ae00fde99c88e79f358845a6
Binary files /dev/null and b/static/java/images/m2m_eclipse_logo.png differ
diff --git a/static/java/images/vision.png b/static/java/images/vision.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f5b0f3fc0b981d0576508c717162f62c5524bcc
Binary files /dev/null and b/static/java/images/vision.png differ
diff --git a/static/java/index.html b/static/java/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..7af3910c63509bce819c535d77a22fbf7ed0b493
--- /dev/null
+++ b/static/java/index.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>iot.eclipse.org &mdash; IoT development made simple</title>
+  <link href='http://fonts.googleapis.com/css?family=Lato:100,300,400' rel='stylesheet' type='text/css'>
+  <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+  <link href='http://fonts.googleapis.com/css?family=Sanchez' rel='stylesheet' type='text/css'>
+
+  <!-- Bootstrap -->
+  <link href="stylesheet/font-awesome.min.css" rel="stylesheet">
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+  <link href="stylesheet/theme.css" rel="stylesheet">
+
+
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+</head>
+
+<body>
+
+  <header>
+    <nav class="navbar">
+      <div class="container">
+        <div class="row">
+          <div class="col-sm-2">
+            <a href="/"><img src="/assets/images/iot-logo.png">
+            </a>
+          </div>
+          <div class="col-sm-10">
+            <ul class="list-inline right menu">
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+                <ul class="dropdown-menu">
+                  <li><a href="/standards">Standards</a>
+                  </li>
+                  <li><a href="/frameworks">Services &amp; Frameworks</a>
+                  </li>
+                  <li><a href="/projects">All the projects</a>
+                  </li>
+                </ul>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+              </li>
+              <li><a href="/ecosystem">Members</a>
+              </li>
+              <li><a href="#">Getting Started</a>
+              </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </nav>
+  </header>
+
+  <!-- Place this tag after the last +1 button tag. -->
+  <script type="text/javascript">
+  (function() {
+    var po = document.createElement('script');
+    po.type = 'text/javascript';
+    po.async = true;
+    po.src = 'https://apis.google.com/js/plusone.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(po, s);
+  })();
+  </script>
+
+
+  <main class="main">
+
+    <div class="header">
+      <div class="container">
+        <div class="row">
+          <div class="col-md-12">
+            <img src="images/logo-01.png" alt="">
+            <img src="images/logo-02.png" alt="">
+          </div>
+          <div class="col-md-12">
+            <h1>Open IoT stack for <strong>Java Developers</strong></h1>
+            <p>Eclipse IoT has the open source technology that makes it easy for Java developers to create IoT applications.</p>
+            <!--              <button>Get Started | <i class="fa fa-arrow-circle-right"></i></button> -->
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="icons-1">
+      <div class="container">
+        <div class="row">
+          <div class="col-md-6">
+            <a href="open-iot-stack-for-java.html">
+              <img src="images/icon-connect.jpg" alt="">
+              <h2><strong>Connect</strong> & <strong>Manage</strong></h2>
+            </a>
+            <p>Find out how the Open IoT Stack for Java can help you connect and manage your IoT solutions</p>
+            <a href="open-iot-stack-for-java.html">
+              <button>Learn More | <i class="fa fa-arrow-circle-right"></i>
+              </button>
+            </a>
+
+          </div>
+          <div class="col-md-6">
+            <a href="download">
+              <img src="images/icon-download.jpg" alt="">
+              <h2><strong>Download</strong> Software</h2>
+            </a>
+            <p>Start building end-to-end IoT applications by downloading our open-source IoT components</p>
+            <a href="download">
+              <button>Download | <i class="fa fa-arrow-circle-right"></i>
+              </button>
+            </a>
+          </div>
+        </div>
+      </div>
+    </div>
+
+
+    <div class="icons-2">
+      <div class="container">
+        <div class="row">
+          <div class="col-md-6">
+            <a href="tutorial">
+              <img src="images/icon-tutorial.jpg" alt="">
+              <h2>Do the <strong>Tutorial</strong></h2>
+            </a>
+            <p>Is there any better way to get familiar with a technology than getting your hands dirty and code?
+              <br/> Follow our tutorial and learn about the Eclipse IoT stack for Java by example</p>
+            <a href="tutorial">
+              <button>Follow the Tutorial | <i class="fa fa-arrow-circle-right"></i>
+              </button>
+            </a>
+          </div>
+          <div class="col-md-6">
+            <a href="/demo">
+              <img src="images/icon-live.jpg" alt="">
+              <h2>See it <strong>Live</strong></h2>
+            </a>
+            <p>Check out our live demo to see the Eclipse Open IoT stack in action! </p>
+            <a href="/demo">
+              <button>Learn More | <i class="fa fa-arrow-circle-right"></i>
+              </button>
+            </a>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="discover">
+      <div class="container">
+        <div class="row">
+          <div class="span12">
+            <h2>Discover</h2>
+            <p>Discover what companies are doing with Eclipse IoT for Java.</p>
+            <a href="discover.html">
+              <button>Learn More | <i class="fa fa-arrow-circle-right"></i>
+              </button>
+            </a>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="logos">
+      <div class="container">
+        <div class="row">
+          <div class="span10 offset1" id="members">
+            <img src="/images/ecosystem/logo-2lemetry.png" width="120">
+            <img src="/images/ecosystem/logo-actuate.png" width="120">
+            <img src="/images/ecosystem/logo-dtag.png" width="120">
+            <img src="/images/ecosystem/logo-bitreactive.png" width="120">
+            <img src="/images/ecosystem/logo-dcsquare.png" width="120">
+            <img src="/images/ecosystem/logo-eurotech.png" width="120">
+            <img src="/images/ecosystem/logo-ibh.png" width="120">
+            <img src="/images/ecosystem/logo-ibm.png" width="120">
+            <img src="/images/ecosystem/logo-laas.png" width="120">
+            <img src="/images/ecosystem/logo-m2m-alliance.png" width="120">
+            <img src="/images/ecosystem/logo-openhab.png" width="120">
+            <img src="/images/ecosystem/logo-sierra.png" width="120">
+            <img src="/images/ecosystem/logo-ubuntu.png" width="120">
+          </div>
+        </div>
+      </div>
+    </div>
+  </main>
+
+
+  <footer>
+
+    <div class="container">
+      <div class="row">
+        <div class="col-md-6">
+          <nav>
+            <ul class="list-inline menu">
+              <li><a href="#">Technology</a>
+              </li>
+              <li><a href="#">Community</a>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </nav>
+          <div class="socials">
+            <a href="#" class="social-facebook">&nbsp;</a>
+            <a href="#" class="social-twitter">&nbsp;</a>
+            <a href="#" class="social-youtube">&nbsp;</a>
+            <a href="#" class="social-share">&nbsp;</a>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+        </div>
+      </div>
+    </div>
+
+
+  </footer>
+
+
+  <!-- JS is at the end of the document so the pages load faster -->
+  <script src="/js/jquery.js"></script>
+  <script src="js/bootstrap/bootstrap.min.js"></script>
+  <script src="/js/shuffle.js"></script>
+
+
+  <script type="text/javascript">
+  $(document).ready(function() {
+    $('#members').shuffle();
+  });
+  </script>
+
+
+</body>
+
+</html>
diff --git a/static/java/js/bootstrap-lightbox.min.js b/static/java/js/bootstrap-lightbox.min.js
new file mode 100755
index 0000000000000000000000000000000000000000..3f38a460e5326cb536b430ba12d317dea37d14fd
--- /dev/null
+++ b/static/java/js/bootstrap-lightbox.min.js
@@ -0,0 +1,6 @@
+/*!
+* bootstrap-lightbox.js v0.6.1 
+* Copyright 2013 Jason Butz
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="lightbox"]',"click.dismiss.lightbox",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".lightbox-body").load(this.options.remote)};t.prototype=e.extend({},e.fn.modal.Constructor.prototype),t.prototype.constructor=t,t.prototype.enforceFocus=function(){var t=this;e(document).on("focusin.lightbox",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},t.prototype.show=function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.preloadSize(function(){t.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})})},t.prototype.hide=function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.lightbox"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},t.prototype.escape=function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.lightbox",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.lightbox")},t.prototype.preloadSize=function(t){var n=e.Callbacks();t&&n.add(t);var r=this,i,s,o,u,a,f,l,c,h,p;i=e(window).height(),s=e(window).width(),o=parseInt(r.$element.find(".lightbox-content").css("padding-top"),10),u=parseInt(r.$element.find(".lightbox-content").css("padding-bottom"),10),a=parseInt(r.$element.find(".lightbox-content").css("padding-left"),10),f=parseInt(r.$element.find(".lightbox-content").css("padding-right"),10),l=r.$element.find(".lightbox-content").find("img:first"),c=new Image,c.onload=function(){c.width+a+f>=s&&(h=c.width,p=c.height,c.width=s-a-f,c.height=p/h*c.width),c.height+o+u>=i&&(h=c.width,p=c.height,c.height=i-o-u,c.width=h/p*c.height),r.$element.css({position:"fixed",width:c.width+a+f,height:c.height+o+u,top:i/2-(c.height+o+u)/2,left:"50%","margin-left":-1*(c.width+a+f)/2}),r.$element.find(".lightbox-content").css({width:c.width,height:c.height}),n.fire()},c.src=l.attr("src")};var n=e.fn.lightbox;e.fn.lightbox=function(n){return this.each(function(){var r=e(this),i=r.data("lightbox"),s=e.extend({},e.fn.lightbox.defaults,r.data(),typeof n=="object"&&n);i||r.data("lightbox",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.lightbox.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.lightbox.Constructor=t,e.fn.lightbox.noConflict=function(){return e.fn.lightbox=n,this},e(document).on("click.lightbox.data-api",'[data-toggle*="lightbox"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("lightbox")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.lightbox(s).one("hide",function(){n.focus()})})}(window.jQuery);
\ No newline at end of file
diff --git a/static/java/js/bootstrap/bootstrap.min.js b/static/java/js/bootstrap/bootstrap.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..089cf42e888958ab1f88123030bc019e9d8401c1
--- /dev/null
+++ b/static/java/js/bootstrap/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){e(function(){"use strict";e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()},e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e(function(){e("body").on("click.alert.data-api",t,n.prototype.close)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.parent('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")},e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e(function(){e("body").on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=n,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},to:function(t){var n=this.$element.find(".item.active"),r=n.parent().children(),i=r.index(n),s=this;if(t>r.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){s.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",e(r[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f=e.Event("slide",{relatedTarget:i[0]});this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u]();if(i.hasClass("active"))return;if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}},e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e(function(){e("body").on("click.carousel.data-api","[data-slide]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=!i.data("modal")&&e.extend({},i.data(),n.data());i.carousel(s),t.preventDefault()})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning)return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning)return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=typeof n=="object"&&n;i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e(function(){e("body").on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})})}(window.jQuery),!function(e){"use strict";function r(){i(e(t)).removeClass("open")}function i(t){var n=t.attr("data-target"),r;return n||(n=t.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,"")),r=e(n),r.length||(r=t.parent()),r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||(s.toggleClass("open"),n.focus()),!1},keydown:function(t){var n,r,s,o,u,a;if(!/(38|40|27)/.test(t.keyCode))return;n=e(this),t.preventDefault(),t.stopPropagation();if(n.is(".disabled, :disabled"))return;o=i(n),u=o.hasClass("open");if(!u||u&&t.keyCode==27)return n.click();r=e("[role=menu] li:not(.divider) a",o);if(!r.length)return;a=r.index(r.filter(":focus")),t.keyCode==38&&a>0&&a--,t.keyCode==40&&a<r.length-1&&a++,~a||(a=0),r.eq(a).focus()}},e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e(function(){e("html").on("click.dropdown.data-api touchstart.dropdown.data-api",r),e("body").on("click.dropdown touchstart.dropdown.data-api",".dropdown",function(e){e.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;e("body").addClass("modal-open"),this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1).focus(),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.trigger("shown")}):t.$element.trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,e("body").removeClass("modal-open"),this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(e){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,e.proxy(this.removeBackdrop,this)):this.removeBackdrop()):t&&t()}},e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e(function(){e("body").on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):this.options.trigger!="manual"&&(i=this.options.trigger=="hover"?"mouseenter":"focus",s=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this))),this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,t,this.$element.data()),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)return n.show();clearTimeout(this.timeout),n.hoverState="in",this.timeout=setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var e,t,n,r,i,s,o;if(this.hasContent()&&this.enabled){e=this.tip(),this.setContent(),this.options.animation&&e.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,t=/in/.test(s),e.remove().css({top:0,left:0,display:"block"}).appendTo(t?this.$element:document.body),n=this.getPosition(t),r=e[0].offsetWidth,i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.css(o).addClass(s).addClass("in")}},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).remove()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.remove()})}var t=this,n=this.tip();return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?r():n.remove(),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content > *")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-content")||(typeof n.content=="function"?n.content.call(t[0]):n.content),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var t=e(this),n=t.data("target")||t.attr("href"),r=/^#\w/.test(n)&&e(n);return r&&r.length&&[[r.position().top,n]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}},e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active a").last()[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}},e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e(function(){e("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=e(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:t.top+t.height,left:t.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),(e.browser.webkit||e.browser.msie)&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this))},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=!~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(e){var t=this;setTimeout(function(){t.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(t){this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")}},e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e(function(){e("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;t.preventDefault(),n.typeahead(n.data())})})}(window.jQuery);
\ No newline at end of file
diff --git a/static/java/js/bootstrap/min/bootstrap.min-min.js b/static/java/js/bootstrap/min/bootstrap.min-min.js
new file mode 100644
index 0000000000000000000000000000000000000000..d91ea08f50431b2f4b6f66a66d37f4496d022340
--- /dev/null
+++ b/static/java/js/bootstrap/min/bootstrap.min-min.js
@@ -0,0 +1 @@
+!function(t){t(function(){"use strict";t.support.transition=function(){var t=function(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i;for(i in e)if(void 0!==t.style[i])return e[i]}();return t&&{end:t}}()})}(window.jQuery),!function(t){"use strict";var e='[data-dismiss="alert"]',i=function(i){t(i).on("click",e,this.close)};i.prototype.close=function(e){function i(){o.trigger("closed").remove()}var s=t(this),n=s.attr("data-target"),o;n||(n=s.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,"")),o=t(n),e&&e.preventDefault(),o.length||(o=s.hasClass("alert")?s:s.parent()),o.trigger(e=t.Event("close")),e.isDefaultPrevented()||(o.removeClass("in"),t.support.transition&&o.hasClass("fade")?o.on(t.support.transition.end,i):i())},t.fn.alert=function(e){return this.each(function(){var s=t(this),n=s.data("alert");n||s.data("alert",n=new i(this)),"string"==typeof e&&n[e].call(s)})},t.fn.alert.Constructor=i,t(function(){t("body").on("click.alert.data-api",e,i.prototype.close)})}(window.jQuery),!function(t){"use strict";var e=function(e,i){this.$element=t(e),this.options=t.extend({},t.fn.button.defaults,i)};e.prototype.setState=function(t){var e="disabled",i=this.$element,s=i.data(),n=i.is("input")?"val":"html";t+="Text",s.resetText||i.data("resetText",i[n]()),i[n](s[t]||this.options[t]),setTimeout(function(){"loadingText"==t?i.addClass(e).attr(e,e):i.removeClass(e).removeAttr(e)},0)},e.prototype.toggle=function(){var t=this.$element.parent('[data-toggle="buttons-radio"]');t&&t.find(".active").removeClass("active"),this.$element.toggleClass("active")},t.fn.button=function(i){return this.each(function(){var s=t(this),n=s.data("button"),o="object"==typeof i&&i;n||s.data("button",n=new e(this,o)),"toggle"==i?n.toggle():i&&n.setState(i)})},t.fn.button.defaults={loadingText:"loading..."},t.fn.button.Constructor=e,t(function(){t("body").on("click.button.data-api","[data-toggle^=button]",function(e){var i=t(e.target);i.hasClass("btn")||(i=i.closest(".btn")),i.button("toggle")})})}(window.jQuery),!function(t){"use strict";var e=function(e,i){this.$element=t(e),this.options=i,this.options.slide&&this.slide(this.options.slide),"hover"==this.options.pause&&this.$element.on("mouseenter",t.proxy(this.pause,this)).on("mouseleave",t.proxy(this.cycle,this))};e.prototype={cycle:function(e){return e||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},to:function(e){var i=this.$element.find(".item.active"),s=i.parent().children(),n=s.index(i),o=this;if(!(e>s.length-1||0>e))return this.sliding?this.$element.one("slid",function(){o.to(e)}):n==e?this.pause().cycle():this.slide(e>n?"next":"prev",t(s[e]))},pause:function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition.end&&(this.$element.trigger(t.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){return this.sliding?void 0:this.slide("next")},prev:function(){return this.sliding?void 0:this.slide("prev")},slide:function(e,i){var s=this.$element.find(".item.active"),n=i||s[e](),o=this.interval,a="next"==e?"left":"right",r="next"==e?"first":"last",h=this,l=t.Event("slide",{relatedTarget:n[0]});if(this.sliding=!0,o&&this.pause(),n=n.length?n:this.$element.find(".item")[r](),!n.hasClass("active")){if(t.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(l),l.isDefaultPrevented())return;n.addClass(e),n[0].offsetWidth,s.addClass(a),n.addClass(a),this.$element.one(t.support.transition.end,function(){n.removeClass([e,a].join(" ")).addClass("active"),s.removeClass(["active",a].join(" ")),h.sliding=!1,setTimeout(function(){h.$element.trigger("slid")},0)})}else{if(this.$element.trigger(l),l.isDefaultPrevented())return;s.removeClass("active"),n.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return o&&this.cycle(),this}}},t.fn.carousel=function(i){return this.each(function(){var s=t(this),n=s.data("carousel"),o=t.extend({},t.fn.carousel.defaults,"object"==typeof i&&i),a="string"==typeof i?i:o.slide;n||s.data("carousel",n=new e(this,o)),"number"==typeof i?n.to(i):a?n[a]():o.interval&&n.cycle()})},t.fn.carousel.defaults={interval:5e3,pause:"hover"},t.fn.carousel.Constructor=e,t(function(){t("body").on("click.carousel.data-api","[data-slide]",function(e){var i=t(this),s,n=t(i.attr("data-target")||(s=i.attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")),o=!n.data("modal")&&t.extend({},n.data(),i.data());n.carousel(o),e.preventDefault()})})}(window.jQuery),!function(t){"use strict";var e=function(e,i){this.$element=t(e),this.options=t.extend({},t.fn.collapse.defaults,i),this.options.parent&&(this.$parent=t(this.options.parent)),this.options.toggle&&this.toggle()};e.prototype={constructor:e,dimension:function(){var t=this.$element.hasClass("width");return t?"width":"height"},show:function(){var e,i,s,n;if(!this.transitioning){if(e=this.dimension(),i=t.camelCase(["scroll",e].join("-")),s=this.$parent&&this.$parent.find("> .accordion-group > .in"),s&&s.length){if(n=s.data("collapse"),n&&n.transitioning)return;s.collapse("hide"),n||s.data("collapse",null)}this.$element[e](0),this.transition("addClass",t.Event("show"),"shown"),t.support.transition&&this.$element[e](this.$element[0][i])}},hide:function(){var e;this.transitioning||(e=this.dimension(),this.reset(this.$element[e]()),this.transition("removeClass",t.Event("hide"),"hidden"),this.$element[e](0))},reset:function(t){var e=this.dimension();return this.$element.removeClass("collapse")[e](t||"auto")[0].offsetWidth,this.$element[null!==t?"addClass":"removeClass"]("collapse"),this},transition:function(e,i,s){var n=this,o=function(){"show"==i.type&&n.reset(),n.transitioning=0,n.$element.trigger(s)};this.$element.trigger(i),i.isDefaultPrevented()||(this.transitioning=1,this.$element[e]("in"),t.support.transition&&this.$element.hasClass("collapse")?this.$element.one(t.support.transition.end,o):o())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},t.fn.collapse=function(i){return this.each(function(){var s=t(this),n=s.data("collapse"),o="object"==typeof i&&i;n||s.data("collapse",n=new e(this,o)),"string"==typeof i&&n[i]()})},t.fn.collapse.defaults={toggle:!0},t.fn.collapse.Constructor=e,t(function(){t("body").on("click.collapse.data-api","[data-toggle=collapse]",function(e){var i=t(this),s,n=i.attr("data-target")||e.preventDefault()||(s=i.attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,""),o=t(n).data("collapse")?"toggle":i.data();i[t(n).hasClass("in")?"addClass":"removeClass"]("collapsed"),t(n).collapse(o)})})}(window.jQuery),!function(t){"use strict";function e(){i(t(s)).removeClass("open")}function i(e){var i=e.attr("data-target"),s;return i||(i=e.attr("href"),i=i&&i.replace(/.*(?=#[^\s]*$)/,"")),s=t(i),s.length||(s=e.parent()),s}var s="[data-toggle=dropdown]",n=function(e){var i=t(e).on("click.dropdown.data-api",this.toggle);t("html").on("click.dropdown.data-api",function(){i.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(s){var n=t(this),o,a;if(!n.is(".disabled, :disabled"))return o=i(n),a=o.hasClass("open"),e(),a||(o.toggleClass("open"),n.focus()),!1},keydown:function(e){var s,n,o,a,r,h;if(/(38|40|27)/.test(e.keyCode)&&(s=t(this),e.preventDefault(),e.stopPropagation(),!s.is(".disabled, :disabled"))){if(a=i(s),r=a.hasClass("open"),!r||r&&27==e.keyCode)return s.click();n=t("[role=menu] li:not(.divider) a",a),n.length&&(h=n.index(n.filter(":focus")),38==e.keyCode&&h>0&&h--,40==e.keyCode&&h<n.length-1&&h++,~h||(h=0),n.eq(h).focus())}}},t.fn.dropdown=function(e){return this.each(function(){var i=t(this),s=i.data("dropdown");s||i.data("dropdown",s=new n(this)),"string"==typeof e&&s[e].call(i)})},t.fn.dropdown.Constructor=n,t(function(){t("html").on("click.dropdown.data-api touchstart.dropdown.data-api",e),t("body").on("click.dropdown touchstart.dropdown.data-api",".dropdown",function(t){t.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",s,n.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",s+", [role=menu]",n.prototype.keydown)})}(window.jQuery),!function(t){"use strict";var e=function(e,i){this.options=i,this.$element=t(e).delegate('[data-dismiss="modal"]',"click.dismiss.modal",t.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};e.prototype={constructor:e,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var e=this,i=t.Event("show");this.$element.trigger(i),this.isShown||i.isDefaultPrevented()||(t("body").addClass("modal-open"),this.isShown=!0,this.escape(),this.backdrop(function(){var i=t.support.transition&&e.$element.hasClass("fade");e.$element.parent().length||e.$element.appendTo(document.body),e.$element.show(),i&&e.$element[0].offsetWidth,e.$element.addClass("in").attr("aria-hidden",!1).focus(),e.enforceFocus(),i?e.$element.one(t.support.transition.end,function(){e.$element.trigger("shown")}):e.$element.trigger("shown")}))},hide:function(e){e&&e.preventDefault();var i=this;e=t.Event("hide"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,t("body").removeClass("modal-open"),this.escape(),t(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),t.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var e=this;t(document).on("focusin.modal",function(t){e.$element[0]!==t.target&&!e.$element.has(t.target).length&&e.$element.focus()})},escape:function(){var t=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(e){27==e.which&&t.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var e=this,i=setTimeout(function(){e.$element.off(t.support.transition.end),e.hideModal()},500);this.$element.one(t.support.transition.end,function(){clearTimeout(i),e.hideModal()})},hideModal:function(t){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(e){var i=this,s=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var n=t.support.transition&&s;this.$backdrop=t('<div class="modal-backdrop '+s+'" />').appendTo(document.body),"static"!=this.options.backdrop&&this.$backdrop.click(t.proxy(this.hide,this)),n&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),n?this.$backdrop.one(t.support.transition.end,e):e()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(t.support.transition.end,t.proxy(this.removeBackdrop,this)):this.removeBackdrop()):e&&e()}},t.fn.modal=function(i){return this.each(function(){var s=t(this),n=s.data("modal"),o=t.extend({},t.fn.modal.defaults,s.data(),"object"==typeof i&&i);n||s.data("modal",n=new e(this,o)),"string"==typeof i?n[i]():o.show&&n.show()})},t.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},t.fn.modal.Constructor=e,t(function(){t("body").on("click.modal.data-api",'[data-toggle="modal"]',function(e){var i=t(this),s=i.attr("href"),n=t(i.attr("data-target")||s&&s.replace(/.*(?=#[^\s]+$)/,"")),o=n.data("modal")?"toggle":t.extend({remote:!/#/.test(s)&&s},n.data(),i.data());e.preventDefault(),n.modal(o).one("hide",function(){i.focus()})})})}(window.jQuery),!function(t){"use strict";var e=function(t,e){this.init("tooltip",t,e)};e.prototype={constructor:e,init:function(e,i,s){var n,o;this.type=e,this.$element=t(i),this.options=this.getOptions(s),this.enabled=!0,"click"==this.options.trigger?this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this)):"manual"!=this.options.trigger&&(n="hover"==this.options.trigger?"mouseenter":"focus",o="hover"==this.options.trigger?"mouseleave":"blur",this.$element.on(n+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(o+"."+this.type,this.options.selector,t.proxy(this.leave,this))),this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(e){return e=t.extend({},t.fn[this.type].defaults,e,this.$element.data()),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},enter:function(e){var i=t(e.currentTarget)[this.type](this._options).data(this.type);return i.options.delay&&i.options.delay.show?(clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show),void 0):i.show()},leave:function(e){var i=t(e.currentTarget)[this.type](this._options).data(this.type);return this.timeout&&clearTimeout(this.timeout),i.options.delay&&i.options.delay.hide?(i.hoverState="out",void(this.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide))):i.hide()},show:function(){var t,e,i,s,n,o,a;if(this.hasContent()&&this.enabled){switch(t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),o="function"==typeof this.options.placement?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,e=/in/.test(o),t.remove().css({top:0,left:0,display:"block"}).appendTo(e?this.$element:document.body),i=this.getPosition(e),s=t[0].offsetWidth,n=t[0].offsetHeight,e?o.split(" ")[1]:o){case"bottom":a={top:i.top+i.height,left:i.left+i.width/2-s/2};break;case"top":a={top:i.top-n,left:i.left+i.width/2-s/2};break;case"left":a={top:i.top+i.height/2-n/2,left:i.left-s};break;case"right":a={top:i.top+i.height/2-n/2,left:i.left+i.width}}t.css(a).addClass(o).addClass("in")}},setContent:function(){var t=this.tip(),e=this.getTitle();t.find(".tooltip-inner")[this.options.html?"html":"text"](e),t.removeClass("fade in top bottom left right")},hide:function(){function e(){var e=setTimeout(function(){s.off(t.support.transition.end).remove()},500);s.one(t.support.transition.end,function(){clearTimeout(e),s.remove()})}var i=this,s=this.tip();return s.removeClass("in"),t.support.transition&&this.$tip.hasClass("fade")?e():s.remove(),this},fixTitle:function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(e){return t.extend({},e?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var t,e=this.$element,i=this.options;return t=e.attr("data-original-title")||("function"==typeof i.title?i.title.call(e[0]):i.title)},tip:function(){return this.$tip=this.$tip||t(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},t.fn.tooltip=function(i){return this.each(function(){var s=t(this),n=s.data("tooltip"),o="object"==typeof i&&i;n||s.data("tooltip",n=new e(this,o)),"string"==typeof i&&n[i]()})},t.fn.tooltip.Constructor=e,t.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(t){"use strict";var e=function(t,e){this.init("popover",t,e)};e.prototype=t.extend({},t.fn.tooltip.Constructor.prototype,{constructor:e,setContent:function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content > *")[this.options.html?"html":"text"](i),t.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var t,e=this.$element,i=this.options;return t=e.attr("data-content")||("function"==typeof i.content?i.content.call(e[0]):i.content)},tip:function(){return this.$tip||(this.$tip=t(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),t.fn.popover=function(i){return this.each(function(){var s=t(this),n=s.data("popover"),o="object"==typeof i&&i;n||s.data("popover",n=new e(this,o)),"string"==typeof i&&n[i]()})},t.fn.popover.Constructor=e,t.fn.popover.defaults=t.extend({},t.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(t){"use strict";function e(e,i){var s=t.proxy(this.process,this),n=t(t(e).is("body")?window:e),o;this.options=t.extend({},t.fn.scrollspy.defaults,i),this.$scrollElement=n.on("scroll.scroll-spy.data-api",s),this.selector=(this.options.target||(o=t(e).attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=t("body"),this.refresh(),this.process()}e.prototype={constructor:e,refresh:function(){var e=this,i;this.offsets=t([]),this.targets=t([]),i=this.$body.find(this.selector).map(function(){var e=t(this),i=e.data("target")||e.attr("href"),s=/^#\w/.test(i)&&t(i);return s&&s.length&&[[s.position().top,i]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){e.offsets.push(this[0]),e.targets.push(this[1])})},process:function(){var t=this.$scrollElement.scrollTop()+this.options.offset,e=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,i=e-this.$scrollElement.height(),s=this.offsets,n=this.targets,o=this.activeTarget,a;if(t>=i)return o!=(a=n.last()[0])&&this.activate(a);for(a=s.length;a--;)o!=n[a]&&t>=s[a]&&(!s[a+1]||t<=s[a+1])&&this.activate(n[a])},activate:function(e){var i,s;this.activeTarget=e,t(this.selector).parent(".active").removeClass("active"),s=this.selector+'[data-target="'+e+'"],'+this.selector+'[href="'+e+'"]',i=t(s).parent("li").addClass("active"),i.parent(".dropdown-menu").length&&(i=i.closest("li.dropdown").addClass("active")),i.trigger("activate")}},t.fn.scrollspy=function(i){return this.each(function(){var s=t(this),n=s.data("scrollspy"),o="object"==typeof i&&i;n||s.data("scrollspy",n=new e(this,o)),"string"==typeof i&&n[i]()})},t.fn.scrollspy.Constructor=e,t.fn.scrollspy.defaults={offset:10},t(window).on("load",function(){t('[data-spy="scroll"]').each(function(){var e=t(this);e.scrollspy(e.data())})})}(window.jQuery),!function(t){"use strict";var e=function(e){this.element=t(e)};e.prototype={constructor:e,show:function(){var e=this.element,i=e.closest("ul:not(.dropdown-menu)"),s=e.attr("data-target"),n,o,a;s||(s=e.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,"")),e.parent("li").hasClass("active")||(n=i.find(".active a").last()[0],a=t.Event("show",{relatedTarget:n}),e.trigger(a),a.isDefaultPrevented()||(o=t(s),this.activate(e.parent("li"),i),this.activate(o,o.parent(),function(){e.trigger({type:"shown",relatedTarget:n})})))},activate:function(e,i,s){function n(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),e.addClass("active"),a?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu")&&e.closest("li.dropdown").addClass("active"),s&&s()}var o=i.find("> .active"),a=s&&t.support.transition&&o.hasClass("fade");a?o.one(t.support.transition.end,n):n(),o.removeClass("in")}},t.fn.tab=function(i){return this.each(function(){var s=t(this),n=s.data("tab");n||s.data("tab",n=new e(this)),"string"==typeof i&&n[i]()})},t.fn.tab.Constructor=e,t(function(){t("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(e){e.preventDefault(),t(this).tab("show")})})}(window.jQuery),!function(t){"use strict";var e=function(e,i){this.$element=t(e),this.options=t.extend({},t.fn.typeahead.defaults,i),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=t(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};e.prototype={constructor:e,select:function(){var t=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(t)).change(),this.hide()},updater:function(t){return t},show:function(){var e=t.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:e.top+e.height,left:e.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(e){var i;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(i=t.isFunction(this.source)?this.source(this.query,t.proxy(this.process,this)):this.source,i?this.process(i):this)},process:function(e){var i=this;return e=t.grep(e,function(t){return i.matcher(t)}),e=this.sorter(e),e.length?this.render(e.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(t){return~t.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(t){for(var e=[],i=[],s=[],n;n=t.shift();)n.toLowerCase().indexOf(this.query.toLowerCase())?~n.indexOf(this.query)?i.push(n):s.push(n):e.push(n);return e.concat(i,s)},highlighter:function(t){var e=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return t.replace(new RegExp("("+e+")","ig"),function(t,e){return"<strong>"+e+"</strong>"})},render:function(e){var i=this;return e=t(e).map(function(e,s){return e=t(i.options.item).attr("data-value",s),e.find("a").html(i.highlighter(s)),e[0]}),e.first().addClass("active"),this.$menu.html(e),this},next:function(e){var i=this.$menu.find(".active").removeClass("active"),s=i.next();s.length||(s=t(this.$menu.find("li")[0])),s.addClass("active")},prev:function(t){var e=this.$menu.find(".active").removeClass("active"),i=e.prev();i.length||(i=this.$menu.find("li").last()),i.addClass("active")},listen:function(){this.$element.on("blur",t.proxy(this.blur,this)).on("keypress",t.proxy(this.keypress,this)).on("keyup",t.proxy(this.keyup,this)),(t.browser.webkit||t.browser.msie)&&this.$element.on("keydown",t.proxy(this.keydown,this)),this.$menu.on("click",t.proxy(this.click,this)).on("mouseenter","li",t.proxy(this.mouseenter,this))},move:function(t){if(this.shown){switch(t.keyCode){case 9:case 13:case 27:t.preventDefault();break;case 38:t.preventDefault(),this.prev();break;case 40:t.preventDefault(),this.next()}t.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=!~t.inArray(e.keyCode,[40,38,9,13,27]),this.move(e)},keypress:function(t){this.suppressKeyPressRepeat||this.move(t)},keyup:function(t){switch(t.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}t.stopPropagation(),t.preventDefault()},blur:function(t){var e=this;setTimeout(function(){e.hide()},150)},click:function(t){t.stopPropagation(),t.preventDefault(),this.select()},mouseenter:function(e){this.$menu.find(".active").removeClass("active"),t(e.currentTarget).addClass("active")}},t.fn.typeahead=function(i){return this.each(function(){var s=t(this),n=s.data("typeahead"),o="object"==typeof i&&i;n||s.data("typeahead",n=new e(this,o)),"string"==typeof i&&n[i]()})},t.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},t.fn.typeahead.Constructor=e,t(function(){t("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(e){var i=t(this);i.data("typeahead")||(e.preventDefault(),i.typeahead(i.data()))})})}(window.jQuery);
\ No newline at end of file
diff --git a/static/java/js/index.js b/static/java/js/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..8e0254778d167bc87075f4a72f4cdf8188781f97
--- /dev/null
+++ b/static/java/js/index.js
@@ -0,0 +1,25 @@
+/**
+ * Onload handler
+ */
+$(document).ready(function() {
+    // Enable dropdowns
+    $('.dropdown-toggle').dropdown();
+
+    $('#iot-definition').popover({
+        placement: 'bottom',
+        trigger: 'hover'
+    });
+
+});
+
+$(window).bind("load", function() {
+    $('.home-box').addClass('loaded');
+});
+
+
+($("a[data-toggle=modal]")).click(function() {
+    var target, url;
+    target = ($(this)).attr('data-target');
+    url = ($(this)).attr('href');
+    return ($(target)).load(url);
+});
\ No newline at end of file
diff --git a/static/java/js/jquery.min.js b/static/java/js/jquery.min.js
new file mode 100755
index 0000000000000000000000000000000000000000..00c4e23a27b15f6158ea46a016beb0ae95c6596d
--- /dev/null
+++ b/static/java/js/jquery.min.js
@@ -0,0 +1,9252 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			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 = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context ? context.ownerDocument || context : document );
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// 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 ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we 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: $(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 current version of jQuery being used
+	jquery: "1.7.1",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// 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, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// 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 ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.add( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	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: 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({
+	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 ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// 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.fireWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).off( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery.Callbacks( "once memory" );
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// 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 || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// 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.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array, i ) {
+		var len;
+
+		if ( array ) {
+			if ( indexOf ) {
+				return indexOf.call( array, elem, i );
+			}
+
+			len = array.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in array && array[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; 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 ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; 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, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// 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 ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.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 ) {
+		if ( typeof context === "string" ) {
+			var 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
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( 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 || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+	var object = flagsCache[ flags ] = {},
+		i, length;
+	flags = flags.split( /\s+/ );
+	for ( i = 0, length = flags.length; i < length; i++ ) {
+		object[ flags[i] ] = true;
+	}
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	flags:	an optional list of space-separated flags that will change how
+ *			the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *	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( flags ) {
+
+	// Convert flags from String-formatted to Object-formatted
+	// (we check in cache first)
+	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+	var // Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = [],
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// 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,
+		// Add one or several callbacks to the list
+		add = function( args ) {
+			var i,
+				length,
+				elem,
+				type,
+				actual;
+			for ( i = 0, length = args.length; i < length; i++ ) {
+				elem = args[ i ];
+				type = jQuery.type( elem );
+				if ( type === "array" ) {
+					// Inspect recursively
+					add( elem );
+				} else if ( type === "function" ) {
+					// Add if not in unique mode and callback is not in
+					if ( !flags.unique || !self.has( elem ) ) {
+						list.push( elem );
+					}
+				}
+			}
+		},
+		// Fire callbacks
+		fire = function( context, args ) {
+			args = args || [];
+			memory = !flags.memory || [ context, args ];
+			firing = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+					memory = true; // Mark as halted
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( !flags.once ) {
+					if ( stack && stack.length ) {
+						memory = stack.shift();
+						self.fireWith( memory[ 0 ], memory[ 1 ] );
+					}
+				} else if ( memory === true ) {
+					self.disable();
+				} else {
+					list = [];
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					var length = list.length;
+					add( 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, unless previous
+					// firing was halted (stopOnFalse)
+					} else if ( memory && memory !== true ) {
+						firingStart = length;
+						fire( memory[ 0 ], memory[ 1 ] );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					var args = arguments,
+						argIndex = 0,
+						argLength = args.length;
+					for ( ; argIndex < argLength ; argIndex++ ) {
+						for ( var i = 0; i < list.length; i++ ) {
+							if ( args[ argIndex ] === list[ i ] ) {
+								// Handle firingIndex and firingLength
+								if ( firing ) {
+									if ( i <= firingLength ) {
+										firingLength--;
+										if ( i <= firingIndex ) {
+											firingIndex--;
+										}
+									}
+								}
+								// Remove the element
+								list.splice( i--, 1 );
+								// If we have some unicity property then
+								// we only need to do this once
+								if ( flags.unique ) {
+									break;
+								}
+							}
+						}
+					}
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				if ( list ) {
+					var i = 0,
+						length = list.length;
+					for ( ; i < length; i++ ) {
+						if ( fn === list[ i ] ) {
+							return true;
+						}
+					}
+				}
+				return false;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				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 || memory === true ) {
+					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 ( stack ) {
+					if ( firing ) {
+						if ( !flags.once ) {
+							stack.push( [ context, args ] );
+						}
+					} else if ( !( flags.once && memory ) ) {
+						fire( context, 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 !!memory;
+			}
+		};
+
+	return self;
+};
+
+
+
+
+var // Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var doneList = jQuery.Callbacks( "once memory" ),
+			failList = jQuery.Callbacks( "once memory" ),
+			progressList = jQuery.Callbacks( "memory" ),
+			state = "pending",
+			lists = {
+				resolve: doneList,
+				reject: failList,
+				notify: progressList
+			},
+			promise = {
+				done: doneList.add,
+				fail: failList.add,
+				progress: progressList.add,
+
+				state: function() {
+					return state;
+				},
+
+				// Deprecated
+				isResolved: doneList.fired,
+				isRejected: failList.fired,
+
+				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+					return this;
+				},
+				always: function() {
+					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+					return this;
+				},
+				pipe: function( fnDone, fnFail, fnProgress ) {
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( {
+							done: [ fnDone, "resolve" ],
+							fail: [ fnFail, "reject" ],
+							progress: [ fnProgress, "notify" ]
+						}, function( handler, data ) {
+							var fn = data[ 0 ],
+								action = data[ 1 ],
+								returned;
+							if ( jQuery.isFunction( fn ) ) {
+								deferred[ handler ](function() {
+									returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								});
+							} else {
+								deferred[ handler ]( newDefer[ action ] );
+							}
+						});
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					if ( obj == null ) {
+						obj = promise;
+					} else {
+						for ( var key in promise ) {
+							obj[ key ] = promise[ key ];
+						}
+					}
+					return obj;
+				}
+			},
+			deferred = promise.promise({}),
+			key;
+
+		for ( key in lists ) {
+			deferred[ key ] = lists[ key ].fire;
+			deferred[ key + "With" ] = lists[ key ].fireWith;
+		}
+
+		// Handle state
+		deferred.done( function() {
+			state = "resolved";
+		}, failList.disable, progressList.lock ).fail( function() {
+			state = "rejected";
+		}, doneList.disable, progressList.lock );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = sliceDeferred.call( arguments, 0 ),
+			i = 0,
+			length = args.length,
+			pValues = new Array( length ),
+			count = length,
+			pCount = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					deferred.resolveWith( deferred, args );
+				}
+			};
+		}
+		function progressFunc( i ) {
+			return function( value ) {
+				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				deferred.notifyWith( promise, pValues );
+			};
+		}
+		if ( length > 1 ) {
+			for ( ; i < length; i++ ) {
+				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return promise;
+	}
+});
+
+
+
+
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		marginDiv,
+		fragment,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported,
+		div = document.createElement( "div" ),
+		documentElement = document.documentElement;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true
+	};
+
+	// Make sure checked status is properly cloned
+	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;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	div.innerHTML = "";
+
+	// Check if div with explicit width and no margin-right incorrectly
+	// gets computed margin-right based on width of container. For more
+	// info see bug #3333
+	// Fails in WebKit before Feb 2011 nightlies
+	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+	if ( window.getComputedStyle ) {
+		marginDiv = document.createElement( "div" );
+		marginDiv.style.width = "0";
+		marginDiv.style.marginRight = "0";
+		div.style.width = "2px";
+		div.appendChild( marginDiv );
+		support.reliableMarginRight =
+			( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+	}
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	fragment.removeChild( div );
+
+	// Null elements to avoid leaks in IE
+	fragment = select = opt = marginDiv = div = input = null;
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, outer, inner, table, td, offsetSupport,
+			conMarginTop, ptlm, vb, style, html,
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		conMarginTop = 1;
+		ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
+		vb = "visibility:hidden;border:0;";
+		style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
+		html = "<div " + style + "><div></div></div>" +
+			"<table " + style + " cellpadding='0' cellspacing='0'>" +
+			"<tr><td></td></tr></table>";
+
+		container = document.createElement("div");
+		container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName( "td" );
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Figure out if the W3C box model works as expected
+		div.innerHTML = "";
+		div.style.width = div.style.paddingLeft = "1px";
+		jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "";
+			div.innerHTML = "<div style='width:4px;'></div>";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+		}
+
+		div.style.cssText = ptlm + vb;
+		div.innerHTML = html;
+
+		outer = div.firstChild;
+		inner = outer.firstChild;
+		td = outer.nextSibling.firstChild.firstChild;
+
+		offsetSupport = {
+			doesNotAddBorder: ( inner.offsetTop !== 5 ),
+			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+		};
+
+		inner.style.position = "fixed";
+		inner.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+		inner.style.position = inner.style.top = "";
+
+		outer.style.overflow = "hidden";
+		outer.style.position = "relative";
+
+		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+		body.removeChild( container );
+		div  = container = null;
+
+		jQuery.extend( support, offsetSupport );
+	});
+
+	return support;
+})();
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var privateCache, thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+			isEvents = name === "events";
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = ++jQuery.uuid;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		privateCache = thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Users should not attempt to inspect the internal events object using jQuery.data,
+		// it is undocumented and subject to change. But does anyone listen? No.
+		if ( isEvents && !thisCache[ name ] ) {
+			return privateCache.events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ internalKey ] : internalKey;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split( " " );
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the cache and need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ internalKey ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( internalKey );
+			} else {
+				elem[ internalKey ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, attr, name,
+			data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
+					attr = this[0].attributes;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+					jQuery._data( this[0], "parsedAttrs", true );
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var self = jQuery( this ),
+					args = [ parts[0], value ];
+
+				self.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var 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 :
+				jQuery.isNumeric( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery._data( elem, deferDataKey );
+	if ( defer &&
+		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery._data( elem, queueDataKey ) &&
+				!jQuery._data( elem, markDataKey ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.fire();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = ( type || "fx" ) + "mark";
+			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+			if ( count ) {
+				jQuery._data( elem, key, count );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		var q;
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			q = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			hooks = {};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			jQuery._data( elem, type + ".run", hooks );
+			fn.call( elem, function() {
+				jQuery.dequeue( elem, type );
+			}, hooks );
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue " + type + ".run", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function() {
+			var queue = jQuery.queue( this, type, data );
+
+			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, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+				count++;
+				tmp.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise();
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.prop );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = ( value || "" ).split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		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 ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( 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 ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+				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 self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.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.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+			// 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, i, max, option,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (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 );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, l,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+			attrNames = value.toLowerCase().split( rspace );
+			l = attrNames.length;
+
+			for ( ; i < l; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					jQuery.attr( elem, name, "" );
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( rboolean.test( name ) && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else 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 it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	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 ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.nodeValue = value + "" );
+		}
+	};
+
+	// Apply the nodeHook to tabindex
+	jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = "" + value );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+
+
+
+
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+	rhoverHack = /\bhover(\.\S+)?\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+	quickParse = function( selector ) {
+		var quick = rquickIs.exec( selector );
+		if ( quick ) {
+			//   0  1    2   3
+			// [ _, tag, id, class ]
+			quick[1] = ( quick[1] || "" ).toLowerCase();
+			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+		}
+		return quick;
+	},
+	quickIs = function( elem, m ) {
+		var attrs = elem.attributes || {};
+		return (
+			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+			(!m[2] || (attrs.id || {}).value === m[2]) &&
+			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+		);
+	},
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, quick, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// 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
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = 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 !== "undefined" && (!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
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// 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: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				quick: quickParse( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			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;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			t, tns, type, origType, namespaces, origCount,
+			j, events, special, handle, eventType, handleObj;
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// 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;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.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 ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, [ "events", "handle" ], true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+		// 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 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// 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 ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( 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)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			old = null;
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old && old === elem.ownerDocument ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && 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( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						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 ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = [].slice.call( arguments, 0 ),
+			run_all = !event.exclusive && !event.namespace,
+			handlerQueue = [],
+			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
+
+			// Pregenerate a single jQuery object for reuse with .is()
+			jqcur = jQuery(this);
+			jqcur.context = this.ownerDocument || this;
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+				selMatch = {};
+				matches = [];
+				jqcur[0] = cur;
+				for ( i = 0; i < delegateCount; i++ ) {
+					handleObj = handlers[ i ];
+					sel = handleObj.selector;
+
+					if ( selMatch[ sel ] === undefined ) {
+						selMatch[ sel ] = (
+							handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+						);
+					}
+					if ( selMatch[ sel ] ) {
+						matches.push( handleObj );
+					}
+				}
+				if ( matches.length ) {
+					handlerQueue.push({ elem: cur, matches: matches });
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement 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 fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// 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 relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// 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,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+		if ( event.metaKey === undefined ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady
+		},
+
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	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();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+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.returnValue === false ||
+			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;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return 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 = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector,
+				ret;
+
+			// 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;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !form._submit_attached ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						// If form was submitted by the user, bubble the event up the tree
+						if ( this.parentNode && !event.isTrigger ) {
+							jQuery.event.simulate( "submit", this.parentNode, event, true );
+						}
+					});
+					form._submit_attached = true;
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+							jQuery.event.simulate( "change", this, event, true );
+						}
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					elem._change_attached = true;
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+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 = 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.call( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			var handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( var 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 );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	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 );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+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 ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2012, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	expando = "sizcache" + (Math.random() + '').replace('.', ''),
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rReturn = /\r\n/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+
+			parts.push( m[1] );
+
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context, seed );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+
+				set = posProcess( selector, set, seed );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set, i, len, match, type, left;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+		type = Expr.order[i];
+
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		type, found, item, filter, left,
+		i, pass,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				filter = Expr.filter[ type ];
+				left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							pass = not ^ found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+		nodeType = elem.nodeType,
+		ret = "";
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 ) {
+			// Use textContent || innerText for elements
+			if ( typeof elem.textContent === 'string' ) {
+				return elem.textContent;
+			} else if ( typeof elem.innerText === 'string' ) {
+				// Replace IE's carriage returns
+				return elem.innerText.replace( rReturn, '' );
+			} else {
+				// Traverse it's children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( i = 0; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			if ( node.nodeType !== 8 ) {
+				ret += getText( node );
+			}
+		}
+	}
+	return ret;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+
+		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;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// 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" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var first, last,
+				doneName, parent, cache,
+				count, diff,
+				type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					if ( type === "first" ) {
+						return true;
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					return true;
+
+				case "nth":
+					first = match[2];
+					last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					doneName = match[0];
+					parent = elem.parentNode;
+
+					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+						count = 0;
+
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						}
+
+						parent[ expando ] = doneName;
+					}
+
+					diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+		},
+
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Sizzle.attr ?
+					Sizzle.attr( elem, name ) :
+					Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				!type && Sizzle.attr ?
+				result != null :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+
+		var cur = a.nextSibling;
+		}
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// 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 and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// 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
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try {
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem[ expando ] = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem[ expando ] = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+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 : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet, seed );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// 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 self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				POS.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		// Array (deprecated as of jQuery 1.7)
+		if ( jQuery.isArray( selectors ) ) {
+			var level = 1;
+
+			while ( cur && cur.ownerDocument && cur !== context ) {
+				for ( i = 0; i < selectors.length; i++ ) {
+
+					if ( jQuery( cur ).is( selectors[ i ] ) ) {
+						ret.push({ selector: selectors[ i ], elem: cur, level: level });
+					}
+				}
+
+				cur = cur.parentNode;
+				level++;
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// 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.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	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( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+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 jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "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 jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")", "i"),
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		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
+			var 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.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				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();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery.clean(arguments) );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		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 ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || ( l > 1 && i < lastIndex ) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc,
+	first = args[ 0 ];
+
+	// nodes may contain either an explicit document object,
+	// a jQuery collection or context object.
+	// If nodes[0] contains a valid object to assign to doc
+	if ( nodes && nodes[0] ) {
+		doc = nodes[0].ownerDocument || nodes[0];
+	}
+
+	// Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ first ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	var nodeName = ( elem.nodeName || "" ).toLowerCase();
+	if ( nodeName === "input" ) {
+		fixDefaultChecked( elem );
+	// Skip scripts, get other children
+	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+	var div = document.createElement( "div" );
+	safeFragment.appendChild( div );
+
+	div.innerHTML = elem.outerHTML;
+	return div.firstChild;
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			// IE<=8 does not properly clone detached, unknown element nodes
+			clone = jQuery.support.html5Clone || !rnoshimcache.test( "<" + elem.nodeName ) ?
+				elem.cloneNode( true ) :
+				shimCloneNode( elem );
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType;
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [], j;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div");
+
+					// Append wrapper element to unknown element safe doc fragment
+					if ( context === document ) {
+						// Use the fragment we've already created for this document
+						safeFragment.appendChild( div );
+					} else {
+						// Use a fragment created with the owner document
+						createSafeFragment( context ).appendChild( div );
+					}
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id,
+			cache = jQuery.cache,
+			special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						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 );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+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", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": 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": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// 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, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || 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";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} 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 ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWH( elem, name, extra );
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				return val;
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat( value );
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( (defaultView = elem.ownerDocument.defaultView) &&
+				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left, rsLeft, uncomputed,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret === null && style && (uncomputed = style[ name ]) ) {
+			ret = uncomputed;
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ( ret || 0 );
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		which = name === "width" ? cssWidth : cssHeight,
+		i = 0,
+		len = which.length;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			for ( ; i < len; i++ ) {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+				}
+			}
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ] || 0;
+	}
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		for ( ; i < len; i++ ) {
+			val += parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+			}
+		}
+	}
+
+	return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	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 = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #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 = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// 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 );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// 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 ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+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({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// 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 ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.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: {
+			context: true,
+			url: true
+		}
+	},
+
+	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 // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// 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 === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// 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;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					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( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ 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" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		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 prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// 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 If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// 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
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// 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;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = 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 ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	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 {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// 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
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for ( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for ( key in s.converters ) {
+				if ( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if ( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for ( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+		( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.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 ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback );
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = 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 ( display === "" && jQuery.css(elem, "display") === "none" ) {
+						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			var elem, display,
+				i = 0,
+				j = this.length;
+
+			for ( ; i < j; i++ ) {
+				elem = this[i];
+				if ( elem.style ) {
+					display = jQuery.css( elem, "display" );
+
+					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+						jQuery._data( elem, "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed( speed, easing, callback );
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		function doAnimation() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p, e,
+				parts, start, end, unit,
+				method;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			for ( p in prop ) {
+
+				// property name normalization
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				val = prop[ name ];
+
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+
+						// inline-level elements accept inline-block;
+						// block-level elements need to be inline with layout
+						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+							this.style.display = "inline-block";
+
+						} else {
+							this.style.zoom = 1;
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test( val ) ) {
+
+					// Tracks whether to show or hide based on private
+					// data attached to the element
+					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+					if ( method ) {
+						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+						e[ method ]();
+					} else {
+						e[ val ]();
+					}
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ( (end || 1) / e.cur() ) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		}
+
+		return optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+
+	stop: function( type, clearQueue, gotoEnd ) {
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var index,
+				hadTimers = false,
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+
+			function stopQueue( elem, data, index ) {
+				var hooks = data[ index ];
+				jQuery.removeData( elem, index, true );
+				hooks.stop( gotoEnd );
+			}
+
+			if ( type == null ) {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+						stopQueue( this, data, index );
+					}
+				}
+			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+				stopQueue( this, data, index );
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					if ( gotoEnd ) {
+
+						// force the next step to be the last
+						timers[ index ]( true );
+					} else {
+						timers[ index ].saveState();
+					}
+					hadTimers = true;
+					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 ( !( gotoEnd && hadTimers ) ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx( "show", 1 ),
+	slideUp: genFx( "hide", 1 ),
+	slideToggle: genFx( "toggle", 1 ),
+	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.extend({
+	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( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue ) {
+				jQuery.dequeue( this, opt.queue );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.end = to;
+		this.now = this.start = from;
+		this.pos = this.state = 0;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+		function t( gotoEnd ) {
+			return self.step( gotoEnd );
+		}
+
+		t.queue = this.options.queue;
+		t.elem = this.elem;
+		t.saveState = function() {
+			if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+				jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+			}
+		};
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any flash of content
+		if ( dataShow !== undefined ) {
+			// This show is picking up where a previous hide or show left off
+			this.custom( this.cur(), dataShow );
+		} else {
+			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+		}
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom( this.cur(), 0 );
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var p, n, complete,
+			t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( p in options.animatedProperties ) {
+				if ( options.animatedProperties[ p ] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+						elem.style[ "overflow" + value ] = options.overflow[ index ];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery( elem ).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[ p ] );
+						jQuery.removeData( elem, "fxshow" + p, true );
+						// Toggle data is no longer needed
+						jQuery.removeData( elem, "toggle" + p, true );
+					}
+				}
+
+				// Execute the complete function
+				// in the event that the complete function throws an exception
+				// we must ensure it won't be called twice. #5684
+
+				complete = options.complete;
+				if ( complete ) {
+
+					options.complete = false;
+					complete.call( elem );
+				}
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ( (this.end - this.start) * this.pos );
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timer,
+			timers = jQuery.timers,
+			i = 0;
+
+		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();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+// Adds width/height step functions
+// Do not set anything below 0
+jQuery.each([ "width", "height" ], function( i, prop ) {
+	jQuery.fx.step[ prop ] = function( fx ) {
+		jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+	};
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// 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 null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function( val ) {
+		var elem, win;
+
+		if ( val === undefined ) {
+			elem = this[ 0 ];
+
+			if ( !elem ) {
+				return null;
+			}
+
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+
+		// Set the scroll offset
+		return this.each(function() {
+			win = getWindow( this );
+
+			if ( win ) {
+				win.scrollTo(
+					!i ? val : jQuery( win ).scrollLeft(),
+					 i ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				this[ method ] = val;
+			}
+		});
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ],
+				body = elem.document.body;
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				body && body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNumeric( ret ) ? ret : orig;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use 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.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
diff --git a/static/java/js/min/jquery.min-min.js b/static/java/js/min/jquery.min-min.js
new file mode 100644
index 0000000000000000000000000000000000000000..7b226c2bf029fb0ab8563f850f2fa19bacb4a221
--- /dev/null
+++ b/static/java/js/min/jquery.min-min.js
@@ -0,0 +1,3 @@
+!function(e,t){function n(e){var t=B[e]={},n,r;for(e=e.split(/\s+/),n=0,r=e.length;r>n;n++)t[e[n]]=!0;return t}function r(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(W,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:H.isNumeric(r)?parseFloat(r):q.test(r)?H.parseJSON(r):r}catch(o){}H.data(e,n,r)}else r=t}return r}function i(e){for(var t in e)if(("data"!==t||!H.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function o(e,t,n){var r=t+"defer",i=t+"queue",o=t+"mark",a=H._data(e,r);!a||"queue"!==n&&H._data(e,i)||"mark"!==n&&H._data(e,o)||setTimeout(function(){H._data(e,i)||H._data(e,o)||(H.removeData(e,r,!0),a.fire())},0)}function a(){return!1}function s(){return!0}function l(e){return!e||!e.parentNode||11===e.parentNode.nodeType}function u(e,t,n){if(t=t||0,H.isFunction(t))return H.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return H.grep(e,function(e,r){return e===t===n});if("string"==typeof t){var r=H.grep(e,function(e){return 1===e.nodeType});if(dt.test(t))return H.filter(t,r,!n);t=H.filter(t,r)}return H.grep(e,function(e,r){return H.inArray(e,t)>=0===n})}function c(e){var t=gt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function f(e,t){return H.nodeName(e,"table")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function d(e,t){if(1===t.nodeType&&H.hasData(e)){var n,r,i,o=H._data(e),a=H._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)H.event.add(t,n+(s[n][r].namespace?".":"")+s[n][r].namespace,s[n][r],s[n][r].data)}a.data&&(a.data=H.extend({},a.data))}}function p(e,t){var n;1===t.nodeType&&(t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),"object"===n?t.outerHTML=e.outerHTML:"input"!==n||"checkbox"!==e.type&&"radio"!==e.type?"option"===n?t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue):(e.checked&&(t.defaultChecked=t.checked=e.checked),t.value!==e.value&&(t.value=e.value)),t.removeAttribute(H.expando))}function h(e){return"undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName("*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll("*"):[]}function m(e){("checkbox"===e.type||"radio"===e.type)&&(e.defaultChecked=e.checked)}function g(e){var t=(e.nodeName||"").toLowerCase();"input"===t?m(e):"script"!==t&&"undefined"!=typeof e.getElementsByTagName&&H.grep(e.getElementsByTagName("input"),m)}function y(e){var t=M.createElement("div");return jt.appendChild(t),t.innerHTML=e.outerHTML,t.firstChild}function v(e,t){t.src?H.ajax({url:t.src,async:!1,dataType:"script"}):H.globalEval((t.text||t.textContent||t.innerHTML||"").replace(At,"/*$0*/")),t.parentNode&&t.parentNode.removeChild(t)}function b(e,t,n){var r="width"===t?e.offsetWidth:e.offsetHeight,i="width"===t?Pt:qt,o=0,a=i.length;if(r>0){if("border"!==n)for(;a>o;o++)n||(r-=parseFloat(H.css(e,"padding"+i[o]))||0),"margin"===n?r+=parseFloat(H.css(e,n+i[o]))||0:r-=parseFloat(H.css(e,"border"+i[o]+"Width"))||0;return r+"px"}if(r=Wt(e,t,t),(0>r||null==r)&&(r=e.style[t]||0),r=parseFloat(r)||0,n)for(;a>o;o++)r+=parseFloat(H.css(e,"padding"+i[o]))||0,"padding"!==n&&(r+=parseFloat(H.css(e,"border"+i[o]+"Width"))||0),"margin"===n&&(r+=parseFloat(H.css(e,n+i[o]))||0);return r+"px"}function x(e){return function(t,n){if("string"!=typeof t&&(n=t,t="*"),H.isFunction(n))for(var r=t.toLowerCase().split(tn),i=0,o=r.length,a,s,l;o>i;i++)a=r[i],l=/^\+/.test(a),l&&(a=a.substr(1)||"*"),s=e[a]=e[a]||[],s[l?"unshift":"push"](n)}}function T(e,n,r,i,o,a){o=o||n.dataTypes[0],a=a||{},a[o]=!0;for(var s=e[o],l=0,u=s?s.length:0,c=e===an,f;u>l&&(c||!f);l++)f=s[l](n,r,i),"string"==typeof f&&(!c||a[f]?f=t:(n.dataTypes.unshift(f),f=T(e,n,r,i,f,a)));return!c&&f||a["*"]||(f=T(e,n,r,i,"*",a)),f}function w(e,n){var r,i,o=H.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((o[r]?e:i||(i={}))[r]=n[r]);i&&H.extend(!0,e,i)}function N(e,t,n,r){if(H.isArray(t))H.each(t,function(t,i){n||Xt.test(e)?r(e,i):N(e+"["+("object"==typeof i||H.isArray(i)?t:"")+"]",i,n,r)});else if(n||null==t||"object"!=typeof t)r(e,t);else for(var i in t)N(e+"["+i+"]",t[i],n,r)}function C(e,n,r){var i=e.contents,o=e.dataTypes,a=e.responseFields,s,l,u,c;for(l in a)l in r&&(n[a[l]]=r[l]);for(;"*"===o[0];)o.shift(),s===t&&(s=e.mimeType||n.getResponseHeader("content-type"));if(s)for(l in i)if(i[l]&&i[l].test(s)){o.unshift(l);break}if(o[0]in r)u=o[0];else{for(l in r){if(!o[0]||e.converters[l+" "+o[0]]){u=l;break}c||(c=l)}u=u||c}return u?(u!==o[0]&&o.unshift(u),r[u]):void 0}function E(e,n){e.dataFilter&&(n=e.dataFilter(n,e.dataType));var r=e.dataTypes,i={},o,a,s=r.length,l,u=r[0],c,f,d,p,h;for(o=1;s>o;o++){if(1===o)for(a in e.converters)"string"==typeof a&&(i[a.toLowerCase()]=e.converters[a]);if(c=u,u=r[o],"*"===u)u=c;else if("*"!==c&&c!==u){if(f=c+" "+u,d=i[f]||i["* "+u],!d){h=t;for(p in i)if(l=p.split(" "),(l[0]===c||"*"===l[0])&&(h=i[l[1]+" "+u])){p=i[p],p===!0?d=h:h===!0&&(d=p);break}}d||h||H.error("No conversion from "+f.replace(" "," to ")),d!==!0&&(n=d?d(n):h(p(n)))}}return n}function k(){try{return new e.XMLHttpRequest}catch(t){}}function S(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function A(){return setTimeout(L,0),Cn=H.now()}function L(){Cn=t}function j(e,t){var n={};return H.each(Nn.concat.apply([],Nn.slice(0,t)),function(){n[this]=e}),n}function F(e){if(!yn[e]){var t=M.body,n=H("<"+e+">").appendTo(t),r=n.css("display");n.remove(),("none"===r||""===r)&&(vn||(vn=M.createElement("iframe"),vn.frameBorder=vn.width=vn.height=0),t.appendChild(vn),bn&&vn.createElement||(bn=(vn.contentWindow||vn.contentDocument).document,bn.write(("CSS1Compat"===M.compatMode?"<!doctype html>":"")+"<html><body>"),bn.close()),n=bn.createElement(e),bn.body.appendChild(n),r=H.css(n,"display"),t.removeChild(vn)),yn[e]=r}return yn[e]}function D(e){return H.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var M=e.document,O=e.navigator,_=e.location,H=function(){function n(){if(!r.isReady){try{M.documentElement.doScroll("left")}catch(e){return void setTimeout(n,1)}r.ready()}}var r=function(e,t){return new r.fn.init(e,t,a)},i=e.jQuery,o=e.$,a,s=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,l=/\S/,u=/^\s+/,c=/\s+$/,f=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,d=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,h=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,m=/(?:^|:|,)(?:\s*\[)+/g,g=/(webkit)[ \/]([\w.]+)/,y=/(opera)(?:.*version)?[ \/]([\w.]+)/,v=/(msie) ([\w.]+)/,b=/(mozilla)(?:.*? rv:([\w.]+))?/,x=/-([a-z]|[0-9])/gi,T=/^-ms-/,w=function(e,t){return(t+"").toUpperCase()},N=O.userAgent,C,E,k,S=Object.prototype.toString,A=Object.prototype.hasOwnProperty,L=Array.prototype.push,j=Array.prototype.slice,F=String.prototype.trim,D=Array.prototype.indexOf,_={};return r.fn=r.prototype={constructor:r,init:function(e,n,i){var o,a,l,u;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if("body"===e&&!n&&M.body)return this.context=M,this[0]=M.body,this.selector=e,this.length=1,this;if("string"==typeof e){if(o="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:s.exec(e),!o||!o[1]&&n)return!n||n.jquery?(n||i).find(e):this.constructor(n).find(e);if(o[1])return n=n instanceof r?n[0]:n,u=n?n.ownerDocument||n:M,l=f.exec(e),l?r.isPlainObject(n)?(e=[M.createElement(l[1])],r.fn.attr.call(e,n,!0)):e=[u.createElement(l[1])]:(l=r.buildFragment([o[1]],[u]),e=(l.cacheable?r.clone(l.fragment):l.fragment).childNodes),r.merge(this,e);if(a=M.getElementById(o[2]),a&&a.parentNode){if(a.id!==o[2])return i.find(e);this.length=1,this[0]=a}return this.context=M,this.selector=e,this}return r.isFunction(e)?i.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),r.makeArray(e,this))},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return j.call(this,0)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e,t,n){var i=this.constructor();return r.isArray(e)?L.apply(i,e):r.merge(i,e),i.prevObject=this,i.context=this.context,"find"===t?i.selector=this.selector+(this.selector?" ":"")+n:t&&(i.selector=this.selector+"."+t+"("+n+")"),i},each:function(e,t){return r.each(this,e,t)},ready:function(e){return r.bindReady(),E.add(e),this},eq:function(e){return e=+e,-1===e?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(j.apply(this,arguments),"slice",j.call(arguments).join(","))},map:function(e){return this.pushStack(r.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:L,sort:[].sort,splice:[].splice},r.fn.init.prototype=r.fn,r.extend=r.fn.extend=function(){var e,n,i,o,a,s,l=arguments[0]||{},u=1,c=arguments.length,f=!1;for("boolean"==typeof l&&(f=l,l=arguments[1]||{},u=2),"object"==typeof l||r.isFunction(l)||(l={}),c===u&&(l=this,--u);c>u;u++)if(null!=(e=arguments[u]))for(n in e)i=l[n],o=e[n],l!==o&&(f&&o&&(r.isPlainObject(o)||(a=r.isArray(o)))?(a?(a=!1,s=i&&r.isArray(i)?i:[]):s=i&&r.isPlainObject(i)?i:{},l[n]=r.extend(f,s,o)):o!==t&&(l[n]=o));return l},r.extend({noConflict:function(t){return e.$===r&&(e.$=o),t&&e.jQuery===r&&(e.jQuery=i),r},isReady:!1,readyWait:1,holdReady:function(e){e?r.readyWait++:r.ready(!0)},ready:function(e){if(e===!0&&!--r.readyWait||e!==!0&&!r.isReady){if(!M.body)return setTimeout(r.ready,1);if(r.isReady=!0,e!==!0&&--r.readyWait>0)return;E.fireWith(M,[r]),r.fn.trigger&&r(M).trigger("ready").off("ready")}},bindReady:function(){if(!E){if(E=r.Callbacks("once memory"),"complete"===M.readyState)return setTimeout(r.ready,1);if(M.addEventListener)M.addEventListener("DOMContentLoaded",k,!1),e.addEventListener("load",r.ready,!1);else if(M.attachEvent){M.attachEvent("onreadystatechange",k),e.attachEvent("onload",r.ready);var t=!1;try{t=null==e.frameElement}catch(i){}M.documentElement.doScroll&&t&&n()}}},isFunction:function(e){return"function"===r.type(e)},isArray:Array.isArray||function(e){return"array"===r.type(e)},isWindow:function(e){return e&&"object"==typeof e&&"setInterval"in e},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?String(e):_[S.call(e)]||"object"},isPlainObject:function(e){if(!e||"object"!==r.type(e)||e.nodeType||r.isWindow(e))return!1;try{if(e.constructor&&!A.call(e,"constructor")&&!A.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var i;for(i in e);return i===t||A.call(e,i)},isEmptyObject:function(e){for(var t in e)return!1;return!0},error:function(e){throw new Error(e)},parseJSON:function(t){return"string"==typeof t&&t?(t=r.trim(t),e.JSON&&e.JSON.parse?e.JSON.parse(t):d.test(t.replace(p,"@").replace(h,"]").replace(m,""))?new Function("return "+t)():void r.error("Invalid JSON: "+t)):null},parseXML:function(n){var i,o;try{e.DOMParser?(o=new DOMParser,i=o.parseFromString(n,"text/xml")):(i=new ActiveXObject("Microsoft.XMLDOM"),i.async="false",i.loadXML(n))}catch(a){i=t}return i&&i.documentElement&&!i.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+n),i},noop:function(){},globalEval:function(t){t&&l.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(T,"ms-").replace(x,w)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toUpperCase()===t.toUpperCase()},each:function(e,n,i){var o,a=0,s=e.length,l=s===t||r.isFunction(e);if(i)if(l){for(o in e)if(n.apply(e[o],i)===!1)break}else for(;s>a&&n.apply(e[a++],i)!==!1;);else if(l){for(o in e)if(n.call(e[o],o,e[o])===!1)break}else for(;s>a&&n.call(e[a],a,e[a++])!==!1;);return e},trim:F?function(e){return null==e?"":F.call(e)}:function(e){return null==e?"":e.toString().replace(u,"").replace(c,"")},makeArray:function(e,t){var n=t||[];if(null!=e){var i=r.type(e);null==e.length||"string"===i||"function"===i||"regexp"===i||r.isWindow(e)?L.call(n,e):r.merge(n,e)}return n},inArray:function(e,t,n){var r;if(t){if(D)return D.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=e.length,i=0;if("number"==typeof n.length)for(var o=n.length;o>i;i++)e[r++]=n[i];else for(;n[i]!==t;)e[r++]=n[i++];return e.length=r,e},grep:function(e,t,n){var r=[],i;n=!!n;for(var o=0,a=e.length;a>o;o++)i=!!t(e[o],o),n!==i&&r.push(e[o]);return r},map:function(e,n,i){var o,a,s=[],l=0,u=e.length,c=e instanceof r||u!==t&&"number"==typeof u&&(u>0&&e[0]&&e[u-1]||0===u||r.isArray(e));if(c)for(;u>l;l++)o=n(e[l],l,i),null!=o&&(s[s.length]=o);else for(a in e)o=n(e[a],a,i),null!=o&&(s[s.length]=o);return s.concat.apply([],s)},guid:1,proxy:function(e,n){if("string"==typeof n){var i=e[n];n=e,e=i}if(!r.isFunction(e))return t;var o=j.call(arguments,2),a=function(){return e.apply(n,o.concat(j.call(arguments)))};return a.guid=e.guid=e.guid||a.guid||r.guid++,a},access:function(e,n,i,o,a,s){var l=e.length;if("object"==typeof n){for(var u in n)r.access(e,u,n[u],o,a,i);return e}if(i!==t){o=!s&&o&&r.isFunction(i);for(var c=0;l>c;c++)a(e[c],n,o?i.call(e[c],c,a(e[c],n)):i,s);return e}return l?a(e[0],n):t},now:function(){return(new Date).getTime()},uaMatch:function(e){e=e.toLowerCase();var t=g.exec(e)||y.exec(e)||v.exec(e)||e.indexOf("compatible")<0&&b.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},sub:function(){function e(t,n){return new e.fn.init(t,n)}r.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function n(i,o){return o&&o instanceof r&&!(o instanceof e)&&(o=e(o)),r.fn.init.call(this,i,o,t)},e.fn.init.prototype=e.fn;var t=e(M);return e},browser:{}}),r.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){_["[object "+t+"]"]=t.toLowerCase()}),C=r.uaMatch(N),C.browser&&(r.browser[C.browser]=!0,r.browser.version=C.version),r.browser.webkit&&(r.browser.safari=!0),l.test(" ")&&(u=/^[\s\xA0]+/,c=/[\s\xA0]+$/),a=r(M),M.addEventListener?k=function(){M.removeEventListener("DOMContentLoaded",k,!1),r.ready()}:M.attachEvent&&(k=function(){"complete"===M.readyState&&(M.detachEvent("onreadystatechange",k),r.ready())}),r}(),B={};H.Callbacks=function(e){e=e?B[e]||n(e):{};var r=[],i=[],o,a,s,l,u,c=function(t){var n,i,o,a,s;for(n=0,i=t.length;i>n;n++)o=t[n],a=H.type(o),"array"===a?c(o):"function"===a&&(e.unique&&d.has(o)||r.push(o))},f=function(t,n){for(n=n||[],o=!e.memory||[t,n],a=!0,u=s||0,s=0,l=r.length;r&&l>u;u++)if(r[u].apply(t,n)===!1&&e.stopOnFalse){o=!0;break}a=!1,r&&(e.once?o===!0?d.disable():r=[]:i&&i.length&&(o=i.shift(),d.fireWith(o[0],o[1])))},d={add:function(){if(r){var e=r.length;c(arguments),a?l=r.length:o&&o!==!0&&(s=e,f(o[0],o[1]))}return this},remove:function(){if(r)for(var t=arguments,n=0,i=t.length;i>n;n++)for(var o=0;o<r.length&&(t[n]!==r[o]||(a&&l>=o&&(l--,u>=o&&u--),r.splice(o--,1),!e.unique));o++);return this},has:function(e){if(r)for(var t=0,n=r.length;n>t;t++)if(e===r[t])return!0;return!1},empty:function(){return r=[],this},disable:function(){return r=i=o=t,this},disabled:function(){return!r},lock:function(){return i=t,o&&o!==!0||d.disable(),this},locked:function(){return!i},fireWith:function(t,n){return i&&(a?e.once||i.push([t,n]):e.once&&o||f(t,n)),this},fire:function(){return d.fireWith(this,arguments),this},fired:function(){return!!o}};return d};var P=[].slice;H.extend({Deferred:function(e){var t=H.Callbacks("once memory"),n=H.Callbacks("once memory"),r=H.Callbacks("memory"),i="pending",o={resolve:t,reject:n,notify:r},a={done:t.add,fail:n.add,progress:r.add,state:function(){return i},isResolved:t.fired,isRejected:n.fired,then:function(e,t,n){return s.done(e).fail(t).progress(n),this},always:function(){return s.done.apply(s,arguments).fail.apply(s,arguments),this},pipe:function(e,t,n){return H.Deferred(function(r){H.each({done:[e,"resolve"],fail:[t,"reject"],progress:[n,"notify"]},function(e,t){var n=t[0],i=t[1],o;s[e](H.isFunction(n)?function(){o=n.apply(this,arguments),o&&H.isFunction(o.promise)?o.promise().then(r.resolve,r.reject,r.notify):r[i+"With"](this===s?r:this,[o])}:r[i])})}).promise()},promise:function(e){if(null==e)e=a;else for(var t in a)e[t]=a[t];return e}},s=a.promise({}),l;for(l in o)s[l]=o[l].fire,s[l+"With"]=o[l].fireWith;return s.done(function(){i="resolved"},n.disable,r.lock).fail(function(){i="rejected"},t.disable,r.lock),e&&e.call(s,s),s},when:function(e){function t(e){return function(t){r[e]=arguments.length>1?P.call(arguments,0):t,--s||u.resolveWith(u,r)}}function n(e){return function(t){a[e]=arguments.length>1?P.call(arguments,0):t,u.notifyWith(c,a)}}var r=P.call(arguments,0),i=0,o=r.length,a=new Array(o),s=o,l=o,u=1>=o&&e&&H.isFunction(e.promise)?e:H.Deferred(),c=u.promise();if(o>1){for(;o>i;i++)r[i]&&r[i].promise&&H.isFunction(r[i].promise)?r[i].promise().then(t(i),u.reject,n(i)):--s;s||u.resolveWith(u,r)}else u!==e&&u.resolveWith(u,o?[e]:[]);return c}}),H.support=function(){var t,n,r,i,o,a,s,l,u,c,f,d,p,h=M.createElement("div"),m=M.documentElement;if(h.setAttribute("className","t"),h.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",n=h.getElementsByTagName("*"),r=h.getElementsByTagName("a")[0],!n||!n.length||!r)return{};i=M.createElement("select"),o=i.appendChild(M.createElement("option")),a=h.getElementsByTagName("input")[0],t={leadingWhitespace:3===h.firstChild.nodeType,tbody:!h.getElementsByTagName("tbody").length,htmlSerialize:!!h.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.55/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:"on"===a.value,optSelected:o.selected,getSetAttribute:"t"!==h.className,enctype:!!M.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==M.createElement("nav").cloneNode(!0).outerHTML,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,i.disabled=!0,t.optDisabled=!o.disabled;try{delete h.test}catch(g){t.deleteExpando=!1}if(!h.addEventListener&&h.attachEvent&&h.fireEvent&&(h.attachEvent("onclick",function(){t.noCloneEvent=!1}),h.cloneNode(!0).fireEvent("onclick")),a=M.createElement("input"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","checked"),h.appendChild(a),l=M.createDocumentFragment(),l.appendChild(h.lastChild),t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=a.checked,l.removeChild(a),l.appendChild(h),h.innerHTML="",e.getComputedStyle&&(s=M.createElement("div"),s.style.width="0",s.style.marginRight="0",h.style.width="2px",h.appendChild(s),t.reliableMarginRight=0===(parseInt((e.getComputedStyle(s,null)||{marginRight:0}).marginRight,10)||0)),h.attachEvent)for(d in{submit:1,change:1,focusin:1})f="on"+d,p=f in h,p||(h.setAttribute(f,"return;"),p="function"==typeof h[f]),t[d+"Bubbles"]=p;return l.removeChild(h),l=i=o=s=h=a=null,H(function(){var e,n,r,i,o,a,s,l,c,f,d,m=M.getElementsByTagName("body")[0];m&&(s=1,l="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",c="visibility:hidden;border:0;",f="style='"+l+"border:5px solid #000;padding:0;'",d="<div "+f+"><div></div></div><table "+f+" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>",e=M.createElement("div"),e.style.cssText=c+"width:0;height:0;position:static;top:0;margin-top:"+s+"px",m.insertBefore(e,m.firstChild),h=M.createElement("div"),e.appendChild(h),h.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",u=h.getElementsByTagName("td"),p=0===u[0].offsetHeight,u[0].style.display="",u[1].style.display="none",t.reliableHiddenOffsets=p&&0===u[0].offsetHeight,h.innerHTML="",h.style.width=h.style.paddingLeft="1px",H.boxModel=t.boxModel=2===h.offsetWidth,"undefined"!=typeof h.style.zoom&&(h.style.display="inline",h.style.zoom=1,t.inlineBlockNeedsLayout=2===h.offsetWidth,h.style.display="",h.innerHTML="<div style='width:4px;'></div>",t.shrinkWrapBlocks=2!==h.offsetWidth),h.style.cssText=l+c,h.innerHTML=d,n=h.firstChild,r=n.firstChild,o=n.nextSibling.firstChild.firstChild,a={doesNotAddBorder:5!==r.offsetTop,doesAddBorderForTableAndCells:5===o.offsetTop},r.style.position="fixed",r.style.top="20px",a.fixedPosition=20===r.offsetTop||15===r.offsetTop,r.style.position=r.style.top="",n.style.overflow="hidden",n.style.position="relative",a.subtractsBorderForOverflowNotVisible=-5===r.offsetTop,a.doesNotIncludeMarginInBodyOffset=m.offsetTop!==s,m.removeChild(e),h=e=null,H.extend(t,a))}),t}();var q=/^(?:\{.*\}|\[.*\])$/,W=/([A-Z])/g;H.extend({cache:{},uuid:0,expando:"jQuery"+(H.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?H.cache[e[H.expando]]:e[H.expando],!!e&&!i(e)},data:function(e,n,r,i){if(H.acceptData(e)){var o,a,s,l=H.expando,u="string"==typeof n,c=e.nodeType,f=c?H.cache:e,d=c?e[l]:e[l]&&l,p="events"===n;if(d&&f[d]&&(p||i||f[d].data)||!u||r!==t)return d||(c?e[l]=d=++H.uuid:d=l),f[d]||(f[d]={},c||(f[d].toJSON=H.noop)),("object"==typeof n||"function"==typeof n)&&(i?f[d]=H.extend(f[d],n):f[d].data=H.extend(f[d].data,n)),o=a=f[d],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[H.camelCase(n)]=r),p&&!a[n]?o.events:(u?(s=a[n],null==s&&(s=a[H.camelCase(n)])):s=a,s)}},removeData:function(e,t,n){if(H.acceptData(e)){var r,o,a,s=H.expando,l=e.nodeType,u=l?H.cache:e,c=l?e[s]:s;if(u[c]){if(t&&(r=n?u[c]:u[c].data)){H.isArray(t)||(t in r?t=[t]:(t=H.camelCase(t),t=t in r?[t]:t.split(" ")));for(o=0,a=t.length;a>o;o++)delete r[t[o]];if(!(n?i:H.isEmptyObject)(r))return}(n||(delete u[c].data,i(u[c])))&&(H.support.deleteExpando||!u.setInterval?delete u[c]:u[c]=null,l&&(H.support.deleteExpando?delete e[s]:e.removeAttribute?e.removeAttribute(s):e[s]=null))}}},_data:function(e,t,n){return H.data(e,t,n,!0)},acceptData:function(e){if(e.nodeName){var t=H.noData[e.nodeName.toLowerCase()];if(t)return!(t===!0||e.getAttribute("classid")!==t)}return!0}}),H.fn.extend({data:function(e,n){var i,o,a,s=null;if("undefined"==typeof e){if(this.length&&(s=H.data(this[0]),1===this[0].nodeType&&!H._data(this[0],"parsedAttrs"))){o=this[0].attributes;for(var l=0,u=o.length;u>l;l++)a=o[l].name,0===a.indexOf("data-")&&(a=H.camelCase(a.substring(5)),r(this[0],a,s[a]));H._data(this[0],"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){H.data(this,e)}):(i=e.split("."),i[1]=i[1]?"."+i[1]:"",n===t?(s=this.triggerHandler("getData"+i[1]+"!",[i[0]]),s===t&&this.length&&(s=H.data(this[0],e),s=r(this[0],e,s)),s===t&&i[1]?this.data(i[0]):s):this.each(function(){var t=H(this),r=[i[0],n];t.triggerHandler("setData"+i[1]+"!",r),H.data(this,e,n),t.triggerHandler("changeData"+i[1]+"!",r)}))},removeData:function(e){return this.each(function(){H.removeData(this,e)})}}),H.extend({_mark:function(e,t){e&&(t=(t||"fx")+"mark",H._data(e,t,(H._data(e,t)||0)+1))},_unmark:function(e,t,n){if(e!==!0&&(n=t,t=e,e=!1),t){n=n||"fx";var r=n+"mark",i=e?0:(H._data(t,r)||1)-1;i?H._data(t,r,i):(H.removeData(t,r,!0),o(t,n,"mark"))}},queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=H._data(e,t),n&&(!r||H.isArray(n)?r=H._data(e,t,H.makeArray(n)):r.push(n)),r||[]):void 0},dequeue:function(e,t){t=t||"fx";var n=H.queue(e,t),r=n.shift(),i={};"inprogress"===r&&(r=n.shift()),r&&("fx"===t&&n.unshift("inprogress"),H._data(e,t+".run",i),r.call(e,function(){H.dequeue(e,t)},i)),n.length||(H.removeData(e,t+"queue "+t+".run",!0),o(e,t,"queue"))}}),H.fn.extend({queue:function(e,n){return"string"!=typeof e&&(n=e,e="fx"),n===t?H.queue(this[0],e):this.each(function(){var t=H.queue(this,e,n);"fx"===e&&"inprogress"!==t[0]&&H.dequeue(this,e)})},dequeue:function(e){return this.each(function(){H.dequeue(this,e)})},delay:function(e,t){return e=H.fx?H.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){function r(){--s||i.resolveWith(o,[o])}"string"!=typeof e&&(n=e,e=t),e=e||"fx";for(var i=H.Deferred(),o=this,a=o.length,s=1,l=e+"defer",u=e+"queue",c=e+"mark",f;a--;)(f=H.data(o[a],l,t,!0)||(H.data(o[a],u,t,!0)||H.data(o[a],c,t,!0))&&H.data(o[a],l,H.Callbacks("once memory"),!0))&&(s++,f.add(r));return r(),i.promise()}});var I=/[\n\t\r]/g,R=/\s+/,X=/\r/g,z=/^(?:button|input)$/i,V=/^(?:button|input|object|select|textarea)$/i,U=/^a(?:rea)?$/i,G=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,J=H.support.getSetAttribute,Y,Q,K;H.fn.extend({attr:function(e,t){return H.access(this,e,t,!0,H.attr)},removeAttr:function(e){return this.each(function(){H.removeAttr(this,e)})},prop:function(e,t){return H.access(this,e,t,!0,H.prop)},removeProp:function(e){return e=H.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a,s;if(H.isFunction(e))return this.each(function(t){H(this).addClass(e.call(this,t,this.className))});if(e&&"string"==typeof e)for(t=e.split(R),n=0,r=this.length;r>n;n++)if(i=this[n],1===i.nodeType)if(i.className||1!==t.length){for(o=" "+i.className+" ",a=0,s=t.length;s>a;a++)~o.indexOf(" "+t[a]+" ")||(o+=t[a]+" ");i.className=H.trim(o)}else i.className=e;return this},removeClass:function(e){var n,r,i,o,a,s,l;if(H.isFunction(e))return this.each(function(t){H(this).removeClass(e.call(this,t,this.className))});if(e&&"string"==typeof e||e===t)for(n=(e||"").split(R),r=0,i=this.length;i>r;r++)if(o=this[r],1===o.nodeType&&o.className)if(e){for(a=(" "+o.className+" ").replace(I," "),s=0,l=n.length;l>s;s++)a=a.replace(" "+n[s]+" "," ");o.className=H.trim(a)}else o.className="";return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return this.each(H.isFunction(e)?function(n){H(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if("string"===n)for(var i,o=0,a=H(this),s=t,l=e.split(R);i=l[o++];)s=r?s:!a.hasClass(i),a[s?"addClass":"removeClass"](i);else("undefined"===n||"boolean"===n)&&(this.className&&H._data(this,"__className__",this.className),this.className=this.className||e===!1?"":H._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(I," ").indexOf(t)>-1)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=H.isFunction(e),this.each(function(r){var o=H(this),a;1===this.nodeType&&(a=i?e.call(this,r,o.val()):e,null==a?a="":"number"==typeof a?a+="":H.isArray(a)&&(a=H.map(a,function(e){return null==e?"":e+""})),n=H.valHooks[this.nodeName.toLowerCase()]||H.valHooks[this.type],n&&"set"in n&&n.set(this,a,"value")!==t||(this.value=a))});if(o)return n=H.valHooks[o.nodeName.toLowerCase()]||H.valHooks[o.type],n&&"get"in n&&(r=n.get(o,"value"))!==t?r:(r=o.value,"string"==typeof r?r.replace(X,""):null==r?"":r)}}}),H.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r,i,o=e.selectedIndex,a=[],s=e.options,l="select-one"===e.type;if(0>o)return null;for(n=l?o:0,r=l?o+1:s.length;r>n;n++)if(i=s[n],!(!i.selected||(H.support.optDisabled?i.disabled:null!==i.getAttribute("disabled"))||i.parentNode.disabled&&H.nodeName(i.parentNode,"optgroup"))){if(t=H(i).val(),l)return t;a.push(t)}return l&&!a.length&&s.length?H(s[o]).val():a},set:function(e,t){var n=H.makeArray(t);return H(e).find("option").each(function(){this.selected=H.inArray(H(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(e,n,r,i){var o,a,s,l=e.nodeType;if(e&&3!==l&&8!==l&&2!==l)return i&&n in H.attrFn?H(e)[n](r):"undefined"==typeof e.getAttribute?H.prop(e,n,r):(s=1!==l||!H.isXMLDoc(e),s&&(n=n.toLowerCase(),a=H.attrHooks[n]||(G.test(n)?Q:Y)),r!==t?null===r?void H.removeAttr(e,n):a&&"set"in a&&s&&(o=a.set(e,r,n))!==t?o:(e.setAttribute(n,""+r),r):a&&"get"in a&&s&&null!==(o=a.get(e,n))?o:(o=e.getAttribute(n),null===o?t:o))},removeAttr:function(e,t){var n,r,i,o,a=0;if(t&&1===e.nodeType)for(r=t.toLowerCase().split(R),o=r.length;o>a;a++)i=r[a],i&&(n=H.propFix[i]||i,H.attr(e,i,""),e.removeAttribute(J?i:n),G.test(i)&&n in e&&(e[n]=!1))},attrHooks:{type:{set:function(e,t){if(z.test(e.nodeName)&&e.parentNode)H.error("type property can't be changed");else if(!H.support.radioValue&&"radio"===t&&H.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return Y&&H.nodeName(e,"button")?Y.get(e,t):t in e?e.value:null},set:function(e,t,n){return Y&&H.nodeName(e,"button")?Y.set(e,t,n):void(e.value=t)}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!H.isXMLDoc(e),a&&(n=H.propFix[n]||n,o=H.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||U.test(e.nodeName)&&e.href?0:t}}}}),H.attrHooks.tabindex=H.propHooks.tabIndex,Q={get:function(e,n){var r,i=H.prop(e,n);return i===!0||"boolean"!=typeof i&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?H.removeAttr(e,n):(r=H.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},J||(K={name:!0,id:!0},Y=H.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(K[n]?""!==r.nodeValue:r.specified)?r.nodeValue:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=M.createAttribute(n),e.setAttributeNode(r)),r.nodeValue=t+""}},H.attrHooks.tabindex.set=Y.set,H.each(["width","height"],function(e,t){H.attrHooks[t]=H.extend(H.attrHooks[t],{set:function(e,n){return""===n?(e.setAttribute(t,"auto"),n):void 0}})}),H.attrHooks.contenteditable={get:Y.get,set:function(e,t,n){""===t&&(t="false"),Y.set(e,t,n)}}),H.support.hrefNormalized||H.each(["href","src","width","height"],function(e,n){H.attrHooks[n]=H.extend(H.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null===r?t:r}})}),H.support.style||(H.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=""+t}}),H.support.optSelected||(H.propHooks.selected=H.extend(H.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),H.support.enctype||(H.propFix.enctype="encoding"),H.support.checkOn||H.each(["radio","checkbox"],function(){H.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),H.each(["radio","checkbox"],function(){H.valHooks[this]=H.extend(H.valHooks[this],{set:function(e,t){return H.isArray(t)?e.checked=H.inArray(H(e).val(),t)>=0:void 0}})});var Z=/^(?:textarea|input|select)$/i,et=/^([^\.]*)?(?:\.(.+))?$/,tt=/\bhover(\.\S+)?\b/,nt=/^key/,rt=/^(?:mouse|contextmenu)|click/,it=/^(?:focusinfocus|focusoutblur)$/,ot=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,at=function(e){var t=ot.exec(e);return t&&(t[1]=(t[1]||"").toLowerCase(),t[3]=t[3]&&new RegExp("(?:^|\\s)"+t[3]+"(?:\\s|$)")),t},st=function(e,t){var n=e.attributes||{};return!(t[1]&&e.nodeName.toLowerCase()!==t[1]||t[2]&&(n.id||{}).value!==t[2]||t[3]&&!t[3].test((n["class"]||{}).value))},lt=function(e){return H.event.special.hover?e:e.replace(tt,"mouseenter$1 mouseleave$1")
+};H.event={add:function(e,n,r,i,o){var a,s,l,u,c,f,d,p,h,m,g,y;if(3!==e.nodeType&&8!==e.nodeType&&n&&r&&(a=H._data(e))){for(r.handler&&(h=r,r=h.handler),r.guid||(r.guid=H.guid++),l=a.events,l||(a.events=l={}),s=a.handle,s||(a.handle=s=function(e){return"undefined"==typeof H||e&&H.event.triggered===e.type?t:H.event.dispatch.apply(s.elem,arguments)},s.elem=e),n=H.trim(lt(n)).split(" "),u=0;u<n.length;u++)c=et.exec(n[u])||[],f=c[1],d=(c[2]||"").split(".").sort(),y=H.event.special[f]||{},f=(o?y.delegateType:y.bindType)||f,y=H.event.special[f]||{},p=H.extend({type:f,origType:c[1],data:i,handler:r,guid:r.guid,selector:o,quick:at(o),namespace:d.join(".")},h),g=l[f],g||(g=l[f]=[],g.delegateCount=0,y.setup&&y.setup.call(e,i,d,s)!==!1||(e.addEventListener?e.addEventListener(f,s,!1):e.attachEvent&&e.attachEvent("on"+f,s))),y.add&&(y.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),o?g.splice(g.delegateCount++,0,p):g.push(p),H.event.global[f]=!0;e=null}},global:{},remove:function(e,t,n,r,i){var o=H.hasData(e)&&H._data(e),a,s,l,u,c,f,d,p,h,m,g,y;if(o&&(p=o.events)){for(t=H.trim(lt(t||"")).split(" "),a=0;a<t.length;a++)if(s=et.exec(t[a])||[],l=u=s[1],c=s[2],l){for(h=H.event.special[l]||{},l=(r?h.delegateType:h.bindType)||l,g=p[l]||[],f=g.length,c=c?new RegExp("(^|\\.)"+c.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null,d=0;d<g.length;d++)y=g[d],!i&&u!==y.origType||n&&n.guid!==y.guid||c&&!c.test(y.namespace)||r&&r!==y.selector&&("**"!==r||!y.selector)||(g.splice(d--,1),y.selector&&g.delegateCount--,h.remove&&h.remove.call(e,y));0===g.length&&f!==g.length&&(h.teardown&&h.teardown.call(e,c)!==!1||H.removeEvent(e,l,o.handle),delete p[l])}else for(l in p)H.event.remove(e,l+t[a],n,r,!0);H.isEmptyObject(p)&&(m=o.handle,m&&(m.elem=null),H.removeData(e,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,i,o){if(!i||3!==i.nodeType&&8!==i.nodeType){var a=n.type||n,s=[],l,u,c,f,d,p,h,m,g,y;if(!it.test(a+H.event.triggered)&&(a.indexOf("!")>=0&&(a=a.slice(0,-1),u=!0),a.indexOf(".")>=0&&(s=a.split("."),a=s.shift(),s.sort()),i&&!H.event.customEvent[a]||H.event.global[a]))if(n="object"==typeof n?n[H.expando]?n:new H.Event(a,n):new H.Event(a),n.type=a,n.isTrigger=!0,n.exclusive=u,n.namespace=s.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+s.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,p=a.indexOf(":")<0?"on"+a:"",i){if(n.result=t,n.target||(n.target=i),r=null!=r?H.makeArray(r):[],r.unshift(n),h=H.event.special[a]||{},!h.trigger||h.trigger.apply(i,r)!==!1){if(g=[[i,h.bindType||a]],!o&&!h.noBubble&&!H.isWindow(i)){for(y=h.delegateType||a,f=it.test(y+a)?i:i.parentNode,d=null;f;f=f.parentNode)g.push([f,y]),d=f;d&&d===i.ownerDocument&&g.push([d.defaultView||d.parentWindow||e,y])}for(c=0;c<g.length&&!n.isPropagationStopped();c++)f=g[c][0],n.type=g[c][1],m=(H._data(f,"events")||{})[n.type]&&H._data(f,"handle"),m&&m.apply(f,r),m=p&&f[p],m&&H.acceptData(f)&&m.apply(f,r)===!1&&n.preventDefault();return n.type=a,o||n.isDefaultPrevented()||h._default&&h._default.apply(i.ownerDocument,r)!==!1||"click"===a&&H.nodeName(i,"a")||!H.acceptData(i)||p&&i[a]&&("focus"!==a&&"blur"!==a||0!==n.target.offsetWidth)&&!H.isWindow(i)&&(d=i[p],d&&(i[p]=null),H.event.triggered=a,i[a](),H.event.triggered=t,d&&(i[p]=d)),n.result}}else{l=H.cache;for(c in l)l[c].events&&l[c].events[a]&&H.event.trigger(n,r,l[c].handle.elem,!0)}}},dispatch:function(n){n=H.event.fix(n||e.event);var r=(H._data(this,"events")||{})[n.type]||[],i=r.delegateCount,o=[].slice.call(arguments,0),a=!n.exclusive&&!n.namespace,s=[],l,u,c,f,d,p,h,m,g,y,v;if(o[0]=n,n.delegateTarget=this,i&&!n.target.disabled&&(!n.button||"click"!==n.type))for(f=H(this),f.context=this.ownerDocument||this,c=n.target;c!=this;c=c.parentNode||this){for(p={},m=[],f[0]=c,l=0;i>l;l++)g=r[l],y=g.selector,p[y]===t&&(p[y]=g.quick?st(c,g.quick):f.is(y)),p[y]&&m.push(g);m.length&&s.push({elem:c,matches:m})}for(r.length>i&&s.push({elem:this,matches:r.slice(i)}),l=0;l<s.length&&!n.isPropagationStopped();l++)for(h=s[l],n.currentTarget=h.elem,u=0;u<h.matches.length&&!n.isImmediatePropagationStopped();u++)g=h.matches[u],(a||!n.namespace&&!g.namespace||n.namespace_re&&n.namespace_re.test(g.namespace))&&(n.data=g.data,n.handleObj=g,d=((H.event.special[g.origType]||{}).handle||g.handler).apply(h.elem,o),d!==t&&(n.result=d,d===!1&&(n.preventDefault(),n.stopPropagation())));return n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,a=n.button,s=n.fromElement;return null==e.pageX&&null!=n.clientX&&(r=e.target.ownerDocument||M,i=r.documentElement,o=r.body,e.pageX=n.clientX+(i&&i.scrollLeft||o&&o.scrollLeft||0)-(i&&i.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(i&&i.scrollTop||o&&o.scrollTop||0)-(i&&i.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&s&&(e.relatedTarget=s===e.target?n.toElement:s),e.which||a===t||(e.which=1&a?1:2&a?3:4&a?2:0),e}},fix:function(e){if(e[H.expando])return e;var n,r,i=e,o=H.event.fixHooks[e.type]||{},a=o.props?this.props.concat(o.props):this.props;for(e=H.Event(i),n=a.length;n;)r=a[--n],e[r]=i[r];return e.target||(e.target=i.srcElement||M),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey===t&&(e.metaKey=e.ctrlKey),o.filter?o.filter(e,i):e},special:{ready:{setup:H.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){H.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=H.extend(new H.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?H.event.trigger(i,null,t):H.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},H.event.handle=H.event.dispatch,H.removeEvent=M.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){e.detachEvent&&e.detachEvent("on"+t,n)},H.Event=function(e,t){return this instanceof H.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?s:a):this.type=e,t&&H.extend(this,t),this.timeStamp=e&&e.timeStamp||H.now(),void(this[H.expando]=!0)):new H.Event(e,t)},H.Event.prototype={preventDefault:function(){this.isDefaultPrevented=s;var e=this.originalEvent;e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=s;var e=this.originalEvent;e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=s,this.stopPropagation()},isDefaultPrevented:a,isPropagationStopped:a,isImmediatePropagationStopped:a},H.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){H.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n=this,r=e.relatedTarget,i=e.handleObj,o=i.selector,a;return(!r||r!==n&&!H.contains(n,r))&&(e.type=i.origType,a=i.handler.apply(this,arguments),e.type=t),a}}}),H.support.submitBubbles||(H.event.special.submit={setup:function(){return H.nodeName(this,"form")?!1:void H.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=H.nodeName(n,"input")||H.nodeName(n,"button")?n.form:t;r&&!r._submit_attached&&(H.event.add(r,"submit._submit",function(e){this.parentNode&&!e.isTrigger&&H.event.simulate("submit",this.parentNode,e,!0)}),r._submit_attached=!0)})},teardown:function(){return H.nodeName(this,"form")?!1:void H.event.remove(this,"._submit")}}),H.support.changeBubbles||(H.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(H.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),H.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1,H.event.simulate("change",this,e,!0))})),!1):void H.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!t._change_attached&&(H.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||H.event.simulate("change",this.parentNode,e,!0)}),t._change_attached=!0)})},handle:function(e){var t=e.target;return this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type?e.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return H.event.remove(this,"._change"),Z.test(this.nodeName)}}),H.support.focusinBubbles||H.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){H.event.simulate(t,e.target,H.event.fix(e),!0)};H.event.special[t]={setup:function(){0===n++&&M.addEventListener(e,r,!0)},teardown:function(){0===--n&&M.removeEventListener(e,r,!0)}}}),H.fn.extend({on:function(e,n,r,i,o){var s,l;if("object"==typeof e){"string"!=typeof n&&(r=n,n=t);for(l in e)this.on(l,n,r,e[l],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=a;else if(!i)return this;return 1===o&&(s=i,i=function(e){return H().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=H.guid++)),this.each(function(){H.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on.call(this,e,t,n,r,1)},off:function(e,n,r){if(e&&e.preventDefault&&e.handleObj){var i=e.handleObj;return H(e.delegateTarget).off(i.namespace?i.type+"."+i.namespace:i.type,i.selector,i.handler),this}if("object"==typeof e){for(var o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=a),this.each(function(){H.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return H(this.context).on(e,this.selector,t,n),this},die:function(e,t){return H(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1==arguments.length?this.off(e,"**"):this.off(t,e,n)},trigger:function(e,t){return this.each(function(){H.event.trigger(e,t,this)})},triggerHandler:function(e,t){return this[0]?H.event.trigger(e,t,this[0],!0):void 0},toggle:function(e){var t=arguments,n=e.guid||H.guid++,r=0,i=function(n){var i=(H._data(this,"lastToggle"+e.guid)||0)%r;return H._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};for(i.guid=n;r<t.length;)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),H.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(e,t){H.fn[t]=function(e,n){return null==n&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},H.attrFn&&(H.attrFn[t]=!0),nt.test(t)&&(H.event.fixHooks[t]=H.event.keyHooks),rt.test(t)&&(H.event.fixHooks[t]=H.event.mouseHooks)}),function(){function e(e,t,n,r,o,a){for(var s=0,l=r.length;l>s;s++){var u=r[s];if(u){var c=!1;for(u=u[e];u;){if(u[i]===n){c=r[u.sizset];break}if(1!==u.nodeType||a||(u[i]=n,u.sizset=s),u.nodeName.toLowerCase()===t){c=u;break}u=u[e]}r[s]=c}}}function n(e,t,n,r,o,a){for(var s=0,l=r.length;l>s;s++){var u=r[s];if(u){var c=!1;for(u=u[e];u;){if(u[i]===n){c=r[u.sizset];break}if(1===u.nodeType)if(a||(u[i]=n,u.sizset=s),"string"!=typeof t){if(u===t){c=!0;break}}else if(d.filter(t,[u]).length>0){c=u;break}u=u[e]}r[s]=c}}}var r=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,i="sizcache"+(Math.random()+"").replace(".",""),o=0,a=Object.prototype.toString,s=!1,l=!0,u=/\\/g,c=/\r\n/g,f=/\W/;[0,0].sort(function(){return l=!1,0});var d=function(e,t,n,i){n=n||[],t=t||M;var o=t;if(1!==t.nodeType&&9!==t.nodeType)return[];if(!e||"string"!=typeof e)return n;var s,l,u,c,f,p,g,y,b=!0,x=d.isXML(t),T=[],N=e;do if(r.exec(""),s=r.exec(N),s&&(N=s[3],T.push(s[1]),s[2])){c=s[3];break}while(s);if(T.length>1&&m.exec(e))if(2===T.length&&h.relative[T[0]])l=w(T[0]+T[1],t,i);else for(l=h.relative[T[0]]?[t]:d(T.shift(),t);T.length;)e=T.shift(),h.relative[e]&&(e+=T.shift()),l=w(e,l,i);else if(!i&&T.length>1&&9===t.nodeType&&!x&&h.match.ID.test(T[0])&&!h.match.ID.test(T[T.length-1])&&(f=d.find(T.shift(),t,x),t=f.expr?d.filter(f.expr,f.set)[0]:f.set[0]),t)for(f=i?{expr:T.pop(),set:v(i)}:d.find(T.pop(),1!==T.length||"~"!==T[0]&&"+"!==T[0]||!t.parentNode?t:t.parentNode,x),l=f.expr?d.filter(f.expr,f.set):f.set,T.length>0?u=v(l):b=!1;T.length;)p=T.pop(),g=p,h.relative[p]?g=T.pop():p="",null==g&&(g=t),h.relative[p](u,g,x);else u=T=[];if(u||(u=l),u||d.error(p||e),"[object Array]"===a.call(u))if(b)if(t&&1===t.nodeType)for(y=0;null!=u[y];y++)u[y]&&(u[y]===!0||1===u[y].nodeType&&d.contains(t,u[y]))&&n.push(l[y]);else for(y=0;null!=u[y];y++)u[y]&&1===u[y].nodeType&&n.push(l[y]);else n.push.apply(n,u);else v(u,n);return c&&(d(c,o,n,i),d.uniqueSort(n)),n};d.uniqueSort=function(e){if(x&&(s=l,e.sort(x),s))for(var t=1;t<e.length;t++)e[t]===e[t-1]&&e.splice(t--,1);return e},d.matches=function(e,t){return d(e,null,null,t)},d.matchesSelector=function(e,t){return d(t,null,null,[e]).length>0},d.find=function(e,t,n){var r,i,o,a,s,l;if(!e)return[];for(i=0,o=h.order.length;o>i;i++)if(s=h.order[i],(a=h.leftMatch[s].exec(e))&&(l=a[1],a.splice(1,1),"\\"!==l.substr(l.length-1)&&(a[1]=(a[1]||"").replace(u,""),r=h.find[s](a,t,n),null!=r))){e=e.replace(h.match[s],"");break}return r||(r="undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName("*"):[]),{set:r,expr:e}},d.filter=function(e,n,r,i){for(var o,a,s,l,u,c,f,p,m,g=e,y=[],v=n,b=n&&n[0]&&d.isXML(n[0]);e&&n.length;){for(s in h.filter)if(null!=(o=h.leftMatch[s].exec(e))&&o[2]){if(c=h.filter[s],f=o[1],a=!1,o.splice(1,1),"\\"===f.substr(f.length-1))continue;if(v===y&&(y=[]),h.preFilter[s])if(o=h.preFilter[s](o,v,r,y,i,b)){if(o===!0)continue}else a=l=!0;if(o)for(p=0;null!=(u=v[p]);p++)u&&(l=c(u,o,p,v),m=i^l,r&&null!=l?m?a=!0:v[p]=!1:m&&(y.push(u),a=!0));if(l!==t){if(r||(v=y),e=e.replace(h.match[s],""),!a)return[];break}}if(e===g){if(null!=a)break;d.error(e)}g=e}return v},d.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var p=d.getText=function(e){var t,n,r=e.nodeType,i="";if(r){if(1===r||9===r){if("string"==typeof e.textContent)return e.textContent;if("string"==typeof e.innerText)return e.innerText.replace(c,"");for(e=e.firstChild;e;e=e.nextSibling)i+=p(e)}else if(3===r||4===r)return e.nodeValue}else for(t=0;n=e[t];t++)8!==n.nodeType&&(i+=p(n));return i},h=d.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(e,t){var n="string"==typeof t,r=n&&!f.test(t),i=n&&!r;r&&(t=t.toLowerCase());for(var o=0,a=e.length,s;a>o;o++)if(s=e[o]){for(;(s=s.previousSibling)&&1!==s.nodeType;);e[o]=i||s&&s.nodeName.toLowerCase()===t?s||!1:s===t}i&&d.filter(t,e,!0)},">":function(e,t){var n,r="string"==typeof t,i=0,o=e.length;if(r&&!f.test(t)){for(t=t.toLowerCase();o>i;i++)if(n=e[i]){var a=n.parentNode;e[i]=a.nodeName.toLowerCase()===t?a:!1}}else{for(;o>i;i++)n=e[i],n&&(e[i]=r?n.parentNode:n.parentNode===t);r&&d.filter(t,e,!0)}},"":function(t,r,i){var a,s=o++,l=n;"string"!=typeof r||f.test(r)||(r=r.toLowerCase(),a=r,l=e),l("parentNode",r,s,t,a,i)},"~":function(t,r,i){var a,s=o++,l=n;"string"!=typeof r||f.test(r)||(r=r.toLowerCase(),a=r,l=e),l("previousSibling",r,s,t,a,i)}},find:{ID:function(e,t,n){if("undefined"!=typeof t.getElementById&&!n){var r=t.getElementById(e[1]);return r&&r.parentNode?[r]:[]}},NAME:function(e,t){if("undefined"!=typeof t.getElementsByName){for(var n=[],r=t.getElementsByName(e[1]),i=0,o=r.length;o>i;i++)r[i].getAttribute("name")===e[1]&&n.push(r[i]);return 0===n.length?null:n}},TAG:function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e[1]):void 0}},preFilter:{CLASS:function(e,t,n,r,i,o){if(e=" "+e[1].replace(u,"")+" ",o)return e;for(var a=0,s;null!=(s=t[a]);a++)s&&(i^(s.className&&(" "+s.className+" ").replace(/[\t\n\r]/g," ").indexOf(e)>=0)?n||r.push(s):n&&(t[a]=!1));return!1},ID:function(e){return e[1].replace(u,"")},TAG:function(e,t){return e[1].replace(u,"").toLowerCase()},CHILD:function(e){if("nth"===e[1]){e[2]||d.error(e[0]),e[2]=e[2].replace(/^\+|\s*/g,"");var t=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec("even"===e[2]&&"2n"||"odd"===e[2]&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=t[1]+(t[2]||1)-0,e[3]=t[3]-0}else e[2]&&d.error(e[0]);return e[0]=o++,e},ATTR:function(e,t,n,r,i,o){var a=e[1]=e[1].replace(u,"");return!o&&h.attrMap[a]&&(e[1]=h.attrMap[a]),e[4]=(e[4]||e[5]||"").replace(u,""),"~="===e[2]&&(e[4]=" "+e[4]+" "),e},PSEUDO:function(e,t,n,i,o){if("not"===e[1]){if(!((r.exec(e[3])||"").length>1||/^\w/.test(e[3]))){var a=d.filter(e[3],t,n,!0^o);return n||i.push.apply(i,a),!1}e[3]=d(e[3],null,null,t)}else if(h.match.POS.test(e[0])||h.match.CHILD.test(e[0]))return!0;return e},POS:function(e){return e.unshift(!0),e}},filters:{enabled:function(e){return e.disabled===!1&&"hidden"!==e.type},disabled:function(e){return e.disabled===!0},checked:function(e){return e.checked===!0},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!!e.firstChild},empty:function(e){return!e.firstChild},has:function(e,t,n){return!!d(n[3],e).length},header:function(e){return/h\d/i.test(e.nodeName)},text:function(e){var t=e.getAttribute("type"),n=e.type;return"input"===e.nodeName.toLowerCase()&&"text"===n&&(t===n||null===t)},radio:function(e){return"input"===e.nodeName.toLowerCase()&&"radio"===e.type},checkbox:function(e){return"input"===e.nodeName.toLowerCase()&&"checkbox"===e.type},file:function(e){return"input"===e.nodeName.toLowerCase()&&"file"===e.type},password:function(e){return"input"===e.nodeName.toLowerCase()&&"password"===e.type},submit:function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&"submit"===e.type},image:function(e){return"input"===e.nodeName.toLowerCase()&&"image"===e.type},reset:function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&"reset"===e.type},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},input:function(e){return/input|select|textarea|button/i.test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(e,t){return 0===t},last:function(e,t,n,r){return t===r.length-1},even:function(e,t){return t%2===0},odd:function(e,t){return t%2===1},lt:function(e,t,n){return t<n[3]-0},gt:function(e,t,n){return t>n[3]-0},nth:function(e,t,n){return n[3]-0===t},eq:function(e,t,n){return n[3]-0===t}},filter:{PSEUDO:function(e,t,n,r){var i=t[1],o=h.filters[i];if(o)return o(e,n,t,r);if("contains"===i)return(e.textContent||e.innerText||p([e])||"").indexOf(t[3])>=0;if("not"===i){for(var a=t[3],s=0,l=a.length;l>s;s++)if(a[s]===e)return!1;return!0}d.error(i)},CHILD:function(e,t){var n,r,o,a,s,l,u,c=t[1],f=e;switch(c){case"only":case"first":for(;f=f.previousSibling;)if(1===f.nodeType)return!1;if("first"===c)return!0;f=e;case"last":for(;f=f.nextSibling;)if(1===f.nodeType)return!1;return!0;case"nth":if(n=t[2],r=t[3],1===n&&0===r)return!0;if(o=t[0],a=e.parentNode,a&&(a[i]!==o||!e.nodeIndex)){for(l=0,f=a.firstChild;f;f=f.nextSibling)1===f.nodeType&&(f.nodeIndex=++l);a[i]=o}return u=e.nodeIndex-r,0===n?0===u:u%n===0&&u/n>=0}},ID:function(e,t){return 1===e.nodeType&&e.getAttribute("id")===t},TAG:function(e,t){return"*"===t&&1===e.nodeType||!!e.nodeName&&e.nodeName.toLowerCase()===t},CLASS:function(e,t){return(" "+(e.className||e.getAttribute("class"))+" ").indexOf(t)>-1},ATTR:function(e,t){var n=t[1],r=d.attr?d.attr(e,n):h.attrHandle[n]?h.attrHandle[n](e):null!=e[n]?e[n]:e.getAttribute(n),i=r+"",o=t[2],a=t[4];return null==r?"!="===o:!o&&d.attr?null!=r:"="===o?i===a:"*="===o?i.indexOf(a)>=0:"~="===o?(" "+i+" ").indexOf(a)>=0:a?"!="===o?i!==a:"^="===o?0===i.indexOf(a):"$="===o?i.substr(i.length-a.length)===a:"|="===o?i===a||i.substr(0,a.length+1)===a+"-":!1:i&&r!==!1},POS:function(e,t,n,r){var i=t[2],o=h.setFilters[i];return o?o(e,n,t,r):void 0}}},m=h.match.POS,g=function(e,t){return"\\"+(t-0+1)};for(var y in h.match)h.match[y]=new RegExp(h.match[y].source+/(?![^\[]*\])(?![^\(]*\))/.source),h.leftMatch[y]=new RegExp(/(^(?:.|\r|\n)*?)/.source+h.match[y].source.replace(/\\(\d+)/g,g));var v=function(e,t){return e=Array.prototype.slice.call(e,0),t?(t.push.apply(t,e),t):e};try{Array.prototype.slice.call(M.documentElement.childNodes,0)[0].nodeType}catch(b){v=function(e,t){var n=0,r=t||[];if("[object Array]"===a.call(e))Array.prototype.push.apply(r,e);else if("number"==typeof e.length)for(var i=e.length;i>n;n++)r.push(e[n]);else for(;e[n];n++)r.push(e[n]);return r}}var x,T;M.documentElement.compareDocumentPosition?x=function(e,t){return e===t?(s=!0,0):e.compareDocumentPosition&&t.compareDocumentPosition?4&e.compareDocumentPosition(t)?-1:1:e.compareDocumentPosition?-1:1}:(x=function(e,t){if(e===t)return s=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],o=[],a=e.parentNode,l=t.parentNode,u=a;if(a===l)return T(e,t);if(!a)return-1;if(!l)return 1;for(;u;)i.unshift(u),u=u.parentNode;for(u=l;u;)o.unshift(u),u=u.parentNode;n=i.length,r=o.length;for(var c=0;n>c&&r>c;c++)if(i[c]!==o[c])return T(i[c],o[c]);return c===n?T(e,o[c],-1):T(i[c],t,1)},T=function(e,t,n){if(e===t){return n;var r=e.nextSibling}for(;r;){if(r===t)return-1;r=r.nextSibling}return 1}),function(){var e=M.createElement("div"),n="script"+(new Date).getTime(),r=M.documentElement;e.innerHTML="<a name='"+n+"'/>",r.insertBefore(e,r.firstChild),M.getElementById(n)&&(h.find.ID=function(e,n,r){if("undefined"!=typeof n.getElementById&&!r){var i=n.getElementById(e[1]);return i?i.id===e[1]||"undefined"!=typeof i.getAttributeNode&&i.getAttributeNode("id").nodeValue===e[1]?[i]:t:[]}},h.filter.ID=function(e,t){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return 1===e.nodeType&&n&&n.nodeValue===t}),r.removeChild(e),r=e=null}(),function(){var e=M.createElement("div");e.appendChild(M.createComment("")),e.getElementsByTagName("*").length>0&&(h.find.TAG=function(e,t){var n=t.getElementsByTagName(e[1]);if("*"===e[1]){for(var r=[],i=0;n[i];i++)1===n[i].nodeType&&r.push(n[i]);n=r}return n}),e.innerHTML="<a href='#'></a>",e.firstChild&&"undefined"!=typeof e.firstChild.getAttribute&&"#"!==e.firstChild.getAttribute("href")&&(h.attrHandle.href=function(e){return e.getAttribute("href",2)}),e=null}(),M.querySelectorAll&&!function(){var e=d,t=M.createElement("div"),n="__sizzle__";if(t.innerHTML="<p class='TEST'></p>",!t.querySelectorAll||0!==t.querySelectorAll(".TEST").length){d=function(t,r,i,o){if(r=r||M,!o&&!d.isXML(r)){var a=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(t);if(a&&(1===r.nodeType||9===r.nodeType)){if(a[1])return v(r.getElementsByTagName(t),i);if(a[2]&&h.find.CLASS&&r.getElementsByClassName)return v(r.getElementsByClassName(a[2]),i)}if(9===r.nodeType){if("body"===t&&r.body)return v([r.body],i);if(a&&a[3]){var s=r.getElementById(a[3]);if(!s||!s.parentNode)return v([],i);if(s.id===a[3])return v([s],i)}try{return v(r.querySelectorAll(t),i)}catch(l){}}else if(1===r.nodeType&&"object"!==r.nodeName.toLowerCase()){var u=r,c=r.getAttribute("id"),f=c||n,p=r.parentNode,m=/^\s*[+~]/.test(t);c?f=f.replace(/'/g,"\\$&"):r.setAttribute("id",f),m&&p&&(r=r.parentNode);try{if(!m||p)return v(r.querySelectorAll("[id='"+f+"'] "+t),i)}catch(g){}finally{c||u.removeAttribute("id")}}}return e(t,r,i,o)};for(var r in e)d[r]=e[r];t=null}}(),function(){var e=M.documentElement,t=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(t){var n=!t.call(M.createElement("div"),"div"),r=!1;try{t.call(M.documentElement,"[test!='']:sizzle")}catch(i){r=!0}d.matchesSelector=function(e,i){if(i=i.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']"),!d.isXML(e))try{if(r||!h.match.PSEUDO.test(i)&&!/!=/.test(i)){var o=t.call(e,i);if(o||!n||e.document&&11!==e.document.nodeType)return o}}catch(a){}return d(i,null,null,[e]).length>0}}}(),function(){var e=M.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>",e.getElementsByClassName&&0!==e.getElementsByClassName("e").length&&(e.lastChild.className="e",1!==e.getElementsByClassName("e").length&&(h.order.splice(1,0,"CLASS"),h.find.CLASS=function(e,t,n){return"undefined"==typeof t.getElementsByClassName||n?void 0:t.getElementsByClassName(e[1])},e=null))}(),d.contains=M.documentElement.contains?function(e,t){return e!==t&&(e.contains?e.contains(t):!0)}:M.documentElement.compareDocumentPosition?function(e,t){return!!(16&e.compareDocumentPosition(t))}:function(){return!1},d.isXML=function(e){var t=(e?e.ownerDocument||e:0).documentElement;return t?"HTML"!==t.nodeName:!1};var w=function(e,t,n){for(var r,i=[],o="",a=t.nodeType?[t]:t;r=h.match.PSEUDO.exec(e);)o+=r[0],e=e.replace(h.match.PSEUDO,"");e=h.relative[e]?e+"*":e;for(var s=0,l=a.length;l>s;s++)d(e,a[s],i,n);return d.filter(o,i)};d.attr=H.attr,d.selectors.attrMap={},H.find=d,H.expr=d.selectors,H.expr[":"]=H.expr.filters,H.unique=d.uniqueSort,H.text=d.getText,H.isXMLDoc=d.isXML,H.contains=d.contains}();var ut=/Until$/,ct=/^(?:parents|prevUntil|prevAll)/,ft=/,/,dt=/^.[^:#\[\.,]*$/,pt=Array.prototype.slice,ht=H.expr.match.POS,mt={children:!0,contents:!0,next:!0,prev:!0};H.fn.extend({find:function(e){var t=this,n,r;if("string"!=typeof e)return H(e).filter(function(){for(n=0,r=t.length;r>n;n++)if(H.contains(t[n],this))return!0});var i=this.pushStack("","find",e),o,a,s;for(n=0,r=this.length;r>n;n++)if(o=i.length,H.find(e,this[n],i),n>0)for(a=o;a<i.length;a++)for(s=0;o>s;s++)if(i[s]===i[a]){i.splice(a--,1);break}return i},has:function(e){var t=H(e);return this.filter(function(){for(var e=0,n=t.length;n>e;e++)if(H.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(u(this,e,!1),"not",e)},filter:function(e){return this.pushStack(u(this,e,!0),"filter",e)},is:function(e){return!!e&&("string"==typeof e?ht.test(e)?H(e,this.context).index(this[0])>=0:H.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n=[],r,i,o=this[0];if(H.isArray(e)){for(var a=1;o&&o.ownerDocument&&o!==t;){for(r=0;r<e.length;r++)H(o).is(e[r])&&n.push({selector:e[r],elem:o,level:a});o=o.parentNode,a++}return n}var s=ht.test(e)||"string"!=typeof e?H(e,t||this.context):0;for(r=0,i=this.length;i>r;r++)for(o=this[r];o;){if(s?s.index(o)>-1:H.find.matchesSelector(o,e)){n.push(o);break}if(o=o.parentNode,!o||!o.ownerDocument||o===t||11===o.nodeType)break}return n=n.length>1?H.unique(n):n,this.pushStack(n,"closest",e)},index:function(e){return e?"string"==typeof e?H.inArray(this[0],H(e)):H.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n="string"==typeof e?H(e,t):H.makeArray(e&&e.nodeType?[e]:e),r=H.merge(this.get(),n);return this.pushStack(l(n[0])||l(r[0])?r:H.unique(r))},andSelf:function(){return this.add(this.prevObject)}}),H.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return H.dir(e,"parentNode")},parentsUntil:function(e,t,n){return H.dir(e,"parentNode",n)},next:function(e){return H.nth(e,2,"nextSibling")},prev:function(e){return H.nth(e,2,"previousSibling")},nextAll:function(e){return H.dir(e,"nextSibling")},prevAll:function(e){return H.dir(e,"previousSibling")},nextUntil:function(e,t,n){return H.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return H.dir(e,"previousSibling",n)},siblings:function(e){return H.sibling(e.parentNode.firstChild,e)},children:function(e){return H.sibling(e.firstChild)},contents:function(e){return H.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:H.makeArray(e.childNodes)}},function(e,t){H.fn[e]=function(n,r){var i=H.map(this,t,n);return ut.test(e)||(r=n),r&&"string"==typeof r&&(i=H.filter(r,i)),i=this.length>1&&!mt[e]?H.unique(i):i,(this.length>1||ft.test(r))&&ct.test(e)&&(i=i.reverse()),this.pushStack(i,e,pt.call(arguments).join(","))}}),H.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?H.find.matchesSelector(t[0],e)?[t[0]]:[]:H.find.matches(e,t)},dir:function(e,n,r){for(var i=[],o=e[n];o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!H(o).is(r));)1===o.nodeType&&i.push(o),o=o[n];return i},nth:function(e,t,n,r){t=t||1;for(var i=0;e&&(1!==e.nodeType||++i!==t);e=e[n]);return e},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});var gt="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",yt=/ jQuery\d+="(?:\d+|null)"/g,vt=/^\s+/,bt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,xt=/<([\w:]+)/,Tt=/<tbody/i,wt=/<|&#?\w+;/,Nt=/<(?:script|style)/i,Ct=/<(?:script|object|embed|option|style)/i,Et=new RegExp("<(?:"+gt+")","i"),kt=/checked\s*(?:[^=]|=\s*.checked.)/i,St=/\/(java|ecma)script/i,At=/^\s*<!(?:\[CDATA\[|\-\-)/,Lt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},jt=c(M);Lt.optgroup=Lt.option,Lt.tbody=Lt.tfoot=Lt.colgroup=Lt.caption=Lt.thead,Lt.th=Lt.td,H.support.htmlSerialize||(Lt._default=[1,"div<div>","</div>"]),H.fn.extend({text:function(e){return H.isFunction(e)?this.each(function(t){var n=H(this);n.text(e.call(this,t,n.text()))}):"object"!=typeof e&&e!==t?this.empty().append((this[0]&&this[0].ownerDocument||M).createTextNode(e)):H.text(this)},wrapAll:function(e){if(H.isFunction(e))return this.each(function(t){H(this).wrapAll(e.call(this,t))});if(this[0]){var t=H(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return this.each(H.isFunction(e)?function(t){H(this).wrapInner(e.call(this,t))}:function(){var t=H(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=H.isFunction(e);return this.each(function(n){H(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){H.nodeName(this,"body")||H(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){1===this.nodeType&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){1===this.nodeType&&this.insertBefore(e,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=H.clean(arguments);return e.push.apply(e,this.toArray()),this.pushStack(e,"before",arguments)
+}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=this.pushStack(this,"after",arguments);return e.push.apply(e,H.clean(arguments)),e}},remove:function(e,t){for(var n=0,r;null!=(r=this[n]);n++)(!e||H.filter(e,[r]).length)&&(t||1!==r.nodeType||(H.cleanData(r.getElementsByTagName("*")),H.cleanData([r])),r.parentNode&&r.parentNode.removeChild(r));return this},empty:function(){for(var e=0,t;null!=(t=this[e]);e++)for(1===t.nodeType&&H.cleanData(t.getElementsByTagName("*"));t.firstChild;)t.removeChild(t.firstChild);return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return H.clone(this,e,t)})},html:function(e){if(e===t)return this[0]&&1===this[0].nodeType?this[0].innerHTML.replace(yt,""):null;if("string"!=typeof e||Nt.test(e)||!H.support.leadingWhitespace&&vt.test(e)||Lt[(xt.exec(e)||["",""])[1].toLowerCase()])H.isFunction(e)?this.each(function(t){var n=H(this);n.html(e.call(this,t,n.html()))}):this.empty().append(e);else{e=e.replace(bt,"<$1></$2>");try{for(var n=0,r=this.length;r>n;n++)1===this[n].nodeType&&(H.cleanData(this[n].getElementsByTagName("*")),this[n].innerHTML=e)}catch(i){this.empty().append(e)}}return this},replaceWith:function(e){return this[0]&&this[0].parentNode?H.isFunction(e)?this.each(function(t){var n=H(this),r=n.html();n.replaceWith(e.call(this,t,r))}):("string"!=typeof e&&(e=H(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;H(this).remove(),t?H(t).before(e):H(n).append(e)})):this.length?this.pushStack(H(H.isFunction(e)?e():e),"replaceWith",e):this},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){var i,o,a,s,l=e[0],u=[];if(!H.support.checkClone&&3===arguments.length&&"string"==typeof l&&kt.test(l))return this.each(function(){H(this).domManip(e,n,r,!0)});if(H.isFunction(l))return this.each(function(i){var o=H(this);e[0]=l.call(this,i,n?o.html():t),o.domManip(e,n,r)});if(this[0]){if(s=l&&l.parentNode,i=H.support.parentNode&&s&&11===s.nodeType&&s.childNodes.length===this.length?{fragment:s}:H.buildFragment(e,this,u),a=i.fragment,o=1===a.childNodes.length?a=a.firstChild:a.firstChild){n=n&&H.nodeName(o,"tr");for(var c=0,d=this.length,p=d-1;d>c;c++)r.call(n?f(this[c],o):this[c],i.cacheable||d>1&&p>c?H.clone(a,!0,!0):a)}u.length&&H.each(u,v)}return this}}),H.buildFragment=function(e,t,n){var r,i,o,a,s=e[0];return t&&t[0]&&(a=t[0].ownerDocument||t[0]),a.createDocumentFragment||(a=M),!(1===e.length&&"string"==typeof s&&s.length<512&&a===M&&"<"===s.charAt(0))||Ct.test(s)||!H.support.checkClone&&kt.test(s)||!H.support.html5Clone&&Et.test(s)||(i=!0,o=H.fragments[s],o&&1!==o&&(r=o)),r||(r=a.createDocumentFragment(),H.clean(e,a,r,n)),i&&(H.fragments[s]=o?r:1),{fragment:r,cacheable:i}},H.fragments={},H.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){H.fn[e]=function(n){var r=[],i=H(n),o=1===this.length&&this[0].parentNode;if(o&&11===o.nodeType&&1===o.childNodes.length&&1===i.length)return i[t](this[0]),this;for(var a=0,s=i.length;s>a;a++){var l=(a>0?this.clone(!0):this).get();H(i[a])[t](l),r=r.concat(l)}return this.pushStack(r,e,i.selector)}}),H.extend({clone:function(e,t,n){var r,i,o,a=H.support.html5Clone||!Et.test("<"+e.nodeName)?e.cloneNode(!0):y(e);if(!(H.support.noCloneEvent&&H.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||H.isXMLDoc(e)))for(p(e,a),r=h(e),i=h(a),o=0;r[o];++o)i[o]&&p(r[o],i[o]);if(t&&(d(e,a),n))for(r=h(e),i=h(a),o=0;r[o];++o)d(r[o],i[o]);return r=i=null,a},clean:function(e,t,n,r){var i;t=t||M,"undefined"==typeof t.createElement&&(t=t.ownerDocument||t[0]&&t[0].ownerDocument||M);for(var o=[],a,s=0,l;null!=(l=e[s]);s++)if("number"==typeof l&&(l+=""),l){if("string"==typeof l)if(wt.test(l)){l=l.replace(bt,"<$1></$2>");var u=(xt.exec(l)||["",""])[1].toLowerCase(),f=Lt[u]||Lt._default,d=f[0],p=t.createElement("div");for(t===M?jt.appendChild(p):c(t).appendChild(p),p.innerHTML=f[1]+l+f[2];d--;)p=p.lastChild;if(!H.support.tbody){var h=Tt.test(l),m="table"!==u||h?"<table>"!==f[1]||h?[]:p.childNodes:p.firstChild&&p.firstChild.childNodes;for(a=m.length-1;a>=0;--a)H.nodeName(m[a],"tbody")&&!m[a].childNodes.length&&m[a].parentNode.removeChild(m[a])}!H.support.leadingWhitespace&&vt.test(l)&&p.insertBefore(t.createTextNode(vt.exec(l)[0]),p.firstChild),l=p.childNodes}else l=t.createTextNode(l);var y;if(!H.support.appendChecked)if(l[0]&&"number"==typeof(y=l.length))for(a=0;y>a;a++)g(l[a]);else g(l);l.nodeType?o.push(l):o=H.merge(o,l)}if(n)for(i=function(e){return!e.type||St.test(e.type)},s=0;o[s];s++)if(!r||!H.nodeName(o[s],"script")||o[s].type&&"text/javascript"!==o[s].type.toLowerCase()){if(1===o[s].nodeType){var v=H.grep(o[s].getElementsByTagName("script"),i);o.splice.apply(o,[s+1,0].concat(v))}n.appendChild(o[s])}else r.push(o[s].parentNode?o[s].parentNode.removeChild(o[s]):o[s]);return o},cleanData:function(e){for(var t,n,r=H.cache,i=H.event.special,o=H.support.deleteExpando,a=0,s;null!=(s=e[a]);a++)if((!s.nodeName||!H.noData[s.nodeName.toLowerCase()])&&(n=s[H.expando])){if(t=r[n],t&&t.events){for(var l in t.events)i[l]?H.event.remove(s,l):H.removeEvent(s,l,t.handle);t.handle&&(t.handle.elem=null)}o?delete s[H.expando]:s.removeAttribute&&s.removeAttribute(H.expando),delete r[n]}}});var Ft=/alpha\([^)]*\)/i,Dt=/opacity=([^)]*)/,Mt=/([A-Z]|^ms)/g,Ot=/^-?\d+(?:px)?$/i,_t=/^-?\d/,Ht=/^([\-+])=([\-+.\de]+)/,Bt={position:"absolute",visibility:"hidden",display:"block"},Pt=["Left","Right"],qt=["Top","Bottom"],Wt,It,$t;H.fn.css=function(e,n){return 2===arguments.length&&n===t?this:H.access(this,e,n,!0,function(e,n,r){return r!==t?H.style(e,n,r):H.css(e,n)})},H.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity","opacity");return""===n?"1":n}return e.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":H.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s=H.camelCase(n),l=e.style,u=H.cssHooks[s];if(n=H.cssProps[s]||s,r===t)return u&&"get"in u&&(o=u.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Ht.exec(r))&&(r=+(o[1]+1)*+o[2]+parseFloat(H.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||H.cssNumber[s]||(r+="px"),u&&"set"in u&&(r=u.set(e,r))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r){var i,o;return n=H.camelCase(n),o=H.cssHooks[n],n=H.cssProps[n]||n,"cssFloat"===n&&(n="float"),o&&"get"in o&&(i=o.get(e,!0,r))!==t?i:Wt?Wt(e,n):void 0},swap:function(e,t,n){var r={};for(var i in t)r[i]=e.style[i],e.style[i]=t[i];n.call(e);for(i in t)e.style[i]=r[i]}}),H.curCSS=H.css,H.each(["height","width"],function(e,t){H.cssHooks[t]={get:function(e,n,r){var i;return n?0!==e.offsetWidth?b(e,t,r):(H.swap(e,Bt,function(){i=b(e,t,r)}),i):void 0},set:function(e,t){return Ot.test(t)?(t=parseFloat(t),t>=0?t+"px":void 0):t}}}),H.support.opacity||(H.cssHooks.opacity={get:function(e,t){return Dt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?parseFloat(RegExp.$1)/100+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=H.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,t>=1&&""===H.trim(o.replace(Ft,""))&&(n.removeAttribute("filter"),r&&!r.filter)||(n.filter=Ft.test(o)?o.replace(Ft,i):o+" "+i)}}),H(function(){H.support.reliableMarginRight||(H.cssHooks.marginRight={get:function(e,t){var n;return H.swap(e,{display:"inline-block"},function(){n=t?Wt(e,"margin-right","marginRight"):e.style.marginRight}),n}})}),M.defaultView&&M.defaultView.getComputedStyle&&(It=function(e,t){var n,r,i;return t=t.replace(Mt,"-$1").toLowerCase(),(r=e.ownerDocument.defaultView)&&(i=r.getComputedStyle(e,null))&&(n=i.getPropertyValue(t),""!==n||H.contains(e.ownerDocument.documentElement,e)||(n=H.style(e,t))),n}),M.documentElement.currentStyle&&($t=function(e,t){var n,r,i,o=e.currentStyle&&e.currentStyle[t],a=e.style;return null===o&&a&&(i=a[t])&&(o=i),!Ot.test(o)&&_t.test(o)&&(n=a.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),a.left="fontSize"===t?"1em":o||0,o=a.pixelLeft+"px",a.left=n,r&&(e.runtimeStyle.left=r)),""===o?"auto":o}),Wt=It||$t,H.expr&&H.expr.filters&&(H.expr.filters.hidden=function(e){var t=e.offsetWidth,n=e.offsetHeight;return 0===t&&0===n||!H.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||H.css(e,"display"))},H.expr.filters.visible=function(e){return!H.expr.filters.hidden(e)});var Rt=/%20/g,Xt=/\[\]$/,zt=/\r?\n/g,Vt=/#.*$/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Gt=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,Jt=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Qt=/^\/\//,Kt=/\?/,Zt=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,en=/^(?:select|textarea)/i,tn=/\s+/,nn=/([?&])_=[^&]*/,rn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,on=H.fn.load,an={},sn={},ln,un,cn=["*/"]+["*"];try{ln=_.href}catch(fn){ln=M.createElement("a"),ln.href="",ln=ln.href}un=rn.exec(ln.toLowerCase())||[],H.fn.extend({load:function(e,n,r){if("string"!=typeof e&&on)return on.apply(this,arguments);if(!this.length)return this;var i=e.indexOf(" ");if(i>=0){var o=e.slice(i,e.length);e=e.slice(0,i)}var a="GET";n&&(H.isFunction(n)?(r=n,n=t):"object"==typeof n&&(n=H.param(n,H.ajaxSettings.traditional),a="POST"));var s=this;return H.ajax({url:e,type:a,dataType:"html",data:n,complete:function(e,t,n){n=e.responseText,e.isResolved()&&(e.done(function(e){n=e}),s.html(o?H("<div>").append(n.replace(Zt,"")).find(o):n)),r&&s.each(r,[n,t,e])}}),this},serialize:function(){return H.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?H.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||en.test(this.nodeName)||Gt.test(this.type))}).map(function(e,t){var n=H(this).val();return null==n?null:H.isArray(n)?H.map(n,function(e,n){return{name:t.name,value:e.replace(zt,"\r\n")}}):{name:t.name,value:n.replace(zt,"\r\n")}}).get()}}),H.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){H.fn[t]=function(e){return this.on(t,e)}}),H.each(["get","post"],function(e,n){H[n]=function(e,r,i,o){return H.isFunction(r)&&(o=o||i,i=r,r=t),H.ajax({type:n,url:e,data:r,success:i,dataType:o})}}),H.extend({getScript:function(e,n){return H.get(e,t,n,"script")},getJSON:function(e,t,n){return H.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?w(e,H.ajaxSettings):(t=e,e=H.ajaxSettings),w(e,t),e},ajaxSettings:{url:ln,isLocal:Jt.test(un[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":H.parseJSON,"text xml":H.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:x(an),ajaxTransport:x(sn),ajax:function(e,n){function r(e,n,r,f){if(2!==v){v=2,g&&clearTimeout(g),m=t,p=f||"",w.readyState=e>0?4:0;var d,h,y,x=n,T=r?C(i,w,r):t,N,k;if(e>=200&&300>e||304===e)if(i.ifModified&&((N=w.getResponseHeader("Last-Modified"))&&(H.lastModified[c]=N),(k=w.getResponseHeader("Etag"))&&(H.etag[c]=k)),304===e)x="notmodified",d=!0;else try{h=E(i,T),x="success",d=!0}catch(S){x="parsererror",y=S}else y=x,(!x||e)&&(x="error",0>e&&(e=0));w.status=e,w.statusText=""+(n||x),d?s.resolveWith(o,[h,x,w]):s.rejectWith(o,[w,x,y]),w.statusCode(u),u=t,b&&a.trigger("ajax"+(d?"Success":"Error"),[w,i,d?h:y]),l.fireWith(o,[w,x]),b&&(a.trigger("ajaxComplete",[w,i]),--H.active||H.event.trigger("ajaxStop"))}}"object"==typeof e&&(n=e,e=t),n=n||{};var i=H.ajaxSetup({},n),o=i.context||i,a=o!==i&&(o.nodeType||o instanceof H)?H(o):H.event,s=H.Deferred(),l=H.Callbacks("once memory"),u=i.statusCode||{},c,f={},d={},p,h,m,g,y,v=0,b,x,w={readyState:0,setRequestHeader:function(e,t){if(!v){var n=e.toLowerCase();e=d[n]=d[n]||e,f[e]=t}return this},getAllResponseHeaders:function(){return 2===v?p:null},getResponseHeader:function(e){var n;if(2===v){if(!h)for(h={};n=Ut.exec(p);)h[n[1].toLowerCase()]=n[2];n=h[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return v||(i.mimeType=e),this},abort:function(e){return e=e||"abort",m&&m.abort(e),r(0,e),this}};if(s.promise(w),w.success=w.done,w.error=w.fail,w.complete=l.add,w.statusCode=function(e){if(e){var t;if(2>v)for(t in e)u[t]=[u[t],e[t]];else t=e[w.status],w.then(t,t)}return this},i.url=((e||i.url)+"").replace(Vt,"").replace(Qt,un[1]+"//"),i.dataTypes=H.trim(i.dataType||"*").toLowerCase().split(tn),null==i.crossDomain&&(y=rn.exec(i.url.toLowerCase()),i.crossDomain=!(!y||y[1]==un[1]&&y[2]==un[2]&&(y[3]||("http:"===y[1]?80:443))==(un[3]||("http:"===un[1]?80:443)))),i.data&&i.processData&&"string"!=typeof i.data&&(i.data=H.param(i.data,i.traditional)),T(an,i,n,w),2===v)return!1;if(b=i.global,i.type=i.type.toUpperCase(),i.hasContent=!Yt.test(i.type),b&&0===H.active++&&H.event.trigger("ajaxStart"),!i.hasContent&&(i.data&&(i.url+=(Kt.test(i.url)?"&":"?")+i.data,delete i.data),c=i.url,i.cache===!1)){var N=H.now(),k=i.url.replace(nn,"$1_="+N);i.url=k+(k===i.url?(Kt.test(i.url)?"&":"?")+"_="+N:"")}(i.data&&i.hasContent&&i.contentType!==!1||n.contentType)&&w.setRequestHeader("Content-Type",i.contentType),i.ifModified&&(c=c||i.url,H.lastModified[c]&&w.setRequestHeader("If-Modified-Since",H.lastModified[c]),H.etag[c]&&w.setRequestHeader("If-None-Match",H.etag[c])),w.setRequestHeader("Accept",i.dataTypes[0]&&i.accepts[i.dataTypes[0]]?i.accepts[i.dataTypes[0]]+("*"!==i.dataTypes[0]?", "+cn+"; q=0.01":""):i.accepts["*"]);for(x in i.headers)w.setRequestHeader(x,i.headers[x]);if(i.beforeSend&&(i.beforeSend.call(o,w,i)===!1||2===v))return w.abort(),!1;for(x in{success:1,error:1,complete:1})w[x](i[x]);if(m=T(sn,i,n,w)){w.readyState=1,b&&a.trigger("ajaxSend",[w,i]),i.async&&i.timeout>0&&(g=setTimeout(function(){w.abort("timeout")},i.timeout));try{v=1,m.send(f,r)}catch(S){if(!(2>v))throw S;r(-1,S)}}else r(-1,"No Transport");return w},param:function(e,n){var r=[],i=function(e,t){t=H.isFunction(t)?t():t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=H.ajaxSettings.traditional),H.isArray(e)||e.jquery&&!H.isPlainObject(e))H.each(e,function(){i(this.name,this.value)});else for(var o in e)N(o,e[o],n,i);return r.join("&").replace(Rt,"+")}}),H.extend({active:0,lastModified:{},etag:{}});var dn=H.now(),pn=/(\=)\?(&|$)|\?\?/i;H.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return H.expando+"_"+dn++}}),H.ajaxPrefilter("json jsonp",function(t,n,r){var i="application/x-www-form-urlencoded"===t.contentType&&"string"==typeof t.data;if("jsonp"===t.dataTypes[0]||t.jsonp!==!1&&(pn.test(t.url)||i&&pn.test(t.data))){var o,a=t.jsonpCallback=H.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s=e[a],l=t.url,u=t.data,c="$1"+a+"$2";return t.jsonp!==!1&&(l=l.replace(pn,c),t.url===l&&(i&&(u=u.replace(pn,c)),t.data===u&&(l+=(/\?/.test(l)?"&":"?")+t.jsonp+"="+a))),t.url=l,t.data=u,e[a]=function(e){o=[e]},r.always(function(){e[a]=s,o&&H.isFunction(s)&&e[a](o[0])}),t.converters["script json"]=function(){return o||H.error(a+" was not called"),o[0]},t.dataTypes[0]="json","script"}}),H.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return H.globalEval(e),e}}}),H.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),H.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=M.head||M.getElementsByTagName("head")[0]||M.documentElement;return{send:function(i,o){n=M.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){(i||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var hn=e.ActiveXObject?function(){for(var e in gn)gn[e](0,1)}:!1,mn=0,gn;H.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&k()||S()}:k,function(e){H.extend(H.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(H.ajaxSettings.xhr()),H.support.ajax&&H.ajaxTransport(function(n){if(!n.crossDomain||H.support.cors){var r;return{send:function(i,o){var a=n.xhr(),s,l;if(n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async),n.xhrFields)for(l in n.xhrFields)a[l]=n.xhrFields[l];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(l in i)a.setRequestHeader(l,i[l])}catch(u){}a.send(n.hasContent&&n.data||null),r=function(e,i){var l,u,c,f,d;try{if(r&&(i||4===a.readyState))if(r=t,s&&(a.onreadystatechange=H.noop,hn&&delete gn[s]),i)4!==a.readyState&&a.abort();else{l=a.status,c=a.getAllResponseHeaders(),f={},d=a.responseXML,d&&d.documentElement&&(f.xml=d),f.text=a.responseText;try{u=a.statusText}catch(p){u=""}l||!n.isLocal||n.crossDomain?1223===l&&(l=204):l=f.text?200:404}}catch(h){i||o(-1,h)}f&&o(l,u,f,c)},n.async&&4!==a.readyState?(s=++mn,hn&&(gn||(gn={},H(e).unload(hn)),gn[s]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var yn={},vn,bn,xn=/^(?:toggle|show|hide)$/,Tn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,wn,Nn=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],Cn;H.fn.extend({show:function(e,t,n){var r,i;if(e||0===e)return this.animate(j("show",3),e,t,n);for(var o=0,a=this.length;a>o;o++)r=this[o],r.style&&(i=r.style.display,H._data(r,"olddisplay")||"none"!==i||(i=r.style.display=""),""===i&&"none"===H.css(r,"display")&&H._data(r,"olddisplay",F(r.nodeName)));for(o=0;a>o;o++)r=this[o],r.style&&(i=r.style.display,(""===i||"none"===i)&&(r.style.display=H._data(r,"olddisplay")||""));return this},hide:function(e,t,n){if(e||0===e)return this.animate(j("hide",3),e,t,n);for(var r,i,o=0,a=this.length;a>o;o++)r=this[o],r.style&&(i=H.css(r,"display"),"none"===i||H._data(r,"olddisplay")||H._data(r,"olddisplay",i));for(o=0;a>o;o++)this[o].style&&(this[o].style.display="none");return this},_toggle:H.fn.toggle,toggle:function(e,t,n){var r="boolean"==typeof e;return H.isFunction(e)&&H.isFunction(t)?this._toggle.apply(this,arguments):null==e||r?this.each(function(){var t=r?e:H(this).is(":hidden");H(this)[t?"show":"hide"]()}):this.animate(j("toggle",3),e,t,n),this},fadeTo:function(e,t,n,r){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){function i(){o.queue===!1&&H._mark(this);var t=H.extend({},o),n=1===this.nodeType,r=n&&H(this).is(":hidden"),i,a,s,l,u,c,f,d,p;t.animatedProperties={};for(s in e){if(i=H.camelCase(s),s!==i&&(e[i]=e[s],delete e[s]),a=e[i],H.isArray(a)?(t.animatedProperties[i]=a[1],a=e[i]=a[0]):t.animatedProperties[i]=t.specialEasing&&t.specialEasing[i]||t.easing||"swing","hide"===a&&r||"show"===a&&!r)return t.complete.call(this);!n||"height"!==i&&"width"!==i||(t.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],"inline"===H.css(this,"display")&&"none"===H.css(this,"float")&&(H.support.inlineBlockNeedsLayout&&"inline"!==F(this.nodeName)?this.style.zoom=1:this.style.display="inline-block"))}null!=t.overflow&&(this.style.overflow="hidden");for(s in e)l=new H.fx(this,t,s),a=e[s],xn.test(a)?(p=H._data(this,"toggle"+s)||("toggle"===a?r?"show":"hide":0),p?(H._data(this,"toggle"+s,"show"===p?"hide":"show"),l[p]()):l[a]()):(u=Tn.exec(a),c=l.cur(),u?(f=parseFloat(u[2]),d=u[3]||(H.cssNumber[s]?"":"px"),"px"!==d&&(H.style(this,s,(f||1)+d),c=(f||1)/l.cur()*c,H.style(this,s,c+d)),u[1]&&(f=("-="===u[1]?-1:1)*f+c),l.custom(c,f,d)):l.custom(c,a,""));return!0}var o=H.speed(t,n,r);return H.isEmptyObject(e)?this.each(o.complete,[!1]):(e=H.extend({},e),o.queue===!1?this.each(i):this.queue(o.queue,i))},stop:function(e,n,r){return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){function t(e,t,n){var i=t[n];H.removeData(e,n,!0),i.stop(r)}var n,i=!1,o=H.timers,a=H._data(this);if(r||H._unmark(!0,this),null==e)for(n in a)a[n]&&a[n].stop&&n.indexOf(".run")===n.length-4&&t(this,a,n);else a[n=e+".run"]&&a[n].stop&&t(this,a,n);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(r?o[n](!0):o[n].saveState(),i=!0,o.splice(n,1));r&&i||H.dequeue(this,e)})}}),H.each({slideDown:j("show",1),slideUp:j("hide",1),slideToggle:j("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){H.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),H.extend({speed:function(e,t,n){var r=e&&"object"==typeof e?H.extend({},e):{complete:n||!n&&t||H.isFunction(e)&&e,duration:e,easing:n&&t||t&&!H.isFunction(t)&&t};return r.duration=H.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in H.fx.speeds?H.fx.speeds[r.duration]:H.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(e){H.isFunction(r.old)&&r.old.call(this),r.queue?H.dequeue(this,r.queue):e!==!1&&H._unmark(this)},r},easing:{linear:function(e,t,n,r){return n+r*e},swing:function(e,t,n,r){return(-Math.cos(e*Math.PI)/2+.5)*r+n}},timers:[],fx:function(e,t,n){this.options=t,this.elem=e,this.prop=n,t.orig=t.orig||{}}}),H.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(H.fx.step[this.prop]||H.fx.step._default)(this)},cur:function(){if(null!=this.elem[this.prop]&&(!this.elem.style||null==this.elem.style[this.prop]))return this.elem[this.prop];var e,t=H.css(this.elem,this.prop);return isNaN(e=parseFloat(t))?t&&"auto"!==t?t:0:e},custom:function(e,n,r){function i(e){return o.step(e)}var o=this,a=H.fx;this.startTime=Cn||A(),this.end=n,this.now=this.start=e,this.pos=this.state=0,this.unit=r||this.unit||(H.cssNumber[this.prop]?"":"px"),i.queue=this.options.queue,i.elem=this.elem,i.saveState=function(){o.options.hide&&H._data(o.elem,"fxshow"+o.prop)===t&&H._data(o.elem,"fxshow"+o.prop,o.start)},i()&&H.timers.push(i)&&!wn&&(wn=setInterval(a.tick,a.interval))},show:function(){var e=H._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||H.style(this.elem,this.prop),this.options.show=!0,e!==t?this.custom(this.cur(),e):this.custom("width"===this.prop||"height"===this.prop?1:0,this.cur()),H(this.elem).show()},hide:function(){this.options.orig[this.prop]=H._data(this.elem,"fxshow"+this.prop)||H.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(e){var t,n,r,i=Cn||A(),o=!0,a=this.elem,s=this.options;if(e||i>=s.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),s.animatedProperties[this.prop]=!0;for(t in s.animatedProperties)s.animatedProperties[t]!==!0&&(o=!1);if(o){if(null==s.overflow||H.support.shrinkWrapBlocks||H.each(["","X","Y"],function(e,t){a.style["overflow"+t]=s.overflow[e]}),s.hide&&H(a).hide(),s.hide||s.show)for(t in s.animatedProperties)H.style(a,t,s.orig[t]),H.removeData(a,"fxshow"+t,!0),H.removeData(a,"toggle"+t,!0);r=s.complete,r&&(s.complete=!1,r.call(a))}return!1}return 1/0==s.duration?this.now=i:(n=i-this.startTime,this.state=n/s.duration,this.pos=H.easing[s.animatedProperties[this.prop]](this.state,n,0,1,s.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update(),!0}},H.extend(H.fx,{tick:function(){for(var e,t=H.timers,n=0;n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||H.fx.stop()},interval:13,stop:function(){clearInterval(wn),wn=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){H.style(e.elem,"opacity",e.now)},_default:function(e){e.elem.style&&null!=e.elem.style[e.prop]?e.elem.style[e.prop]=e.now+e.unit:e.elem[e.prop]=e.now}}}),H.each(["width","height"],function(e,t){H.fx.step[t]=function(e){H.style(e.elem,t,Math.max(0,e.now)+e.unit)}}),H.expr&&H.expr.filters&&(H.expr.filters.animated=function(e){return H.grep(H.timers,function(t){return e===t.elem}).length});var En=/^t(?:able|d|h)$/i,kn=/^(?:body|html)$/i;H.fn.offset="getBoundingClientRect"in M.documentElement?function(e){var t=this[0],n;if(e)return this.each(function(t){H.offset.setOffset(this,e,t)});if(!t||!t.ownerDocument)return null;if(t===t.ownerDocument.body)return H.offset.bodyOffset(t);try{n=t.getBoundingClientRect()}catch(r){}var i=t.ownerDocument,o=i.documentElement;if(!n||!H.contains(o,t))return n?{top:n.top,left:n.left}:{top:0,left:0};var a=i.body,s=D(i),l=o.clientTop||a.clientTop||0,u=o.clientLeft||a.clientLeft||0,c=s.pageYOffset||H.support.boxModel&&o.scrollTop||a.scrollTop,f=s.pageXOffset||H.support.boxModel&&o.scrollLeft||a.scrollLeft,d=n.top+c-l,p=n.left+f-u;return{top:d,left:p}}:function(e){var t=this[0];if(e)return this.each(function(t){H.offset.setOffset(this,e,t)});if(!t||!t.ownerDocument)return null;if(t===t.ownerDocument.body)return H.offset.bodyOffset(t);for(var n,r=t.offsetParent,i=t,o=t.ownerDocument,a=o.documentElement,s=o.body,l=o.defaultView,u=l?l.getComputedStyle(t,null):t.currentStyle,c=t.offsetTop,f=t.offsetLeft;(t=t.parentNode)&&t!==s&&t!==a&&(!H.support.fixedPosition||"fixed"!==u.position);)n=l?l.getComputedStyle(t,null):t.currentStyle,c-=t.scrollTop,f-=t.scrollLeft,t===r&&(c+=t.offsetTop,f+=t.offsetLeft,!H.support.doesNotAddBorder||H.support.doesAddBorderForTableAndCells&&En.test(t.nodeName)||(c+=parseFloat(n.borderTopWidth)||0,f+=parseFloat(n.borderLeftWidth)||0),i=r,r=t.offsetParent),H.support.subtractsBorderForOverflowNotVisible&&"visible"!==n.overflow&&(c+=parseFloat(n.borderTopWidth)||0,f+=parseFloat(n.borderLeftWidth)||0),u=n;return("relative"===u.position||"static"===u.position)&&(c+=s.offsetTop,f+=s.offsetLeft),H.support.fixedPosition&&"fixed"===u.position&&(c+=Math.max(a.scrollTop,s.scrollTop),f+=Math.max(a.scrollLeft,s.scrollLeft)),{top:c,left:f}},H.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return H.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(H.css(e,"marginTop"))||0,n+=parseFloat(H.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=H.css(e,"position");"static"===r&&(e.style.position="relative");var i=H(e),o=i.offset(),a=H.css(e,"top"),s=H.css(e,"left"),l=("absolute"===r||"fixed"===r)&&H.inArray("auto",[a,s])>-1,u={},c={},f,d;l?(c=i.position(),f=c.top,d=c.left):(f=parseFloat(a)||0,d=parseFloat(s)||0),H.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+f),null!=t.left&&(u.left=t.left-o.left+d),"using"in t?t.using.call(e,u):i.css(u)}},H.fn.extend({position:function(){if(!this[0])return null;var e=this[0],t=this.offsetParent(),n=this.offset(),r=kn.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(H.css(e,"marginTop"))||0,n.left-=parseFloat(H.css(e,"marginLeft"))||0,r.top+=parseFloat(H.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(H.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||M.body;e&&!kn.test(e.nodeName)&&"static"===H.css(e,"position");)e=e.offsetParent;return e})}}),H.each(["Left","Top"],function(e,n){var r="scroll"+n;H.fn[r]=function(n){var i,o;return n===t?(i=this[0])?(o=D(i),o?"pageXOffset"in o?o[e?"pageYOffset":"pageXOffset"]:H.support.boxModel&&o.document.documentElement[r]||o.document.body[r]:i[r]):null:this.each(function(){o=D(this),o?o.scrollTo(e?H(o).scrollLeft():n,e?n:H(o).scrollTop()):this[r]=n})}}),H.each(["Height","Width"],function(e,n){var r=n.toLowerCase();H.fn["inner"+n]=function(){var e=this[0];return e?e.style?parseFloat(H.css(e,r,"padding")):this[r]():null},H.fn["outer"+n]=function(e){var t=this[0];return t?t.style?parseFloat(H.css(t,r,e?"margin":"border")):this[r]():null},H.fn[r]=function(e){var i=this[0];if(!i)return null==e?null:this;if(H.isFunction(e))return this.each(function(t){var n=H(this);n[r](e.call(this,t,n[r]()))});if(H.isWindow(i)){var o=i.document.documentElement["client"+n],a=i.document.body;return"CSS1Compat"===i.document.compatMode&&o||a&&a["client"+n]||o}if(9===i.nodeType)return Math.max(i.documentElement["client"+n],i.body["scroll"+n],i.documentElement["scroll"+n],i.body["offset"+n],i.documentElement["offset"+n]);if(e===t){var s=H.css(i,r),l=parseFloat(s);return H.isNumeric(l)?l:s}return this.css(r,"string"==typeof e?e:e+"px")}}),e.jQuery=e.$=H,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return H})}(window);
\ No newline at end of file
diff --git a/static/java/js/prism.js b/static/java/js/prism.js
new file mode 100644
index 0000000000000000000000000000000000000000..19f778c9ecf8fadec88e8715de1b239505dd4f8a
--- /dev/null
+++ b/static/java/js/prism.js
@@ -0,0 +1,10 @@
+/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+java+bash&plugins=line-highlight+line-numbers */
+self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{};var Prism=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{encode:function(e){return e instanceof n?new n(e.type,t.util.encode(e.content),e.alias):"Array"===t.util.type(e)?e.map(t.util.encode):e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){var n=t.util.type(e);switch(n){case"Object":var a={};for(var r in e)e.hasOwnProperty(r)&&(a[r]=t.util.clone(e[r]));return a;case"Array":return e.slice()}return e}},languages:{extend:function(e,n){var a=t.util.clone(t.languages[e]);for(var r in n)a[r]=n[r];return a},insertBefore:function(e,n,a,r){r=r||t.languages;var i=r[e],l={};for(var o in i)if(i.hasOwnProperty(o)){if(o==n)for(var s in a)a.hasOwnProperty(s)&&(l[s]=a[s]);l[o]=i[o]}return r[e]=l},DFS:function(e,n){for(var a in e)n.call(e,a,e[a]),"Object"===t.util.type(e)&&t.languages.DFS(e[a],n)}},highlightAll:function(e,n){for(var a,r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'),i=0;a=r[i++];)t.highlightElement(a,e===!0,n)},highlightElement:function(a,r,i){for(var l,o,s=a;s&&!e.test(s.className);)s=s.parentNode;if(s&&(l=(s.className.match(e)||[,""])[1],o=t.languages[l]),o){a.className=a.className.replace(e,"").replace(/\s+/g," ")+" language-"+l,s=a.parentNode,/pre/i.test(s.nodeName)&&(s.className=s.className.replace(e,"").replace(/\s+/g," ")+" language-"+l);var c=a.textContent;if(c){var g={element:a,language:l,grammar:o,code:c};if(t.hooks.run("before-highlight",g),r&&self.Worker){var u=new Worker(t.filename);u.onmessage=function(e){g.highlightedCode=n.stringify(JSON.parse(e.data),l),t.hooks.run("before-insert",g),g.element.innerHTML=g.highlightedCode,i&&i.call(g.element),t.hooks.run("after-highlight",g)},u.postMessage(JSON.stringify({language:g.language,code:g.code}))}else g.highlightedCode=t.highlight(g.code,g.grammar,g.language),t.hooks.run("before-insert",g),g.element.innerHTML=g.highlightedCode,i&&i.call(a),t.hooks.run("after-highlight",g)}}},highlight:function(e,a,r){var i=t.tokenize(e,a);return n.stringify(t.util.encode(i),r)},tokenize:function(e,n){var a=t.Token,r=[e],i=n.rest;if(i){for(var l in i)n[l]=i[l];delete n.rest}e:for(var l in n)if(n.hasOwnProperty(l)&&n[l]){var o=n[l];o="Array"===t.util.type(o)?o:[o];for(var s=0;s<o.length;++s){var c=o[s],g=c.inside,u=!!c.lookbehind,f=0,h=c.alias;c=c.pattern||c;for(var p=0;p<r.length;p++){var d=r[p];if(r.length>e.length)break e;if(!(d instanceof a)){c.lastIndex=0;var m=c.exec(d);if(m){u&&(f=m[1].length);var y=m.index-1+f,m=m[0].slice(f),v=m.length,k=y+v,b=d.slice(0,y+1),w=d.slice(k+1),N=[p,1];b&&N.push(b);var O=new a(l,g?t.tokenize(m,g):m,h);N.push(O),w&&N.push(w),Array.prototype.splice.apply(r,N)}}}}}return r},hooks:{all:{},add:function(e,n){var a=t.hooks.all;a[e]=a[e]||[],a[e].push(n)},run:function(e,n){var a=t.hooks.all[e];if(a&&a.length)for(var r,i=0;r=a[i++];)r(n)}}},n=t.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(n.stringify=function(e,a,r){if("string"==typeof e)return e;if("[object Array]"==Object.prototype.toString.call(e))return e.map(function(t){return n.stringify(t,a,e)}).join("");var i={type:e.type,content:n.stringify(e.content,a,r),tag:"span",classes:["token",e.type],attributes:{},language:a,parent:r};if("comment"==i.type&&(i.attributes.spellcheck="true"),e.alias){var l="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,l)}t.hooks.run("wrap",i);var o="";for(var s in i.attributes)o+=s+'="'+(i.attributes[s]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'" '+o+">"+i.content+"</"+i.tag+">"},!self.document)return self.addEventListener?(self.addEventListener("message",function(e){var n=JSON.parse(e.data),a=n.language,r=n.code;self.postMessage(JSON.stringify(t.util.encode(t.tokenize(r,t.languages[a])))),self.close()},!1),self.Prism):self.Prism;var a=document.getElementsByTagName("script");return a=a[a.length-1],a&&(t.filename=a.src,document.addEventListener&&!a.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)),self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism);;
+Prism.languages.markup={comment:/<!--[\w\W]*?-->/g,prolog:/<\?.+?\?>/,doctype:/<!DOCTYPE.+?>/,cdata:/<!\[CDATA\[[\w\W]*?]]>/i,tag:{pattern:/<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|[^\s'">=]+))?\s*)*\/?>/gi,inside:{tag:{pattern:/^<\/?[\w:-]+/i,inside:{punctuation:/^<\/?/,namespace:/^[\w-]+?:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi,inside:{punctuation:/=|>|"/g}},punctuation:/\/?>/g,"attr-name":{pattern:/[\w:-]+/g,inside:{namespace:/^[\w-]+?:/}}}},entity:/\&#?[\da-z]{1,8};/gi},Prism.hooks.add("wrap",function(t){"entity"===t.type&&(t.attributes.title=t.content.replace(/&amp;/,"&"))});;
+Prism.languages.css={comment:/\/\*[\w\W]*?\*\//g,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*{))/gi,inside:{punctuation:/[;:]/g}},url:/url\((["']?).*?\1\)/gi,selector:/[^\{\}\s][^\{\};]*(?=\s*\{)/g,property:/(\b|\B)[\w-]+(?=\s*:)/gi,string:/("|')(\\?.)*?\1/g,important:/\B!important\b/gi,punctuation:/[\{\};:]/g,"function":/[-a-z0-9]+(?=\()/gi},Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{style:{pattern:/<style[\w\W]*?>[\w\W]*?<\/style>/gi,inside:{tag:{pattern:/<style[\w\W]*?>|<\/style>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css}}});;
+Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//g,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*?(\r?\n|$)/g,lookbehind:!0}],string:/("|')(\\?.)*?\1/g,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/gi,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,"function":{pattern:/[a-z0-9_]+\(/gi,inside:{punctuation:/\(/}},number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|&{1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g};;
+Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|get|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?|NaN|-?Infinity)\b/g}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/<script[\w\W]*?>[\w\W]*?<\/script>/gi,inside:{tag:{pattern:/<script[\w\W]*?>|<\/script>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript}}});;
+Prism.languages.java=Prism.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/g,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+[e]?[\d]*[df]\b|\W\d*\.?\d+\b/gi,operator:{pattern:/(^|[^\.])(?:\+=|\+\+?|-=|--?|!=?|<{1,2}=?|>{1,3}=?|==?|&=|&&?|\|=|\|\|?|\?|\*=?|\/=?|%=?|\^=?|:|~)/gm,lookbehind:!0}});;
+Prism.languages.bash=Prism.languages.extend("clike",{comment:{pattern:/(^|[^"{\\])(#.*?(\r?\n|$))/g,lookbehind:!0},string:{pattern:/("|')(\\?[\s\S])*?\1/g,inside:{property:/\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^\}]+\})/g}},keyword:/\b(if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/g}),Prism.languages.insertBefore("bash","keyword",{property:/\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^}]+\})/g}),Prism.languages.insertBefore("bash","comment",{important:/(^#!\s*\/bin\/bash)|(^#!\s*\/bin\/sh)/g});;
+!function(){function e(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function t(e,t){return t=" "+t+" ",(" "+e.className+" ").replace(/[\n\t]/g," ").indexOf(t)>-1}function n(e,n,r){for(var i,a=n.replace(/\s+/g,"").split(","),l=+e.getAttribute("data-line-offset")||0,o=parseFloat(getComputedStyle(e).lineHeight),d=0;i=a[d++];){i=i.split("-");var c=+i[0],h=+i[1]||c,s=document.createElement("div");s.textContent=Array(h-c+2).join(" \r\n"),s.className=(r||"")+" line-highlight",t(e,"line-numbers")||(s.setAttribute("data-start",c),h>c&&s.setAttribute("data-end",h)),s.style.top=(c-l-1)*o+"px",t(e,"line-numbers")?e.appendChild(s):(e.querySelector("code")||e).appendChild(s)}}function r(){var t=location.hash.slice(1);e(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var r=(t.match(/\.([\d,-]+)$/)||[,""])[1];if(r&&!document.getElementById(t)){var i=t.slice(0,t.lastIndexOf(".")),a=document.getElementById(i);a&&(a.hasAttribute("data-line")||a.setAttribute("data-line",""),n(a,r,"temporary "),document.querySelector(".temporary.line-highlight").scrollIntoView())}}if(window.Prism){var i=(crlf=/\r?\n|\r/g,0);Prism.hooks.add("after-highlight",function(t){var a=t.element.parentNode,l=a&&a.getAttribute("data-line");a&&l&&/pre/i.test(a.nodeName)&&(clearTimeout(i),e(".line-highlight",a).forEach(function(e){e.parentNode.removeChild(e)}),n(a,l),i=setTimeout(r,1))}),addEventListener("hashchange",r)}}();;
+Prism.hooks.add("after-highlight",function(e){var n=e.element.parentNode;if(n&&/pre/i.test(n.nodeName)&&-1!==n.className.indexOf("line-numbers")){var t,a=1+e.code.split("\n").length;lines=new Array(a),lines=lines.join("<span></span>"),t=document.createElement("span"),t.className="line-numbers-rows",t.innerHTML=lines,n.hasAttribute("data-start")&&(n.style.counterReset="linenumber "+(parseInt(n.getAttribute("data-start"),10)-1)),e.element.appendChild(t)}});;
diff --git a/static/java/open-iot-stack-for-java.html b/static/java/open-iot-stack-for-java.html
new file mode 100644
index 0000000000000000000000000000000000000000..f0ab70285e1a866f4509a77502966933c98d05a0
--- /dev/null
+++ b/static/java/open-iot-stack-for-java.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>iot.eclipse.org &mdash; Open IoT Stack for Java</title>
+  <meta name="description" content="Open IoT Stack for Java">
+  <meta name="author" content="Eclipse.org">
+  <link rel="author" href="humans.txt" />
+
+  <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+  <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+  <!-- Bootstrap -->
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+
+</head>
+
+<body>
+
+  <header>
+    <nav class="navbar">
+      <div class="container">
+        <div class="row">
+          <div class="col-sm-2">
+            <a href="/"><img src="/assets/images/iot-logo.png">
+            </a>
+          </div>
+          <div class="col-sm-10">
+            <ul class="list-inline right menu">
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+                <ul class="dropdown-menu">
+                  <li><a href="/standards">Standards</a>
+                  </li>
+                  <li><a href="/frameworks">Services &amp; Frameworks</a>
+                  </li>
+                  <li><a href="/projects">All the projects</a>
+                  </li>
+                </ul>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+              </li>
+
+              <li><a href="/ecosystem">Members</a>
+              </li>
+              <li><a href="#">Getting Started</a>
+              </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </nav>
+
+  </header>
+
+  <!-- Place this tag after the last +1 button tag. -->
+  <script type="text/javascript">
+  (function() {
+    var po = document.createElement('script');
+    po.type = 'text/javascript';
+    po.async = true;
+    po.src = 'https://apis.google.com/js/plusone.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(po, s);
+  })();
+  </script>
+
+  <main class="main">
+
+
+
+    <div class="well">
+      <div class="container">
+        <h1>Open IoT Stack for Java </h1>
+
+        <div class="lead">
+          <p>The Internet of Things (IoT) is all about connecting devices, sensors and actuators to the Internet. By some estimates 20+ billion “things” such as automobiles, wearables, homes, industrial factories, etc. will be connected to the Internet. It is an incredible opportunity to modernize existing ‘legacy’ machines and systems and also create new innovative connected “things.”</p>
+        </div>
+      </div>
+    </div>
+
+
+    <section class="first">
+      <div class="container">
+
+
+        <p>A key challenge to making IoT a reality is the complexity of implementing an IoT solution. For example, to develop an IoT solution, the developers need to deal with different types of hardware platforms, implement and manage the IoT gateways that connect the devices to the Internet, manage connectivity and network issues, and integrate the IoT data with existing enterprise systems and databases and many other issues. </p>
+        <p>An important way to reduce the complexity of IoT solutions is to create reusable building blocks and frameworks that abstract and implement key IoT features. The lack of reusable building blocks means developers are required to re-implement common functionalities for each IoT solution. This is similar to the start of the World Wide Web (WWW), where developers were required to create their own HTTP web server. Now there are open source HTTP servers (ex. Apache) that everyone use instead of creating their own.</p>
+        <p>For IoT to be successful, we need a consistent set of open source frameworks that anyone can use.</p>
+
+        <div class="row-fluid">
+          <div class="span12 pagination-centered"><img src="images/vision.png" alt="Vision" />
+          </div>
+        </div>
+
+        <h2 style="margin-top: .5em;">Connect with Open Standards</h2>
+
+        <p>Eclipse IoT is providing a set of re-usable open source technologies that make it possible to connect and manage the devices for your IoT solutions. Based on open standards and open source, the Open IoT Stack for Java developers provides the building blocks that simplify the creation of IoT solutions.</p>
+        <p>The Open IoT Stack for Java developers provides support for some of the key IoT open standards, including MQTT, CoAP and Lightweight M2M. These are the standards that help to connect and manage the devices at the heart of an IoT solution. The following Eclipse projects provide open source implementations of these standards:</p>
+
+        <ul>
+          <li>MQTT: Eclipse <a href="https://eclipse.org/paho" target="_blank">Paho</a> provides the MQTT client implementation in Java, C, C++. JavaScript, Python, etc. Eclipse <a href="https://eclipse.org/mosquitto" target="_blank">Mosquitto</a> is an MQTT broker implemented in C</li>
+          <li>CoAP: Eclipse <a href="https://eclipse.org/californium" target="_blank">Californium</a> implements the CoAP standard in Java, including DTLS support</li>
+          <li>Lightweight M2M: Eclipse <a href="https://eclipse.org/wakaama" target="_blank">Wakaama</a> implements the LWM2M client support in C/C++, and <a href="https://projects.eclipse.org/proposals/leshan" target="_blank">Leshan</a> provide a Java-based LWM2M server</li>
+        </ul>
+
+        <h2>Connect and Manage with IoT Gateway Services</h2>
+
+        <p>IoT Gateways are used to manage the connectivity between the IoT devices and provide a platform for applications to be deployed at the edge of the network. Eclipse IoT provides a set of IoT Gateway services to help developers manage the devices and applications deployed onto IoT gateways.</p>
+
+        <p>Eclipse <a href="https://eclipse.org/kura" target="_blank">Kura</a> is a Java and OSGi-based framework that implements services to</p>
+        <ul>
+          <li>Manage cloud connectivity</li>
+          <li>Support different protocols to connect to different servers or devices (ex. MQTT, Serial, Modbus, CANbus)</li>
+          <li>Configure the network, such as Wi-Fi and cellular bearers, LAN, firewalling and routing, etc</li>
+          <li>Allow for remote application and device management and configuration</li>
+        </ul>
+
+        <h2>IoT Solution Frameworks</h2>
+
+        <p>In addition to the core Open IoT Stack, Eclipse IoT provides a set of solution-oriented frameworks for Home Automation, SCADA systems and telco service providers.</p>
+
+        <h3>Home Automation </h3>
+        <p><a href="https://eclipse.org/smarthome" target="_blank">Eclipse SmartHome</a> is a set of Java and OSGi services for building Smart Home and assisted living solutions. It provides an extensible framework (rules engine, declarative UI, etc.) that allows developers to integrate devices that support different protocols and standards for home automation.</p>
+
+        <h3>SCADA Systems</h3>
+        <p><a href="https://eclipse.org/eclipsescada" target="_blank">Eclipse SCADA</a> is a set of Java and OSGi services that implements many of the services required for a SCADA system, including data acquisition, monitoring, data and event archival, visualization and value processing. Eclipse SCADA supports many of the industrial automation standards, such as Modbus, Siemens PLC, SNMP and OPC.</p>
+
+        <h3>Telco Service Providers</h3>
+        <p>Eclipse <a href="https://eclipse.org/om2m" target="_blank">OM2M</a> is an implementation of the ETSI M2M standard. It provides a horizontal Service Capability Layer (SCL) that can be deployed in an M2M network, a gateway, or a device. Each SCL provides Application Enablement, Generic Communication, Reachability, Addressing and Repository, Interworking proxy, Entity Management, etc.</p>
+
+      </div>
+    </section>
+  </main>
+
+
+
+
+  <footer>
+
+    <div class="container">
+      <div class="row">
+        <div class="col-md-6">
+          <nav>
+            <ul class="list-inline menu">
+              <li><a href="#">Technology</a>
+              </li>
+              <li><a href="#">Community</a>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </nav>
+          <div class="socials">
+            <a href="#" class="social-facebook">&nbsp;</a>
+            <a href="#" class="social-twitter">&nbsp;</a>
+            <a href="#" class="social-youtube">&nbsp;</a>
+            <a href="#" class="social-share">&nbsp;</a>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+        </div>
+      </div>
+    </div>
+
+
+  </footer>
+
+
+
+
+  <!-- JS is at the end of the document so the pages load faster -->
+  <script src="/js/jquery.js"></script>
+  <script src="/js/bootstrap/bootstrap.min.js"></script>
+  <script src="/js/index.js"></script>
+
+  <script src="../js/prism.js"></script>
+
+
+</body>
+
+</html>
diff --git a/static/java/stylesheet/bootstrap-lightbox.min.css b/static/java/stylesheet/bootstrap-lightbox.min.css
new file mode 100755
index 0000000000000000000000000000000000000000..bfda7caf8d37b64131defcbf8de7f956ed679ecd
--- /dev/null
+++ b/static/java/stylesheet/bootstrap-lightbox.min.css
@@ -0,0 +1,6 @@
+/*!
+* bootstrap-lightbox.css v0.6.1 
+* Copyright 2013 Jason Butz
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+.lightbox{position:relative;top:70px;z-index:1050;line-height:0;text-align:center;background-color:transparent;outline:0}.lightbox .hide{display:none}.lightbox .in{display:block}.lightbox-content{display:inline-block;padding:10px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.lightbox-content .lightbox-caption{position:absolute;right:12px;bottom:11px;left:11px;padding:2%;font-size:14px;line-height:18px;color:white;text-align:center;text-shadow:0 -1px 0 #000;text-shadow:0 -1px 0 rgba(0,0,0,0.3);background:#000;background:rgba(0,0,0,0.6)}.lightbox-header .close{margin-top:-16px;margin-right:-16px;font-size:2em;color:white;opacity:.8;filter:alpha(opacity=80)}.lightbox-header .close :hover{opacity:.4;filter:alpha(opacity=40)}
diff --git a/static/java/stylesheet/bootstrap/bootstrap-responsive.min.css b/static/java/stylesheet/bootstrap/bootstrap-responsive.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..52e6c9911040f14187b317d8640ad51ec7d8e36c
--- /dev/null
+++ b/static/java/stylesheet/bootstrap/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}html{text-rendering:optimizeLegibility}body.index{background:url('../img/bg_index.png') top repeat-x #dee8ef}#catchline{font-weight:300;color:#eff4f7}#catchline h2{font-size:50px;color:#eff4f7;text-align:left}a:hover{text-decoration:none}.navbar a{border-bottom:0}h2{margin-bottom:20px;font-family:Lekton,Arial,sans-serif;font-size:38px;font-weight:normal;color:#26102b;text-shadow:0 1px 1px #8487b8;border-bottom:2px dotted #26102b}.home-box .lead{margin-top:-10px;font-size:20px;color:#8487b8}.lead li{line-height:inherit}.home-box.span4{width:350px;padding-right:10px;padding-left:10px;margin-bottom:330px;border-radius:10px}.home-box.span4 h2 a{color:#26102b}.home-box:hover{background:rgba(255,255,255,0.3)}.loaded{height:335px!important;margin-bottom:10px!important;opacity:1!important}.home-box h2{font-size:38px;text-shadow:0 1px 1px #8487b8}body.index h2{border:0}.home-box i{display:block;width:120px;height:70px;padding-top:45px;margin:auto;margin-top:20px;margin-bottom:20px;font-size:75px;color:#4b7d38;text-align:center;text-shadow:none;background:#FFF;border-radius:94px}.brand{width:100px;text-indent:-1000em;background:url('../../images/m2m_eclipse_logo.png') 0 7px no-repeat}.navbar .brand{margin-left:-40px}.row{margin-bottom:30px}.carousel-caption{background:rgba(22,23,28,0.4)}div.page-header{padding-bottom:9px;margin:0 0 30px;border-bottom:1px dashed #EEE}div.page-header h1{margin-top:0;color:#26102b}div.page-header h1 small{display:block;font-weight:300;color:#783388}.container ul li{margin-left:1em}.well{margin-bottom:50px;margin-left:-20px;background-color:white;border:1px solid #bcd1de;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.15)}@media(max-width:979px){.well{margin-left:0}}p+h2{margin-top:50px}h3{text-indent:.3em}.home-box i{display:block;width:120px;height:70px;padding-top:45px;margin-top:20px;margin-right:10px;margin-bottom:-80px;font-size:75px;color:#08c;text-align:center;text-shadow:none;background:rgba(255,255,255,0.8);border-radius:94px}.home-box .lead{width:245px;margin-top:-10px;font-size:20px;color:#8487b8}hr{margin-top:50px;margin-bottom:5px}footer ul li.pull-right{margin-top:8px}.section-title{position:relative;padding:6px 12px 8px 12px;padding-left:55px;font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:28px;font-weight:lighter;color:#fff;background:url('../../images/layout/section-heading-end.gif') #7c2c90 top right no-repeat;border-bottom:0 none}.section-title i{position:absolute;top:8px;left:16px}.section-title.grey-title{margin-bottom:0;background:url('../../images/layout/section-heading-grey-end.gif') #acb5bb top right no-repeat;border-bottom:1px solid #ccc}.grey-box{padding:20px;margin-bottom:60px;background:#ced8de}.itembox{position:relative;margin-bottom:20px;text-align:center;cursor:pointer;background:#fff}.itembox h3{color:#7c2c90}.itembox h3,.itembox p{padding:0 10px}.itembox p{font-weight:lighter}.itembox a.readmore:link,.itembox a.readmore:visited{position:absolute;bottom:0;display:block;width:100%;padding:8px 0;clear:both;color:#fff;text-align:center;background:#bd95c7}.itembox a.readmore:hover{background:#7c2c90}.itembox:hover{background:#f6f6f6}.project-list .itembox h3,.project-list .itembox p{padding:0 10px}.project-list .itembox .logo{max-width:80%;padding:15px}.project-list .itembox h3{font-size:21px}.project-list .itembox p{padding-bottom:50px;font-size:15px;color:#7c2c90}.event-list .itembox h3{padding-top:10px;margin-top:0;margin-bottom:4px;font-size:15px;line-height:16px}.event-list .itembox .location{padding-bottom:40px;margin-bottom:10px}.event-list .itembox .date,.event-list .itembox .location{font-size:13px;font-weight:normal}ul.news-list{padding:0;margin:0 0 80px 0;color:#161726;list-style:none}ul.news-list li{min-height:40px;padding:8px;margin-bottom:20px;margin-left:0!important;background:#fff;*zoom:1}ul.news-list li:before,ul.news-list li:after{display:table;line-height:0;content:""}ul.news-list li:after{clear:both}ul.news-list li span.date{position:absolute;display:block;padding-right:20px;padding-left:10px;margin-right:10px;font-size:13px;text-align:center;border-right:1px solid #ccc}ul.news-list li span.date::first-line {font-size:18px}ul.news-list li span.text{display:block;padding-left:95px}ul.news-list li:hover{cursor:pointer;background:#f6f6f6}ul.webinars-list{padding:0;margin:0;color:#161726;list-style:none}ul.webinars-list li{min-height:165px!important;padding:8px;margin-bottom:20px;background:#fff;*zoom:1}ul.webinars-list li:before,ul.webinars-list li:after{display:table;line-height:0;content:""}ul.webinars-list li:after{clear:both}@media(min-width:1200px){ul.webinars-list li{min-height:140px!important}}@media(max-width:979px) and (min-width:768px){ul.webinars-list li{min-height:240px!important}}@media(max-width:767px){ul.webinars-list li{min-height:0!important}}ul.webinars-list li span.date{position:absolute;display:block;padding-right:20px;padding-left:10px;margin-right:10px;font-size:13px;text-align:center;border-right:1px solid #ccc}ul.webinars-list li span.date::first-line {font-size:18px}ul.webinars-list li span.text{display:block;padding-left:95px}ul.webinars-list li:hover{cursor:pointer;background:#f6f6f6}.members-info .mb-logo{padding-bottom:22px}.members-info .mb-info{background:url('../../images/layout/members-info-top-left.gif') top left no-repeat}.members-info .mb-info .mb-info-container{padding:25px 22px;margin-left:25px;background:#fff}.members-info .mb-info .mb-info-container p{font-size:18px;font-weight:lighter;line-height:24px;color:#333450}.members-info .mb-info .mb-info-container h4{margin-top:0;font-size:23px;color:#7c2c90}.members-info ul.mb-links{height:38px;padding:0;margin:0;margin-left:25px;overflow:hidden}.members-info ul.mb-links a{display:block;padding:8px 0}.members-info ul.mb-links a:link,.members-info ul.mb-links a:visited{color:#fff}.members-info ul.mb-links li{display:block;float:left;width:50%;padding:0;margin:0;text-align:center;list-style-type:none;background:url('../../images/layout/members-info-link-sep-b.gif') left #12131d no-repeat}.members-info ul.mb-links li a:hover{background:-moz-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:-webkit-gradient(linear,left top,right top,color-stop(0%,rgba(125,126,125,0.01)),color-stop(100%,#7a2da3));background:-webkit-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:-o-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:-ms-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:linear-gradient(to right,rgba(125,126,125,0.01) 0,#7a2da3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#037d7e7d',endColorstr='#7a2da3',GradientType=1)}.members-info ul.mb-links li.read-more{background:url('../../images/layout/members-info-link-sep-a.gif') right #bd95c7 no-repeat}.members-info ul.mb-links li.read-more a:hover{background:-moz-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:-webkit-gradient(linear,left top,right top,color-stop(0%,#7a2da3),color-stop(100%,rgba(125,126,125,0.01)));background:-webkit-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:-o-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:-ms-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:linear-gradient(to right,#7a2da3 0,rgba(125,126,125,0.01) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7a2da3',endColorstr='#037d7e7d',GradientType=1)}@media(max-width:767px){.project-list .itembox p{font-size:13px}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:auto;margin-left:0}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade.in{top:auto}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:768px){body{padding-top:0}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:5px;padding-left:5px}.navbar .container{width:auto;padding:0;margin-right:10px;margin-left:10px}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#eff4f7;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#c4c6dd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#0d0d16}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #0d0d16;border-bottom:1px solid #0d0d16;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/static/java/stylesheet/bootstrap/bootstrap.min.css b/static/java/stylesheet/bootstrap/bootstrap.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..e8dafbecf27a9db4f5613fd1beee537c4d50860d
--- /dev/null
+++ b/static/java/stylesheet/bootstrap/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#161726;background:#dee8ef}a{color:#4b7d38;text-decoration:none}a:hover{color:#6bb151;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{padding-top:80px;margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:24px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal dt{float:left;width:120px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea{width:210px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #bbb}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#323456}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{margin-left:-1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:160px}.form-horizontal .help-block{margin-top:10px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-right-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.info td{background-color:#d9edf7}@font-face{font-family:'FontAwesome';font-style:normal;font-weight:normal;src:url('../font/fontawesome-webfont.eot');src:url('../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),url('../font/fontawesome-webfont.woff') format('woff'),url('../font/fontawesome-webfont.ttf') format('truetype'),url('../font/fontawesome-webfont.svg#FontAwesome') format('svg')}[class^="icon-"]:before,[class*=" icon-"]:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;text-decoration:inherit}a [class^="icon-"],a [class*=" icon-"]{display:inline-block;text-decoration:inherit}.icon-large:before{font-size:1.3333333333333333em;vertical-align:middle}.btn [class^="icon-"],.nav-tabs [class^="icon-"],.btn [class*=" icon-"],.nav-tabs [class*=" icon-"]{line-height:.9em}li [class^="icon-"],li [class*=" icon-"]{display:inline-block;width:1.25em;text-align:center}li .icon-large:before,li .icon-large:before{width:1.875em}ul.icons{margin-left:2em;text-indent:-0.8em;list-style-type:none}ul.icons li [class^="icon-"],ul.icons li [class*=" icon-"]{width:.8em}ul.icons li .icon-large:before,ul.icons li .icon-large:before{vertical-align:initial}.icon-glass:before{content:"\f000"}.icon-music:before{content:"\f001"}.icon-search:before{content:"\f002"}.icon-envelope:before{content:"\f003"}.icon-heart:before{content:"\f004"}.icon-star:before{content:"\f005"}.icon-star-empty:before{content:"\f006"}.icon-user:before{content:"\f007"}.icon-film:before{content:"\f008"}.icon-th-large:before{content:"\f009"}.icon-th:before{content:"\f00a"}.icon-th-list:before{content:"\f00b"}.icon-ok:before{content:"\f00c"}.icon-remove:before{content:"\f00d"}.icon-zoom-in:before{content:"\f00e"}.icon-zoom-out:before{content:"\f010"}.icon-off:before{content:"\f011"}.icon-signal:before{content:"\f012"}.icon-cog:before{content:"\f013"}.icon-trash:before{content:"\f014"}.icon-home:before{content:"\f015"}.icon-file:before{content:"\f016"}.icon-time:before{content:"\f017"}.icon-road:before{content:"\f018"}.icon-download-alt:before{content:"\f019"}.icon-download:before{content:"\f01a"}.icon-upload:before{content:"\f01b"}.icon-inbox:before{content:"\f01c"}.icon-play-circle:before{content:"\f01d"}.icon-repeat:before{content:"\f01e"}.icon-refresh:before{content:"\f021"}.icon-list-alt:before{content:"\f022"}.icon-lock:before{content:"\f023"}.icon-flag:before{content:"\f024"}.icon-headphones:before{content:"\f025"}.icon-volume-off:before{content:"\f026"}.icon-volume-down:before{content:"\f027"}.icon-volume-up:before{content:"\f028"}.icon-qrcode:before{content:"\f029"}.icon-barcode:before{content:"\f02a"}.icon-tag:before{content:"\f02b"}.icon-tags:before{content:"\f02c"}.icon-book:before{content:"\f02d"}.icon-bookmark:before{content:"\f02e"}.icon-print:before{content:"\f02f"}.icon-camera:before{content:"\f030"}.icon-font:before{content:"\f031"}.icon-bold:before{content:"\f032"}.icon-italic:before{content:"\f033"}.icon-text-height:before{content:"\f034"}.icon-text-width:before{content:"\f035"}.icon-align-left:before{content:"\f036"}.icon-align-center:before{content:"\f037"}.icon-align-right:before{content:"\f038"}.icon-align-justify:before{content:"\f039"}.icon-list:before{content:"\f03a"}.icon-indent-left:before{content:"\f03b"}.icon-indent-right:before{content:"\f03c"}.icon-facetime-video:before{content:"\f03d"}.icon-picture:before{content:"\f03e"}.icon-pencil:before{content:"\f040"}.icon-map-marker:before{content:"\f041"}.icon-adjust:before{content:"\f042"}.icon-tint:before{content:"\f043"}.icon-edit:before{content:"\f044"}.icon-share:before{content:"\f045"}.icon-check:before{content:"\f046"}.icon-move:before{content:"\f047"}.icon-step-backward:before{content:"\f048"}.icon-fast-backward:before{content:"\f049"}.icon-backward:before{content:"\f04a"}.icon-play:before{content:"\f04b"}.icon-pause:before{content:"\f04c"}.icon-stop:before{content:"\f04d"}.icon-forward:before{content:"\f04e"}.icon-fast-forward:before{content:"\f050"}.icon-step-forward:before{content:"\f051"}.icon-eject:before{content:"\f052"}.icon-chevron-left:before{content:"\f053"}.icon-chevron-right:before{content:"\f054"}.icon-plus-sign:before{content:"\f055"}.icon-minus-sign:before{content:"\f056"}.icon-remove-sign:before{content:"\f057"}.icon-ok-sign:before{content:"\f058"}.icon-question-sign:before{content:"\f059"}.icon-info-sign:before{content:"\f05a"}.icon-screenshot:before{content:"\f05b"}.icon-remove-circle:before{content:"\f05c"}.icon-ok-circle:before{content:"\f05d"}.icon-ban-circle:before{content:"\f05e"}.icon-arrow-left:before{content:"\f060"}.icon-arrow-right:before{content:"\f061"}.icon-arrow-up:before{content:"\f062"}.icon-arrow-down:before{content:"\f063"}.icon-share-alt:before{content:"\f064"}.icon-resize-full:before{content:"\f065"}.icon-resize-small:before{content:"\f066"}.icon-plus:before{content:"\f067"}.icon-minus:before{content:"\f068"}.icon-asterisk:before{content:"\f069"}.icon-exclamation-sign:before{content:"\f06a"}.icon-gift:before{content:"\f06b"}.icon-leaf:before{content:"\f06c"}.icon-fire:before{content:"\f06d"}.icon-eye-open:before{content:"\f06e"}.icon-eye-close:before{content:"\f070"}.icon-warning-sign:before{content:"\f071"}.icon-plane:before{content:"\f072"}.icon-calendar:before{content:"\f073"}.icon-random:before{content:"\f074"}.icon-comment:before{content:"\f075"}.icon-magnet:before{content:"\f076"}.icon-chevron-up:before{content:"\f077"}.icon-chevron-down:before{content:"\f078"}.icon-retweet:before{content:"\f079"}.icon-shopping-cart:before{content:"\f07a"}.icon-folder-close:before{content:"\f07b"}.icon-folder-open:before{content:"\f07c"}.icon-resize-vertical:before{content:"\f07d"}.icon-resize-horizontal:before{content:"\f07e"}.icon-bar-chart:before{content:"\f080"}.icon-twitter-sign:before{content:"\f081"}.icon-facebook-sign:before{content:"\f082"}.icon-camera-retro:before{content:"\f083"}.icon-key:before{content:"\f084"}.icon-cogs:before{content:"\f085"}.icon-comments:before{content:"\f086"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-star-half:before{content:"\f089"}.icon-heart-empty:before{content:"\f08a"}.icon-signout:before{content:"\f08b"}.icon-linkedin-sign:before{content:"\f08c"}.icon-pushpin:before{content:"\f08d"}.icon-external-link:before{content:"\f08e"}.icon-signin:before{content:"\f090"}.icon-trophy:before{content:"\f091"}.icon-github-sign:before{content:"\f092"}.icon-upload-alt:before{content:"\f093"}.icon-lemon:before{content:"\f094"}.icon-phone:before{content:"\f095"}.icon-check-empty:before{content:"\f096"}.icon-bookmark-empty:before{content:"\f097"}.icon-phone-sign:before{content:"\f098"}.icon-twitter:before{content:"\f099"}.icon-facebook:before{content:"\f09a"}.icon-github:before{content:"\f09b"}.icon-unlock:before{content:"\f09c"}.icon-credit-card:before{content:"\f09d"}.icon-rss:before{content:"\f09e"}.icon-hdd:before{content:"\f0a0"}.icon-bullhorn:before{content:"\f0a1"}.icon-bell:before{content:"\f0a2"}.icon-certificate:before{content:"\f0a3"}.icon-hand-right:before{content:"\f0a4"}.icon-hand-left:before{content:"\f0a5"}.icon-hand-up:before{content:"\f0a6"}.icon-hand-down:before{content:"\f0a7"}.icon-circle-arrow-left:before{content:"\f0a8"}.icon-circle-arrow-right:before{content:"\f0a9"}.icon-circle-arrow-up:before{content:"\f0aa"}.icon-circle-arrow-down:before{content:"\f0ab"}.icon-globe:before{content:"\f0ac"}.icon-wrench:before{content:"\f0ad"}.icon-tasks:before{content:"\f0ae"}.icon-filter:before{content:"\f0b0"}.icon-briefcase:before{content:"\f0b1"}.icon-fullscreen:before{content:"\f0b2"}.icon-group:before{content:"\f0c0"}.icon-link:before{content:"\f0c1"}.icon-cloud:before{content:"\f0c2"}.icon-beaker:before{content:"\f0c3"}.icon-cut:before{content:"\f0c4"}.icon-copy:before{content:"\f0c5"}.icon-paper-clip:before{content:"\f0c6"}.icon-save:before{content:"\f0c7"}.icon-sign-blank:before{content:"\f0c8"}.icon-reorder:before{content:"\f0c9"}.icon-list-ul:before{content:"\f0ca"}.icon-list-ol:before{content:"\f0cb"}.icon-strikethrough:before{content:"\f0cc"}.icon-underline:before{content:"\f0cd"}.icon-table:before{content:"\f0ce"}.icon-magic:before{content:"\f0d0"}.icon-truck:before{content:"\f0d1"}.icon-pinterest:before{content:"\f0d2"}.icon-pinterest-sign:before{content:"\f0d3"}.icon-google-plus-sign:before{content:"\f0d4"}.icon-google-plus:before{content:"\f0d5"}.icon-money:before{content:"\f0d6"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-columns:before{content:"\f0db"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-envelope-alt:before{content:"\f0e0"}.icon-linkedin:before{content:"\f0e1"}.icon-undo:before{content:"\f0e2"}.icon-legal:before{content:"\f0e3"}.icon-dashboard:before{content:"\f0e4"}.icon-comment-alt:before{content:"\f0e5"}.icon-comments-alt:before{content:"\f0e6"}.icon-bolt:before{content:"\f0e7"}.icon-sitemap:before{content:"\f0e8"}.icon-umbrella:before{content:"\f0e9"}.icon-paste:before{content:"\f0ea"}.icon-user-md:before{content:"\f200"}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#4b7d38;background-color:#477635;background-image:-moz-linear-gradient(top,#4b7d38,#406c30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4b7d38),to(#406c30));background-image:-webkit-linear-gradient(top,#4b7d38,#406c30);background-image:-o-linear-gradient(top,#4b7d38,#406c30);background-image:linear-gradient(to bottom,#4b7d38,#406c30);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38',endColorstr='#ff406c30',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#4b7d38;background-color:#477635;background-image:-moz-linear-gradient(top,#4b7d38,#406c30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4b7d38),to(#406c30));background-image:-webkit-linear-gradient(top,#4b7d38,#406c30);background-image:-o-linear-gradient(top,#4b7d38,#406c30);background-image:linear-gradient(to bottom,#4b7d38,#406c30);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38',endColorstr='#ff406c30',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover .dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;overflow:visible \9;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 14px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^="icon-"]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:16px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#437d3a;*background-color:#387d3c;background-image:-moz-linear-gradient(top,#4b7d38,#387d3c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4b7d38),to(#387d3c));background-image:-webkit-linear-gradient(top,#4b7d38,#387d3c);background-image:-o-linear-gradient(top,#4b7d38,#387d3c);background-image:linear-gradient(to bottom,#4b7d38,#387d3c);background-repeat:repeat-x;border-color:#387d3c #387d3c #214823;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38',endColorstr='#ff387d3c',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#387d3c;*background-color:#306c34}.btn-primary:active,.btn-primary.active{background-color:#285a2c \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#4b7d38;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#6bb151;text-decoration:underline;background-color:transparent}.btn-group{position:relative;*margin-left:.3em;font-size:0;white-space:nowrap}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#387d3c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#4b7d38}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#4b7d38}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#4b7d38;border-bottom-color:#4b7d38}.nav .dropdown-toggle:hover .caret{border-top-color:#6bb151;border-bottom-color:#6bb151}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#eff4f7}.navbar-inner{min-height:60px;padding-right:20px;padding-left:20px;background-color:#121320;background-image:-moz-linear-gradient(top,#161726,#0d0d16);background-image:-webkit-gradient(linear,0 0,0 100%,from(#161726),to(#0d0d16));background-image:-webkit-linear-gradient(top,#161726,#0d0d16);background-image:-o-linear-gradient(top,#161726,#0d0d16);background-image:linear-gradient(to bottom,#161726,#0d0d16);background-repeat:repeat-x;border:1px solid #000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff161726',endColorstr='#ff0d0d16',GradientType=0);-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar .container{width:auto;padding-top:0}.nav-collapse.collapse{height:auto}.navbar .brand{display:block;float:left;padding:20px 20px 20px;margin-left:-20px;font-size:20px;font-weight:200;color:#c4c6dd;text-shadow:0 1px 0 #161726}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:60px}.navbar-link{color:#c4c6dd}.navbar-link:hover{color:#eff4f7}.navbar .divider-vertical{height:60px;margin:0 9px;border-right:1px solid #161726;border-left:1px solid #0d0d16}.navbar .btn,.navbar .btn-group{margin-top:16px}.navbar .btn-group .btn{margin:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:15px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:15px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner,.navbar-static-top .navbar-inner{border:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:20px 15px 20px;color:#c4c6dd;text-decoration:none;text-shadow:0 1px 0 #161726;border-top:2px #161726 solid}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#eff4f7;text-decoration:none;background-color:transparent;border-top-color:#eff4f7}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#eff4f7;text-decoration:none;background-color:#030306;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#09090f;*background-color:#030306;background-image:-moz-linear-gradient(top,#0d0d16,#030306);background-image:-webkit-gradient(linear,0 0,0 100%,from(#0d0d16),to(#030306));background-image:-webkit-linear-gradient(top,#0d0d16,#030306);background-image:-o-linear-gradient(top,#0d0d16,#030306);background-image:linear-gradient(to bottom,#0d0d16,#030306);background-repeat:repeat-x;border-color:#030306 #030306 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0d0d16',endColorstr='#ff030306',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#030306;*background-color:#000}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#000 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#eff4f7;background-color:#030306}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#c4c6dd;border-bottom-color:#c4c6dd}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#eff4f7;border-bottom-color:#eff4f7}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{height:40px;margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination li{display:inline}.pagination a,.pagination span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination a:hover,.pagination .active a,.pagination .active span{background-color:#f5f5f5}.pagination .active a,.pagination .active span{color:#999;cursor:default}.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999;cursor:default;background-color:transparent}.pagination li:first-child a,.pagination li:first-child span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination li:last-child a,.pagination li:last-child span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover{color:#999;cursor:default;background-color:#fff}.modal-open .dropdown-menu{z-index:2050}.modal-open .dropdown.open{*z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#eff4f7;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#e5edf2;border-bottom:1px solid #d4e1e9;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#4b7d38;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#161726}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit}.home-box.span4{height:0;overflow:hidden;opacity:0;-webkit-transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease;-moz-transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease;-o-transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease;transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease}#home-frameworks{-webkit-transition-delay:0;-moz-transition-delay:0;-ms-transition-delay:0;-o-transition-delay:0;transition-delay:0}#home-protocols{-webkit-transition-delay:200ms;-moz-transition-delay:200ms;-ms-transition-delay:200ms;-o-transition-delay:200ms;transition-delay:200ms}#home-tools{-webkit-transition-delay:400ms;-moz-transition-delay:400ms;-ms-transition-delay:400ms;-o-transition-delay:400ms;transition-delay:400ms}#home-community{-webkit-transition-delay:600ms;-moz-transition-delay:600ms;-ms-transition-delay:600ms;-o-transition-delay:600ms;transition-delay:600ms}#home-sandbox{-webkit-transition-delay:800ms;-moz-transition-delay:800ms;-ms-transition-delay:800ms;-o-transition-delay:800ms;transition-delay:800ms}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/static/java/stylesheet/font-awesome.min.css b/static/java/stylesheet/font-awesome.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..ec53d4d6d5bf13db8ca757ea991a9c7839f23c89
--- /dev/null
+++ b/static/java/stylesheet/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ *  Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}
\ No newline at end of file
diff --git a/static/java/stylesheet/prism.css b/static/java/stylesheet/prism.css
new file mode 100644
index 0000000000000000000000000000000000000000..d76534777b5f9a9d58877bbc573f374aa1b98f5c
--- /dev/null
+++ b/static/java/stylesheet/prism.css
@@ -0,0 +1,220 @@
+/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+java+bash&plugins=line-highlight+line-numbers */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+
+code[class*="language-"],
+pre[class*="language-"] {
+	color: black;
+	text-shadow: 0 1px white;
+	font-family: Consolas, Monaco, 'Andale Mono', monospace;
+	direction: ltr;
+	text-align: left;
+	white-space: pre;
+	word-spacing: normal;
+	word-break: normal;
+	line-height: 1.5;
+
+	-moz-tab-size: 4;
+	-o-tab-size: 4;
+	tab-size: 4;
+
+	-webkit-hyphens: none;
+	-moz-hyphens: none;
+	-ms-hyphens: none;
+	hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
+	text-shadow: none;
+	background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
+code[class*="language-"]::selection, code[class*="language-"] ::selection {
+	text-shadow: none;
+	background: #b3d4fc;
+}
+
+@media print {
+	code[class*="language-"],
+	pre[class*="language-"] {
+		text-shadow: none;
+	}
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+	padding: 1em;
+	margin: .5em 0;
+	overflow: auto;
+}
+
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+	background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+	padding: .1em;
+	border-radius: .3em;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+	color: slategray;
+}
+
+.token.punctuation {
+	color: #999;
+}
+
+.namespace {
+	opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+	color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+	color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+	color: #a67f59;
+	background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+	color: #07a;
+}
+
+.token.function {
+	color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+	color: #e90;
+}
+
+.token.important {
+	font-weight: bold;
+}
+
+.token.entity {
+	cursor: help;
+}
+
+pre[data-line] {
+	position: relative;
+	padding: 1em 0 1em 3em;
+}
+
+.line-highlight {
+	position: absolute;
+	left: 0;
+	right: 0;
+	padding: inherit 0;
+	margin-top: 1em; /* Same as .prism’s padding-top */
+
+	background: hsla(24, 20%, 50%,.08);
+	background: -moz-linear-gradient(left, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
+	background: -webkit-linear-gradient(left, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
+	background: -o-linear-gradient(left, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
+	background: linear-gradient(left, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
+	
+	pointer-events: none;
+	
+	line-height: inherit;
+	white-space: pre;
+}
+
+	.line-highlight:before,
+	.line-highlight[data-end]:after {
+		content: attr(data-start);
+		position: absolute;
+		top: .4em;
+		left: .6em;
+		min-width: 1em;
+		padding: 0 .5em;
+		background-color: hsla(24, 20%, 50%,.4);
+		color: hsl(24, 20%, 95%);
+		font: bold 65%/1.5 sans-serif;
+		text-align: center;
+		vertical-align: .3em;
+		border-radius: 999px;
+		text-shadow: none;
+		box-shadow: 0 1px white;
+	}
+	
+	.line-highlight[data-end]:after {
+		content: attr(data-end);
+		top: auto;
+		bottom: .4em;
+	}
+pre.line-numbers {
+	position: relative;
+	padding-left: 3.8em;
+	counter-reset: linenumber;
+}
+
+pre.line-numbers > code {
+	position: relative;
+}
+
+.line-numbers .line-numbers-rows {
+	position: absolute;
+	pointer-events: none;
+	top: 0;
+	font-size: 100%;
+	left: -3.8em;
+	width: 3em; /* works for line-numbers below 1000 lines */
+	letter-spacing: -1px;
+	border-right: 1px solid #999;
+
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+
+}
+
+	.line-numbers-rows > span {
+		pointer-events: none;
+		display: block;
+		counter-increment: linenumber;
+	}
+
+		.line-numbers-rows > span:before {
+			content: counter(linenumber);
+			color: #999;
+			display: block;
+			padding-right: 0.8em;
+			text-align: right;
+		}
diff --git a/static/java/stylesheet/theme.css b/static/java/stylesheet/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..129c2182b09c87e577452cd64bfd9f9cbcbd2a84
--- /dev/null
+++ b/static/java/stylesheet/theme.css
@@ -0,0 +1,159 @@
+body, p, li, h1, h2, h3, h4, h5 {
+    /*    font-family: 'Montserrat', sans-serif;
+*/
+}
+a {
+    transition: color 0.3s ease;
+}
+.header {
+    background-image: url(../images/header-bg.png);
+    background-size: cover;
+    background-position: top center;
+    text-align: center;
+    padding: 40px 0;
+}
+.header h1, .header p {
+    font-weight: 300;
+}
+.header h1 {
+    color: white;
+    text-transform: uppercase;
+    font-size: 60px;
+    margin: 40px 0 20px;
+}
+.header p {
+    color: #dee8ef !important;
+    font-size: 27px;
+    line-height: 1.4;
+    font-weight: 300;
+}
+.list-inline {
+    display: block;
+    position: relative;
+    left: 0;
+    float: left;
+    margin: 0 10px 0 0;
+    list-style: none;
+}
+.list-inline li {
+    float: left;
+    list-style: none;
+}
+button {
+    font-family: 'Sanchez', serif;
+    color: #ffffff;
+    background-color: #75b01e;
+    border-radius: 3px;
+    border: none;
+    padding: 10px 20px;
+    margin: 20px 0;
+    box-shadow: -3px 3px rgba(0, 0, 0, 0.2);
+    transition: background-color 0.3s ease;
+}
+button:hover {
+    background-color: #5C9704;
+}
+button i.fa {
+    /*font-size: 18px;
+    margin: 0 0 0 5px;*/
+}
+.icons-1, .icons-2 {
+    text-align: center;
+    padding-top: 80px;
+}
+.icons-1 {
+    background-color: #f4f3f3;
+    width: 100%;
+}
+.icons-2 {
+    background-color: #fff;
+    width: 100%;
+}
+.icons-1 h2, .icons-2 h2 {
+    text-transform: uppercase;
+    font-weight: 300;
+    color: #474646;
+    border: none;
+    margin-top: 40px;
+}
+.icons-1 p, .icons-2 p {
+    font-weight: 300;
+    color: #474646;
+    font-size: 21px;
+    line-height: 1.4;
+}
+.discover {
+    background-image: url('../images/discover-bg.png');
+    background-position: top center;
+    background-size: cover;
+    padding: 40px 0;
+    text-align: center;
+}
+.discover h2 {
+    text-transform: uppercase;
+    font-size: 60px;
+    color: #dee8ef;
+    font-weight: 300;
+    border: none;
+}
+.discover p {
+    font-size: 21px;
+    line-height: 1.4;
+    color: #dee8ef !important;
+    font-weight: 300;
+}
+.logos {
+    background: #f4f3f3;
+    padding: 0px 0 40px;
+}
+.footer {
+    background-image: url('../images/footer-bg.png');
+    background-position: top center;
+    background-size: cover;
+    color: #d6d6d6;
+    font-weight: 300;
+}
+.footer ul {
+    list-style: none
+}
+.footer ul li {
+    list-style: none;
+    text-transform: uppercase;
+    margin-bottom: 10px;
+}
+.footer ul li a {
+    color: #d6d6d6;
+}
+.footer ul li a:hover {
+    color: #838383;
+}
+.footer p {
+    text-transform: uppercase;
+    font-style: italic;
+}
+.left {
+    float: left;
+}
+.right {
+    float: right;
+}
+/** added Benjamin **/
+
+#members {
+    text-align: center;
+}
+#members img {
+    margin: 1.5em 2em;
+}
+.container ul li {
+    margin-left: 0.8em;
+}
+@media (max-width: 960px) {
+    body {
+        padding-right: 0px;
+        padding-left: 0px;
+    }
+    .header h1 {
+        font-size: 48px;
+    }
+}
diff --git a/static/java/tutorial/index.html b/static/java/tutorial/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..7f1a7a58d7d0e0841744a7cb2b7e2d4682af377b
--- /dev/null
+++ b/static/java/tutorial/index.html
@@ -0,0 +1,480 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>iot.eclipse.org &mdash; Eclipse IoT Greenhouse tutorial</title>
+  <meta name="description" content="Eclipse IoT Greenhouse tutorial">
+  <meta name="author" content="Eclipse.org">
+  <link rel="author" href="humans.txt" />
+
+  <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+  <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+
+  <!-- Bootstrap -->
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+
+
+  <link href="../stylesheet/prism.css" rel="stylesheet" />
+  <link href="../stylesheet/bootstrap-lightbox.min.css" rel="stylesheet" />
+
+  <style type="text/css">
+  .container h4 {
+    margin-left: 3em;
+  }
+  .container h4:before {
+    content: "> ";
+  }
+  img.fleft {
+    float: left;
+    width: 200px;
+    margin-right: 2em;
+    margin-bottom: 1em;
+  }
+  </style>
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+
+</head>
+
+<body>
+
+  <header>
+    <nav class="navbar">
+      <div class="container">
+        <div class="row">
+          <div class="col-sm-2">
+            <a href="/"><img src="/assets/images/iot-logo.png">
+            </a>
+          </div>
+          <div class="col-sm-10">
+            <ul class="list-inline right menu">
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+                <ul class="dropdown-menu">
+                  <li><a href="/standards">Standards</a>
+                  </li>
+                  <li><a href="/frameworks">Services &amp; Frameworks</a>
+                  </li>
+                  <li><a href="/projects">All the projects</a>
+                  </li>
+                </ul>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+              </li>
+              <li><a href="/ecosystem">Members</a>
+              </li>
+              <li><a href="#">Getting Started</a>
+              </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </nav>
+
+  </header>
+
+  <!-- Place this tag after the last +1 button tag. -->
+  <script type="text/javascript">
+  (function() {
+    var po = document.createElement('script');
+    po.type = 'text/javascript';
+    po.async = true;
+    po.src = 'https://apis.google.com/js/plusone.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(po, s);
+  })();
+  </script>
+
+
+
+  <main class="main">
+    <div class="well">
+      <div class="container">
+        <h1>Using Eclipse Kura, MQTT and CoAP to build a smart
+                    greenhouse</h1>
+
+        <div class="lead">
+          <p>Java is almost 20 years old, and has over the years gathered a very large community of developers that in turn fostered an even larger ecosystem of open-source components and frameworks.</p>
+          <p>Thanks to the recent efforts towards making Java a more than decent platform for embedded devices, as well as the help of Moore&rsquo;s law always bringing more processing power to devices, everyone can benefit from two decades of innovation in the Java land to build IoT (Internet of Things) solutions.</p>
+
+        </div>
+      </div>
+    </div>
+
+    <section class="first">
+      <div class="container">
+
+        <p>It&rsquo;s no news that there are many challenges when building an IoT application. One of the main challenges is to make sure that the application you&rsquo;re building will be simple to operate once it is deployed on the field. It means you need to be able to perform many operations over-the-air, including things like:</p>
+
+        <ul>
+          <li><b>changing the settings of your running application</b> – because a sensor you were attached to, for example, needs to be accessed with different settings,</li>
+          <li><b>deploying a new version of your application</b> – you found a nasty bug that causes your application to use all your tiny cellular data plan in minutes, so you want to deploy a hot-fix on your IoT gateway,</li>
+          <li><b>ensuring the gateway has proper access to the network</b> – because you care about your application and not necessarily about how you&rsquo;ll actually get Internet connectivity, it&rsquo;s important to have a framework taking care of your wireless modem of WiFi setup for you.</li>
+        </ul>
+        <p>
+          <a href='http://eclipse.org/kura' />Eclipse Kura</a> is an <a href='http://iot.eclipse.org' />Eclipse IoT</a> project that provides a platform for building IoT gateways. It is a smart application container that enables remote management of such gateways and provides a wide range of APIs for allowing you to write and deploy your own IoT application.
+        </p>
+        <p>Kura runs on top of the Java Virtual Machine (JVM) and leverages OSGi, a dynamic component system for Java, to simplify the process of writing reusable software building blocks.</p>
+        <p></p>
+        <p>In this tutorial, we want to guide you through the steps for building your very own IoT gateway. We will first guide you through the (very simple!) process of installing Eclipse Kura on what will become your IoT gateway (we&rsquo;ll be using a Raspberry Pi as the hardware platform), and we will then detail how you can install deploy existing IoT applications or develop your own using Kura&rsquo;s application framework.</p>
+        <p></p>
+        <h2>Technologies involved</h2>
+
+        <h3>Kura</h3>
+
+        <p>
+          <img class="fleft" src='https://hackpad-attachments.s3.amazonaws.com/hackpad.com_9EkDXF5JhoD_p.189956_1406563851399_kura.png' />
+        </p>
+        <p>Kura provides a Java/OSGi-based container for IoT applications running in service gateways. By installing Kura on a device, not only can you turn it into a powerful IoT router that can be managed remotely, but you also have access to a complete application framework for deploying custom applications. These applications leverage OSGi and Kura API for making it easy to access the underlying hardware (serial port, GPIOs, etc.), communicate with an IoT server backend, manage the runtime settings, etc.&nbsp;</p>
+        <p></p>
+        <p>
+          Learn more on Kura on the project&rsquo;s website: <a href="https://www.eclipse.org/kura">https://www.eclipse.org/kura</a>.
+        </p>
+        <p></p>
+        <h3>MQTT and Paho</h3>
+
+        <p>
+          <img class="fleft" src='https://hackpad-attachments.s3.amazonaws.com/hackpad.com_9EkDXF5JhoD_p.189956_1408377319893_hackpad.com_9EkDXF5JhoD_p.189956_1406300892088_paho.png' />
+        </p>
+
+        <p>In order to make the greenhouse sensors data available to the Internet, and therefore allow 3rd party applications (mobile, web, etc.) to consume this data, we will use the MQTT protocol.</p>
+        <p>MQTT is a lightweight messaging protocol based on the publish/subscribe model. A central broker is federating MQTT clients that are publishing messages on specific topics, allowing other clients subscribed to these topics to immediately receive those messages.
+        </p>
+        <p>Eclipse Paho is an open-source project that provides MQTT client implementations in many programming languages, and Kura is using Paho to provide high-level OSGi services for IoT communications between a gateway and the Internet.&nbsp;&nbsp;</p>
+        <p></p>
+        <p>
+          Learn more on Paho on the project&rsquo;s website: <a href="https://www.eclipse.org/paho">https://www.eclipse.org/paho</a>.
+        </p>
+        <p></p>
+        <h3>CoAP and Californium</h3>
+
+        <p>
+          <img class="fleft" style="width:100px" src='https://hackpad-attachments.s3.amazonaws.com/hackpad.com_9EkDXF5JhoD_p.189956_1408377341864_hackpad.com_9EkDXF5JhoD_p.189956_1406301003313_californium-180.png' />
+        </p>
+
+        <p>
+          CoAP (<b>Co</b>nstrained <b>A</b>pplication <b>P</b>rotocol) is a RESTful protocol targeting constrained embedded devices and wireless networks. CoAP essentially replicates the HTTP resource model on top of UDP using a binary, bandwidth-efficient, encoding.
+
+          <p>Eclipse Californium provides a Java implementation of CoAP, together with a security library (Scandium) for DTLS.
+            <p>
+              Learn more on Californium on the project&rsquo;s website: <a href="https://www.eclipse.org/californium">https://www.eclipse.org/californium</a>.
+            </p>
+
+            <h2>What are we going to build?</h2>
+
+            <p>Whether we are talking about industrial control, wearables, home automation, or any other field where IoT is relevant, the core principle is always the same: we want to connect a reasonably smart device coupled with sensors and actuators, to the Internet so as the sensors and actuators can be monitored and controlled remotely.</p>
+            <p>A very simplified version of such a smart device could be a connected greenhouse that allows you to monitor the current temperature from wherever you are in the world, as well as turn artificial lighting on and off – and that's exactly what we are going to build!</p>
+
+            <h2>Setting up the hardware</h2>
+
+            <h3>Shopping list</h3>
+
+            <p>We&rsquo;ve kept the list of hardware elements needed for the greenhouse to a minimum to make it easy for anyone with no electronics skills to build it.</p>
+            <p>Here is what you will need:</p>
+            <p>
+              <img class="img-responsive" src='https://hackpad-attachments.s3.amazonaws.com/hackpad.com_9EkDXF5JhoD_p.189956_1408377358810_hackpad.com_9EkDXF5JhoD_p.189956_1406297683547_hw.png' />
+            </p>
+            <p></p>
+            <ul>
+              <li><b>Raspberry Pi Model B or B+</b> and an <b>SD card</b> (min. 4GB) with the latest Debian Linux distribution. Raspbian should be downloaded from the Raspberry Pi Foundation&rsquo;s <a href='http://www.raspberrypi.org/downloads/' />Downloads page</a>, and
+                <a href='http://www.raspberrypi.org/documentation/installation/installing-images/README.md' />these instructions
+                </a> will help you put Raspbian on the SD Card.</li>
+              <li><b>Grove temperature &amp; humidity sensor</b>,</li>
+              <li><b>Grove LED</b>,</li>
+              <li><b>4 pin Female Jumper to Grove 4 pin Conversion Cable</b>,</li>
+              <li><b>Ethernet cable.</b>
+              </li>
+            </ul>
+            <p>
+              You can easily order the parts from SeeedStudio thanks to the following wish list: <a href="http://tiny.cc/iot-greenhouse-parts"><code>http://tiny.cc/iot-greenhouse-parts</code></a>.
+            </p>
+            <p>
+              You can also check for a distributor next to you on this <a href='http://www.seeedstudio.com/depot/index.php?main_page=distributors'>web
+                page</a>.
+            </p>
+            <p></p>
+
+            <h3>Assembling the Raspberry Pi and the sensors</h3>
+
+            <p>As indicated earlier, the hardware setup should be really just take a couple of minutes. Before to actually perform the wiring of all the sensors, now is a good time to briefly explain how the Raspberry Pi can be augmented with external sensors. The row of pins, along the edge of the board, is programmable from the Linux system, is allow you to interact with various kinds of sensors you can connect to them. You should think of these GPIOs (General Purpose Input Outputs) as switches you can control from the Raspberry Pi (outputs), or that external sensors can control (inputs). Some of the pins are more sophisticated and allow the use of higher-level protocols to exchange more than on/off signals ; such protocols include SPI, I2C or UART, and we will indeed use an I2C temperature sensor in this tutorial.&nbsp;</p>
+            <p>
+              You can <a href='http://www.raspberrypi.org/documentation/usage/gpio/' />read more on GPIOs</a> in the official Raspberry Pi documentation.
+            </p>
+            <p></p>
+            <p>Now is time to hook up our temperature sensor and LED to the Raspberry Pi! The GPIO pins are numbered as follows (if you have a Raspberry Pi model B, no worries, the pin headers we&rsquo;ll be using are the same):</p>
+            <p></p>
+            <p>
+              <img class="img-responsive" src='http://www.recantha.co.uk/blog/wp-content/uploads/2014/07/GPIO.png' />
+            </p>
+            <p></p>
+            <ol>
+              <li>Connect the Grove cables to your temperature/humidity sensor and LED</li>
+            </ol>
+            <p>
+              <img class="img-responsive" src='https://hackpad-attachments.s3.amazonaws.com/hackpad.com_9EkDXF5JhoD_p.189956_1408547740131_sensors-with-cables.png' />
+            </p>
+            <p></p>
+            <ol>
+              <li><b>&#x26a0; Make sure that your Raspberry Pi is not
+                    powered!</b>
+              </li>
+              <li><u>Temperature sensor</u>:
+                <br />
+                <ul>
+                  <li><code>BLACK</code> wire goes on <code>PIN#06</code>
+                  </li>
+                  <li><code>RED</code> wire goes on <code>PIN#01</code>
+                  </li>
+                  <li><code>YELLOW</code>wire goes on <code>PIN#05</code>
+                  </li>
+                  <li><code>WHITE</code>wire goes on <code>PIN#03</code>
+                  </li>
+                </ul>
+              </li>
+              <li><u>LED</u>:
+                <br />
+
+                <ul>
+                  <li><code>BLACK</code> wire goes on <code>PIN#14</code>
+                  </li>
+                  <li><code>RED</code> wire goes on <code>PIN#02</code>
+                  </li>
+                  <li><code>YELLOW</code>wire goes on <code>PIN#11</code>
+                  </li>
+                  <li>The <code>WHITE</code> wire is not used in the case of the LED – you only really need one pin to toggle a LED on or off, right? :-) – so you can leave it dangling or connect it to a Ground pin header.
+                  </li>
+                </ul>
+              </li>
+              <li>Connect the Raspberry Pi to your home router or to your PC using the Ethernet cable.</li>
+            </ol>
+            <p>That&rsquo;s all, really! Now let&rsquo;s boot our Raspberry Pi for the first time and install Kura.</p>
+
+            <h3>Booting the Raspberry Pi for the first time</h3>
+
+            <h4>Expand filesystem</h4>
+
+            <p>After the first boot completes, make sure to run the configuration utility and expand the filesystem.</p>
+            <p></p>
+
+            <pre><code class="language-bash">sudo raspi-config</code></pre>
+
+            <p>
+              <img class="img-responsive" src='https://hackpad-attachments.s3.amazonaws.com/hackpad.com_9EkDXF5JhoD_p.189956_1410192008723_raspi-config.png' />&nbsp;
+            </p>
+
+            <h4>Enable i2c</h4>
+
+            <p>You need to make sure to enable the Linux modules that will allow us to do i2c communications. Enter the following command:</p>
+
+            <pre><code class="language-bash">sudo nano /etc/modules</code></pre>
+
+            <p>and add these two lines to the end of the file:</p>
+
+            <pre><code class="language-bash">i2c-bcm2708
+i2c-dev</code></pre>
+
+            <p>You need to reboot for the changes to be applied.</p>
+
+            <h3>Installing Eclipse Kura on the Raspberry Pi</h3>
+
+            <p>It is really easy to install Kura on your Raspberry Pi. It is actually as simple as installing any other Debian package.</p>
+            <p>Assuming you are properly logged in on your Raspberry Pi, here&rsquo;s how to install Kura:</p>
+            <p></p>
+
+            <pre><code class="language-bash">cd ~
+sudo apt-get update # let's make sure Debian repositories descriptions are up-to-date
+wget https://s3.amazonaws.com/kura_downloads/raspbian/release/1.0.0/kura_1.0.0_raspberry-pi_armv6.deb
+sudo dpkg -i kura_1.0.0_raspberry-pi_armv6.deb</code></pre>
+
+            <p>dpkg will complain about missing dependencies, and will fail. Indeed, Kura depends on some packages that you probably don&rsquo;t have on your Raspberry Pi, so we must tell Aptitude to download those automatically for us:</p>
+
+            <pre><code class="language-bash">sudo apt-get install -f</code></pre>
+
+            <p>You should now reboot your Raspberry Pi to make sure all the Kura services are properly started.</p>
+
+            <pre><code class="language-bash">sudo reboot</code></pre>
+
+            <p>
+              In order to confirm that Kura is properly installed, you can try accessing its web UI from your favorite web browser. The URL should be something like: <code>http://my-raspberry-pi/kura</code>, default credentials are: <code>admin</code> / <code>admin</code>.
+            </p>
+            <p>
+              <img class="img-responsive" src='https://hackpad-attachments.s3.amazonaws.com/hackpad.com_9EkDXF5JhoD_p.189956_1409907331696_kura post install.png' />
+            </p>
+            <p></p>
+            <h2>Deploying a ready-to-use greenhouse application</h2>
+            <p>Before diving deeper into how to use the Kura application framework for developing your own application, let&rsquo;s see by ourselves how easy it is to deploy an application in Kura.</p>
+            <p>Kura relies on the OSGi Deployment Admin standard to allow software packages to be managed. A deployment package is essentially a ZIP file containing a set of OSGi bundles and a Manifest providing the name, version, etc. of the application.</p>
+            <p></p>
+            <p>We have already prepared a software package containing the application that allows to control the greenhouse over MQTT or CoAP.&nbsp;
+            </p>
+            <p></p>
+
+            <h3>Installing the application from Kura web UI</h3>
+
+            <p>If you correctly followed the previous steps, Kura should be now up and running on your Raspberry Pi, and you should be able to access its web-based administration interface from your browser.</p>
+            <ul>
+              <li>Navigate the &quot;Packages&quot; entry of the web UI</li>
+              <li>Click the &quot;Install/Upgrade&quot; button and enter the following address in the &quot;URL&quot; tab of the popup dialog: <code>http://iot.eclipse.org/java/demo/org.eclipse.greenhouse.iot-0.1.0.dp</code>
+              </li>
+              <li>Refresh your web browser and notice there is a new entry in the Services section on the left-hand side: Greenhouse Publisher.</li>
+            </ul>
+
+            <h3>Configuring the application</h3>
+
+            <p>
+              Kura allows to easily manage the settings of the installed software components from its web UI, together with the ability to save <i>snapshots</i> of those settings that can be re-applied if and when needed. It is also possible to manage the settings over the air, by publishing specific MQTT messages to the broker the Kura gateway is configured to talk to.
+            </p>
+            <p>Here are the settings you need to adjust:</p>
+            <ul>
+              <li>In the <b>MqttDataTransport</b> section, you need to change the <i>broker-url</i> to: <code>mqtt://iot.eclipse.org:1883/</code>- other settings can remain unchanged,&nbsp;
+              </li>
+              <li>In the <b>DataService</b> section, you want to make sure that the MQTT communication is automatically established when Kura starts, by setting <b>connect.auto-on-startup</b> to true,
+              </li>
+              <li>Finally, you have to change the prefix of the MQTT topic for the data related to the greenhouse. In the <b>Greenhouse
+                    Publisher</b> section, set <b>publish.appTopicPrefix</b> to whatever seems like a good name for your greenhouse (e.g. <code>javaonedemo/bob-greenhouse</code>)!
+              </li>
+            </ul>
+            <h3>Communicating with the greenhouse remotely</h3>
+            <p>Now that Kura and our Greenhouse application are properly configured, the current temperature is actually published over MQTT, and it&rsquo;s also possible to toggle the LED by publishing a message on a specific topic.</p>
+            <p>
+              The easiest way for you to control your now IoT-ized Raspberry Pi + greenhouse combo is to use a Web UI that uses MQTT over WebSockets to display the temperature and control the LED.
+            </p>
+            <p>
+              Simply replace the end of the URL with the topic prefix you picked earlier (for the example earlier, the URL would be <code><a
+                href="http://iot.eclipse.org/java/demo/app/#/greenhouses/remote/bob-greenhouse">http://iot.eclipse.org/java/demo/app/#/greenhouses/remote/bob-greenhouse</a></code>)
+            </p>
+            <p>
+              <img class="img-responsive" src='https://hackpad-attachments.s3.amazonaws.com/hackpad.com_9EkDXF5JhoD_p.189956_1410350332293_angular-remote.png' />
+            </p>
+            <p></p>
+            <p>Hopefully, you&rsquo;re now more familiar with Kura, and we encourage you to play around with the Web UI to learn more about its capabilities in terms of network management, device-to-cloud communication, etc.</p>
+            <p>If you&rsquo;d like to actually use the Kura application framework to develop your own IoT application, you may want to check out the source code of the "Greenhouse" app you've deployed earlier – it's <a href="https://github.com/kartben/kura-greenhouse-demo" target="_blank">on Github<a>.</p>
+        <p></p>
+
+        <h2>Going further</h2>
+        <p></p>
+
+        <h3>Build your own greenhouse!</h3>
+
+        <p>
+            Head over to <a href='http://www.thingiverse.com/thing:144791' />Thingiverse</a> and download the blueprints of the acrylic greenhouse below. With them, just use the online laser-cutting service of your choice or <a href='https://www.fablabs.io/map' />go to a local Fab Lab</a> to get all the pieces cut from a sheet of plexiglas! It shouldn&rsquo;t cost you more than $20.
+            </p>
+            <p>
+              <img class="img-responsive" src='http://thingiverse-production.s3.amazonaws.com/renders/a2/da/2f/b4/01/untitled_preview_featured.jpg' />
+            </p>
+            <ul style="list-style: none;">
+              <li>
+                <br />
+              </li>
+            </ul>
+
+            <h3>Retrieve the humidity</h3>
+
+            <p>
+              Similarly to how we retrieved the temperature, you could refer to the
+              <a href="http://www.hoperf.cn/upload/sensor/TH02_V1.1.pdf">sensor&rsquo;s
+                datasheet</a> to implement the proper I2C code to read the humidity. See in particular Section <b>3.1.1. Performing a Relative Humidity
+                Measurement</b>.
+            </p>
+
+            <h3>Use other I2C sensors</h3>
+
+            <p>The great thing with I2C sensors is that it&rsquo;s really easy to hook up several of them on the same host device. Just use your imagination and explore what you could do if you were to use a luminosity, barometric pressure, or carbon dioxide sensor!</p>
+
+            <h3>Use Kura&rsquo;s CloudService to publish data</h3>
+
+            <p>
+              The <b>CloudService</b> leverages Google Protocol Buffers to provide a very efficient binary communication between the Kura gateway and an IoT server. Browse the documentation of the <a href='http://download.eclipse.org/kura/releases/0.7.1/docs/apidocs/org/eclipse/kura/cloud/CloudClient.html' />CloudClient</a>
+              and <a href='http://download.eclipse.org/kura/releases/0.7.1/docs/apidocs/org/eclipse/kura/message/KuraPayload.html' />KuraPayload</a>
+              APIs to learn more.&nbsp;
+            </p>
+
+            <h3>Setup a 6LoWPAN network</h3>
+
+            <p>If you&rsquo;re familiar with 802.15.4 Wireless Sensor Networks, you could easily setup your Raspberry Pi as a border router, that would expose the CoAP server on its radio interface. You could then use e.g. Contiki and the Erbium CoAP client to write a simple app that will run on a mote and talk CoAP to read the temperature, or control the LED!</p>
+
+    </section>
+  </main>
+
+
+  <footer>
+
+    <div class="container">
+      <div class="row">
+        <div class="col-md-6">
+          <nav>
+            <ul class="list-inline menu">
+              <li><a href="#">Technology</a>
+              </li>
+              <li><a href="#">Community</a>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </nav>
+          <div class="socials">
+            <a href="#" class="social-facebook">&nbsp;</a>
+            <a href="#" class="social-twitter">&nbsp;</a>
+            <a href="#" class="social-youtube">&nbsp;</a>
+            <a href="#" class="social-share">&nbsp;</a>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+        </div>
+      </div>
+    </div>
+
+
+  </footer>
+
+
+
+  <!-- JS is at the end of the document so the pages load faster -->
+  <script src="/js/jquery.js"></script>
+  <script src="/js/bootstrap/bootstrap.min.js"></script>
+  <script src="/js/index.js"></script>
+
+  <script src="../js/prism.js"></script>
+  <script src="../js/bootstrap-lightbox.min.js"></script>
+
+
+</body>
+
+</html>
diff --git a/static/js/bootstrap/bootstrap-carousel.js b/static/js/bootstrap/bootstrap-carousel.js
new file mode 100644
index 0000000000000000000000000000000000000000..f5ad612718d6d764a1139491a0592e9be9fc4d94
--- /dev/null
+++ b/static/js/bootstrap/bootstrap-carousel.js
@@ -0,0 +1,157 @@
+/* ==========================================================
+ * bootstrap-carousel.js v2.0.1
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function( $ ){
+
+  "use strict"
+
+ /* CAROUSEL CLASS DEFINITION
+  * ========================= */
+
+  var Carousel = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.carousel.defaults, options)
+    this.options.slide && this.slide(this.options.slide)
+  }
+
+  Carousel.prototype = {
+
+    cycle: function () {
+      this.interval = setInterval($.proxy(this.next, this), this.options.interval)
+      return this
+    }
+
+  , to: function (pos) {
+      var $active = this.$element.find('.active')
+        , children = $active.parent().children()
+        , activePos = children.index($active)
+        , that = this
+
+      if (pos > (children.length - 1) || pos < 0) return
+
+      if (this.sliding) {
+        return this.$element.one('slid', function () {
+          that.to(pos)
+        })
+      }
+
+      if (activePos == pos) {
+        return this.pause().cycle()
+      }
+
+      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
+    }
+
+  , pause: function () {
+      clearInterval(this.interval)
+      this.interval = null
+      return this
+    }
+
+  , next: function () {
+      if (this.sliding) return
+      return this.slide('next')
+    }
+
+  , prev: function () {
+      if (this.sliding) return
+      return this.slide('prev')
+    }
+
+  , slide: function (type, next) {
+      var $active = this.$element.find('.active')
+        , $next = next || $active[type]()
+        , isCycling = this.interval
+        , direction = type == 'next' ? 'left' : 'right'
+        , fallback  = type == 'next' ? 'first' : 'last'
+        , that = this
+
+      // if (!$next.length) return
+
+      this.sliding = true
+
+      isCycling && this.pause()
+
+      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
+
+      if (!$.support.transition && this.$element.hasClass('slide')) {
+        this.$element.trigger('slide')
+        $active.removeClass('active')
+        $next.addClass('active')
+        this.sliding = false
+        this.$element.trigger('slid')
+      } else {
+        $next.addClass(type)
+        $next[0].offsetWidth // force reflow
+        $active.addClass(direction)
+        $next.addClass(direction)
+        this.$element.trigger('slide')
+        this.$element.one($.support.transition.end, function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () { that.$element.trigger('slid') }, 0)
+        })
+      }
+
+      isCycling && this.cycle()
+
+      return this
+    }
+
+  }
+
+
+ /* CAROUSEL PLUGIN DEFINITION
+  * ========================== */
+
+  $.fn.carousel = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('carousel')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (typeof option == 'string' || (option = options.slide)) data[option]()
+      else data.cycle()
+    })
+  }
+
+  $.fn.carousel.defaults = {
+    interval: 5000
+  }
+
+  $.fn.carousel.Constructor = Carousel
+
+
+ /* CAROUSEL DATA-API
+  * ================= */
+
+  $(function () {
+    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
+      var $this = $(this), href
+        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
+      $target.carousel(options)
+      e.preventDefault()
+    })
+  })
+
+}( window.jQuery );
\ No newline at end of file
diff --git a/static/js/bootstrap/bootstrap-modal.js b/static/js/bootstrap/bootstrap-modal.js
new file mode 100644
index 0000000000000000000000000000000000000000..62fbc951b5ddc91846fb3c7ec73da0db0c70f0dd
--- /dev/null
+++ b/static/js/bootstrap/bootstrap-modal.js
@@ -0,0 +1,239 @@
+/* =========================================================
+ * bootstrap-modal.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#modals
+ * =========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* MODAL CLASS DEFINITION
+  * ====================== */
+
+  var Modal = function (element, options) {
+    this.options = options
+    this.$element = $(element)
+      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
+    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
+  }
+
+  Modal.prototype = {
+
+      constructor: Modal
+
+    , toggle: function () {
+        return this[!this.isShown ? 'show' : 'hide']()
+      }
+
+    , show: function () {
+        var that = this
+          , e = $.Event('show')
+
+        this.$element.trigger(e)
+
+        if (this.isShown || e.isDefaultPrevented()) return
+
+        $('body').addClass('modal-open')
+
+        this.isShown = true
+
+        this.escape()
+
+        this.backdrop(function () {
+          var transition = $.support.transition && that.$element.hasClass('fade')
+
+          if (!that.$element.parent().length) {
+            that.$element.appendTo(document.body) //don't move modals dom position
+          }
+
+          that.$element
+            .show()
+
+          if (transition) {
+            that.$element[0].offsetWidth // force reflow
+          }
+
+          that.$element
+            .addClass('in')
+            .attr('aria-hidden', false)
+            .focus()
+
+          that.enforceFocus()
+
+          transition ?
+            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
+            that.$element.trigger('shown')
+
+        })
+      }
+
+    , hide: function (e) {
+        e && e.preventDefault()
+
+        var that = this
+
+        e = $.Event('hide')
+
+        this.$element.trigger(e)
+
+        if (!this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = false
+
+        $('body').removeClass('modal-open')
+
+        this.escape()
+
+        $(document).off('focusin.modal')
+
+        this.$element
+          .removeClass('in')
+          .attr('aria-hidden', true)
+
+        $.support.transition && this.$element.hasClass('fade') ?
+          this.hideWithTransition() :
+          this.hideModal()
+      }
+
+    , enforceFocus: function () {
+        var that = this
+        $(document).on('focusin.modal', function (e) {
+          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
+            that.$element.focus()
+          }
+        })
+      }
+
+    , escape: function () {
+        var that = this
+        if (this.isShown && this.options.keyboard) {
+          this.$element.on('keyup.dismiss.modal', function ( e ) {
+            e.which == 27 && that.hide()
+          })
+        } else if (!this.isShown) {
+          this.$element.off('keyup.dismiss.modal')
+        }
+      }
+
+    , hideWithTransition: function () {
+        var that = this
+          , timeout = setTimeout(function () {
+              that.$element.off($.support.transition.end)
+              that.hideModal()
+            }, 500)
+
+        this.$element.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          that.hideModal()
+        })
+      }
+
+    , hideModal: function (that) {
+        this.$element
+          .hide()
+          .trigger('hidden')
+
+        this.backdrop()
+      }
+
+    , removeBackdrop: function () {
+        this.$backdrop.remove()
+        this.$backdrop = null
+      }
+
+    , backdrop: function (callback) {
+        var that = this
+          , animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+        if (this.isShown && this.options.backdrop) {
+          var doAnimate = $.support.transition && animate
+
+          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+            .appendTo(document.body)
+
+          if (this.options.backdrop != 'static') {
+            this.$backdrop.click($.proxy(this.hide, this))
+          }
+
+          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+          this.$backdrop.addClass('in')
+
+          doAnimate ?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (!this.isShown && this.$backdrop) {
+          this.$backdrop.removeClass('in')
+
+          $.support.transition && this.$element.hasClass('fade')?
+            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
+            this.removeBackdrop()
+
+        } else if (callback) {
+          callback()
+        }
+      }
+  }
+
+
+ /* MODAL PLUGIN DEFINITION
+  * ======================= */
+
+  $.fn.modal = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('modal')
+        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option]()
+      else if (options.show) data.show()
+    })
+  }
+
+  $.fn.modal.defaults = {
+      backdrop: true
+    , keyboard: true
+    , show: true
+  }
+
+  $.fn.modal.Constructor = Modal
+
+
+ /* MODAL DATA-API
+  * ============== */
+
+  $(function () {
+    $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
+      var $this = $(this)
+        , href = $this.attr('href')
+        , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+        , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+      e.preventDefault()
+
+      $target
+        .modal(option)
+        .one('hide', function () {
+          $this.focus()
+        })
+    })
+  })
+
+}(window.jQuery);
\ No newline at end of file
diff --git a/static/js/bootstrap/bootstrap.min.js b/static/js/bootstrap/bootstrap.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..089cf42e888958ab1f88123030bc019e9d8401c1
--- /dev/null
+++ b/static/js/bootstrap/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){e(function(){"use strict";e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()},e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e(function(){e("body").on("click.alert.data-api",t,n.prototype.close)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.parent('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")},e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e(function(){e("body").on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=n,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},to:function(t){var n=this.$element.find(".item.active"),r=n.parent().children(),i=r.index(n),s=this;if(t>r.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){s.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",e(r[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f=e.Event("slide",{relatedTarget:i[0]});this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u]();if(i.hasClass("active"))return;if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}},e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e(function(){e("body").on("click.carousel.data-api","[data-slide]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=!i.data("modal")&&e.extend({},i.data(),n.data());i.carousel(s),t.preventDefault()})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning)return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning)return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=typeof n=="object"&&n;i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e(function(){e("body").on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})})}(window.jQuery),!function(e){"use strict";function r(){i(e(t)).removeClass("open")}function i(t){var n=t.attr("data-target"),r;return n||(n=t.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,"")),r=e(n),r.length||(r=t.parent()),r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||(s.toggleClass("open"),n.focus()),!1},keydown:function(t){var n,r,s,o,u,a;if(!/(38|40|27)/.test(t.keyCode))return;n=e(this),t.preventDefault(),t.stopPropagation();if(n.is(".disabled, :disabled"))return;o=i(n),u=o.hasClass("open");if(!u||u&&t.keyCode==27)return n.click();r=e("[role=menu] li:not(.divider) a",o);if(!r.length)return;a=r.index(r.filter(":focus")),t.keyCode==38&&a>0&&a--,t.keyCode==40&&a<r.length-1&&a++,~a||(a=0),r.eq(a).focus()}},e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e(function(){e("html").on("click.dropdown.data-api touchstart.dropdown.data-api",r),e("body").on("click.dropdown touchstart.dropdown.data-api",".dropdown",function(e){e.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;e("body").addClass("modal-open"),this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1).focus(),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.trigger("shown")}):t.$element.trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,e("body").removeClass("modal-open"),this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(e){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,e.proxy(this.removeBackdrop,this)):this.removeBackdrop()):t&&t()}},e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e(function(){e("body").on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):this.options.trigger!="manual"&&(i=this.options.trigger=="hover"?"mouseenter":"focus",s=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this))),this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,t,this.$element.data()),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)return n.show();clearTimeout(this.timeout),n.hoverState="in",this.timeout=setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var e,t,n,r,i,s,o;if(this.hasContent()&&this.enabled){e=this.tip(),this.setContent(),this.options.animation&&e.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,t=/in/.test(s),e.remove().css({top:0,left:0,display:"block"}).appendTo(t?this.$element:document.body),n=this.getPosition(t),r=e[0].offsetWidth,i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.css(o).addClass(s).addClass("in")}},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).remove()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.remove()})}var t=this,n=this.tip();return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?r():n.remove(),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content > *")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-content")||(typeof n.content=="function"?n.content.call(t[0]):n.content),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var t=e(this),n=t.data("target")||t.attr("href"),r=/^#\w/.test(n)&&e(n);return r&&r.length&&[[r.position().top,n]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}},e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active a").last()[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}},e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e(function(){e("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=e(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:t.top+t.height,left:t.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),(e.browser.webkit||e.browser.msie)&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this))},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=!~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(e){var t=this;setTimeout(function(){t.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(t){this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")}},e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e(function(){e("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;t.preventDefault(),n.typeahead(n.data())})})}(window.jQuery);
\ No newline at end of file
diff --git a/static/js/community.js b/static/js/community.js
new file mode 100644
index 0000000000000000000000000000000000000000..c4b3765953bea91f16cb6bc5b324d5b617aa813a
--- /dev/null
+++ b/static/js/community.js
@@ -0,0 +1,126 @@
+/*!
+ * community.js by Christopher Guindon - @chrisguindon
+ * Copyright 2013 Eclipse Foundation
+ * http://www.eclipse.org/org/documents/epl-v10.php
+ */
+(function($, window, document) {
+    $(function() {
+
+        $(window).resize(function() {
+            resize();
+        });
+
+        $(document).on('click', '.itembox, .news-list li', function() {
+            var link = $(this).find('.readmore').attr('href');
+            $(location).attr('href', link);
+            return false;
+        });
+
+        $.ajax({
+            type: "GET",
+            url: "//projects.eclipse.org/jsonp/technology/Internet%20of%20Things",
+            dataType: "jsonp",
+            cache: false,
+            success: function(data) {
+                var output = "";
+                var i = 0;
+
+                $("#update-project").removeClass("loading");
+
+                $.each(data, function(key, value) {
+                    if ((i % 4) === 0) {
+                        if (i !== 0) {
+                            output += '</div>';
+                        }
+                        output += '<div class="row-fluid">';
+                    }
+
+                    // Clean up and remove HTML.
+                    var title = stringJanitor(value.name);
+                    var id = stringJanitor(value.id);
+                    var desc = stringJanitor(value.description, {
+                        "cut": true,
+                        "ellipsis": "&hellip;"
+                    });
+                    var link = value.website;
+                    var logo = value.logo;
+                    var style = "";
+                    var showlogo = false;
+
+                    if (id == 'rt.ecf' || id == 'tools.sequoyah.mtj' || id == "technology.koneki")
+                        return true;
+
+                    output += "<div class=\"col-md-4 col-sm-6 itembox\"" + style + ">";
+                    if (validateUrl(logo) && showlogo === true) {
+                        output += "<img class =\"logo\" alt=\"" + title + " logo\" src=\"" + logo + "\">";
+                    } else {
+                        output += "<h1 class=\"purple\">" + title + "</h1>";
+                    }
+
+                    output += "<p>" + desc + "</p>";
+
+                    if (!validateUrl(link)) {
+                        link = "http://projects.eclipse.org/projects/" + id;
+                    }
+
+
+                    output += "<a href=\"" + link + "\" class=\"readmore\">Read more <i class=\"icon-chevron-right\"></i></a>";
+                    output += "</div>";
+                    i++;
+                });
+                // Insert html and resize the boxes.
+                $("#update-project").append('</div>' + output);
+                resize();
+            },
+        });
+
+    });
+    // Validate URL.
+    var validateUrl = function validateUrl(str) {
+        return (/^(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i).test(str);
+    };
+
+    // Set same height to all .itembox in a row.
+    var resize = function() {
+        $('.itembox').css({
+            "height": "auto"
+        });
+        $('.row-fluid').each(function() {
+            var highestBox = 0;
+            $('.itembox', this).each(function() {
+                if ($(this).height() > highestBox) {
+                    highestBox = $(this).outerHeight();
+                }
+            });
+            $('.itembox', this).height(highestBox);
+        });
+    };
+
+    // Remove html, add ellipsis and cut strings.
+    var stringJanitor = function(str, options) {
+        var settings = $.extend({
+            // These are the defaults.
+            start: 0,
+            end: 200,
+            html: false,
+            ellipsis: "",
+            cut: false,
+        }, options);
+        var text = "";
+        // Remove HTML.
+        if (!settings.html) {
+            text = str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/g, "");
+        }
+
+        // Shorten the string.
+        if (settings.cut) {
+            var cutat = text.lastIndexOf(' ', settings.end);
+            if (cutat !== -1) {
+                text = text.substring(settings.start, cutat) + settings.ellipsis;
+            }
+        }
+        return text;
+    };
+
+}(window.jQuery, window, document));
+// The global jQuery object is passed as a parameter
diff --git a/static/js/community.min.js b/static/js/community.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..6ea1c8f382f8bc9bcef8c728a064d7bba8ae10ed
--- /dev/null
+++ b/static/js/community.min.js
@@ -0,0 +1 @@
+(function($,window,document){$(function(){$(window).resize(function(){resize()});$(document).on("click",".itembox, .news-list li",function(){var link=$(this).find(".readmore").attr("href");$(location).attr("href",link);return false});$.ajax({type:"GET",url:"//projects.eclipse.org/jsonp/technology/Internet%20of%20Things",dataType:"jsonp",cache:false,success:function(data){var output="";var i=0;$("#update-project").removeClass("loading");$.each(data,function(key,value){if(i%4===0){if(i!==0){output+="</div>"}output+='<div class="row-fluid">'}var title=stringJanitor(value.name);var id=stringJanitor(value.id);var desc=stringJanitor(value.description,{cut:true,ellipsis:"&hellip;"});var link=value.website;var logo=value.logo;var style="";var showlogo=false;if(id=="rt.ecf"||id=="tools.sequoyah.mtj"||id=="technology.koneki")return true;output+='<div class="col-md-4 col-sm-6 itembox"'+style+">";if(validateUrl(logo)&&showlogo===true){output+='<img class ="logo" alt="'+title+' logo" src="'+logo+'">'}else{output+='<h1 class="purple">'+title+"</h1>"}output+="<p>"+desc+"</p>";if(!validateUrl(link)){link="http://projects.eclipse.org/projects/"+id}output+='<a href="'+link+'" class="readmore">Read more <i class="icon-chevron-right"></i></a>';output+="</div>";i++});$("#update-project").append("</div>"+output);resize()}})});var validateUrl=function validateUrl(str){return/^(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i.test(str)};var resize=function(){$(".itembox").css({height:"auto"});$(".row-fluid").each(function(){var highestBox=0;$(".itembox",this).each(function(){if($(this).height()>highestBox){highestBox=$(this).outerHeight()}});$(".itembox",this).height(highestBox)})};var stringJanitor=function(str,options){var settings=$.extend({start:0,end:200,html:false,ellipsis:"",cut:false},options);var text="";if(!settings.html){text=str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/g,"")}if(settings.cut){var cutat=text.lastIndexOf(" ",settings.end);if(cutat!==-1){text=text.substring(settings.start,cutat)+settings.ellipsis}}return text}})(window.jQuery,window,document);
\ No newline at end of file
diff --git a/static/js/ecosystem.js b/static/js/ecosystem.js
new file mode 100644
index 0000000000000000000000000000000000000000..8f6f31aadff0c339cc10fbb2023584a8064665f4
--- /dev/null
+++ b/static/js/ecosystem.js
@@ -0,0 +1,18 @@
+/*!
+* ecosystem.js by Christopher Guindon - @chrisguindon
+* Copyright 2013 Eclipse Foundation
+* http://www.eclipse.org/org/documents/epl-v10.php
+*/
+(function($) {
+  $(function() {
+      
+      // Vertical alignement of members logo. 
+      $(".members-info").each(function () {
+        var id =  '#' + $(this).attr('id') + " ";
+        var height = $(id  + ".mb-info").outerHeight(true);
+        var logoh = $(id  + ".mb-logo").outerHeight(true);
+        var logom = (height-logoh)/2;
+        $(id  + ".mb-logo img").css({"padding-top": logom});
+    }); 
+  });
+}(window.jQuery, window, document));
diff --git a/static/js/ecosystem.min.js b/static/js/ecosystem.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..2feb311c14a02b1b50672a708dbf60b033b87192
--- /dev/null
+++ b/static/js/ecosystem.min.js
@@ -0,0 +1,5 @@
+/*!
+* ecosystem.js by Christopher Guindon - @chrisguindon
+* Copyright 2013 Eclipse Foundation
+* http://www.eclipse.org/org/documents/epl-v10.php
+*/(function(e){e(function(){e(".members-info").each(function(){var t="#"+e(this).attr("id")+" ",n=e(t+".mb-info").outerHeight(!0),r=e(t+".mb-logo").outerHeight(!0),i=(n-r)/2;e(t+".mb-logo img").css({"padding-top":i})})})})(window.jQuery,window,document);
\ No newline at end of file
diff --git a/static/js/getting-started.js b/static/js/getting-started.js
new file mode 100644
index 0000000000000000000000000000000000000000..eb78099a65628a64e55c42539c1c1df92bc445eb
--- /dev/null
+++ b/static/js/getting-started.js
@@ -0,0 +1,34 @@
+/*!
+ * community.js by Christopher Guindon - @chrisguindon
+ * Copyright 2013 Eclipse Foundation
+ * http://www.eclipse.org/org/documents/epl-v10.php
+ */
+(function($, window, document) {
+    $(function() {
+
+        $(function() {
+            $("a.embed").oembed(null, {
+                includeHandle: false,
+                afterEmbed: function() {
+
+                    $('.presentations div').filter(function() {
+                        return $(this).css('margin-bottom') == '5px';
+                    }).remove();
+
+                    $('.presentations br').remove();
+
+                    $('.presentations iframe').attr("align", "center");
+                    $('.presentations iframe').css({
+                        display: "block",
+                        margin: "0 auto"
+                    });
+
+
+                },
+            });
+        });
+
+    });
+
+}(window.jQuery, window, document));
+// The global jQuery object is passed as a parameter
diff --git a/static/js/index.js b/static/js/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..655447f672afe914b6e4df2b43bc3cfe0660e3f5
--- /dev/null
+++ b/static/js/index.js
@@ -0,0 +1,56 @@
+/**
+ * Onload handler
+ */
+$(document).ready(function() {
+    // Enable dropdowns
+    $('.dropdown-toggle').dropdown();
+
+    $('a[rel=popover]').popover({
+        html: true,
+        placement: 'bottom',
+        trigger: 'hover'
+    });
+
+    $('.img-microej').popover({
+        html: true,
+        placement: 'bottom',
+        trigger: 'hover',
+        template: '<div class="popover" role="tooltip" style="width: 500px;"><div class="arrow"></div><div class="popover-content"><div class="data-content"></div></div></div>',
+        content: function() {
+            return '<img src="/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.jpg" />';
+        }
+
+    });
+
+    // var FEED_URL = "https://pipes.yahoo.com/pipes/pipe.run?_id=aedbf3bc8ceeda32ebc49a51a40be9d5&_render=rss";
+    // $.ajax({
+    //     url: document.location.protocol + '//ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&callback=?&q=' + encodeURIComponent(FEED_URL),
+    //     dataType: 'json',
+    //     success: function(data) {
+    //         if (data.responseData.feed && data.responseData.feed.entries) {
+    //             $.each(data.responseData.feed.entries, function(i, e) {
+    //                 console.log("------------------------");
+    //                 console.log(e);
+    //                 console.log("title      : " + e.title);
+    //                 console.log("author     : " + e.author);
+    //                 console.log("description: " + e.description);
+    //             });
+    //         }
+    //     }
+    // });
+
+
+
+});
+
+$(window).bind("load", function() {
+    $('.home-box').addClass('loaded');
+});
+
+
+($("a[data-toggle=modal]")).click(function() {
+    var target, url;
+    target = ($(this)).attr('data-target');
+    url = ($(this)).attr('href');
+    return ($(target)).load(url);
+});
diff --git a/static/js/jquery.js b/static/js/jquery.js
new file mode 100644
index 0000000000000000000000000000000000000000..00c4e23a27b15f6158ea46a016beb0ae95c6596d
--- /dev/null
+++ b/static/js/jquery.js
@@ -0,0 +1,9252 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			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 = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context ? context.ownerDocument || context : document );
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// 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 ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we 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: $(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 current version of jQuery being used
+	jquery: "1.7.1",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// 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, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// 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 ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.add( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	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: 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({
+	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 ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// 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.fireWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).off( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery.Callbacks( "once memory" );
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// 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 || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// 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.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array, i ) {
+		var len;
+
+		if ( array ) {
+			if ( indexOf ) {
+				return indexOf.call( array, elem, i );
+			}
+
+			len = array.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in array && array[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; 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 ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; 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, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// 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 ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.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 ) {
+		if ( typeof context === "string" ) {
+			var 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
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( 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 || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+	var object = flagsCache[ flags ] = {},
+		i, length;
+	flags = flags.split( /\s+/ );
+	for ( i = 0, length = flags.length; i < length; i++ ) {
+		object[ flags[i] ] = true;
+	}
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	flags:	an optional list of space-separated flags that will change how
+ *			the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *	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( flags ) {
+
+	// Convert flags from String-formatted to Object-formatted
+	// (we check in cache first)
+	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+	var // Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = [],
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// 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,
+		// Add one or several callbacks to the list
+		add = function( args ) {
+			var i,
+				length,
+				elem,
+				type,
+				actual;
+			for ( i = 0, length = args.length; i < length; i++ ) {
+				elem = args[ i ];
+				type = jQuery.type( elem );
+				if ( type === "array" ) {
+					// Inspect recursively
+					add( elem );
+				} else if ( type === "function" ) {
+					// Add if not in unique mode and callback is not in
+					if ( !flags.unique || !self.has( elem ) ) {
+						list.push( elem );
+					}
+				}
+			}
+		},
+		// Fire callbacks
+		fire = function( context, args ) {
+			args = args || [];
+			memory = !flags.memory || [ context, args ];
+			firing = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+					memory = true; // Mark as halted
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( !flags.once ) {
+					if ( stack && stack.length ) {
+						memory = stack.shift();
+						self.fireWith( memory[ 0 ], memory[ 1 ] );
+					}
+				} else if ( memory === true ) {
+					self.disable();
+				} else {
+					list = [];
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					var length = list.length;
+					add( 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, unless previous
+					// firing was halted (stopOnFalse)
+					} else if ( memory && memory !== true ) {
+						firingStart = length;
+						fire( memory[ 0 ], memory[ 1 ] );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					var args = arguments,
+						argIndex = 0,
+						argLength = args.length;
+					for ( ; argIndex < argLength ; argIndex++ ) {
+						for ( var i = 0; i < list.length; i++ ) {
+							if ( args[ argIndex ] === list[ i ] ) {
+								// Handle firingIndex and firingLength
+								if ( firing ) {
+									if ( i <= firingLength ) {
+										firingLength--;
+										if ( i <= firingIndex ) {
+											firingIndex--;
+										}
+									}
+								}
+								// Remove the element
+								list.splice( i--, 1 );
+								// If we have some unicity property then
+								// we only need to do this once
+								if ( flags.unique ) {
+									break;
+								}
+							}
+						}
+					}
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				if ( list ) {
+					var i = 0,
+						length = list.length;
+					for ( ; i < length; i++ ) {
+						if ( fn === list[ i ] ) {
+							return true;
+						}
+					}
+				}
+				return false;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				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 || memory === true ) {
+					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 ( stack ) {
+					if ( firing ) {
+						if ( !flags.once ) {
+							stack.push( [ context, args ] );
+						}
+					} else if ( !( flags.once && memory ) ) {
+						fire( context, 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 !!memory;
+			}
+		};
+
+	return self;
+};
+
+
+
+
+var // Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var doneList = jQuery.Callbacks( "once memory" ),
+			failList = jQuery.Callbacks( "once memory" ),
+			progressList = jQuery.Callbacks( "memory" ),
+			state = "pending",
+			lists = {
+				resolve: doneList,
+				reject: failList,
+				notify: progressList
+			},
+			promise = {
+				done: doneList.add,
+				fail: failList.add,
+				progress: progressList.add,
+
+				state: function() {
+					return state;
+				},
+
+				// Deprecated
+				isResolved: doneList.fired,
+				isRejected: failList.fired,
+
+				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+					return this;
+				},
+				always: function() {
+					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+					return this;
+				},
+				pipe: function( fnDone, fnFail, fnProgress ) {
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( {
+							done: [ fnDone, "resolve" ],
+							fail: [ fnFail, "reject" ],
+							progress: [ fnProgress, "notify" ]
+						}, function( handler, data ) {
+							var fn = data[ 0 ],
+								action = data[ 1 ],
+								returned;
+							if ( jQuery.isFunction( fn ) ) {
+								deferred[ handler ](function() {
+									returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								});
+							} else {
+								deferred[ handler ]( newDefer[ action ] );
+							}
+						});
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					if ( obj == null ) {
+						obj = promise;
+					} else {
+						for ( var key in promise ) {
+							obj[ key ] = promise[ key ];
+						}
+					}
+					return obj;
+				}
+			},
+			deferred = promise.promise({}),
+			key;
+
+		for ( key in lists ) {
+			deferred[ key ] = lists[ key ].fire;
+			deferred[ key + "With" ] = lists[ key ].fireWith;
+		}
+
+		// Handle state
+		deferred.done( function() {
+			state = "resolved";
+		}, failList.disable, progressList.lock ).fail( function() {
+			state = "rejected";
+		}, doneList.disable, progressList.lock );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = sliceDeferred.call( arguments, 0 ),
+			i = 0,
+			length = args.length,
+			pValues = new Array( length ),
+			count = length,
+			pCount = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					deferred.resolveWith( deferred, args );
+				}
+			};
+		}
+		function progressFunc( i ) {
+			return function( value ) {
+				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				deferred.notifyWith( promise, pValues );
+			};
+		}
+		if ( length > 1 ) {
+			for ( ; i < length; i++ ) {
+				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return promise;
+	}
+});
+
+
+
+
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		marginDiv,
+		fragment,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported,
+		div = document.createElement( "div" ),
+		documentElement = document.documentElement;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true
+	};
+
+	// Make sure checked status is properly cloned
+	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;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	div.innerHTML = "";
+
+	// Check if div with explicit width and no margin-right incorrectly
+	// gets computed margin-right based on width of container. For more
+	// info see bug #3333
+	// Fails in WebKit before Feb 2011 nightlies
+	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+	if ( window.getComputedStyle ) {
+		marginDiv = document.createElement( "div" );
+		marginDiv.style.width = "0";
+		marginDiv.style.marginRight = "0";
+		div.style.width = "2px";
+		div.appendChild( marginDiv );
+		support.reliableMarginRight =
+			( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+	}
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	fragment.removeChild( div );
+
+	// Null elements to avoid leaks in IE
+	fragment = select = opt = marginDiv = div = input = null;
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, outer, inner, table, td, offsetSupport,
+			conMarginTop, ptlm, vb, style, html,
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		conMarginTop = 1;
+		ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
+		vb = "visibility:hidden;border:0;";
+		style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
+		html = "<div " + style + "><div></div></div>" +
+			"<table " + style + " cellpadding='0' cellspacing='0'>" +
+			"<tr><td></td></tr></table>";
+
+		container = document.createElement("div");
+		container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName( "td" );
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Figure out if the W3C box model works as expected
+		div.innerHTML = "";
+		div.style.width = div.style.paddingLeft = "1px";
+		jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "";
+			div.innerHTML = "<div style='width:4px;'></div>";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+		}
+
+		div.style.cssText = ptlm + vb;
+		div.innerHTML = html;
+
+		outer = div.firstChild;
+		inner = outer.firstChild;
+		td = outer.nextSibling.firstChild.firstChild;
+
+		offsetSupport = {
+			doesNotAddBorder: ( inner.offsetTop !== 5 ),
+			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+		};
+
+		inner.style.position = "fixed";
+		inner.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+		inner.style.position = inner.style.top = "";
+
+		outer.style.overflow = "hidden";
+		outer.style.position = "relative";
+
+		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+		body.removeChild( container );
+		div  = container = null;
+
+		jQuery.extend( support, offsetSupport );
+	});
+
+	return support;
+})();
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var privateCache, thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+			isEvents = name === "events";
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = ++jQuery.uuid;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		privateCache = thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Users should not attempt to inspect the internal events object using jQuery.data,
+		// it is undocumented and subject to change. But does anyone listen? No.
+		if ( isEvents && !thisCache[ name ] ) {
+			return privateCache.events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ internalKey ] : internalKey;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split( " " );
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the cache and need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ internalKey ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( internalKey );
+			} else {
+				elem[ internalKey ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, attr, name,
+			data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
+					attr = this[0].attributes;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+					jQuery._data( this[0], "parsedAttrs", true );
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var self = jQuery( this ),
+					args = [ parts[0], value ];
+
+				self.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var 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 :
+				jQuery.isNumeric( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery._data( elem, deferDataKey );
+	if ( defer &&
+		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery._data( elem, queueDataKey ) &&
+				!jQuery._data( elem, markDataKey ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.fire();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = ( type || "fx" ) + "mark";
+			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+			if ( count ) {
+				jQuery._data( elem, key, count );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		var q;
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			q = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			hooks = {};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			jQuery._data( elem, type + ".run", hooks );
+			fn.call( elem, function() {
+				jQuery.dequeue( elem, type );
+			}, hooks );
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue " + type + ".run", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function() {
+			var queue = jQuery.queue( this, type, data );
+
+			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, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+				count++;
+				tmp.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise();
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.prop );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = ( value || "" ).split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		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 ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( 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 ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+				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 self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.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.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+			// 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, i, max, option,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (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 );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, l,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+			attrNames = value.toLowerCase().split( rspace );
+			l = attrNames.length;
+
+			for ( ; i < l; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					jQuery.attr( elem, name, "" );
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( rboolean.test( name ) && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else 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 it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	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 ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.nodeValue = value + "" );
+		}
+	};
+
+	// Apply the nodeHook to tabindex
+	jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = "" + value );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+
+
+
+
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+	rhoverHack = /\bhover(\.\S+)?\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+	quickParse = function( selector ) {
+		var quick = rquickIs.exec( selector );
+		if ( quick ) {
+			//   0  1    2   3
+			// [ _, tag, id, class ]
+			quick[1] = ( quick[1] || "" ).toLowerCase();
+			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+		}
+		return quick;
+	},
+	quickIs = function( elem, m ) {
+		var attrs = elem.attributes || {};
+		return (
+			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+			(!m[2] || (attrs.id || {}).value === m[2]) &&
+			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+		);
+	},
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, quick, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// 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
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = 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 !== "undefined" && (!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
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// 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: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				quick: quickParse( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			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;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			t, tns, type, origType, namespaces, origCount,
+			j, events, special, handle, eventType, handleObj;
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// 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;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.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 ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, [ "events", "handle" ], true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+		// 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 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// 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 ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( 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)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			old = null;
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old && old === elem.ownerDocument ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && 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( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						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 ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = [].slice.call( arguments, 0 ),
+			run_all = !event.exclusive && !event.namespace,
+			handlerQueue = [],
+			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
+
+			// Pregenerate a single jQuery object for reuse with .is()
+			jqcur = jQuery(this);
+			jqcur.context = this.ownerDocument || this;
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+				selMatch = {};
+				matches = [];
+				jqcur[0] = cur;
+				for ( i = 0; i < delegateCount; i++ ) {
+					handleObj = handlers[ i ];
+					sel = handleObj.selector;
+
+					if ( selMatch[ sel ] === undefined ) {
+						selMatch[ sel ] = (
+							handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+						);
+					}
+					if ( selMatch[ sel ] ) {
+						matches.push( handleObj );
+					}
+				}
+				if ( matches.length ) {
+					handlerQueue.push({ elem: cur, matches: matches });
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement 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 fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// 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 relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// 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,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+		if ( event.metaKey === undefined ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady
+		},
+
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	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();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+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.returnValue === false ||
+			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;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return 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 = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector,
+				ret;
+
+			// 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;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !form._submit_attached ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						// If form was submitted by the user, bubble the event up the tree
+						if ( this.parentNode && !event.isTrigger ) {
+							jQuery.event.simulate( "submit", this.parentNode, event, true );
+						}
+					});
+					form._submit_attached = true;
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+							jQuery.event.simulate( "change", this, event, true );
+						}
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					elem._change_attached = true;
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+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 = 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.call( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			var handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( var 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 );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	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 );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+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 ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2012, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	expando = "sizcache" + (Math.random() + '').replace('.', ''),
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rReturn = /\r\n/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+
+			parts.push( m[1] );
+
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context, seed );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+
+				set = posProcess( selector, set, seed );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set, i, len, match, type, left;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+		type = Expr.order[i];
+
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		type, found, item, filter, left,
+		i, pass,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				filter = Expr.filter[ type ];
+				left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							pass = not ^ found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+		nodeType = elem.nodeType,
+		ret = "";
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 ) {
+			// Use textContent || innerText for elements
+			if ( typeof elem.textContent === 'string' ) {
+				return elem.textContent;
+			} else if ( typeof elem.innerText === 'string' ) {
+				// Replace IE's carriage returns
+				return elem.innerText.replace( rReturn, '' );
+			} else {
+				// Traverse it's children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( i = 0; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			if ( node.nodeType !== 8 ) {
+				ret += getText( node );
+			}
+		}
+	}
+	return ret;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+
+		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;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// 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" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var first, last,
+				doneName, parent, cache,
+				count, diff,
+				type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					if ( type === "first" ) {
+						return true;
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					return true;
+
+				case "nth":
+					first = match[2];
+					last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					doneName = match[0];
+					parent = elem.parentNode;
+
+					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+						count = 0;
+
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						}
+
+						parent[ expando ] = doneName;
+					}
+
+					diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+		},
+
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Sizzle.attr ?
+					Sizzle.attr( elem, name ) :
+					Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				!type && Sizzle.attr ?
+				result != null :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+
+		var cur = a.nextSibling;
+		}
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// 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 and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// 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
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try {
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem[ expando ] = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem[ expando ] = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+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 : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet, seed );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// 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 self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				POS.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		// Array (deprecated as of jQuery 1.7)
+		if ( jQuery.isArray( selectors ) ) {
+			var level = 1;
+
+			while ( cur && cur.ownerDocument && cur !== context ) {
+				for ( i = 0; i < selectors.length; i++ ) {
+
+					if ( jQuery( cur ).is( selectors[ i ] ) ) {
+						ret.push({ selector: selectors[ i ], elem: cur, level: level });
+					}
+				}
+
+				cur = cur.parentNode;
+				level++;
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// 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.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	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( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+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 jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "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 jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")", "i"),
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		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
+			var 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.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				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();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery.clean(arguments) );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		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 ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || ( l > 1 && i < lastIndex ) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc,
+	first = args[ 0 ];
+
+	// nodes may contain either an explicit document object,
+	// a jQuery collection or context object.
+	// If nodes[0] contains a valid object to assign to doc
+	if ( nodes && nodes[0] ) {
+		doc = nodes[0].ownerDocument || nodes[0];
+	}
+
+	// Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ first ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	var nodeName = ( elem.nodeName || "" ).toLowerCase();
+	if ( nodeName === "input" ) {
+		fixDefaultChecked( elem );
+	// Skip scripts, get other children
+	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+	var div = document.createElement( "div" );
+	safeFragment.appendChild( div );
+
+	div.innerHTML = elem.outerHTML;
+	return div.firstChild;
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			// IE<=8 does not properly clone detached, unknown element nodes
+			clone = jQuery.support.html5Clone || !rnoshimcache.test( "<" + elem.nodeName ) ?
+				elem.cloneNode( true ) :
+				shimCloneNode( elem );
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType;
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [], j;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div");
+
+					// Append wrapper element to unknown element safe doc fragment
+					if ( context === document ) {
+						// Use the fragment we've already created for this document
+						safeFragment.appendChild( div );
+					} else {
+						// Use a fragment created with the owner document
+						createSafeFragment( context ).appendChild( div );
+					}
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id,
+			cache = jQuery.cache,
+			special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						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 );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+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", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": 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": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// 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, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || 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";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} 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 ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWH( elem, name, extra );
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				return val;
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat( value );
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( (defaultView = elem.ownerDocument.defaultView) &&
+				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left, rsLeft, uncomputed,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret === null && style && (uncomputed = style[ name ]) ) {
+			ret = uncomputed;
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ( ret || 0 );
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		which = name === "width" ? cssWidth : cssHeight,
+		i = 0,
+		len = which.length;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			for ( ; i < len; i++ ) {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+				}
+			}
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ] || 0;
+	}
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		for ( ; i < len; i++ ) {
+			val += parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+			}
+		}
+	}
+
+	return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	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 = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #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 = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// 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 );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// 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 ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+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({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// 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 ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.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: {
+			context: true,
+			url: true
+		}
+	},
+
+	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 // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// 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 === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// 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;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					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( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ 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" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		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 prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// 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 If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// 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
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// 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;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = 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 ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	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 {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// 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
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for ( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for ( key in s.converters ) {
+				if ( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if ( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for ( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+		( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.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 ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback );
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = 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 ( display === "" && jQuery.css(elem, "display") === "none" ) {
+						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			var elem, display,
+				i = 0,
+				j = this.length;
+
+			for ( ; i < j; i++ ) {
+				elem = this[i];
+				if ( elem.style ) {
+					display = jQuery.css( elem, "display" );
+
+					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+						jQuery._data( elem, "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed( speed, easing, callback );
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		function doAnimation() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p, e,
+				parts, start, end, unit,
+				method;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			for ( p in prop ) {
+
+				// property name normalization
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				val = prop[ name ];
+
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+
+						// inline-level elements accept inline-block;
+						// block-level elements need to be inline with layout
+						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+							this.style.display = "inline-block";
+
+						} else {
+							this.style.zoom = 1;
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test( val ) ) {
+
+					// Tracks whether to show or hide based on private
+					// data attached to the element
+					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+					if ( method ) {
+						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+						e[ method ]();
+					} else {
+						e[ val ]();
+					}
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ( (end || 1) / e.cur() ) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		}
+
+		return optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+
+	stop: function( type, clearQueue, gotoEnd ) {
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var index,
+				hadTimers = false,
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+
+			function stopQueue( elem, data, index ) {
+				var hooks = data[ index ];
+				jQuery.removeData( elem, index, true );
+				hooks.stop( gotoEnd );
+			}
+
+			if ( type == null ) {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+						stopQueue( this, data, index );
+					}
+				}
+			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+				stopQueue( this, data, index );
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					if ( gotoEnd ) {
+
+						// force the next step to be the last
+						timers[ index ]( true );
+					} else {
+						timers[ index ].saveState();
+					}
+					hadTimers = true;
+					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 ( !( gotoEnd && hadTimers ) ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx( "show", 1 ),
+	slideUp: genFx( "hide", 1 ),
+	slideToggle: genFx( "toggle", 1 ),
+	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.extend({
+	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( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue ) {
+				jQuery.dequeue( this, opt.queue );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.end = to;
+		this.now = this.start = from;
+		this.pos = this.state = 0;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+		function t( gotoEnd ) {
+			return self.step( gotoEnd );
+		}
+
+		t.queue = this.options.queue;
+		t.elem = this.elem;
+		t.saveState = function() {
+			if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+				jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+			}
+		};
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any flash of content
+		if ( dataShow !== undefined ) {
+			// This show is picking up where a previous hide or show left off
+			this.custom( this.cur(), dataShow );
+		} else {
+			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+		}
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom( this.cur(), 0 );
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var p, n, complete,
+			t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( p in options.animatedProperties ) {
+				if ( options.animatedProperties[ p ] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+						elem.style[ "overflow" + value ] = options.overflow[ index ];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery( elem ).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[ p ] );
+						jQuery.removeData( elem, "fxshow" + p, true );
+						// Toggle data is no longer needed
+						jQuery.removeData( elem, "toggle" + p, true );
+					}
+				}
+
+				// Execute the complete function
+				// in the event that the complete function throws an exception
+				// we must ensure it won't be called twice. #5684
+
+				complete = options.complete;
+				if ( complete ) {
+
+					options.complete = false;
+					complete.call( elem );
+				}
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ( (this.end - this.start) * this.pos );
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timer,
+			timers = jQuery.timers,
+			i = 0;
+
+		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();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+// Adds width/height step functions
+// Do not set anything below 0
+jQuery.each([ "width", "height" ], function( i, prop ) {
+	jQuery.fx.step[ prop ] = function( fx ) {
+		jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+	};
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// 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 null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function( val ) {
+		var elem, win;
+
+		if ( val === undefined ) {
+			elem = this[ 0 ];
+
+			if ( !elem ) {
+				return null;
+			}
+
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+
+		// Set the scroll offset
+		return this.each(function() {
+			win = getWindow( this );
+
+			if ( win ) {
+				win.scrollTo(
+					!i ? val : jQuery( win ).scrollLeft(),
+					 i ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				this[ method ] = val;
+			}
+		});
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ],
+				body = elem.document.body;
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				body && body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNumeric( ret ) ? ret : orig;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use 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.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
diff --git a/static/js/npm-debug.log b/static/js/npm-debug.log
new file mode 100644
index 0000000000000000000000000000000000000000..4e09e91fde194dd94e4b1d80b424096fbd1de6cb
--- /dev/null
+++ b/static/js/npm-debug.log
@@ -0,0 +1,87 @@
+0 info it worked if it ends with ok
+1 verbose cli [ 'node', '/usr/local/bin/npm', 'install', 'jscompress' ]
+2 info using npm@2.1.17
+3 info using node@v0.10.33
+4 warn package.json version2@2.0.0 No description
+5 warn package.json version2@2.0.0 No repository field.
+6 warn package.json version2@2.0.0 No README data
+7 silly cache add args [ 'jscompress', null ]
+8 verbose cache add spec jscompress
+9 silly cache add parsed spec { raw: 'jscompress',
+9 silly cache add   scope: null,
+9 silly cache add   name: 'jscompress',
+9 silly cache add   rawSpec: '',
+9 silly cache add   spec: '*',
+9 silly cache add   type: 'range' }
+10 verbose addNamed jscompress@*
+11 silly addNamed semver.valid null
+12 silly addNamed semver.validRange *
+13 silly addNameRange { name: 'jscompress', range: '*', hasData: false }
+14 silly mapToRegistry name jscompress
+15 silly mapToRegistry using default registry
+16 silly mapToRegistry registry https://registry.npmjs.org/
+17 silly mapToRegistry uri https://registry.npmjs.org/jscompress
+18 verbose addNameRange registry:https://registry.npmjs.org/jscompress not in flight; fetching
+19 verbose request uri https://registry.npmjs.org/jscompress
+20 verbose request no auth needed
+21 info attempt registry request try #1 at 17:35:43
+22 verbose request id 6b15acec6da5398d
+23 http request GET https://registry.npmjs.org/jscompress
+24 http 404 https://registry.npmjs.org/jscompress
+25 verbose headers { date: 'Tue, 03 Mar 2015 16:35:43 GMT',
+25 verbose headers   server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)',
+25 verbose headers   'content-type': 'application/json',
+25 verbose headers   'cache-control': 'max-age=0',
+25 verbose headers   'content-length': '52',
+25 verbose headers   'accept-ranges': 'bytes',
+25 verbose headers   via: '1.1 varnish',
+25 verbose headers   age: '0',
+25 verbose headers   'x-served-by': 'cache-ams4145-AMS',
+25 verbose headers   'x-cache': 'MISS',
+25 verbose headers   'x-cache-hits': '0',
+25 verbose headers   'x-timer': 'S1425400543.831023,VS0,VE167',
+25 verbose headers   'keep-alive': 'timeout=10, max=50',
+25 verbose headers   connection: 'Keep-Alive' }
+26 silly get cb [ 404,
+26 silly get   { date: 'Tue, 03 Mar 2015 16:35:43 GMT',
+26 silly get     server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)',
+26 silly get     'content-type': 'application/json',
+26 silly get     'cache-control': 'max-age=0',
+26 silly get     'content-length': '52',
+26 silly get     'accept-ranges': 'bytes',
+26 silly get     via: '1.1 varnish',
+26 silly get     age: '0',
+26 silly get     'x-served-by': 'cache-ams4145-AMS',
+26 silly get     'x-cache': 'MISS',
+26 silly get     'x-cache-hits': '0',
+26 silly get     'x-timer': 'S1425400543.831023,VS0,VE167',
+26 silly get     'keep-alive': 'timeout=10, max=50',
+26 silly get     connection: 'Keep-Alive' } ]
+27 verbose stack Error: 404 Not Found: jscompress
+27 verbose stack     at CachingRegistryClient.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:241:14)
+27 verbose stack     at Request._callback (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:172:14)
+27 verbose stack     at Request.self.callback (/usr/local/lib/node_modules/npm/node_modules/request/request.js:373:22)
+27 verbose stack     at Request.emit (events.js:98:17)
+27 verbose stack     at Request.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/request/request.js:1318:14)
+27 verbose stack     at Request.emit (events.js:117:20)
+27 verbose stack     at IncomingMessage.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/request/request.js:1266:12)
+27 verbose stack     at IncomingMessage.emit (events.js:117:20)
+27 verbose stack     at _stream_readable.js:943:16
+27 verbose stack     at process._tickCallback (node.js:419:13)
+28 verbose statusCode 404
+29 verbose pkgid jscompress
+30 verbose cwd /Users/kartben/Repositories/m2m.eclipse.org/js
+31 error Darwin 14.1.0
+32 error argv "node" "/usr/local/bin/npm" "install" "jscompress"
+33 error node v0.10.33
+34 error npm  v2.1.17
+35 error code E404
+36 error 404 Not Found: jscompress
+36 error 404
+36 error 404 'jscompress' is not in the npm registry.
+36 error 404 You should bug the author to publish it (or use the name yourself!)
+36 error 404 It was specified as a dependency of 'version2'
+36 error 404
+36 error 404 Note that you can also install from a
+36 error 404 tarball, folder, http url, or git url.
+37 verbose exit [ 1, true ]
diff --git a/static/js/projects.js b/static/js/projects.js
new file mode 100644
index 0000000000000000000000000000000000000000..8e2db1572064ba9c46472e29b629c790005fa0c2
--- /dev/null
+++ b/static/js/projects.js
@@ -0,0 +1,141 @@
+/*!
+ * community.js by Christopher Guindon - @chrisguindon
+ * Copyright 2013 Eclipse Foundation
+ * http://www.eclipse.org/org/documents/epl-v10.php
+ */
+(function($, window, document) {
+    $(function() {
+
+        $(window).resize(function() {
+            resize();
+        });
+
+        $(document).on('click', '.itembox, .news-list li', function() {
+            var link = $(this).find('.readmore').attr('href');
+            $(location).attr('href', link);
+            return false;
+        });
+
+        $('.btn-projects').on('click', function() {
+            var $btn = $(this);
+            //            window.alert('bx');
+            $btn.button('toggle')
+        })
+
+        $.ajax({
+            type: "GET",
+            url: "//projects.eclipse.org/jsonp/technology/Internet%20of%20Things",
+            dataType: "jsonp",
+            cache: true,
+            success: function(data) {
+
+                var val = 20;
+                $('.progress-bar').css('width', val + '%').attr('aria-valuenow', val);
+
+                var output = "<div class=\"all-projects row-fluid\">";
+                var i = 0;
+
+                $.each(data, function(key, value) {
+                    i++;
+                    var val = 20 + (i / Object.keys(data).length) * 80;
+
+                    $('.progress-bar').css('width', val + '%').attr('aria-valuenow', val);
+
+
+                    // Clean up and remove HTML.
+                    var title = stringJanitor(value.name);
+                    var id = stringJanitor(value.id);
+                    var desc = stringJanitor(value.description, {
+                        "cut": true,
+                        "ellipsis": "&hellip;"
+                    });
+                    var link = value.website;
+                    var logo = value.logo;
+                    var style = "";
+                    var showlogo = false;
+
+                    if (id == 'rt.ecf' || id == 'tools.sequoyah.mtj' || id == "technology.koneki")
+                        return true;
+
+                    output += "<div class=\"col-md-4 col-sm-6 itembox\"" + style + ">";
+                    if (validateUrl(logo) && showlogo === true) {
+                        output += "<img class =\"logo\" alt=\"" + title + " logo\" src=\"" + logo + "\">";
+                    } else {
+                        output += "<h1 class=\"purple\">" + title + "</h1>";
+                    }
+
+                    output += "<p>" + desc + "</p>";
+
+                    if (!validateUrl(link)) {
+                        link = "http://projects.eclipse.org/projects/" + id;
+                    }
+
+
+                    output += "<a href=\"" + link + "\" class=\"readmore\">Read more <i class=\"icon-chevron-right\"></i></a>";
+                    output += "</div>";
+                    i++;
+                });
+
+                $("#update-project").empty();
+                $("#update-project").removeClass("loading");
+
+
+                // Insert html and resize the boxes.
+                $("#update-project").append('</div>' + output);
+                resize();
+
+                $('.all-projects').shuffle();
+
+            },
+        });
+
+    });
+    // Validate URL.
+    var validateUrl = function validateUrl(str) {
+        return (/^(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i).test(str);
+    };
+
+    // Set same height to all .itembox in a row.
+    var resize = function() {
+        $('.itembox').css({
+            "height": "auto"
+        });
+        $('.row-fluid').each(function() {
+            var highestBox = 0;
+            $('.itembox', this).each(function() {
+                if ($(this).height() > highestBox) {
+                    highestBox = $(this).outerHeight();
+                }
+            });
+            $('.itembox', this).height(highestBox);
+        });
+    };
+
+    // Remove html, add ellipsis and cut strings.
+    var stringJanitor = function(str, options) {
+        var settings = $.extend({
+            // These are the defaults.
+            start: 0,
+            end: 200,
+            html: false,
+            ellipsis: "",
+            cut: false,
+        }, options);
+        var text = "";
+        // Remove HTML.
+        if (!settings.html) {
+            text = str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/g, "");
+        }
+
+        // Shorten the string.
+        if (settings.cut) {
+            var cutat = text.lastIndexOf(' ', settings.end);
+            if (cutat !== -1) {
+                text = text.substring(settings.start, cutat) + settings.ellipsis;
+            }
+        }
+        return text;
+    };
+
+}(window.jQuery, window, document));
+// The global jQuery object is passed as a parameter
diff --git a/static/js/rss_update.js b/static/js/rss_update.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5ffbcd523d14b7b5b0ca283eac527e60be24aa7
--- /dev/null
+++ b/static/js/rss_update.js
@@ -0,0 +1,28 @@
+$('#rssdata')
+		.ready(
+				function() {
+					var pipe_url = 'http://pipes.yahoo.com/pipes/pipe.run?_id=aedbf3bc8ceeda32ebc49a51a40be9d5&_render=json&_callback=?';
+					$.getJSON(pipe_url, function(data) {
+						$(data.value.items).each(
+								function(index, item) {
+									var item_html = '<li><a id="rss' + index
+											+ '" href="' + item.link + '">'
+											+ item.title + '</a> &mdash; '
+											+ item['y:published'].month_name
+											+ ', ' + item['y:published'].day
+											+ ', ' + item['y:published'].year
+											+ '</li>';
+									$('#rssdata ul.rss-items')
+											.append(item_html);
+//									$('#rss' + index).popover({
+//										trigger : 'hover',
+//										html : true,
+//										content : item.description,
+//										title : item.title
+//									});
+								});
+
+						$('#rssdata div.loading').fadeOut();
+						$('#rssdata ul.rss-items').slideDown();
+					});
+				});
diff --git a/static/js/shuffle.js b/static/js/shuffle.js
new file mode 100644
index 0000000000000000000000000000000000000000..9bdc80749c39c19416ff1d39abfd168acc60f857
--- /dev/null
+++ b/static/js/shuffle.js
@@ -0,0 +1,11 @@
+$.fn.shuffle = function() {
+    return this.each(function() {
+        var items = $(this).children().clone(true);
+        return (items.length) ? $(this).html($.shuffle(items)) : this;
+    });
+}
+
+$.shuffle = function(arr) {
+    for (var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
+    return arr;
+}
\ No newline at end of file
diff --git a/static/less/Makefile b/static/less/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d3fc4dff42f438248fbb7148f3cc686e02a31188
--- /dev/null
+++ b/static/less/Makefile
@@ -0,0 +1,103 @@
+BOOTSTRAP_LESS = ./bootstrap.less
+BOOTSTRAP_RESPONSIVE_LESS = ./responsive.less
+
+BOOTSTRAP = ../css/bootstrap.css
+BOOTSTRAP_RESPONSIVE = ../css/bootstrap-responsive.css
+
+DATE=$(shell date +%I:%M%p)
+CHECK=\033[32m✔\033[39m
+HR=\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
+
+
+#
+# BUILD DOCS
+#
+
+build:
+	@echo "\n${HR}"
+	@echo "Building Bootstrap..."
+	@echo "${HR}\n"
+	@jshint js/*.js --config js/.jshintrc
+	@jshint js/tests/unit/*.js --config js/.jshintrc
+	@echo "Running JSHint on javascript...             ${CHECK} Done"
+	@recess --compile ${BOOTSTRAP_LESS} > ${BOOTSTRAP}
+	@recess --compile ${BOOTSTRAP_RESPONSIVE_LESS} > ${BOOTSTRAP_RESPONSIVE}
+	@echo "Compiling LESS with Recess...               ${CHECK} Done"
+	@node docs/build
+	@cp img/* docs/assets/img/
+	@cp js/*.js docs/assets/js/
+	@cp js/tests/vendor/jquery.js docs/assets/js/
+	@echo "Compiling documentation...                  ${CHECK} Done"
+	@cat js/bootstrap-transition.js js/bootstrap-alert.js js/bootstrap-button.js js/bootstrap-carousel.js js/bootstrap-collapse.js js/bootstrap-dropdown.js js/bootstrap-modal.js js/bootstrap-tooltip.js js/bootstrap-popover.js js/bootstrap-scrollspy.js js/bootstrap-tab.js js/bootstrap-typeahead.js js/bootstrap-affix.js > docs/assets/js/bootstrap.js
+	@uglifyjs -nc docs/assets/js/bootstrap.js > docs/assets/js/bootstrap.min.tmp.js
+	@echo "/**\n* Bootstrap.js by @fat & @mdo\n* Copyright 2012 Twitter, Inc.\n* http://www.apache.org/licenses/LICENSE-2.0.txt\n*/" > docs/assets/js/copyright.js
+	@cat docs/assets/js/copyright.js docs/assets/js/bootstrap.min.tmp.js > docs/assets/js/bootstrap.min.js
+	@rm docs/assets/js/copyright.js docs/assets/js/bootstrap.min.tmp.js
+	@echo "Compiling and minifying javascript...       ${CHECK} Done"
+	@echo "\n${HR}"
+	@echo "Bootstrap successfully built at ${DATE}."
+	@echo "${HR}\n"
+	@echo "Thanks for using Bootstrap,"
+	@echo "<3 @mdo and @fat\n"
+
+#
+# RUN JSHINT & QUNIT TESTS IN PHANTOMJS
+#
+
+test:
+	jshint js/*.js --config js/.jshintrc
+	jshint js/tests/unit/*.js --config js/.jshintrc
+	node js/tests/server.js &
+	phantomjs js/tests/phantom.js "http://localhost:3000/js/tests"
+	kill -9 `cat js/tests/pid.txt`
+	rm js/tests/pid.txt
+
+#
+# BUILD SIMPLE BOOTSTRAP DIRECTORY
+# recess & uglifyjs are required
+#
+
+bootstrap:
+#	mkdir -p bootstrap/img
+#	mkdir -p bootstrap/css
+#	mkdir -p bootstrap/js
+#	cp img/* bootstrap/img/
+	recess --compile ${BOOTSTRAP_LESS} > ../css/bootstrap/bootstrap.css
+	recess --compress ${BOOTSTRAP_LESS} > ../css/bootstrap/bootstrap.min.css
+	recess --compile ${BOOTSTRAP_RESPONSIVE_LESS} > ../css/bootstrap/bootstrap-responsive.css
+	recess --compress ${BOOTSTRAP_RESPONSIVE_LESS} > ../css/bootstrap/bootstrap-responsive.min.css
+#	cat js/bootstrap-transition.js js/bootstrap-alert.js js/bootstrap-button.js js/bootstrap-carousel.js js/bootstrap-collapse.js js/bootstrap-dropdown.js js/bootstrap-modal.js js/bootstrap-tooltip.js js/bootstrap-popover.js js/bootstrap-scrollspy.js js/bootstrap-tab.js js/bootstrap-typeahead.js > bootstrap/js/bootstrap.js
+#	uglifyjs -nc bootstrap/js/bootstrap.js > bootstrap/js/bootstrap.min.tmp.js
+#	echo "/*!\n* Bootstrap.js by @fat & @mdo\n* Copyright 2012 Twitter, Inc.\n* http://www.apache.org/licenses/LICENSE-2.0.txt\n*/" > bootstrap/js/copyright.js
+#	cat bootstrap/js/copyright.js bootstrap/js/bootstrap.min.tmp.js > bootstrap/js/bootstrap.min.js
+#	rm bootstrap/js/copyright.js bootstrap/js/bootstrap.min.tmp.js
+
+#
+# MAKE FOR GH-PAGES 4 FAT & MDO ONLY (O_O  )
+#
+
+gh-pages: bootstrap docs
+	rm -f docs/assets/bootstrap.zip
+	zip -r docs/assets/bootstrap.zip bootstrap
+	rm -r bootstrap
+	rm -f ../bootstrap-gh-pages/assets/bootstrap.zip
+	node docs/build production
+	cp -r docs/* ../bootstrap-gh-pages
+
+#
+# WATCH LESS FILES
+#
+
+watch:
+	echo "Watching less files..."; \
+	watchr -e "watch('*\.less') { system 'make' }"
+
+#
+# HAUNT GITHUB ISSUES 4 FAT & MDO ONLY (O_O  )
+#
+
+haunt:
+	@haunt .issue-guidelines.js https://github.com/twitter/bootstrap
+
+
+.PHONY: docs watch gh-pages
\ No newline at end of file
diff --git a/static/less/README b/static/less/README
new file mode 100644
index 0000000000000000000000000000000000000000..50d51eff5bdd0513cb4b02054fedff9537e108b0
--- /dev/null
+++ b/static/less/README
@@ -0,0 +1 @@
+You can recompile the less files by issuing "make bootstrap". The CSS files will be automatically copied to the location that all the HTML pages reference.
diff --git a/static/less/accordion.less b/static/less/accordion.less
new file mode 100644
index 0000000000000000000000000000000000000000..c13c7be260901c9b625b4c90a0623b48ed7a54c6
--- /dev/null
+++ b/static/less/accordion.less
@@ -0,0 +1,34 @@
+//
+// Accordion
+// --------------------------------------------------
+
+
+// Parent container
+.accordion {
+  margin-bottom: @baseLineHeight;
+}
+
+// Group == heading + body
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  .border-radius(4px);
+}
+.accordion-heading {
+  border-bottom: 0;
+}
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+
+// General toggle styles
+.accordion-toggle {
+  cursor: pointer;
+}
+
+// Inner needs the styles because you can't animate properly with any styles on the element
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
diff --git a/static/less/alerts.less b/static/less/alerts.less
new file mode 100644
index 0000000000000000000000000000000000000000..6df5fd72d0c0fa298a3df51d6e2e481ce4310f40
--- /dev/null
+++ b/static/less/alerts.less
@@ -0,0 +1,65 @@
+//
+// Alerts
+// --------------------------------------------------
+
+
+// Base styles
+// -------------------------
+
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: @baseLineHeight;
+  text-shadow: 0 1px 0 rgba(255,255,255,.5);
+  background-color: @warningBackground;
+  border: 1px solid @warningBorder;
+  .border-radius(4px);
+  color: @warningText;
+}
+.alert h4 {
+  margin: 0;
+}
+
+// Adjust close link position
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: @baseLineHeight;
+}
+
+
+// Alternate styles
+// -------------------------
+
+.alert-success {
+  background-color: @successBackground;
+  border-color: @successBorder;
+  color: @successText;
+}
+.alert-danger,
+.alert-error {
+  background-color: @errorBackground;
+  border-color: @errorBorder;
+  color: @errorText;
+}
+.alert-info {
+  background-color: @infoBackground;
+  border-color: @infoBorder;
+  color: @infoText;
+}
+
+
+// Block alerts
+// -------------------------
+
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+.alert-block p + p {
+  margin-top: 5px;
+}
diff --git a/static/less/bootstrap.less b/static/less/bootstrap.less
new file mode 100644
index 0000000000000000000000000000000000000000..231d244ff988d8cd7e2f0bf7ceac4203d96dbef1
--- /dev/null
+++ b/static/less/bootstrap.less
@@ -0,0 +1,66 @@
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+// CSS Reset
+@import "reset.less";
+
+// Core variables and mixins
+@import "variables.less"; // Modify this for custom colors, font-sizes, etc
+@import "mixins.less";
+
+// Grid system and page structure
+@import "scaffolding.less";
+@import "grid.less";
+@import "layouts.less";
+
+// Base CSS
+@import "type.less";
+@import "code.less";
+@import "forms.less";
+@import "tables.less";
+
+// Components: common
+//@import "sprites.less";
+@import "font-awesome.less";
+@import "dropdowns.less";
+@import "wells.less";
+@import "component-animations.less";
+@import "close.less";
+
+// Components: Buttons & Alerts
+@import "buttons.less";
+@import "button-groups.less";
+@import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
+
+// Components: Nav
+@import "navs.less";
+@import "navbar.less";
+@import "breadcrumbs.less";
+@import "pagination.less";
+@import "pager.less";
+
+// Components: Popovers
+@import "modals.less";
+@import "tooltip.less";
+@import "popovers.less";
+
+// Components: Misc
+@import "thumbnails.less";
+@import "labels-badges.less";
+@import "progress-bars.less";
+@import "accordion.less";
+@import "carousel.less";
+@import "hero-unit.less";
+//@import "m2m.eclipse.org.less";
+@import "m2m.eclipse.org.animations.less";
+
+// Utility classes
+@import "utilities.less"; // Has to be last to override when necessary
+
diff --git a/static/less/breadcrumbs.less b/static/less/breadcrumbs.less
new file mode 100644
index 0000000000000000000000000000000000000000..fd269b31a07564188d24cf3ff29bc25d54220d88
--- /dev/null
+++ b/static/less/breadcrumbs.less
@@ -0,0 +1,24 @@
+//
+// Breadcrumbs
+// --------------------------------------------------
+
+
+.breadcrumb {
+  padding: 8px 15px;
+  margin: 0 0 @baseLineHeight;
+  list-style: none;
+  background-color: #f5f5f5;
+  .border-radius(4px);
+  li {
+    display: inline-block;
+    .ie7-inline-block();
+    text-shadow: 0 1px 0 @white;
+  }
+  .divider {
+    padding: 0 5px;
+    color: #ccc;
+  }
+  .active {
+    color: @grayLight;
+  }
+}
diff --git a/static/less/button-groups.less b/static/less/button-groups.less
new file mode 100644
index 0000000000000000000000000000000000000000..77496d6ab8d806fa55cd56dbc6b5818a0077881e
--- /dev/null
+++ b/static/less/button-groups.less
@@ -0,0 +1,244 @@
+//
+// Button groups
+// --------------------------------------------------
+
+
+// Make the div behave like a button
+.btn-group {
+  position: relative;
+  font-size: 0; // remove as part 1 of font-size inline-block hack
+  white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page)
+  .ie7-restore-left-whitespace();
+}
+
+// Space out series of button groups
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+
+// Optional: Group multiple button groups together for a toolbar
+.btn-toolbar {
+  font-size: 0; // Hack to remove whitespace that results from using inline-block
+  margin-top: @baseLineHeight / 2;
+  margin-bottom: @baseLineHeight / 2;
+  .btn-group {
+    display: inline-block;
+    .ie7-inline-block();
+  }
+  .btn + .btn,
+  .btn-group + .btn,
+  .btn + .btn-group {
+    margin-left: 5px;
+  }
+}
+
+// Float them, remove border radius, then re-add to first and last elements
+.btn-group > .btn {
+  position: relative;
+  .border-radius(0);
+}
+.btn-group > .btn + .btn {
+  margin-left: -1px;
+}
+.btn-group > .btn,
+.btn-group > .dropdown-menu {
+  font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack
+}
+
+// Reset fonts for other sizes
+.btn-group > .btn-mini {
+  font-size: 11px;
+}
+.btn-group > .btn-small {
+  font-size: 12px;
+}
+.btn-group > .btn-large {
+  font-size: 16px;
+}
+
+// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
+.btn-group > .btn:first-child {
+  margin-left: 0;
+     -webkit-border-top-left-radius: 4px;
+         -moz-border-radius-topleft: 4px;
+             border-top-left-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+      -moz-border-radius-bottomleft: 4px;
+          border-bottom-left-radius: 4px;
+}
+// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+     -webkit-border-top-right-radius: 4px;
+         -moz-border-radius-topright: 4px;
+             border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+      -moz-border-radius-bottomright: 4px;
+          border-bottom-right-radius: 4px;
+}
+// Reset corners for large buttons
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+     -webkit-border-top-left-radius: 6px;
+         -moz-border-radius-topleft: 6px;
+             border-top-left-radius: 6px;
+  -webkit-border-bottom-left-radius: 6px;
+      -moz-border-radius-bottomleft: 6px;
+          border-bottom-left-radius: 6px;
+}
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+     -webkit-border-top-right-radius: 6px;
+         -moz-border-radius-topright: 6px;
+             border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+      -moz-border-radius-bottomright: 6px;
+          border-bottom-right-radius: 6px;
+}
+
+// On hover/focus/active, bring the proper btn to front
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+
+// On active and open, don't show outline
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+
+
+// Split button dropdowns
+// ----------------------
+
+// Give the line between buttons some depth
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+  .box-shadow(~"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
+  *padding-top: 5px;
+  *padding-bottom: 5px;
+}
+.btn-group > .btn-mini + .dropdown-toggle {
+  padding-left: 5px;
+  padding-right: 5px;
+  *padding-top: 2px;
+  *padding-bottom: 2px;
+}
+.btn-group > .btn-small + .dropdown-toggle {
+  *padding-top: 5px;
+  *padding-bottom: 4px;
+}
+.btn-group > .btn-large + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+
+.btn-group.open {
+
+  // The clickable button for toggling the menu
+  // Remove the gradient and set the same inset shadow as the :active state
+  .dropdown-toggle {
+    background-image: none;
+    .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
+  }
+
+  // Keep the hover's background when dropdown is open
+  .btn.dropdown-toggle {
+    background-color: @btnBackgroundHighlight;
+  }
+  .btn-primary.dropdown-toggle {
+    background-color: @btnPrimaryBackgroundHighlight;
+  }
+  .btn-warning.dropdown-toggle {
+    background-color: @btnWarningBackgroundHighlight;
+  }
+  .btn-danger.dropdown-toggle {
+    background-color: @btnDangerBackgroundHighlight;
+  }
+  .btn-success.dropdown-toggle {
+    background-color: @btnSuccessBackgroundHighlight;
+  }
+  .btn-info.dropdown-toggle {
+    background-color: @btnInfoBackgroundHighlight;
+  }
+  .btn-inverse.dropdown-toggle {
+    background-color: @btnInverseBackgroundHighlight;
+  }
+}
+
+
+// Reposition the caret
+.btn .caret {
+  margin-top: 8px;
+  margin-left: 0;
+}
+// Carets in other button sizes
+.btn-mini .caret,
+.btn-small .caret,
+.btn-large .caret {
+  margin-top: 6px;
+}
+.btn-large .caret {
+  border-left-width:  5px;
+  border-right-width: 5px;
+  border-top-width:   5px;
+}
+// Upside down carets for .dropup
+.dropup .btn-large .caret {
+  border-bottom: 5px solid @black;
+  border-top: 0;
+}
+
+
+
+// Account for other colors
+.btn-primary,
+.btn-warning,
+.btn-danger,
+.btn-info,
+.btn-success,
+.btn-inverse {
+  .caret {
+    border-top-color: @white;
+    border-bottom-color: @white;
+  }
+}
+
+
+
+// Vertical button groups
+// ----------------------
+
+.btn-group-vertical {
+  display: inline-block; // makes buttons only take up the width they need
+  .ie7-inline-block();
+}
+.btn-group-vertical .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  .border-radius(0);
+}
+.btn-group-vertical .btn + .btn {
+  margin-left: 0;
+  margin-top: -1px;
+}
+.btn-group-vertical .btn:first-child {
+  .border-radius(4px 4px 0 0);
+}
+.btn-group-vertical .btn:last-child {
+  .border-radius(0 0 4px 4px);
+}
+.btn-group-vertical .btn-large:first-child {
+  .border-radius(6px 6px 0 0);
+}
+.btn-group-vertical .btn-large:last-child {
+  .border-radius(0 0 6px 6px);
+}
diff --git a/static/less/buttons.less b/static/less/buttons.less
new file mode 100644
index 0000000000000000000000000000000000000000..077616e990bf38de04855c75f4eb04f2caca972d
--- /dev/null
+++ b/static/less/buttons.less
@@ -0,0 +1,211 @@
+//
+// Buttons
+// --------------------------------------------------
+
+
+// Base styles
+// --------------------------------------------------
+
+// Core
+.btn {
+  display: inline-block;
+  .ie7-inline-block();
+  padding: 4px 14px;
+  margin-bottom: 0; // For input.btn
+  font-size: @baseFontSize;
+  line-height: @baseLineHeight;
+  *line-height: @baseLineHeight;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));
+  border: 1px solid @btnBorder;
+  *border: 0; // Remove the border to prevent IE7's black border on input:focus
+  border-bottom-color: darken(@btnBorder, 10%);
+  .border-radius(4px);
+  .ie7-restore-left-whitespace(); // Give IE7 some love
+  .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
+
+  // Hover state
+  &:hover {
+    color: @grayDark;
+    text-decoration: none;
+    background-color: darken(@white, 10%);
+    *background-color: darken(@white, 15%); /* Buttons in IE7 don't get borders, so darken on hover */
+    background-position: 0 -15px;
+
+    // transition is only when going to hover, otherwise the background
+    // behind the gradient (there for IE<=9 fallback) gets mismatched
+    .transition(background-position .1s linear);
+  }
+
+  // Focus state for keyboard and accessibility
+  &:focus {
+    .tab-focus();
+  }
+
+  // Active state
+  &.active,
+  &:active {
+    background-color: darken(@white, 10%);
+    background-color: darken(@white, 15%) e("\9");
+    background-image: none;
+    outline: 0;
+    .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
+  }
+
+  // Disabled state
+  &.disabled,
+  &[disabled] {
+    cursor: default;
+    background-color: darken(@white, 10%);
+    background-image: none;
+    .opacity(65);
+    .box-shadow(none);
+  }
+
+}
+
+
+
+// Button Sizes
+// --------------------------------------------------
+
+// Large
+.btn-large {
+  padding: 9px 14px;
+  font-size: @baseFontSize + 2px;
+  line-height: normal;
+  .border-radius(5px);
+}
+.btn-large [class^="icon-"] {
+  margin-top: 2px;
+}
+
+// Small
+.btn-small {
+  padding: 3px 9px;
+  font-size: @baseFontSize - 2px;
+  line-height: @baseLineHeight - 2px;
+}
+.btn-small [class^="icon-"] {
+  margin-top: 0;
+}
+
+// Mini
+.btn-mini {
+  padding: 2px 6px;
+  font-size: @baseFontSize - 3px;
+  line-height: @baseLineHeight - 4px;
+}
+
+// Block button
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+  .box-sizing(border-box);
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+
+// Alternate buttons
+// --------------------------------------------------
+
+// Provide *some* extra contrast for those who can get it
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255,255,255,.75);
+}
+
+// Set the backgrounds
+// -------------------------
+.btn {
+  // reset here as of 2.0.3 due to Recess property order
+  border-color: #c5c5c5;
+  border-color: rgba(0,0,0,.15) rgba(0,0,0,.15) rgba(0,0,0,.25);
+}
+.btn-primary {
+  .buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);
+}
+// Warning appears are orange
+.btn-warning {
+  .buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight);
+}
+// Danger and error appear as red
+.btn-danger {
+  .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight);
+}
+// Success appears as green
+.btn-success {
+  .buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight);
+}
+// Info appears as a neutral blue
+.btn-info {
+  .buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight);
+}
+// Inverse appears as dark gray
+.btn-inverse {
+  .buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight);
+}
+
+
+// Cross-browser Jank
+// --------------------------------------------------
+
+button.btn,
+input[type="submit"].btn {
+
+  // Firefox 3.6 only I believe
+  &::-moz-focus-inner {
+    padding: 0;
+    border: 0;
+  }
+
+  // IE7 has some default padding on button controls
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+
+  &.btn-large {
+    *padding-top: 7px;
+    *padding-bottom: 7px;
+  }
+  &.btn-small {
+    *padding-top: 3px;
+    *padding-bottom: 3px;
+  }
+  &.btn-mini {
+    *padding-top: 1px;
+    *padding-bottom: 1px;
+  }
+}
+
+
+// Link buttons
+// --------------------------------------------------
+
+// Make a button look and behave like a link
+.btn-link,
+.btn-link:active {
+  background-color: transparent;
+  background-image: none;
+  .box-shadow(none);
+}
+.btn-link {
+  border-color: transparent;
+  cursor: pointer;
+  color: @linkColor;
+  .border-radius(0);
+}
+.btn-link:hover {
+  color: @linkColorHover;
+  text-decoration: underline;
+  background-color: transparent;
+}
diff --git a/static/less/carousel.less b/static/less/carousel.less
new file mode 100644
index 0000000000000000000000000000000000000000..843bda8f2303a57c8fa6326e76a4929961c1916e
--- /dev/null
+++ b/static/less/carousel.less
@@ -0,0 +1,131 @@
+//
+// Carousel
+// --------------------------------------------------
+
+
+.carousel {
+  position: relative;
+  margin-bottom: @baseLineHeight;
+  line-height: 1;
+}
+
+.carousel-inner {
+  overflow: hidden;
+  width: 100%;
+  position: relative;
+}
+
+.carousel {
+
+  .item {
+    display: none;
+    position: relative;
+    .transition(.6s ease-in-out left);
+  }
+
+  // Account for jankitude on images
+  .item > img {
+    display: block;
+    line-height: 1;
+  }
+
+  .active,
+  .next,
+  .prev { display: block; }
+
+  .active {
+    left: 0;
+  }
+
+  .next,
+  .prev {
+    position: absolute;
+    top: 0;
+    width: 100%;
+  }
+
+  .next {
+    left: 100%;
+  }
+  .prev {
+    left: -100%;
+  }
+  .next.left,
+  .prev.right {
+    left: 0;
+  }
+
+  .active.left {
+    left: -100%;
+  }
+  .active.right {
+    left: 100%;
+  }
+
+}
+
+// Left/right controls for nav
+// ---------------------------
+
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: @white;
+  text-align: center;
+//  background: @grayDarker;
+//  border: 3px solid @white;
+//  .border-radius(23px);
+//  .opacity(50);
+
+  // we can't have this transition here
+  // because webkit cancels the carousel
+  // animation if you trip this while
+  // in the middle of another animation
+  // ;_;
+  // .transition(opacity .2s linear);
+
+  // Reposition the right one
+  &.right {
+    left: auto;
+    right: 15px;
+  }
+
+  // Hover state
+  &:hover {
+    color: @white;
+    text-decoration: none;
+    .opacity(90);
+  }
+}
+
+
+// Caption for text below images
+// -----------------------------
+
+.carousel-caption {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  padding: 15px;
+  background: @blueDark;
+//  background: rgba(22,23,28,1);
+}
+.carousel-caption h4,
+.carousel-caption p {
+  color: @white;
+  line-height: @baseLineHeight;
+}
+.carousel-caption h4 {
+  margin: 0 0 5px;
+}
+.carousel-caption p {
+  margin-bottom: 0;
+}
diff --git a/static/less/close.less b/static/less/close.less
new file mode 100644
index 0000000000000000000000000000000000000000..c71a508f3ff4c629231dab750b82584519090df5
--- /dev/null
+++ b/static/less/close.less
@@ -0,0 +1,31 @@
+//
+// Close icons
+// --------------------------------------------------
+
+
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: @baseLineHeight;
+  color: @black;
+  text-shadow: 0 1px 0 rgba(255,255,255,1);
+  .opacity(20);
+  &:hover {
+    color: @black;
+    text-decoration: none;
+    cursor: pointer;
+    .opacity(40);
+  }
+}
+
+// Additional properties for button version
+// iOS requires the button element instead of an anchor tag.
+// If you want the anchor version, it requires `href="#"`.
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
\ No newline at end of file
diff --git a/static/less/code.less b/static/less/code.less
new file mode 100644
index 0000000000000000000000000000000000000000..f1851a074c5d3f38849233e3356a7bcba20ee20e
--- /dev/null
+++ b/static/less/code.less
@@ -0,0 +1,58 @@
+//
+// Code (inline and blocK)
+// --------------------------------------------------
+
+
+// Inline and block code styles
+code,
+pre {
+  padding: 0 3px 2px;
+  #font > #family > .monospace;
+  font-size: @baseFontSize - 2;
+  color: @grayDark;
+  .border-radius(3px);
+}
+
+// Inline code
+code {
+  padding: 2px 4px;
+  color: #d14;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+
+// Blocks of code
+pre {
+  display: block;
+  padding: (@baseLineHeight - 1) / 2;
+  margin: 0 0 @baseLineHeight / 2;
+  font-size: @baseFontSize - 1; // 14px to 13px
+  line-height: @baseLineHeight;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc; // fallback for IE7-8
+  border: 1px solid rgba(0,0,0,.15);
+  .border-radius(4px);
+
+  // Make prettyprint styles more spaced out for readability
+  &.prettyprint {
+    margin-bottom: @baseLineHeight;
+  }
+
+  // Account for some code outputs that place code tags in pre tags
+  code {
+    padding: 0;
+    color: inherit;
+    background-color: transparent;
+    border: 0;
+  }
+}
+
+// Enable scrollable blocks of code
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
\ No newline at end of file
diff --git a/static/less/component-animations.less b/static/less/component-animations.less
new file mode 100644
index 0000000000000000000000000000000000000000..2166776d98ba7807e54353a475707cfd4571c80a
--- /dev/null
+++ b/static/less/component-animations.less
@@ -0,0 +1,23 @@
+//
+// Component animations
+// --------------------------------------------------
+
+
+.fade {
+  opacity: 0;
+  .transition(opacity .15s linear);
+  &.in {
+    opacity: 1;
+  }
+}
+
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  overflow: visible \9;
+  .transition(height .35s ease);
+  &.in {
+    height: auto;
+  }
+}
diff --git a/static/less/dropdowns.less b/static/less/dropdowns.less
new file mode 100644
index 0000000000000000000000000000000000000000..e83915dba51d47e24e5055e03058a8dd6cfcdf62
--- /dev/null
+++ b/static/less/dropdowns.less
@@ -0,0 +1,210 @@
+//
+// Dropdown menus
+// --------------------------------------------------
+
+
+// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns
+.dropup,
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle {
+  // The caret makes the toggle a bit too tall in IE7
+  *margin-bottom: -3px;
+}
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+
+// Dropdown arrow/caret
+// --------------------
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top:   4px solid @black;
+  border-right: 4px solid transparent;
+  border-left:  4px solid transparent;
+  content: "";
+}
+
+// Place the caret
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+
+// The dropdown menu (ul)
+// ----------------------
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: @zindexDropdown;
+  display: none; // none by default, but block on "open" of the menu
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0; // override default ul
+  list-style: none;
+  background-color: @dropdownBackground;
+  border: 1px solid #ccc; // Fallback for IE7-8
+  border: 1px solid @dropdownBorder;
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  .border-radius(6px);
+  .box-shadow(0 5px 10px rgba(0,0,0,.2));
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+
+  // Aligns the dropdown menu to right
+  &.pull-right {
+    right: 0;
+    left: auto;
+  }
+
+  // Dividers (basically an hr) within the dropdown
+  .divider {
+    .nav-divider(@dropdownDividerTop, @dropdownDividerBottom);
+  }
+
+  // Links within the dropdown menu
+  a {
+    display: block;
+    padding: 3px 20px;
+    clear: both;
+    font-weight: normal;
+    line-height: @baseLineHeight;
+    color: @dropdownLinkColor;
+    white-space: nowrap;
+  }
+}
+
+// Hover state
+// -----------
+.dropdown-menu li > a:hover,
+.dropdown-menu li > a:focus,
+.dropdown-submenu:hover > a {
+  text-decoration: none;
+  color: @dropdownLinkColorHover;
+  background-color: @dropdownLinkBackgroundHover;
+  #gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%));
+}
+
+// Active state
+// ------------
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: @dropdownLinkColorHover;
+  text-decoration: none;
+  outline: 0;
+  background-color: @dropdownLinkBackgroundActive;
+  #gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%));
+}
+
+// Disabled state
+// --------------
+// Gray out text and ensure the hover state remains gray
+.dropdown-menu .disabled > a,
+.dropdown-menu .disabled > a:hover {
+  color: @grayLight;
+}
+// Nuke hover effects
+.dropdown-menu .disabled > a:hover {
+  text-decoration: none;
+  background-color: transparent;
+  cursor: default;
+}
+
+// Open state for the dropdown
+// ---------------------------
+.open {
+  // IE7's z-index only goes to the nearest positioned ancestor, which would
+  // make the menu appear below buttons that appeared later on the page
+  *z-index: @zindexDropdown;
+
+  & > .dropdown-menu {
+    display: block;
+  }
+}
+
+// Right aligned dropdowns
+// ---------------------------
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+// Allow for dropdowns to go bottom up (aka, dropup-menu)
+// ------------------------------------------------------
+// Just add .dropup after the standard .dropdown class and you're set, bro.
+// TODO: abstract this so that the navbar fixed styles are not placed here?
+.dropup,
+.navbar-fixed-bottom .dropdown {
+  // Reverse the caret
+  .caret {
+    border-top: 0;
+    border-bottom: 4px solid @black;
+    content: "\2191";
+  }
+  // Different positioning for bottom up menu
+  .dropdown-menu {
+    top: auto;
+    bottom: 100%;
+    margin-bottom: 1px;
+  }
+}
+
+// Sub menus
+// ---------------------------
+.dropdown-submenu {
+  position: relative;
+}
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+     -moz-border-radius: 0 6px 6px 6px;
+          border-radius: 0 6px 6px 6px;
+}
+.dropdown-submenu:hover .dropdown-menu {
+  display: block;
+}
+
+.dropdown-submenu > a:after {
+  display: block;
+  content: " ";
+  float: right;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  border-left-color: darken(@dropdownBackground, 20%);
+  margin-top: 5px;
+  margin-right: -10px;
+}
+.dropdown-submenu:hover > a:after {
+  border-left-color: @dropdownLinkColorHover;
+}
+
+
+// Tweak nav headers
+// -----------------
+// Increase padding from 15px to 20px on sides
+.dropdown .dropdown-menu .nav-header {
+  padding-left: 20px;
+  padding-right: 20px;
+}
+
+// Typeahead
+// ---------
+.typeahead {
+  margin-top: 2px; // give it some space to breathe
+  .border-radius(4px);
+}
diff --git a/static/less/font-awesome.less b/static/less/font-awesome.less
new file mode 100644
index 0000000000000000000000000000000000000000..45f69edb6eef1c1d0ef87a438fa391c7c809b14e
--- /dev/null
+++ b/static/less/font-awesome.less
@@ -0,0 +1,329 @@
+/*  Font Awesome
+    the iconic font designed for use with Twitter Bootstrap
+    -------------------------------------------------------
+    The full suite of pictographic icons, examples, and documentation
+    can be found at: http://fortawesome.github.com/Font-Awesome/
+
+    License
+    -------------------------------------------------------
+    The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:
+    http://creativecommons.org/licenses/by/3.0/ A mention of
+    'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable
+    source code is considered acceptable attribution (most common on the web).
+    If human readable source code is not available to the end user, a mention in
+    an 'About' or 'Credits' screen is considered acceptable (most common in desktop
+    or mobile software).
+
+    Contact
+    -------------------------------------------------------
+    Email: dave@davegandy.com
+    Twitter: http://twitter.com/fortaweso_me
+    Work: Lead Product Designer @ http://kyruus.com
+
+    */
+
+@fontAwesomePath: '../font';
+
+@font-face {
+  font-family: 'FontAwesome';
+  src: url('@{fontAwesomePath}/fontawesome-webfont.eot');
+  src: url('@{fontAwesomePath}/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),
+    url('@{fontAwesomePath}/fontawesome-webfont.woff') format('woff'),
+    url('@{fontAwesomePath}/fontawesome-webfont.ttf') format('truetype'),
+    url('@{fontAwesomePath}/fontawesome-webfont.svg#FontAwesome') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+
+/*  Font Awesome styles
+    ------------------------------------------------------- */
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+  font-family: FontAwesome;
+  font-weight: normal;
+  font-style: normal;
+  display: inline-block;
+  text-decoration: inherit;
+}
+
+a [class^="icon-"],
+a [class*=" icon-"] {
+  display: inline-block;
+  text-decoration: inherit;
+}
+
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+  vertical-align: middle;
+  font-size: 4/3em;
+}
+
+.btn, .nav-tabs {
+  [class^="icon-"],
+  [class*=" icon-"] {
+  /* keeps button heights with and without icons the same */
+    line-height: .9em;
+  }
+}
+
+li {
+  [class^="icon-"],
+  [class*=" icon-"] {
+    display: inline-block;
+    width: 1.25em;
+    text-align: center;
+  }
+  .icon-large:before,
+  .icon-large:before {
+    /* 1.5 increased font size for icon-large * 1.25 width */
+    width: 1.5*1.25em;
+  }
+}
+
+ul.icons {
+  list-style-type: none;
+  margin-left: 2em;
+  text-indent: -.8em;
+
+  li {
+    [class^="icon-"],
+    [class*=" icon-"] {
+      width: .8em;
+    }
+    .icon-large:before,
+    .icon-large:before {
+      /* 1.5 increased font size for icon-large * 1.25 width */
+      vertical-align: initial;
+//      width: 1.5*1.25em;
+    }
+  }
+}
+
+/*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+    readers do not read off random characters that represent icons */
+.icon-glass:before                { content: "\f000"; }
+.icon-music:before                { content: "\f001"; }
+.icon-search:before               { content: "\f002"; }
+.icon-envelope:before             { content: "\f003"; }
+.icon-heart:before                { content: "\f004"; }
+.icon-star:before                 { content: "\f005"; }
+.icon-star-empty:before           { content: "\f006"; }
+.icon-user:before                 { content: "\f007"; }
+.icon-film:before                 { content: "\f008"; }
+.icon-th-large:before             { content: "\f009"; }
+.icon-th:before                   { content: "\f00a"; }
+.icon-th-list:before              { content: "\f00b"; }
+.icon-ok:before                   { content: "\f00c"; }
+.icon-remove:before               { content: "\f00d"; }
+.icon-zoom-in:before              { content: "\f00e"; }
+
+.icon-zoom-out:before             { content: "\f010"; }
+.icon-off:before                  { content: "\f011"; }
+.icon-signal:before               { content: "\f012"; }
+.icon-cog:before                  { content: "\f013"; }
+.icon-trash:before                { content: "\f014"; }
+.icon-home:before                 { content: "\f015"; }
+.icon-file:before                 { content: "\f016"; }
+.icon-time:before                 { content: "\f017"; }
+.icon-road:before                 { content: "\f018"; }
+.icon-download-alt:before         { content: "\f019"; }
+.icon-download:before             { content: "\f01a"; }
+.icon-upload:before               { content: "\f01b"; }
+.icon-inbox:before                { content: "\f01c"; }
+.icon-play-circle:before          { content: "\f01d"; }
+.icon-repeat:before               { content: "\f01e"; }
+
+/* \f020 doesn't work in Safari. all shifted one down */
+.icon-refresh:before              { content: "\f021"; }
+.icon-list-alt:before             { content: "\f022"; }
+.icon-lock:before                 { content: "\f023"; }
+.icon-flag:before                 { content: "\f024"; }
+.icon-headphones:before           { content: "\f025"; }
+.icon-volume-off:before           { content: "\f026"; }
+.icon-volume-down:before          { content: "\f027"; }
+.icon-volume-up:before            { content: "\f028"; }
+.icon-qrcode:before               { content: "\f029"; }
+.icon-barcode:before              { content: "\f02a"; }
+.icon-tag:before                  { content: "\f02b"; }
+.icon-tags:before                 { content: "\f02c"; }
+.icon-book:before                 { content: "\f02d"; }
+.icon-bookmark:before             { content: "\f02e"; }
+.icon-print:before                { content: "\f02f"; }
+
+.icon-camera:before               { content: "\f030"; }
+.icon-font:before                 { content: "\f031"; }
+.icon-bold:before                 { content: "\f032"; }
+.icon-italic:before               { content: "\f033"; }
+.icon-text-height:before          { content: "\f034"; }
+.icon-text-width:before           { content: "\f035"; }
+.icon-align-left:before           { content: "\f036"; }
+.icon-align-center:before         { content: "\f037"; }
+.icon-align-right:before          { content: "\f038"; }
+.icon-align-justify:before        { content: "\f039"; }
+.icon-list:before                 { content: "\f03a"; }
+.icon-indent-left:before          { content: "\f03b"; }
+.icon-indent-right:before         { content: "\f03c"; }
+.icon-facetime-video:before       { content: "\f03d"; }
+.icon-picture:before              { content: "\f03e"; }
+
+.icon-pencil:before               { content: "\f040"; }
+.icon-map-marker:before           { content: "\f041"; }
+.icon-adjust:before               { content: "\f042"; }
+.icon-tint:before                 { content: "\f043"; }
+.icon-edit:before                 { content: "\f044"; }
+.icon-share:before                { content: "\f045"; }
+.icon-check:before                { content: "\f046"; }
+.icon-move:before                 { content: "\f047"; }
+.icon-step-backward:before        { content: "\f048"; }
+.icon-fast-backward:before        { content: "\f049"; }
+.icon-backward:before             { content: "\f04a"; }
+.icon-play:before                 { content: "\f04b"; }
+.icon-pause:before                { content: "\f04c"; }
+.icon-stop:before                 { content: "\f04d"; }
+.icon-forward:before              { content: "\f04e"; }
+
+.icon-fast-forward:before         { content: "\f050"; }
+.icon-step-forward:before         { content: "\f051"; }
+.icon-eject:before                { content: "\f052"; }
+.icon-chevron-left:before         { content: "\f053"; }
+.icon-chevron-right:before        { content: "\f054"; }
+.icon-plus-sign:before            { content: "\f055"; }
+.icon-minus-sign:before           { content: "\f056"; }
+.icon-remove-sign:before          { content: "\f057"; }
+.icon-ok-sign:before              { content: "\f058"; }
+.icon-question-sign:before        { content: "\f059"; }
+.icon-info-sign:before            { content: "\f05a"; }
+.icon-screenshot:before           { content: "\f05b"; }
+.icon-remove-circle:before        { content: "\f05c"; }
+.icon-ok-circle:before            { content: "\f05d"; }
+.icon-ban-circle:before           { content: "\f05e"; }
+
+.icon-arrow-left:before           { content: "\f060"; }
+.icon-arrow-right:before          { content: "\f061"; }
+.icon-arrow-up:before             { content: "\f062"; }
+.icon-arrow-down:before           { content: "\f063"; }
+.icon-share-alt:before            { content: "\f064"; }
+.icon-resize-full:before          { content: "\f065"; }
+.icon-resize-small:before         { content: "\f066"; }
+.icon-plus:before                 { content: "\f067"; }
+.icon-minus:before                { content: "\f068"; }
+.icon-asterisk:before             { content: "\f069"; }
+.icon-exclamation-sign:before     { content: "\f06a"; }
+.icon-gift:before                 { content: "\f06b"; }
+.icon-leaf:before                 { content: "\f06c"; }
+.icon-fire:before                 { content: "\f06d"; }
+.icon-eye-open:before             { content: "\f06e"; }
+
+.icon-eye-close:before            { content: "\f070"; }
+.icon-warning-sign:before         { content: "\f071"; }
+.icon-plane:before                { content: "\f072"; }
+.icon-calendar:before             { content: "\f073"; }
+.icon-random:before               { content: "\f074"; }
+.icon-comment:before              { content: "\f075"; }
+.icon-magnet:before               { content: "\f076"; }
+.icon-chevron-up:before           { content: "\f077"; }
+.icon-chevron-down:before         { content: "\f078"; }
+.icon-retweet:before              { content: "\f079"; }
+.icon-shopping-cart:before        { content: "\f07a"; }
+.icon-folder-close:before         { content: "\f07b"; }
+.icon-folder-open:before          { content: "\f07c"; }
+.icon-resize-vertical:before      { content: "\f07d"; }
+.icon-resize-horizontal:before    { content: "\f07e"; }
+
+.icon-bar-chart:before            { content: "\f080"; }
+.icon-twitter-sign:before         { content: "\f081"; }
+.icon-facebook-sign:before        { content: "\f082"; }
+.icon-camera-retro:before         { content: "\f083"; }
+.icon-key:before                  { content: "\f084"; }
+.icon-cogs:before                 { content: "\f085"; }
+.icon-comments:before             { content: "\f086"; }
+.icon-thumbs-up:before            { content: "\f087"; }
+.icon-thumbs-down:before          { content: "\f088"; }
+.icon-star-half:before            { content: "\f089"; }
+.icon-heart-empty:before          { content: "\f08a"; }
+.icon-signout:before              { content: "\f08b"; }
+.icon-linkedin-sign:before        { content: "\f08c"; }
+.icon-pushpin:before              { content: "\f08d"; }
+.icon-external-link:before        { content: "\f08e"; }
+
+.icon-signin:before               { content: "\f090"; }
+.icon-trophy:before               { content: "\f091"; }
+.icon-github-sign:before          { content: "\f092"; }
+.icon-upload-alt:before           { content: "\f093"; }
+.icon-lemon:before                { content: "\f094"; }
+.icon-phone:before                { content: "\f095"; }
+.icon-check-empty:before          { content: "\f096"; }
+.icon-bookmark-empty:before       { content: "\f097"; }
+.icon-phone-sign:before           { content: "\f098"; }
+.icon-twitter:before              { content: "\f099"; }
+.icon-facebook:before             { content: "\f09a"; }
+.icon-github:before               { content: "\f09b"; }
+.icon-unlock:before               { content: "\f09c"; }
+.icon-credit-card:before          { content: "\f09d"; }
+.icon-rss:before                  { content: "\f09e"; }
+
+.icon-hdd:before                  { content: "\f0a0"; }
+.icon-bullhorn:before             { content: "\f0a1"; }
+.icon-bell:before                 { content: "\f0a2"; }
+.icon-certificate:before          { content: "\f0a3"; }
+.icon-hand-right:before           { content: "\f0a4"; }
+.icon-hand-left:before            { content: "\f0a5"; }
+.icon-hand-up:before              { content: "\f0a6"; }
+.icon-hand-down:before            { content: "\f0a7"; }
+.icon-circle-arrow-left:before    { content: "\f0a8"; }
+.icon-circle-arrow-right:before   { content: "\f0a9"; }
+.icon-circle-arrow-up:before      { content: "\f0aa"; }
+.icon-circle-arrow-down:before    { content: "\f0ab"; }
+.icon-globe:before                { content: "\f0ac"; }
+.icon-wrench:before               { content: "\f0ad"; }
+.icon-tasks:before                { content: "\f0ae"; }
+
+.icon-filter:before               { content: "\f0b0"; }
+.icon-briefcase:before            { content: "\f0b1"; }
+.icon-fullscreen:before           { content: "\f0b2"; }
+
+.icon-group:before                { content: "\f0c0"; }
+.icon-link:before                 { content: "\f0c1"; }
+.icon-cloud:before                { content: "\f0c2"; }
+.icon-beaker:before               { content: "\f0c3"; }
+.icon-cut:before                  { content: "\f0c4"; }
+.icon-copy:before                 { content: "\f0c5"; }
+.icon-paper-clip:before           { content: "\f0c6"; }
+.icon-save:before                 { content: "\f0c7"; }
+.icon-sign-blank:before           { content: "\f0c8"; }
+.icon-reorder:before              { content: "\f0c9"; }
+.icon-list-ul:before              { content: "\f0ca"; }
+.icon-list-ol:before              { content: "\f0cb"; }
+.icon-strikethrough:before        { content: "\f0cc"; }
+.icon-underline:before            { content: "\f0cd"; }
+.icon-table:before                { content: "\f0ce"; }
+
+.icon-magic:before                { content: "\f0d0"; }
+.icon-truck:before                { content: "\f0d1"; }
+.icon-pinterest:before            { content: "\f0d2"; }
+.icon-pinterest-sign:before       { content: "\f0d3"; }
+.icon-google-plus-sign:before     { content: "\f0d4"; }
+.icon-google-plus:before          { content: "\f0d5"; }
+.icon-money:before                { content: "\f0d6"; }
+.icon-caret-down:before           { content: "\f0d7"; }
+.icon-caret-up:before             { content: "\f0d8"; }
+.icon-caret-left:before           { content: "\f0d9"; }
+.icon-caret-right:before          { content: "\f0da"; }
+.icon-columns:before              { content: "\f0db"; }
+.icon-sort:before                 { content: "\f0dc"; }
+.icon-sort-down:before            { content: "\f0dd"; }
+.icon-sort-up:before              { content: "\f0de"; }
+
+.icon-envelope-alt:before         { content: "\f0e0"; }
+.icon-linkedin:before             { content: "\f0e1"; }
+.icon-undo:before                 { content: "\f0e2"; }
+.icon-legal:before                { content: "\f0e3"; }
+.icon-dashboard:before            { content: "\f0e4"; }
+.icon-comment-alt:before          { content: "\f0e5"; }
+.icon-comments-alt:before         { content: "\f0e6"; }
+.icon-bolt:before                 { content: "\f0e7"; }
+.icon-sitemap:before              { content: "\f0e8"; }
+.icon-umbrella:before             { content: "\f0e9"; }
+.icon-paste:before                { content: "\f0ea"; }
+
+.icon-user-md:before              { content: "\f200"; }
diff --git a/static/less/forms.less b/static/less/forms.less
new file mode 100644
index 0000000000000000000000000000000000000000..77b5135a404043729e0614c11508f334eb0de1bf
--- /dev/null
+++ b/static/less/forms.less
@@ -0,0 +1,635 @@
+//
+// Forms
+// --------------------------------------------------
+
+
+// GENERAL STYLES
+// --------------
+
+// Make all forms have space below them
+form {
+  margin: 0 0 @baseLineHeight;
+}
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+// Groups of fields with labels on top (legends)
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: @baseLineHeight;
+  font-size: @baseFontSize * 1.5;
+  line-height: @baseLineHeight * 2;
+  color: @grayDark;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+
+  // Small
+  small {
+    font-size: @baseLineHeight * .75;
+    color: @grayLight;
+  }
+}
+
+// Set font for forms
+label,
+input,
+button,
+select,
+textarea {
+  #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here
+}
+input,
+button,
+select,
+textarea {
+  font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)
+}
+
+// Identify controls by their labels
+label {
+  display: block;
+  margin-bottom: 5px;
+}
+
+// Form controls
+// -------------------------
+
+// Shared size and type resets
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  display: inline-block;
+  height: @baseLineHeight;
+  padding: 4px 6px;
+  margin-bottom: 9px;
+  font-size: @baseFontSize;
+  line-height: @baseLineHeight;
+  color: @gray;
+  .border-radius(@inputBorderRadius);
+}
+
+// Reset appearance properties for textual inputs and textarea
+// Declare width for legacy (can't be on input[type=*] selectors or it's too specific)
+input,
+textarea {
+  width: 210px;
+}
+// Reset height since textareas have rows
+textarea {
+  height: auto;
+}
+// Everything else
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  background-color: @inputBackground;
+  border: 1px solid @inputBorder;
+  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
+  .transition(~"border linear .2s, box-shadow linear .2s");
+
+  // Focus state
+  &:focus {
+    border-color: rgba(82,168,236,.8);
+    outline: 0;
+    outline: thin dotted \9; /* IE6-9 */
+    .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)");
+  }
+}
+
+// Position radios and checkboxes better
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  *margin-top: 0; /* IE7 */
+  margin-top: 1px \9; /* IE8-9 */
+  line-height: normal;
+  cursor: pointer;
+}
+
+// Reset width of input images, buttons, radios, checkboxes
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+  width: auto; // Override of generic input selector
+}
+
+// Set the height of select and file controls to match text inputs
+select,
+input[type="file"] {
+  height: 30px; /* In IE7, the height of the select element cannot be changed by height, only font-size */
+  *margin-top: 4px; /* For IE7, add top margin to align select with labels */
+  line-height: 30px;
+}
+
+// Make select elements obey height by applying a border
+select {
+  width: 220px; // default input width + 10px of padding that doesn't get applied
+  border: 1px solid #bbb;
+  background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color
+}
+
+// Make multiple select elements height not fixed
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+// Focus for select, file, radio, and checkbox
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  .tab-focus();
+}
+
+
+// Uneditable inputs
+// -------------------------
+
+// Make uneditable inputs look inactive
+.uneditable-input,
+.uneditable-textarea {
+  color: @grayLight;
+  background-color: darken(@inputBackground, 1%);
+  border-color: @inputBorder;
+  .box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
+  cursor: not-allowed;
+}
+
+// For text that needs to appear as an input but should not be an input
+.uneditable-input {
+  overflow: hidden; // prevent text from wrapping, but still cut it off like an input does
+  white-space: nowrap;
+}
+
+// Make uneditable textareas behave like a textarea
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+
+
+// Placeholder
+// -------------------------
+
+// Placeholder text gets special styles; can't be bundled together though for some reason
+input,
+textarea {
+  .placeholder();
+}
+
+
+// CHECKBOXES & RADIOS
+// -------------------
+
+// Indent the labels to position radios/checkboxes as hanging
+.radio,
+.checkbox {
+  min-height: 18px; // clear the floating input if there is no label text
+  padding-left: 18px;
+}
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -18px;
+}
+
+// Move the options list down to align with labels
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px; // has to be padding because margin collaspes
+}
+
+// Radios and checkboxes on same line
+// TODO v3: Convert .inline to .control-inline
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px; // space out consecutive inline controls
+}
+
+
+
+// INPUT SIZES
+// -----------
+
+// General classes for quick sizes
+.input-mini       { width: 60px; }
+.input-small      { width: 90px; }
+.input-medium     { width: 150px; }
+.input-large      { width: 210px; }
+.input-xlarge     { width: 270px; }
+.input-xxlarge    { width: 530px; }
+
+// Grid style input sizes
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+// Redeclare since the fluid row class is more specific
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+// Ensure input-prepend/append never wraps
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+  display: inline-block;
+}
+
+
+
+// GRID SIZING FOR INPUTS
+// ----------------------
+
+// Grid sizes
+#grid > .input(@gridColumnWidth, @gridGutterWidth);
+
+// Control row for multiple inputs per line
+.controls-row {
+  .clearfix(); // Clear the float from controls
+}
+.controls-row [class*="span"] {
+  float: left; // Float to collapse white-space for proper grid alignment
+}
+
+
+
+
+// DISABLED STATE
+// --------------
+
+// Disabled and read-only inputs
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: @inputDisabledBackground;
+}
+// Explicitly reset the colors here
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+
+
+
+
+// FORM FIELD FEEDBACK STATES
+// --------------------------
+
+// Warning
+.control-group.warning {
+  .formFieldState(@warningText, @warningText, @warningBackground);
+}
+// Error
+.control-group.error {
+  .formFieldState(@errorText, @errorText, @errorBackground);
+}
+// Success
+.control-group.success {
+  .formFieldState(@successText, @successText, @successBackground);
+}
+
+// HTML5 invalid states
+// Shares styles with the .control-group.error above
+input:focus:required:invalid,
+textarea:focus:required:invalid,
+select:focus:required:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+  &:focus {
+    border-color: darken(#ee5f5b, 10%);
+    .box-shadow(0 0 6px lighten(#ee5f5b, 20%));
+  }
+}
+
+
+
+// FORM ACTIONS
+// ------------
+
+.form-actions {
+  padding: (@baseLineHeight - 1) 20px @baseLineHeight;
+  margin-top: @baseLineHeight;
+  margin-bottom: @baseLineHeight;
+  background-color: @formActionsBackground;
+  border-top: 1px solid #e5e5e5;
+  .clearfix(); // Adding clearfix to allow for .pull-right button containers
+}
+
+
+
+// HELP TEXT
+// ---------
+
+.help-block,
+.help-inline {
+  color: lighten(@textColor, 15%); // lighten the text some for contrast
+}
+
+.help-block {
+  display: block; // account for any element using help-block
+  margin-bottom: @baseLineHeight / 2;
+}
+
+.help-inline {
+  display: inline-block;
+  .ie7-inline-block();
+  vertical-align: middle;
+  padding-left: 5px;
+}
+
+
+
+// INPUT GROUPS
+// ------------
+
+// Allow us to put symbols and text within the input field for a cleaner look
+.input-append,
+.input-prepend {
+  margin-bottom: 5px;
+  font-size: 0;
+  white-space: nowrap; // Prevent span and input from separating
+
+  input,
+  select,
+  .uneditable-input {
+    position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness
+    margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms
+    *margin-left: 0;
+    font-size: @baseFontSize;
+    vertical-align: top;
+    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+    // Make input on top when focused so blue border and shadow always show
+    &:focus {
+      z-index: 2;
+    }
+  }
+  .add-on {
+    display: inline-block;
+    width: auto;
+    height: @baseLineHeight;
+    min-width: 16px;
+    padding: 4px 5px;
+    font-size: @baseFontSize;
+    font-weight: normal;
+    line-height: @baseLineHeight;
+    text-align: center;
+    text-shadow: 0 1px 0 @white;
+    background-color: @grayLighter;
+    border: 1px solid #ccc;
+  }
+  .add-on,
+  .btn {
+    margin-left: -1px;
+    vertical-align: top;
+    .border-radius(0);
+  }
+  .active {
+    background-color: lighten(@green, 30);
+    border-color: @green;
+  }
+}
+.input-prepend {
+  .add-on,
+  .btn {
+    margin-right: -1px;
+  }
+  .add-on:first-child,
+  .btn:first-child {
+    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+  }
+}
+.input-append {
+  input,
+  select,
+  .uneditable-input {
+    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+  }
+  .add-on:last-child,
+  .btn:last-child {
+    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+  }
+}
+// Remove all border-radius for inputs with both prepend and append
+.input-prepend.input-append {
+  input,
+  select,
+  .uneditable-input {
+    .border-radius(0);
+  }
+  .add-on:first-child,
+  .btn:first-child {
+    margin-right: -1px;
+    .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+  }
+  .add-on:last-child,
+  .btn:last-child {
+    margin-left: -1px;
+    .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+  }
+}
+
+
+
+// SEARCH FORM
+// -----------
+
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */
+  margin-bottom: 0; // Remove the default margin on all inputs
+  .border-radius(15px);
+}
+
+/* Allow for input prepend/append in search forms */
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+  .border-radius(0); // Override due to specificity
+}
+.form-search .input-append .search-query {
+  .border-radius(14px 0 0 14px)
+}
+.form-search .input-append .btn {
+  .border-radius(0 14px 14px 0)
+}
+.form-search .input-prepend .search-query {
+  .border-radius(0 14px 14px 0)
+}
+.form-search .input-prepend .btn {
+  .border-radius(14px 0 0 14px)
+}
+
+
+
+
+// HORIZONTAL & VERTICAL FORMS
+// ---------------------------
+
+// Common properties
+// -----------------
+
+.form-search,
+.form-inline,
+.form-horizontal {
+  input,
+  textarea,
+  select,
+  .help-inline,
+  .uneditable-input,
+  .input-prepend,
+  .input-append {
+    display: inline-block;
+    .ie7-inline-block();
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  // Re-hide hidden elements due to specifity
+  .hide {
+    display: none;
+  }
+}
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+  display: inline-block;
+}
+// Remove margin for input-prepend/-append
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+// Inline checkbox/radio labels (remove padding on left)
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+// Remove float and margin, set to inline-block
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+
+
+// Margin to space out fieldsets
+.control-group {
+  margin-bottom: @baseLineHeight / 2;
+}
+
+// Legend collapses margin, so next element is responsible for spacing
+legend + .control-group {
+  margin-top: @baseLineHeight;
+  -webkit-margin-top-collapse: separate;
+}
+
+// Horizontal-specific styles
+// --------------------------
+
+.form-horizontal {
+  // Increase spacing between groups
+  .control-group {
+    margin-bottom: @baseLineHeight;
+    .clearfix();
+  }
+  // Float the labels left
+  .control-label {
+    float: left;
+    width: 140px;
+    padding-top: 5px;
+    text-align: right;
+  }
+  // Move over all input controls and content
+  .controls {
+    // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend
+    // don't inherit the margin of the parent, in this case .controls
+    *display: inline-block;
+    *padding-left: 20px;
+    margin-left: 160px;
+    *margin-left: 0;
+    &:first-child {
+      *padding-left: 160px;
+    }
+  }
+  // Remove bottom margin on block level help text since that's accounted for on .control-group
+  .help-block {
+    margin-top: @baseLineHeight / 2;
+    margin-bottom: 0;
+  }
+  // Move over buttons in .form-actions to align with .controls
+  .form-actions {
+    padding-left: 160px;
+  }
+}
diff --git a/static/less/grid.less b/static/less/grid.less
new file mode 100644
index 0000000000000000000000000000000000000000..750d20351498f75e2f3dec9e588bbcbc91645bb6
--- /dev/null
+++ b/static/less/grid.less
@@ -0,0 +1,21 @@
+//
+// Grid system
+// --------------------------------------------------
+
+
+// Fixed (940px)
+#grid > .core(@gridColumnWidth, @gridGutterWidth);
+
+// Fluid (940px)
+#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);
+
+// Reset utility classes due to specificity
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
diff --git a/static/less/hero-unit.less b/static/less/hero-unit.less
new file mode 100644
index 0000000000000000000000000000000000000000..672b7d7c7489dd67a66510640893a7a1e59a44e8
--- /dev/null
+++ b/static/less/hero-unit.less
@@ -0,0 +1,24 @@
+//
+// Hero unit
+// --------------------------------------------------
+
+
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  background-color: @heroUnitBackground;
+  .border-radius(6px);
+  h1 {
+    margin-bottom: 0;
+    font-size: 60px;
+    line-height: 1;
+    color: @heroUnitHeadingColor;
+    letter-spacing: -1px;
+  }
+  p {
+    font-size: 18px;
+    font-weight: 200;
+    line-height: @baseLineHeight * 1.5;
+    color: @heroUnitLeadColor;
+  }
+}
diff --git a/static/less/labels-badges.less b/static/less/labels-badges.less
new file mode 100644
index 0000000000000000000000000000000000000000..2f15fec05fd136074812ef9f34a82dc8a639bf92
--- /dev/null
+++ b/static/less/labels-badges.less
@@ -0,0 +1,72 @@
+//
+// Labels and badges
+// --------------------------------------------------
+
+
+// Base classes
+.label,
+.badge {
+  font-size: @baseFontSize * .846;
+  font-weight: bold;
+  line-height: 14px; // ensure proper line-height if floated
+  color: @white;
+  vertical-align: baseline;
+  white-space: nowrap;
+  text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+  background-color: @grayLight;
+}
+// Set unique padding and border-radii
+.label {
+  padding: 1px 4px 2px;
+  .border-radius(3px);
+}
+.badge {
+  padding: 1px 9px 2px;
+  .border-radius(9px);
+}
+
+// Hover state, but only for links
+a {
+  &.label:hover,
+  &.badge:hover {
+    color: @white;
+    text-decoration: none;
+    cursor: pointer;
+  }
+}
+
+// Colors
+// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)
+.label,
+.badge {
+  // Important (red)
+  &-important         { background-color: @errorText; }
+  &-important[href]   { background-color: darken(@errorText, 10%); }
+  // Warnings (orange)
+  &-warning           { background-color: @orange; }
+  &-warning[href]     { background-color: darken(@orange, 10%); }
+  // Success (green)
+  &-success           { background-color: @successText; }
+  &-success[href]     { background-color: darken(@successText, 10%); }
+  // Info (turquoise)
+  &-info              { background-color: @infoText; }
+  &-info[href]        { background-color: darken(@infoText, 10%); }
+  // Inverse (black)
+  &-inverse           { background-color: @grayDark; }
+  &-inverse[href]     { background-color: darken(@grayDark, 10%); }
+}
+
+// Quick fix for labels/badges in buttons
+.btn {
+  .label,
+  .badge {
+    position: relative;
+    top: -1px;
+  }
+}
+.btn-mini {
+  .label,
+  .badge {
+    top: 0;
+  }
+}
diff --git a/static/less/layouts.less b/static/less/layouts.less
new file mode 100644
index 0000000000000000000000000000000000000000..2cba9f3cad887467fce35cdfd3b5776ea9d1aa2d
--- /dev/null
+++ b/static/less/layouts.less
@@ -0,0 +1,17 @@
+//
+// Layouts
+// --------------------------------------------------
+
+
+// Container (centered, fixed-width layouts)
+.container {
+  .container-fixed();
+  padding-top: @navbarHeight + @baseLineHeight;
+}
+
+// Fluid layouts (left aligned, with sidebar, min- & max-width content)
+.container-fluid {
+  padding-right: @gridGutterWidth;
+  padding-left: @gridGutterWidth;
+  .clearfix();
+}
\ No newline at end of file
diff --git a/static/less/m2m.eclipse.org.animations.less b/static/less/m2m.eclipse.org.animations.less
new file mode 100644
index 0000000000000000000000000000000000000000..63f3a945e1814ccc982ce5171d10e6e451dbb074
--- /dev/null
+++ b/static/less/m2m.eclipse.org.animations.less
@@ -0,0 +1,53 @@
+.home-box.span4 {
+  overflow: hidden;
+  height: 0px;
+
+  opacity: 0;
+  -webkit-transition: height 0.5s ease, opacity 0.5s ease, margin-bottom 0.5s ease ;
+  -moz-transition: height 0.5s ease, opacity 0.5s ease, margin-bottom 0.5s ease ;
+  -o-transition: height 0.5s ease, opacity 0.5s ease, margin-bottom 0.5s ease  ;
+  transition: height 0.5s ease, opacity 0.5s ease, margin-bottom 0.5s ease ;
+}
+
+@delay: 200;
+
+#home-frameworks {
+  -webkit-transition-delay: 0;
+  -moz-transition-delay: 0;
+  -ms-transition-delay: 0;
+  -o-transition-delay: 0;
+   transition-delay: 0;
+}
+
+#home-protocols {
+  -webkit-transition-delay: @delay * 1ms;
+  -moz-transition-delay: @delay * 1ms;
+  -ms-transition-delay: @delay * 1ms;
+  -o-transition-delay: @delay * 1ms;
+   transition-delay: @delay * 1ms;
+}
+
+#home-tools {
+  -webkit-transition-delay: @delay * 2ms;
+  -moz-transition-delay: @delay * 2ms;
+  -ms-transition-delay: @delay * 2ms;
+  -o-transition-delay: @delay * 2ms;
+   transition-delay: @delay * 2ms;
+}
+
+#home-community {
+  -webkit-transition-delay: @delay * 3ms;
+  -moz-transition-delay: @delay * 3ms;
+  -ms-transition-delay: @delay * 3ms;
+  -o-transition-delay: @delay * 3ms;
+   transition-delay: @delay * 3ms;
+}
+
+#home-sandbox {
+  -webkit-transition-delay: @delay * 4ms;
+  -moz-transition-delay: @delay * 4ms;
+  -ms-transition-delay: @delay * 4ms;
+  -o-transition-delay: @delay * 4ms;
+   transition-delay: @delay * 4ms;
+}
+
diff --git a/static/less/m2m.eclipse.org.less b/static/less/m2m.eclipse.org.less
new file mode 100644
index 0000000000000000000000000000000000000000..59f12f07ef0408615502aca30db39f36f3ba8235
--- /dev/null
+++ b/static/less/m2m.eclipse.org.less
@@ -0,0 +1,519 @@
+html {
+	text-rendering: optimizeLegibility;
+}
+
+body.index {
+  background: url('../img/bg_index.png') top repeat-x @bodyBackground;
+}
+
+#catchline {
+  color: @blue;
+  font-weight: 300;
+}
+
+#catchline h2 {
+  text-align: left;
+  color: @blue;
+  font-size: 50px;
+}
+
+a:hover {
+	text-decoration: none;
+//	border-bottom: 1px dashed #005580;
+}
+
+/*.btn:hover, */.navbar a {
+	border-bottom: none;
+}
+
+h2 {
+	font-family: Lekton, Arial, sans-serif;
+	font-weight: normal;
+	font-size: 38px;
+//	line-height: 30px;
+	margin-bottom: @baseLineHeight;
+	color: darken(@purple, 15%);
+	text-shadow: 0px 1px 1px lighten(@blueDark, 50%);
+	border-bottom: 2px dotted darken(@purple, 15%);
+}
+
+.home-box .lead {
+  margin-top: -10px;
+  color: lighten(@blueDark, 50%);
+  font-size: 20px;
+}
+
+.lead li {
+  line-height: inherit;
+}
+
+.home-box.span4 {
+  width: 350px;
+  padding-left: 10px;
+  padding-right: 10px;
+  border-radius: 10px;
+  margin-bottom: 330px;
+}
+
+.home-box.span4 h2 a {
+  color:darken(@purple, 15%);
+}
+
+.home-box:hover {
+  background:rgba(255,255,255,0.3);
+}
+
+.loaded {
+  opacity:1 !important;
+  height: 335px !important;
+  margin-bottom: 10px !important;
+}
+
+.home-box h2 {
+	text-shadow: 0px 1px 1px lighten(@blueDark, 50%);
+  	font-size: 38px;
+}
+
+body.index h2 {
+	border: none;
+}
+
+.home-box i {
+  font-size: 75px;
+  display: block;
+  background: #FFF;
+  width: 120px;
+  height: 70px;
+  border-radius: 94px;
+  padding-top: 45px;
+  text-align: center;
+  margin-bottom: @baseLineHeight;
+  margin-top: @baseLineHeight;
+  margin: auto;
+  text-shadow: none;
+  color: @linkColor;
+}
+
+.brand {
+  	background: url('../img/m2m_eclipse_logo.png') 0 7px no-repeat;
+  	width: 100px;
+  	text-indent: -1000em;
+}
+
+.navbar .brand {
+  	margin-left: -40px;
+}
+
+.row {
+  	margin-bottom: 30px;
+}
+
+.carousel-caption {
+	background: rgba(22,23,28,0.4);
+}
+
+div.page-header {
+	padding-bottom: 9px;
+	margin: 0px 0 30px;
+	border-bottom: 1px dashed #EEE;
+}
+
+div.page-header h1 {
+	margin-top: 0px;
+	color: darken(@purple, 15%);
+}
+
+div.page-header h1 small {
+	color: lighten(@purple, 10%);
+	display: block;
+	font-weight: 300;
+}
+
+.container ul li {
+  margin-left:.7em;
+}
+
+.well {
+//	min-height: 20px;
+//	padding: 19px;
+	margin-left: -20px;
+	margin-bottom: 50px;
+	background-color: white;
+	border: 1px solid darken(@blue, 15%);
+	-webkit-border-radius: 7px;
+	-moz-border-radius: 7px;
+	border-radius: 7px;
+	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+	-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.15);
+}
+
+@media (max-width: 979px) {
+	.well {
+		margin-left: 0px;
+	}
+}
+
+
+// TODO not the good way to do yet
+p + h2 {
+	margin-top: 50px;
+}
+
+h3 {
+	text-indent: 0.3em;
+}
+
+#wg-members td, #sc-members td {
+	text-align:center;
+}
+
+
+// TRYING DIFFERENT ICONS ON HOMEPAGE
+
+.home-box i {
+  display: block;
+  width: 120px;
+  height: 70px;
+  padding-top: 45px;
+  margin-top: 20px;
+  font-size: 75px;
+  color: #0088cc;
+  text-align: center;
+  text-shadow: none;
+  background: rgba(255, 255, 255, 0.8);
+  border-radius: 94px;
+  margin-right: 10px;
+//  margin-bottom: -110px;
+  margin-bottom: -80px;
+}
+
+.home-box .lead {
+  margin-top: -10px;
+  color: lighten(@blueDark, 50%);
+  font-size: 20px;
+  width: 245px;
+}
+
+#java-launch {
+    background: url('/images/_home/javalaunch_background.jpg');
+}
+#iotchallenge-launch {
+    background: url('/images/_home/iotchallenge_background.jpg') center top;
+}
+.home_featured img {
+    opacity: 0.9;
+}
+.home_featured img:hover {
+    opacity: 1.0;
+}
+hr {
+  margin-top: 50px;
+  margin-bottom: 5px;
+}
+
+footer ul li.pull-right {
+  margin-top: 8px;
+}
+
+/* Heading: Layout item */ 
+.section-title {
+  background:url('../../images/layout/section-heading-end.gif') @purple1 top right no-repeat;
+  border-bottom:0 none;
+  color:#fff;
+  font-family:@sansFontFamily;
+  padding:6px 12px 8px 12px;
+  font-size:28px;
+  padding-left:55px;
+  font-weight:lighter;
+  position:relative;
+  i {
+    position:absolute;
+    left:16px;
+    top:8px 
+  } 
+}
+
+.section-title.grey-title {
+  background:url('../../images/layout/section-heading-grey-end.gif') #acb5bb top right no-repeat;
+  margin-bottom:0;
+  border-bottom:1px solid #ccc;
+} 
+
+/* Grey container: Layout item */ 
+.grey-box {
+	background:#ced8de;
+	padding:20px;
+	margin-bottom:60px;
+}
+
+/* Item box: Layout item */ 
+.itembox {
+	background:#fff;
+	margin-bottom:20px;
+	text-align:center;
+	position:relative;
+	cursor: pointer;
+	h3 {
+	  color:@purple1;
+	}
+	h3, p {	    
+	  padding:0 10px;  
+	}
+	p {
+	  font-weight: lighter;
+	}
+	a.readmore:link,
+	a.readmore:visited {
+	  display:block;
+	  width:100%;
+	  position:absolute;
+	  bottom:0;
+	  clear:both;
+	  background:#bd95c7;
+	  color:#fff;
+	  text-align: center;
+	  padding:8px 0;
+
+	}
+	a.readmore:hover {
+	 background:@purple1;
+	}
+}
+
+.itembox:hover {
+	background:@greylight;
+}
+
+/* Project list: community.html */ 
+.project-list {
+	.itembox {
+	  h3, p {
+	    padding:0 10px; 
+	  }
+	  .logo{
+	    padding:15px;
+	    max-width:80%;
+	  }
+	  h3 {
+      font-size:21px;
+    }
+    p {
+      font-size:15px;
+      padding-bottom:50px;
+      color:@purple1; 
+    }
+	}
+}
+
+/* Event list: community.html */ 
+.event-list {
+	.itembox {
+	  h3 {
+      font-size:15px;
+      line-height: 16px;
+      margin-bottom:4px;
+      padding-top:10px; 
+      margin-top:0;         
+    }
+    
+    .location {
+      padding-bottom:40px;
+      margin-bottom:10px;
+    }
+    .date,
+    .location {
+      font-size:13px;;
+      font-weight:normal;
+    }
+  }
+}
+
+/* News list: community.html */ 
+ul.news-list {
+	list-style:none;
+	padding:0;
+	margin:0 0 80px 0;
+	color:@blueDark;
+	li {
+	  .clearfix;
+	  min-height:40px;
+	  background:#fff;
+	  margin-left:0 !important;
+	  margin-bottom:20px;
+	  padding:8px;
+    
+	  span.date{
+	    text-align:center;
+	    border-right:1px solid #ccc;
+	    padding-right:20px;
+	    padding-left:10px;
+	    margin-right:10px;
+	    font-size:13px;
+	    display:block;
+	    position:absolute;   
+	  }
+	  span.date::first-line{
+	    font-size:18px;
+	  }
+	  span.text {
+	     padding-left:95px;
+	     display:block;
+	  }
+	}
+	li:hover {
+	  background:@greylight;
+	  cursor:pointer;
+	}
+}
+
+/* Webinars list: community.html */
+/* copied from news-list since our LESS compiler version does not support 'extend' :-( */
+ul.webinars-list {
+	list-style:none;
+	padding:0;
+	margin:0 0 0px 0;
+//	min-height: 200px;
+	color:@blueDark;
+	li {
+	  .clearfix;
+
+	  min-height:165px !important;
+	  @media (min-width: 1200px) {
+		min-height: 140px !important;
+	  }
+	  @media (max-width: 979px) and (min-width: 768px) {
+	    min-height: 240px !important;
+	  }
+	  @media (max-width: 767px) {
+	    min-height: 0px !important;
+	  }
+
+	  background:#fff;
+	  // margin-left:0 !important;
+	  margin-bottom:20px;
+	  padding:8px;
+    
+	  span.date{
+	    text-align:center;
+	    border-right:1px solid #ccc;
+	    padding-right:20px;
+	    padding-left:10px;
+	    margin-right:10px;
+	    font-size:13px;
+	    display:block;
+	    position:absolute;   
+	  }
+	  span.date::first-line{
+	    font-size:18px;
+	  }
+	  span.text {
+	     padding-left:95px;
+	     display:block;
+	  }
+	}
+	li:hover {
+	  background:@greylight;
+	  cursor:pointer;
+	}
+
+	li.past {
+	  background: repeating-linear-gradient( 
+	  	45deg, 
+	  	rgba(0, 0, 0, 0.2), 
+	  	rgba(0, 0, 0, 0.2) 10px, 
+	  	rgba(0, 0, 0, 0.3) 10px, 
+	  	rgba(0, 0, 0, 0.3) 20px 
+	  );
+	  opacity: 0.6;
+	}
+
+}
+
+
+
+
+
+/* Member information: ecosystem.html */
+.members-info {
+	.mb-logo{
+	  padding-bottom:22px;
+	}
+	.mb-info {
+	  background:url('../../images/layout/members-info-top-left.gif') top left no-repeat;
+	  .mb-info-container {
+	    background:#fff;
+	    margin-left:25px;
+	    padding:25px 22px;
+	    p {
+	      color:@purpledark;
+	      font-size:18px;
+	      line-height:24px;
+	      font-weight: lighter;
+	    }
+	    h4{
+	      margin-top:0;
+	      color:@purple1;
+	      font-size:23px;
+	    }
+	  }
+	}
+	ul.mb-links {
+	  margin:0;
+	  margin-left:25px;
+	  padding:0;
+	  height:38px;
+	  overflow:hidden;
+	  a{
+	    padding:8px 0;
+	    display:block;
+	  }
+	  a:link,
+	  a:visited {
+	    color:#fff;
+	  }
+	  li {
+	 	height:36px;
+	    background:url('../../images/layout/members-info-link-sep-b.gif') left #12131d no-repeat;	   
+	    display:block;
+	    margin:0;
+	    padding:0;
+	    list-style-type: none;
+	    width: 50%;
+	    float:left;
+	    text-align:center;
+	    a:hover{
+	      background: -moz-linear-gradient(left,  rgba(125,126,125,0.01) 0%, rgba(122,45,163,1) 100%); /* FF3.6+ */
+        background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(125,126,125,0.01)), color-stop(100%,rgba(122,45,163,1))); /* Chrome,Safari4+ */
+        background: -webkit-linear-gradient(left,  rgba(125,126,125,0.01) 0%,rgba(122,45,163,1) 100%); /* Chrome10+,Safari5.1+ */
+        background: -o-linear-gradient(left,  rgba(125,126,125,0.01) 0%,rgba(122,45,163,1) 100%); /* Opera 11.10+ */
+        background: -ms-linear-gradient(left,  rgba(125,126,125,0.01) 0%,rgba(122,45,163,1) 100%); /* IE10+ */
+        background: linear-gradient(to right,  rgba(125,126,125,0.01) 0%,rgba(122,45,163,1) 100%); /* W3C */
+        filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#037d7e7d', endColorstr='#7a2da3',GradientType=1 ); /* IE6-9 */     
+	    }
+	  }
+	  li.read-more {
+      background:url('../../images/layout/members-info-link-sep-a.gif') right #bd95c7 no-repeat; 
+      a:hover{
+        background: -moz-linear-gradient(left,  rgba(122,45,163,1) 0%, rgba(125,126,125,0.01) 100%); /* FF3.6+ */
+        background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(122,45,163,1)), color-stop(100%,rgba(125,126,125,0.01))); /* Chrome,Safari4+ */
+        background: -webkit-linear-gradient(left,  rgba(122,45,163,1) 0%,rgba(125,126,125,0.01) 100%); /* Chrome10+,Safari5.1+ */
+        background: -o-linear-gradient(left,  rgba(122,45,163,1) 0%,rgba(125,126,125,0.01) 100%); /* Opera 11.10+ */
+        background: -ms-linear-gradient(left,  rgba(122,45,163,1) 0%,rgba(125,126,125,0.01) 100%); /* IE10+ */
+        background: linear-gradient(to right,  rgba(122,45,163,1) 0%,rgba(125,126,125,0.01) 100%); /* W3C */
+        filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7a2da3', endColorstr='#037d7e7d',GradientType=1 ); /* IE6-9 */  
+      }     
+    }
+	}
+}
+
+/* Landscape phone to portrait tablet */
+@media (max-width: 767px) { 
+  .project-list {
+    .itembox {
+      p{
+        font-size:13px;
+      }
+    }
+  }
+}
diff --git a/static/less/mixins.less b/static/less/mixins.less
new file mode 100644
index 0000000000000000000000000000000000000000..c6d661bc40dda20b3b45271cadf8cb2718ce06a0
--- /dev/null
+++ b/static/less/mixins.less
@@ -0,0 +1,670 @@
+//
+// Mixins
+// --------------------------------------------------
+
+
+// UTILITY MIXINS
+// --------------------------------------------------
+
+// Clearfix
+// --------
+// For clearing floats like a boss h5bp.com/q
+.clearfix {
+  *zoom: 1;
+  &:before,
+  &:after {
+    display: table;
+    content: "";
+    // Fixes Opera/contenteditable bug:
+    // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
+    line-height: 0;
+  }
+  &:after {
+    clear: both;
+  }
+}
+
+// Webkit-style focus
+// ------------------
+.tab-focus() {
+  // Default
+  outline: thin dotted #333;
+  // Webkit
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+// Center-align a block level element
+// ----------------------------------
+.center-block() {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+// IE7 inline-block
+// ----------------
+.ie7-inline-block() {
+  *display: inline; /* IE7 inline-block hack */
+  *zoom: 1;
+}
+
+// IE7 likes to collapse whitespace on either side of the inline-block elements.
+// Ems because we're attempting to match the width of a space character. Left
+// version is for form buttons, which typically come after other elements, and
+// right version is for icons, which come before. Applying both is ok, but it will
+// mean that space between those elements will be .6em (~2 space characters) in IE7,
+// instead of the 1 space in other browsers.
+.ie7-restore-left-whitespace() {
+  *margin-left: .3em;
+
+  &:first-child {
+    *margin-left: 0;
+  }
+}
+
+.ie7-restore-right-whitespace() {
+  *margin-right: .3em;
+}
+
+// Sizing shortcuts
+// -------------------------
+.size(@height, @width) {
+  width: @width;
+  height: @height;
+}
+.square(@size) {
+  .size(@size, @size);
+}
+
+// Placeholder text
+// -------------------------
+.placeholder(@color: @placeholderText) {
+  &:-moz-placeholder {
+    color: @color;
+  }
+  &:-ms-input-placeholder {
+    color: @color;
+  }
+  &::-webkit-input-placeholder {
+    color: @color;
+  }
+}
+
+// Text overflow
+// -------------------------
+// Requires inline-block or block for proper styling
+.text-overflow() {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+// CSS image replacement
+// -------------------------
+// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+
+// FONTS
+// --------------------------------------------------
+
+#font {
+  #family {
+    .serif() {
+      font-family: @serifFontFamily;
+    }
+    .sans-serif() {
+      font-family: @sansFontFamily;
+    }
+    .monospace() {
+      font-family: @monoFontFamily;
+    }
+  }
+  .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+    font-size: @size;
+    font-weight: @weight;
+    line-height: @lineHeight;
+  }
+  .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+    #font > #family > .serif;
+    #font > .shorthand(@size, @weight, @lineHeight);
+  }
+  .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+    #font > #family > .sans-serif;
+    #font > .shorthand(@size, @weight, @lineHeight);
+  }
+  .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+    #font > #family > .monospace;
+    #font > .shorthand(@size, @weight, @lineHeight);
+  }
+}
+
+
+// FORMS
+// --------------------------------------------------
+
+// Block level inputs
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;        // Make inputs at least the height of their button counterpart
+  .box-sizing(border-box); // Makes inputs behave like true block-level elements
+}
+
+
+
+// Mixin for form field states
+.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
+  // Set the text color
+  > label,
+  .help-block,
+  .help-inline {
+    color: @textColor;
+  }
+  // Style inputs accordingly
+  .checkbox,
+  .radio,
+  input,
+  select,
+  textarea {
+    color: @textColor;
+    border-color: @borderColor;
+    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
+    &:focus {
+      border-color: darken(@borderColor, 10%);
+      // Write out in full since the lighten() function isn't easily escaped
+      -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
+         -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
+              box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
+    }
+  }
+  // Give a small background color for input-prepend/-append
+  .input-prepend .add-on,
+  .input-append .add-on {
+    color: @textColor;
+    background-color: @backgroundColor;
+    border-color: @textColor;
+  }
+}
+
+
+
+// CSS3 PROPERTIES
+// --------------------------------------------------
+
+// Border Radius
+.border-radius(@radius) {
+  -webkit-border-radius: @radius;
+     -moz-border-radius: @radius;
+          border-radius: @radius;
+}
+
+// Single Corner Border Radius
+.border-top-left-radius(@radius) {
+  -webkit-border-top-left-radius: @radius;
+      -moz-border-radius-topleft: @radius;
+          border-top-left-radius: @radius;
+}
+.border-top-right-radius(@radius) {
+  -webkit-border-top-right-radius: @radius;
+      -moz-border-radius-topright: @radius;
+          border-top-right-radius: @radius;
+}
+.border-bottom-right-radius(@radius) {
+  -webkit-border-bottom-right-radius: @radius;
+      -moz-border-radius-bottomright: @radius;
+          border-bottom-right-radius: @radius;
+}
+.border-bottom-left-radius(@radius) {
+  -webkit-border-bottom-left-radius: @radius;
+      -moz-border-radius-bottomleft: @radius;
+          border-bottom-left-radius: @radius;
+}
+
+// Single Side Border Radius
+.border-top-radius(@radius) {
+  .border-top-right-radius(@radius);
+  .border-top-left-radius(@radius);
+}
+.border-right-radius(@radius) {
+  .border-top-right-radius(@radius);
+  .border-bottom-right-radius(@radius);
+}
+.border-bottom-radius(@radius) {
+  .border-bottom-right-radius(@radius);
+  .border-bottom-left-radius(@radius);
+}
+.border-left-radius(@radius) {
+  .border-top-left-radius(@radius);
+  .border-bottom-left-radius(@radius);
+}
+
+// Drop shadows
+.box-shadow(@shadow) {
+  -webkit-box-shadow: @shadow;
+     -moz-box-shadow: @shadow;
+          box-shadow: @shadow;
+}
+
+// Transitions
+.transition(@transition) {
+  -webkit-transition: @transition;
+     -moz-transition: @transition;
+       -o-transition: @transition;
+          transition: @transition;
+}
+
+// Transformations
+.rotate(@degrees) {
+  -webkit-transform: rotate(@degrees);
+     -moz-transform: rotate(@degrees);
+      -ms-transform: rotate(@degrees);
+       -o-transform: rotate(@degrees);
+          transform: rotate(@degrees);
+}
+.scale(@ratio) {
+  -webkit-transform: scale(@ratio);
+     -moz-transform: scale(@ratio);
+      -ms-transform: scale(@ratio);
+       -o-transform: scale(@ratio);
+          transform: scale(@ratio);
+}
+.translate(@x, @y) {
+  -webkit-transform: translate(@x, @y);
+     -moz-transform: translate(@x, @y);
+      -ms-transform: translate(@x, @y);
+       -o-transform: translate(@x, @y);
+          transform: translate(@x, @y);
+}
+.skew(@x, @y) {
+  -webkit-transform: skew(@x, @y);
+     -moz-transform: skew(@x, @y);
+      -ms-transform: skew(@x, @y);
+       -o-transform: skew(@x, @y);
+          transform: skew(@x, @y);
+}
+.translate3d(@x, @y, @z) {
+  -webkit-transform: translate3d(@x, @y, @z);
+     -moz-transform: translate3d(@x, @y, @z);
+       -o-transform: translate3d(@x, @y, @z);
+          transform: translate3d(@x, @y, @z);
+}
+
+// Backface visibility
+// Prevent browsers from flickering when using CSS 3D transforms.
+// Default value is `visible`, but can be changed to `hidden
+// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
+.backface-visibility(@visibility){
+	-webkit-backface-visibility: @visibility;
+	   -moz-backface-visibility: @visibility;
+	        backface-visibility: @visibility;
+}
+
+// Background clipping
+// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
+.background-clip(@clip) {
+  -webkit-background-clip: @clip;
+     -moz-background-clip: @clip;
+          background-clip: @clip;
+}
+
+// Background sizing
+.background-size(@size){
+  -webkit-background-size: @size;
+     -moz-background-size: @size;
+       -o-background-size: @size;
+          background-size: @size;
+}
+
+
+// Box sizing
+.box-sizing(@boxmodel) {
+  -webkit-box-sizing: @boxmodel;
+     -moz-box-sizing: @boxmodel;
+          box-sizing: @boxmodel;
+}
+
+// User select
+// For selecting text on the page
+.user-select(@select) {
+  -webkit-user-select: @select;
+     -moz-user-select: @select;
+      -ms-user-select: @select;
+       -o-user-select: @select;
+          user-select: @select;
+}
+
+// Resize anything
+.resizable(@direction) {
+  resize: @direction; // Options: horizontal, vertical, both
+  overflow: auto; // Safari fix
+}
+
+// CSS3 Content Columns
+.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
+  -webkit-column-count: @columnCount;
+     -moz-column-count: @columnCount;
+          column-count: @columnCount;
+  -webkit-column-gap: @columnGap;
+     -moz-column-gap: @columnGap;
+          column-gap: @columnGap;
+}
+
+// Optional hyphenation
+.hyphens(@mode: auto) {
+  word-wrap: break-word;
+  -webkit-hyphens: @mode;
+     -moz-hyphens: @mode;
+      -ms-hyphens: @mode;
+       -o-hyphens: @mode;
+          hyphens: @mode;
+}
+
+// Opacity
+.opacity(@opacity) {
+  opacity: @opacity / 100;
+  filter: ~"alpha(opacity=@{opacity})";
+}
+
+
+
+// BACKGROUNDS
+// --------------------------------------------------
+
+// Add an alphatransparency value to any background or border color (via Elyse Holladay)
+#translucent {
+  .background(@color: @white, @alpha: 1) {
+    background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
+  }
+  .border(@color: @white, @alpha: 1) {
+    border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
+    .background-clip(padding-box);
+  }
+}
+
+// Gradient Bar Colors for buttons and alerts
+.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
+  color: @textColor;
+  text-shadow: @textShadow;
+  #gradient > .vertical(@primaryColor, @secondaryColor);
+  border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);
+  border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
+}
+
+// Gradients
+#gradient {
+  .horizontal(@startColor: #555, @endColor: #333) {
+    background-color: @endColor;
+    background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
+    background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
+    background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+    background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
+    background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10
+    background-repeat: repeat-x;
+    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down
+  }
+  .vertical(@startColor: #555, @endColor: #333) {
+    background-color: mix(@startColor, @endColor, 60%);
+    background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
+    background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+    background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
+    background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10
+    background-repeat: repeat-x;
+    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down
+  }
+  .directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
+    background-color: @endColor;
+    background-repeat: repeat-x;
+    background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
+    background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+    background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
+    background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10
+  }
+  .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
+    background-color: mix(@midColor, @endColor, 80%);
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
+    background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+    background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop*100%, @endColor);
+    background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+    background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
+    background-repeat: no-repeat;
+    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
+  }
+  .radial(@innerColor: #555, @outerColor: #333)  {
+    background-color: @outerColor;
+    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
+    background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
+    background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
+    background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
+    background-repeat: no-repeat;
+  }
+  .striped(@color, @angle: 45deg) {
+    background-color: @color;
+    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
+    background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+    background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+    background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+    background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
+  }
+}
+// Reset filters for IE
+.reset-filter() {
+  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
+}
+
+
+
+// COMPONENT MIXINS
+// --------------------------------------------------
+
+// Horizontal dividers
+// -------------------------
+// Dividers (basically an hr) within dropdowns and nav lists
+.nav-divider(@top: #e5e5e5, @bottom: @white) {
+  // IE7 needs a set width since we gave a height. Restricting just
+  // to IE7 to keep the 1px left/right space in other browsers.
+  // It is unclear where IE is getting the extra space that we need
+  // to negative-margin away, but so it goes.
+  *width: 100%;
+  height: 1px;
+  margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: @top;
+  border-bottom: 1px solid @bottom;
+}
+
+// Button backgrounds
+// ------------------
+.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
+  // gradientBar will set the background to a pleasing blend of these, to support IE<=9
+  .gradientBar(@startColor, @endColor, @textColor, @textShadow);
+  *background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+  .reset-filter();
+
+  // in these cases the gradient won't cover the background, so we override
+  &:hover, &:active, &.active, &.disabled, &[disabled] {
+    color: @textColor;
+    background-color: @endColor;
+    *background-color: darken(@endColor, 5%);
+  }
+
+  // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
+  &:active,
+  &.active {
+    background-color: darken(@endColor, 10%) e("\9");
+  }
+}
+
+// Navbar vertical align
+// -------------------------
+// Vertically center elements in the navbar.
+// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.
+.navbarVerticalAlign(@elementHeight) {
+  margin-top: (@navbarHeight - @elementHeight) / 2;
+}
+
+
+
+// Grid System
+// -----------
+
+// Centered container element
+.container-fixed() {
+  margin-right: auto;
+  margin-left: auto;
+  .clearfix();
+}
+
+// Table columns
+.tableColumns(@columnSpan: 1) {
+  float: none; // undo default grid column styles
+  width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells
+  margin-left: 0; // undo default grid column styles
+}
+
+// Make a Grid
+// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
+.makeRow() {
+  margin-left: @gridGutterWidth * -1;
+  .clearfix();
+}
+.makeColumn(@columns: 1, @offset: 0) {
+  float: left;
+  margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
+  width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
+}
+
+// The Grid
+#grid {
+
+  .core (@gridColumnWidth, @gridGutterWidth) {
+
+    .spanX (@index) when (@index > 0) {
+      (~".span@{index}") { .span(@index); }
+      .spanX(@index - 1);
+    }
+    .spanX (0) {}
+
+    .offsetX (@index) when (@index > 0) {
+      (~".offset@{index}") { .offset(@index); }
+      .offsetX(@index - 1);
+    }
+    .offsetX (0) {}
+
+    .offset (@columns) {
+      margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
+    }
+
+    .span (@columns) {
+      width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
+    }
+
+    .row {
+      margin-left: @gridGutterWidth * -1;
+      .clearfix();
+    }
+
+    [class*="span"] {
+      float: left;
+      margin-left: @gridGutterWidth;
+    }
+
+    // Set the container width, and override it for fixed navbars in media queries
+    .container,
+    .navbar-static-top .container,
+    .navbar-fixed-top .container,
+    .navbar-fixed-bottom .container { .span(@gridColumns); }
+
+    // generate .spanX and .offsetX
+    .spanX (@gridColumns);
+    .offsetX (@gridColumns);
+  }
+
+  .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {
+
+    .spanX (@index) when (@index > 0) {
+      (~".span@{index}") { .span(@index); }
+      .spanX(@index - 1);
+    }
+    .spanX (0) {}
+
+    .offsetX (@index) when (@index > 0) {
+      (~'.offset@{index}') { .offset(@index); }
+      (~'.offset@{index}:first-child') { .offsetFirstChild(@index); }
+      .offsetX(@index - 1);
+    }
+    .offsetX (0) {}
+
+    .offset (@columns) {
+      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);
+  	  *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);
+    }
+
+    .offsetFirstChild (@columns) {
+      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);
+      *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
+    }
+
+    .span (@columns) {
+      width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
+      *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);
+    }
+
+    .row-fluid {
+      width: 100%;
+      .clearfix();
+      [class*="span"] {
+        .input-block-level();
+        float: left;
+        margin-left: @fluidGridGutterWidth;
+        *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
+      }
+      [class*="span"]:first-child {
+        margin-left: 0;
+      }
+
+      // generate .spanX and .offsetX
+      .spanX (@gridColumns);
+      .offsetX (@gridColumns);
+    }
+
+  }
+
+  .input(@gridColumnWidth, @gridGutterWidth) {
+
+    .spanX (@index) when (@index > 0) {
+      (~"input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index}") { .span(@index); }
+      .spanX(@index - 1);
+    }
+    .spanX (0) {}
+
+    .span(@columns) {
+      width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14;
+    }
+
+    input,
+    textarea,
+    .uneditable-input {
+      margin-left: 0; // override margin-left from core grid system
+    }
+
+    // Space grid-sized controls properly if multiple per line
+    .controls-row [class*="span"] + [class*="span"] {
+      margin-left: @gridGutterWidth;
+    }
+
+    // generate .spanX
+    .spanX (@gridColumns);
+
+  }
+
+}
diff --git a/static/less/modals.less b/static/less/modals.less
new file mode 100644
index 0000000000000000000000000000000000000000..e515bb796d75034d6cdc99b31d8df396cb5b49a3
--- /dev/null
+++ b/static/less/modals.less
@@ -0,0 +1,97 @@
+//
+// Modals
+// --------------------------------------------------
+
+
+// Recalculate z-index where appropriate
+.modal-open {
+  .dropdown-menu {  z-index: @zindexDropdown + @zindexModal; }
+  .dropdown.open { *z-index: @zindexDropdown + @zindexModal; }
+  .popover       {  z-index: @zindexPopover  + @zindexModal; }
+  .tooltip       {  z-index: @zindexTooltip  + @zindexModal; }
+}
+
+// Background
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: @zindexModalBackdrop;
+  background-color: @black;
+  // Fade for backdrop
+  &.fade { opacity: 0; }
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  .opacity(80);
+}
+
+// Base modal
+.modal {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  z-index: @zindexModal;
+  overflow: auto;
+  width: 560px;
+  margin: -250px 0 0 -280px;
+  background-color: @white;
+  border: 1px solid #999;
+  border: 1px solid rgba(0,0,0,.3);
+  *border: 1px solid #999; /* IE6-7 */
+  .border-radius(6px);
+  .box-shadow(0 3px 7px rgba(0,0,0,0.3));
+  .background-clip(padding-box);
+  &.fade {
+    .transition(e('opacity .3s linear, top .3s ease-out'));
+    top: -25%;
+  }
+  &.fade.in { top: 50%; }
+}
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+  // Close icon
+  .close { margin-top: 2px; }
+  // Heading
+  h3 {
+    margin: 0;
+    line-height: 30px;
+  }
+}
+
+// Body (where all modal content resides)
+.modal-body {
+  overflow-y: auto;
+  max-height: 400px;
+  padding: 15px;
+}
+// Remove bottom margin if need be
+.modal-form {
+  margin-bottom: 0;
+}
+
+// Footer (for actions)
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right; // right align buttons
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  .border-radius(0 0 6px 6px);
+  .box-shadow(inset 0 1px 0 @white);
+  .clearfix(); // clear it in case folks use .pull-* classes on buttons
+
+  // Properly space out buttons
+  .btn + .btn {
+    margin-left: 5px;
+    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
+  }
+  // but override that for button groups
+  .btn-group .btn + .btn {
+    margin-left: -1px;
+  }
+}
diff --git a/static/less/navbar.less b/static/less/navbar.less
new file mode 100644
index 0000000000000000000000000000000000000000..5d03960a016734b21dc97e4fa3c91eff20e6617b
--- /dev/null
+++ b/static/less/navbar.less
@@ -0,0 +1,475 @@
+//
+// Navbars (Redux)
+// --------------------------------------------------
+
+
+// COMMON STYLES
+// -------------
+
+// Base class and wrapper
+.navbar {
+  overflow: visible;
+  margin-bottom: @baseLineHeight;
+  color: @navbarText;
+
+  // Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar
+  *position: relative;
+  *z-index: 2;
+}
+
+// Inner for background effects
+// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present
+.navbar-inner {
+  min-height: @navbarHeight;
+  padding-left:  20px;
+  padding-right: 20px;
+  #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);
+  border: 1px solid @navbarBorder;
+  .border-radius(4px);
+  .box-shadow(0 1px 4px rgba(0,0,0,.065));
+}
+
+// Set width to auto for default container
+// We then reset it for fixed navbars in the #gridSystem mixin
+.navbar .container {
+  width: auto;
+  padding-top: 0px;
+}
+
+// Override the default collapsed state
+.nav-collapse.collapse {
+  height: auto;
+}
+
+
+// Brand: website or project name
+// -------------------------
+.navbar .brand {
+  float: left;
+  display: block;
+  // Vertically center the text given @navbarHeight
+  padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2);
+  margin-left: -20px; // negative indent to left-align the text down the page
+  font-size: 20px;
+  font-weight: 200;
+  color: @navbarBrandColor;
+  text-shadow: 0 1px 0 @navbarBackgroundHighlight;
+  &:hover {
+    text-decoration: none;
+  }
+}
+
+// Plain text in topbar
+// -------------------------
+.navbar-text {
+  margin-bottom: 0;
+  line-height: @navbarHeight;
+}
+
+// Janky solution for now to account for links outside the .nav
+// -------------------------
+.navbar-link {
+  color: @navbarLinkColor;
+  &:hover {
+    color: @navbarLinkColorHover;
+  }
+}
+
+// Dividers in navbar
+// -------------------------
+.navbar .divider-vertical {
+  height: @navbarHeight;
+  margin: 0 9px;
+  border-left: 1px solid @navbarBackground;
+  border-right: 1px solid @navbarBackgroundHighlight;
+}
+
+// Buttons in navbar
+// -------------------------
+.navbar .btn,
+.navbar .btn-group {
+  .navbarVerticalAlign(28px); // Vertically center in navbar
+}
+.navbar .btn-group .btn {
+  margin: 0; // then undo the margin here so we don't accidentally double it
+}
+
+// Navbar forms
+.navbar-form {
+  margin-bottom: 0; // remove default bottom margin
+  .clearfix();
+  input,
+  select,
+  .radio,
+  .checkbox {
+    .navbarVerticalAlign(30px); // Vertically center in navbar
+  }
+  input,
+  select,
+  .btn {
+    display: inline-block;
+    margin-bottom: 0;
+  }
+  input[type="image"],
+  input[type="checkbox"],
+  input[type="radio"] {
+    margin-top: 3px;
+  }
+  .input-append,
+  .input-prepend {
+    margin-top: 6px;
+    white-space: nowrap; // preven two  items from separating within a .navbar-form that has .pull-left
+    input {
+      margin-top: 0; // remove the margin on top since it's on the parent
+    }
+  }
+}
+
+// Navbar search
+.navbar-search {
+  position: relative;
+  float: left;
+  .navbarVerticalAlign(30px); // Vertically center in navbar
+  margin-bottom: 0;
+  .search-query {
+    margin-bottom: 0;
+    padding: 4px 14px;
+    #font > .sans-serif(13px, normal, 1);
+    .border-radius(15px); // redeclare because of specificity of the type attribute
+  }
+}
+
+
+
+// Static navbar
+// -------------------------
+
+.navbar-static-top {
+  position: static;
+  width: 100%;
+  margin-bottom: 0; // remove 18px margin for default navbar
+  .navbar-inner {
+    .border-radius(0);
+  }
+}
+
+
+
+// Fixed navbar
+// -------------------------
+
+// Shared (top/bottom) styles
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: @zindexFixedNavbar;
+  margin-bottom: 0; // remove 18px margin for default navbar
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom,
+.navbar-static-top {
+  .navbar-inner {
+    border: 0;
+  }
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-left:  0;
+  padding-right: 0;
+  .border-radius(0);
+}
+
+// Reset container width
+// Required here as we reset the width earlier on and the grid mixins don't override early enough
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  #grid > .core > .span(@gridColumns);
+}
+
+// Fixed to top
+.navbar-fixed-top {
+  top: 0;
+}
+.navbar-fixed-top,
+.navbar-static-top {
+  .navbar-inner {
+    .box-shadow(~"inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1)");
+  }
+}
+
+// Fixed to bottom
+.navbar-fixed-bottom {
+  bottom: 0;
+  .navbar-inner {
+    .box-shadow(~"inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1)");
+  }
+}
+
+
+
+// NAVIGATION
+// ----------
+
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+  float: right; // redeclare due to specificity
+}
+.navbar .nav > li {
+  float: left;
+}
+
+// Links
+.navbar .nav > li > a {
+  float: none;
+  // Vertically center the text given @navbarHeight
+  padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2);
+  color: @navbarLinkColor;
+  text-decoration: none;
+  text-shadow: 0 1px 0 @navbarBackgroundHighlight;
+  border-top: 2px @blueDark solid;
+
+}
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+// Hover
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover from .active
+  color: @navbarLinkColorHover;
+  text-decoration: none;
+  border-top-color: @blue;
+
+}
+
+// Active nav items
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: @navbarLinkColorActive;
+  text-decoration: none;
+  background-color: @navbarLinkBackgroundActive;
+  -webkit-box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
+     -moz-box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
+          box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
+//  border-top-color: @navbarLinkColor;
+}
+
+// Navbar button for toggling navbar items in responsive layouts
+// These definitions need to come after '.navbar .btn'
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-left: 5px;
+  margin-right: 5px;
+  .buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%));
+  .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)");
+}
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  .border-radius(1px);
+  .box-shadow(0 1px 0 rgba(0,0,0,.25));
+}
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+
+
+
+// Dropdown menus
+// --------------
+
+// Menu position and menu carets
+.navbar .nav > li > .dropdown-menu {
+  &:before {
+    content: '';
+    display: inline-block;
+    border-left:   7px solid transparent;
+    border-right:  7px solid transparent;
+    border-bottom: 7px solid #ccc;
+    border-bottom-color: @dropdownBorder;
+    position: absolute;
+    top: -7px;
+    left: 9px;
+  }
+  &:after {
+    content: '';
+    display: inline-block;
+    border-left:   6px solid transparent;
+    border-right:  6px solid transparent;
+    border-bottom: 6px solid @dropdownBackground;
+    position: absolute;
+    top: -6px;
+    left: 10px;
+  }
+}
+// Menu position and menu caret support for dropups via extra dropup class
+.navbar-fixed-bottom .nav > li > .dropdown-menu {
+  &:before {
+    border-top: 7px solid #ccc;
+    border-top-color: @dropdownBorder;
+    border-bottom: 0;
+    bottom: -7px;
+    top: auto;
+  }
+  &:after {
+    border-top: 6px solid @dropdownBackground;
+    border-bottom: 0;
+    bottom: -6px;
+    top: auto;
+  }
+}
+
+// Remove background color from open dropdown
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  background-color: @navbarLinkBackgroundActive;
+  color: @navbarLinkColorActive;
+}
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: @navbarLinkColor;
+  border-bottom-color: @navbarLinkColor;
+}
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: @navbarLinkColorActive;
+  border-bottom-color: @navbarLinkColorActive;
+}
+
+// Right aligned menus need alt position
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  left: auto;
+  right: 0;
+  &:before {
+    left: auto;
+    right: 12px;
+  }
+  &:after {
+    left: auto;
+    right: 13px;
+  }
+  .dropdown-menu {
+    left: auto;
+    right: 100%;
+    margin-left: 0;
+    margin-right: -1px;
+    .border-radius(6px 0 6px 6px);
+  }
+}
+
+
+// Inverted navbar
+// -------------------------
+
+.navbar-inverse {
+  color: @navbarInverseText;
+
+  .navbar-inner {
+    #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);
+    border-color: @navbarInverseBorder;
+  }
+
+  .brand,
+  .nav > li > a {
+    color: @navbarInverseLinkColor;
+    text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+    &:hover {
+      color: @navbarInverseLinkColorHover;
+    }
+  }
+
+  .nav > li > a:focus,
+  .nav > li > a:hover {
+    background-color: @navbarInverseLinkBackgroundHover;
+    color: @navbarInverseLinkColorHover;
+  }
+
+  .nav .active > a,
+  .nav .active > a:hover,
+  .nav .active > a:focus {
+    color: @navbarInverseLinkColorActive;
+    background-color: @navbarInverseLinkBackgroundActive;
+  }
+
+  // Inline text links
+  .navbar-link {
+    color: @navbarInverseLinkColor;
+    &:hover {
+      color: @navbarInverseLinkColorHover;
+    }
+  }
+
+  // Dividers in navbar
+  .divider-vertical {
+    border-left-color: @navbarInverseBackground;
+    border-right-color: @navbarInverseBackgroundHighlight;
+  }
+
+  // Dropdowns
+  .nav li.dropdown.open > .dropdown-toggle,
+  .nav li.dropdown.active > .dropdown-toggle,
+  .nav li.dropdown.open.active > .dropdown-toggle {
+    background-color: @navbarInverseLinkBackgroundActive;
+    color: @navbarInverseLinkColorActive;
+  }
+  .nav li.dropdown > .dropdown-toggle .caret {
+    border-top-color: @navbarInverseLinkColor;
+    border-bottom-color: @navbarInverseLinkColor;
+  }
+  .nav li.dropdown.open > .dropdown-toggle .caret,
+  .nav li.dropdown.active > .dropdown-toggle .caret,
+  .nav li.dropdown.open.active > .dropdown-toggle .caret {
+    border-top-color: @navbarInverseLinkColorActive;
+    border-bottom-color: @navbarInverseLinkColorActive;
+  }
+
+  // Navbar search
+  .navbar-search {
+    .search-query {
+      color: @white;
+      background-color: @navbarInverseSearchBackground;
+      border-color: @navbarInverseSearchBorder;
+      .box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)");
+      .transition(none);
+      .placeholder(@navbarInverseSearchPlaceholderColor);
+
+      // Focus states (we use .focused since IE7-8 and down doesn't support :focus)
+      &:focus,
+      &.focused {
+        padding: 5px 15px;
+        color: @grayDark;
+        text-shadow: 0 1px 0 @white;
+        background-color: @navbarInverseSearchBackgroundFocus;
+        border: 0;
+        .box-shadow(0 0 3px rgba(0,0,0,.15));
+        outline: 0;
+      }
+    }
+  }
+
+  // Navbar collapse button
+  .btn-navbar {
+    .buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%));
+  }
+
+}
+
+
+
diff --git a/static/less/navbar.less.orig b/static/less/navbar.less.orig
new file mode 100644
index 0000000000000000000000000000000000000000..f6dd34cf5b3d024a43328ab37821e95bf0075853
--- /dev/null
+++ b/static/less/navbar.less.orig
@@ -0,0 +1,502 @@
+//
+// Navbars (Redux)
+// --------------------------------------------------
+
+
+// COMMON STYLES
+// -------------
+
+// Base class and wrapper
+.navbar {
+  overflow: visible;
+  margin-bottom: @baseLineHeight;
+
+  // Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar
+  *position: relative;
+  *z-index: 2;
+}
+
+// Inner for background effects
+// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present
+.navbar-inner {
+  min-height: @navbarHeight;
+  padding-left:  20px;
+  padding-right: 20px;
+  #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);
+  border: 1px solid @navbarBorder;
+  .border-radius(@baseBorderRadius);
+  .box-shadow(0 1px 4px rgba(0,0,0,.065));
+
+  // Prevent floats from breaking the navbar
+  .clearfix();
+}
+
+// Set width to auto for default container
+// We then reset it for fixed navbars in the #gridSystem mixin
+.navbar .container {
+  width: auto;
+  padding-top: 0px;
+}
+
+// Override the default collapsed state
+.nav-collapse.collapse {
+  height: auto;
+  overflow: visible;
+}
+
+
+// Brand: website or project name
+// -------------------------
+.navbar .brand {
+  float: left;
+  display: block;
+  // Vertically center the text given @navbarHeight
+  padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2);
+  margin-left: -20px; // negative indent to left-align the text down the page
+  font-size: 20px;
+  font-weight: 200;
+  color: @navbarBrandColor;
+  text-shadow: 0 1px 0 @navbarBackgroundHighlight;
+  &:hover {
+    text-decoration: none;
+  }
+}
+
+// Plain text in topbar
+// -------------------------
+.navbar-text {
+  margin-bottom: 0;
+  line-height: @navbarHeight;
+  color: @navbarText;
+}
+
+// Janky solution for now to account for links outside the .nav
+// -------------------------
+.navbar-link {
+  color: @navbarLinkColor;
+  &:hover {
+    color: @navbarLinkColorHover;
+  }
+}
+
+// Dividers in navbar
+// -------------------------
+.navbar .divider-vertical {
+  height: @navbarHeight;
+  margin: 0 9px;
+  border-left: 1px solid @navbarBackground;
+  border-right: 1px solid @navbarBackgroundHighlight;
+}
+
+// Buttons in navbar
+// -------------------------
+.navbar .btn,
+.navbar .btn-group {
+  .navbarVerticalAlign(30px); // Vertically center in navbar
+}
+.navbar .btn-group .btn,
+.navbar .input-prepend .btn,
+.navbar .input-append .btn {
+  margin-top: 0; // then undo the margin here so we don't accidentally double it
+}
+
+// Navbar forms
+// -------------------------
+.navbar-form {
+  margin-bottom: 0; // remove default bottom margin
+  .clearfix();
+  input,
+  select,
+  .radio,
+  .checkbox {
+    .navbarVerticalAlign(30px); // Vertically center in navbar
+  }
+  input,
+  select,
+  .btn {
+    display: inline-block;
+    margin-bottom: 0;
+  }
+  input[type="image"],
+  input[type="checkbox"],
+  input[type="radio"] {
+    margin-top: 3px;
+  }
+  .input-append,
+  .input-prepend {
+    margin-top: 5px;
+    white-space: nowrap; // preven two  items from separating within a .navbar-form that has .pull-left
+    input {
+      margin-top: 0; // remove the margin on top since it's on the parent
+    }
+  }
+}
+
+// Navbar search
+// -------------------------
+.navbar-search {
+  position: relative;
+  float: left;
+  .navbarVerticalAlign(30px); // Vertically center in navbar
+  margin-bottom: 0;
+  .search-query {
+    margin-bottom: 0;
+    padding: 4px 14px;
+    #font > .sans-serif(13px, normal, 1);
+    .border-radius(15px); // redeclare because of specificity of the type attribute
+  }
+}
+
+
+
+// Static navbar
+// -------------------------
+
+.navbar-static-top {
+  position: static;
+  margin-bottom: 0; // remove 18px margin for default navbar
+  .navbar-inner {
+    .border-radius(0);
+  }
+}
+
+
+
+// Fixed navbar
+// -------------------------
+
+// Shared (top/bottom) styles
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: @zindexFixedNavbar;
+  margin-bottom: 0; // remove 18px margin for default navbar
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  border-width: 0 0 1px;
+}
+.navbar-fixed-bottom .navbar-inner {
+  border-width: 1px 0 0;
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-left:  0;
+  padding-right: 0;
+  .border-radius(0);
+}
+
+// Reset container width
+// Required here as we reset the width earlier on and the grid mixins don't override early enough
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  #grid > .core > .span(@gridColumns);
+}
+
+// Fixed to top
+.navbar-fixed-top {
+  top: 0;
+}
+.navbar-fixed-top,
+.navbar-static-top {
+  .navbar-inner {
+    .box-shadow(~"0 1px 10px rgba(0,0,0,.1)");
+  }
+}
+
+// Fixed to bottom
+.navbar-fixed-bottom {
+  bottom: 0;
+  .navbar-inner {
+    .box-shadow(~"0 -1px 10px rgba(0,0,0,.1)");
+  }
+}
+
+
+
+// NAVIGATION
+// ----------
+
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+  float: right; // redeclare due to specificity
+  margin-right: 0; // remove margin on float right nav
+}
+.navbar .nav > li {
+  float: left;
+}
+
+// Links
+.navbar .nav > li > a {
+  float: none;
+  // Vertically center the text given @navbarHeight
+  padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2);
+  color: @navbarLinkColor;
+  text-decoration: none;
+  text-shadow: 0 1px 0 @navbarBackgroundHighlight;
+  border-top: 2px @blueDark solid;
+
+}
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+
+}
+
+// Hover
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover from .active
+  color: @navbarLinkColorHover;
+  text-decoration: none;
+  border-top-color: @blue;
+
+}
+
+// Active nav items
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: @navbarLinkColorActive;
+  text-decoration: none;
+  background-color: @navbarLinkBackgroundActive;
+<<<<<<< HEAD
+  -webkit-box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
+     -moz-box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
+          box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
+//  border-top-color: @navbarLinkColor;
+=======
+  .box-shadow(inset 0 3px 8px rgba(0,0,0,.125));
+>>>>>>> v2.2.2
+}
+
+// Navbar button for toggling navbar items in responsive layouts
+// These definitions need to come after '.navbar .btn'
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-left: 5px;
+  margin-right: 5px;
+  .buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%));
+  .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)");
+}
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  .border-radius(1px);
+  .box-shadow(0 1px 0 rgba(0,0,0,.25));
+}
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+
+
+
+// Dropdown menus
+// --------------
+
+// Menu position and menu carets
+.navbar .nav > li > .dropdown-menu {
+  &:before {
+    content: '';
+    display: inline-block;
+    border-left:   7px solid transparent;
+    border-right:  7px solid transparent;
+    border-bottom: 7px solid #ccc;
+    border-bottom-color: @dropdownBorder;
+    position: absolute;
+    top: -7px;
+    left: 9px;
+  }
+  &:after {
+    content: '';
+    display: inline-block;
+    border-left:   6px solid transparent;
+    border-right:  6px solid transparent;
+    border-bottom: 6px solid @dropdownBackground;
+    position: absolute;
+    top: -6px;
+    left: 10px;
+  }
+}
+// Menu position and menu caret support for dropups via extra dropup class
+.navbar-fixed-bottom .nav > li > .dropdown-menu {
+  &:before {
+    border-top: 7px solid #ccc;
+    border-top-color: @dropdownBorder;
+    border-bottom: 0;
+    bottom: -7px;
+    top: auto;
+  }
+  &:after {
+    border-top: 6px solid @dropdownBackground;
+    border-bottom: 0;
+    bottom: -6px;
+    top: auto;
+  }
+}
+
+// Caret should match text color on hover
+.navbar .nav li.dropdown > a:hover .caret {
+  border-top-color: @navbarLinkColorActive;
+  border-bottom-color: @navbarLinkColorActive;
+}
+
+// Remove background color from open dropdown
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  background-color: @navbarLinkBackgroundActive;
+  color: @navbarLinkColorActive;
+}
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: @navbarLinkColor;
+  border-bottom-color: @navbarLinkColor;
+}
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: @navbarLinkColorActive;
+  border-bottom-color: @navbarLinkColorActive;
+}
+
+// Right aligned menus need alt position
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  left: auto;
+  right: 0;
+  &:before {
+    left: auto;
+    right: 12px;
+  }
+  &:after {
+    left: auto;
+    right: 13px;
+  }
+  .dropdown-menu {
+    left: auto;
+    right: 100%;
+    margin-left: 0;
+    margin-right: -1px;
+    .border-radius(6px 0 6px 6px);
+  }
+}
+
+
+// Inverted navbar
+// -------------------------
+
+.navbar-inverse {
+
+  .navbar-inner {
+    #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);
+    border-color: @navbarInverseBorder;
+  }
+
+  .brand,
+  .nav > li > a {
+    color: @navbarInverseLinkColor;
+    text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+    &:hover {
+      color: @navbarInverseLinkColorHover;
+    }
+  }
+
+  .brand {
+    color: @navbarInverseBrandColor;
+  }
+
+  .navbar-text {
+    color: @navbarInverseText;
+  }
+
+  .nav > li > a:focus,
+  .nav > li > a:hover {
+    background-color: @navbarInverseLinkBackgroundHover;
+    color: @navbarInverseLinkColorHover;
+  }
+
+  .nav .active > a,
+  .nav .active > a:hover,
+  .nav .active > a:focus {
+    color: @navbarInverseLinkColorActive;
+    background-color: @navbarInverseLinkBackgroundActive;
+  }
+
+  // Inline text links
+  .navbar-link {
+    color: @navbarInverseLinkColor;
+    &:hover {
+      color: @navbarInverseLinkColorHover;
+    }
+  }
+
+  // Dividers in navbar
+  .divider-vertical {
+    border-left-color: @navbarInverseBackground;
+    border-right-color: @navbarInverseBackgroundHighlight;
+  }
+
+  // Dropdowns
+  .nav li.dropdown.open > .dropdown-toggle,
+  .nav li.dropdown.active > .dropdown-toggle,
+  .nav li.dropdown.open.active > .dropdown-toggle {
+    background-color: @navbarInverseLinkBackgroundActive;
+    color: @navbarInverseLinkColorActive;
+  }
+  .nav li.dropdown > a:hover .caret {
+    border-top-color: @navbarInverseLinkColorActive;
+    border-bottom-color: @navbarInverseLinkColorActive;
+  }
+  .nav li.dropdown > .dropdown-toggle .caret {
+    border-top-color: @navbarInverseLinkColor;
+    border-bottom-color: @navbarInverseLinkColor;
+  }
+  .nav li.dropdown.open > .dropdown-toggle .caret,
+  .nav li.dropdown.active > .dropdown-toggle .caret,
+  .nav li.dropdown.open.active > .dropdown-toggle .caret {
+    border-top-color: @navbarInverseLinkColorActive;
+    border-bottom-color: @navbarInverseLinkColorActive;
+  }
+
+  // Navbar search
+  .navbar-search {
+    .search-query {
+      color: @white;
+      background-color: @navbarInverseSearchBackground;
+      border-color: @navbarInverseSearchBorder;
+      .box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)");
+      .transition(none);
+      .placeholder(@navbarInverseSearchPlaceholderColor);
+
+      // Focus states (we use .focused since IE7-8 and down doesn't support :focus)
+      &:focus,
+      &.focused {
+        padding: 5px 15px;
+        color: @grayDark;
+        text-shadow: 0 1px 0 @white;
+        background-color: @navbarInverseSearchBackgroundFocus;
+        border: 0;
+        .box-shadow(0 0 3px rgba(0,0,0,.15));
+        outline: 0;
+      }
+    }
+  }
+
+  // Navbar collapse button
+  .btn-navbar {
+    .buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%));
+  }
+
+}
diff --git a/static/less/navs.less b/static/less/navs.less
new file mode 100644
index 0000000000000000000000000000000000000000..4c38f7dbf2c80036cb9b62d01b6a16d5d113216f
--- /dev/null
+++ b/static/less/navs.less
@@ -0,0 +1,384 @@
+//
+// Navs
+// --------------------------------------------------
+
+
+// BASE CLASS
+// ----------
+
+.nav {
+  margin-left: 0;
+  margin-bottom: @baseLineHeight;
+  list-style: none;
+}
+
+// Make links block level
+.nav > li > a {
+  display: block;
+}
+.nav > li > a:hover {
+  text-decoration: none;
+  background-color: @grayLighter;
+}
+
+// Redeclare pull classes because of specifity
+.nav > .pull-right {
+  float: right;
+}
+
+// Nav headers (for dropdowns and lists)
+.nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: @baseLineHeight;
+  color: @grayLight;
+  text-shadow: 0 1px 0 rgba(255,255,255,.5);
+  text-transform: uppercase;
+}
+// Space them out when they follow another list item (link)
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+
+
+
+// NAV LIST
+// --------
+
+.nav-list {
+  padding-left: 15px;
+  padding-right: 15px;
+  margin-bottom: 0;
+}
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-left:  -15px;
+  margin-right: -15px;
+  text-shadow: 0 1px 0 rgba(255,255,255,.5);
+}
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+.nav-list > .active > a,
+.nav-list > .active > a:hover {
+  color: @white;
+  text-shadow: 0 -1px 0 rgba(0,0,0,.2);
+  background-color: @linkColor;
+}
+.nav-list [class^="icon-"] {
+  margin-right: 2px;
+}
+// Dividers (basically an hr) within the dropdown
+.nav-list .divider {
+  .nav-divider();
+}
+
+
+
+// TABS AND PILLS
+// -------------
+
+// Common styles
+.nav-tabs,
+.nav-pills {
+  .clearfix();
+}
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px; // keeps the overall height an even number
+}
+
+// TABS
+// ----
+
+// Give the tabs something to sit on
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+// Make the list-items overlay the bottom border
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+// Actual tabs (as links)
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: @baseLineHeight;
+  border: 1px solid transparent;
+  .border-radius(4px 4px 0 0);
+  &:hover {
+    border-color: @grayLighter @grayLighter #ddd;
+  }
+}
+// Active state, and it's :hover to override normal :hover
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover {
+  color: @gray;
+  background-color: @white;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+  cursor: default;
+}
+
+
+// PILLS
+// -----
+
+// Links rendered as pills
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  .border-radius(5px);
+}
+
+// Active state
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover {
+  color: @white;
+  background-color: @linkColor;
+}
+
+
+
+// STACKED NAV
+// -----------
+
+// Stacked tabs and pills
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li > a {
+  margin-right: 0; // no need for the gap between nav items
+}
+
+// Tabs
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  .border-radius(0);
+}
+.nav-tabs.nav-stacked > li:first-child > a {
+  .border-top-radius(4px);
+}
+.nav-tabs.nav-stacked > li:last-child > a {
+  .border-bottom-radius(4px);
+}
+.nav-tabs.nav-stacked > li > a:hover {
+  border-color: #ddd;
+  z-index: 2;
+}
+
+// Pills
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px; // decrease margin to match sizing of stacked tabs
+}
+
+
+
+// DROPDOWNS
+// ---------
+
+.nav-tabs .dropdown-menu {
+  .border-radius(0 0 6px 6px); // remove the top rounded corners here since there is a hard edge above the menu
+}
+.nav-pills .dropdown-menu {
+  .border-radius(6px); // make rounded corners match the pills
+}
+
+// Default dropdown links
+// -------------------------
+// Make carets use linkColor to start
+.nav .dropdown-toggle .caret {
+  border-top-color: @linkColor;
+  border-bottom-color: @linkColor;
+  margin-top: 6px;
+}
+.nav .dropdown-toggle:hover .caret {
+  border-top-color: @linkColorHover;
+  border-bottom-color: @linkColorHover;
+}
+/* move down carets for tabs */
+.nav-tabs .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+// Active dropdown links
+// -------------------------
+.nav .active .dropdown-toggle .caret {
+  border-top-color: #fff;
+  border-bottom-color: #fff;
+}
+.nav-tabs .active .dropdown-toggle .caret {
+  border-top-color: @gray;
+  border-bottom-color: @gray;
+}
+
+// Active:hover dropdown links
+// -------------------------
+.nav > .dropdown.active > a:hover {
+  cursor: pointer;
+}
+
+// Open dropdowns
+// -------------------------
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover {
+  color: @white;
+  background-color: @grayLight;
+  border-color: @grayLight;
+}
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret {
+  border-top-color: @white;
+  border-bottom-color: @white;
+  .opacity(100);
+}
+
+// Dropdowns in stacked tabs
+.tabs-stacked .open > a:hover {
+  border-color: @grayLight;
+}
+
+
+
+// TABBABLE
+// --------
+
+
+// COMMON STYLES
+// -------------
+
+// Clear any floats
+.tabbable {
+  .clearfix();
+}
+.tab-content {
+  overflow: auto; // prevent content from running below tabs
+}
+
+// Remove border on bottom, left, right
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+
+// Show/hide tabbable areas
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+
+
+// BOTTOM
+// ------
+
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+.tabs-below > .nav-tabs > li > a {
+  .border-radius(0 0 4px 4px);
+  &:hover {
+    border-bottom-color: transparent;
+    border-top-color: #ddd;
+  }
+}
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover {
+  border-color: transparent #ddd #ddd #ddd;
+}
+
+// LEFT & RIGHT
+// ------------
+
+// Common styles
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+
+// Tabs on the left
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  .border-radius(4px 0 0 4px);
+}
+.tabs-left > .nav-tabs > li > a:hover {
+  border-color: @grayLighter #ddd @grayLighter @grayLighter;
+}
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: @white;
+}
+
+// Tabs on the right
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  .border-radius(0 4px 4px 0);
+}
+.tabs-right > .nav-tabs > li > a:hover {
+  border-color: @grayLighter @grayLighter @grayLighter #ddd;
+}
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: @white;
+}
+
+
+
+// DISABLED STATES
+// ---------------
+
+// Gray out text
+.nav > .disabled > a {
+  color: @grayLight;
+}
+// Nuke hover effects
+.nav > .disabled > a:hover {
+  text-decoration: none;
+  background-color: transparent;
+  cursor: default;
+}
diff --git a/static/less/pager.less b/static/less/pager.less
new file mode 100644
index 0000000000000000000000000000000000000000..2b854b4bef92844e974ae71b3d9d5f3b4f46c174
--- /dev/null
+++ b/static/less/pager.less
@@ -0,0 +1,37 @@
+//
+// Pager pagination
+// --------------------------------------------------
+
+
+.pager {
+  margin: @baseLineHeight 0;
+  list-style: none;
+  text-align: center;
+  .clearfix();
+}
+.pager li {
+  display: inline;
+}
+.pager a {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  .border-radius(15px);
+}
+.pager a:hover {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.pager .next a {
+  float: right;
+}
+.pager .previous a {
+  float: left;
+}
+.pager .disabled a,
+.pager .disabled a:hover {
+  color: @grayLight;
+  background-color: #fff;
+  cursor: default;
+}
\ No newline at end of file
diff --git a/static/less/pagination.less b/static/less/pagination.less
new file mode 100644
index 0000000000000000000000000000000000000000..2c19880c09e2d79e240dd98d5da3cc22692fe895
--- /dev/null
+++ b/static/less/pagination.less
@@ -0,0 +1,64 @@
+//
+// Pagination (multiple pages)
+// --------------------------------------------------
+
+
+.pagination {
+  height: @baseLineHeight * 2;
+  margin: @baseLineHeight 0;
+ }
+.pagination ul {
+  display: inline-block;
+  .ie7-inline-block();
+  margin-left: 0;
+  margin-bottom: 0;
+  .border-radius(3px);
+  .box-shadow(0 1px 2px rgba(0,0,0,.05));
+}
+.pagination li {
+    display: inline;
+  }
+.pagination a,
+.pagination span {
+  float: left;
+  padding: 0 14px;
+  line-height: (@baseLineHeight * 2) - 2;
+  text-decoration: none;
+  background-color: @paginationBackground;
+  border: 1px solid @paginationBorder;
+  border-left-width: 0;
+}
+.pagination a:hover,
+.pagination .active a,
+.pagination .active span {
+  background-color: #f5f5f5;
+}
+.pagination .active a,
+.pagination .active span {
+  color: @grayLight;
+  cursor: default;
+}
+.pagination .disabled span,
+.pagination .disabled a,
+.pagination .disabled a:hover {
+  color: @grayLight;
+  background-color: transparent;
+  cursor: default;
+}
+.pagination li:first-child a,
+.pagination li:first-child span {
+  border-left-width: 1px;
+  .border-radius(3px 0 0 3px);
+}
+.pagination li:last-child a,
+.pagination li:last-child span {
+  .border-radius(0 3px 3px 0);
+}
+
+// Centered
+.pagination-centered {
+  text-align: center;
+}
+.pagination-right {
+  text-align: right;
+}
diff --git a/static/less/popovers.less b/static/less/popovers.less
new file mode 100644
index 0000000000000000000000000000000000000000..2b3f1b059956b337dad93eab3644d835854557a7
--- /dev/null
+++ b/static/less/popovers.less
@@ -0,0 +1,117 @@
+//
+// Popovers
+// --------------------------------------------------
+
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: @zindexPopover;
+  display: none;
+  width: 236px;
+  padding: 1px;
+  background-color: @popoverBackground;
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0,0,0,.2);
+  .border-radius(6px);
+  .box-shadow(0 5px 10px rgba(0,0,0,.2));
+
+  // Offset the popover to account for the popover arrow
+  &.top     { margin-bottom: 10px; }
+  &.right   { margin-left: 10px; }
+  &.bottom  { margin-top: 10px; }
+  &.left    { margin-right: 10px; }
+
+}
+
+.popover-title {
+  margin: 0; // reset heading margin
+  padding: 8px 14px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: @popoverTitleBackground;
+  border-bottom: 1px solid darken(@popoverTitleBackground, 5%);
+  .border-radius(5px 5px 0 0);
+}
+
+.popover-content {
+  padding: 9px 14px;
+  p, ul, ol {
+    margin-bottom: 0;
+  }
+}
+
+// Arrows
+.popover .arrow,
+.popover .arrow:after {
+  position: absolute;
+  display: inline-block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.popover .arrow:after {
+  content: "";
+  z-index: -1;
+}
+
+.popover {
+  &.top .arrow {
+    bottom: -@popoverArrowWidth;
+    left: 50%;
+    margin-left: -@popoverArrowWidth;
+    border-width: @popoverArrowWidth @popoverArrowWidth 0;
+    border-top-color: @popoverArrowColor;
+    &:after {
+      border-width: @popoverArrowOuterWidth @popoverArrowOuterWidth 0;
+      border-top-color: @popoverArrowOuterColor;
+      bottom: -1px;
+      left: -@popoverArrowOuterWidth;
+    }
+  }
+  &.right .arrow {
+    top: 50%;
+    left: -@popoverArrowWidth;
+    margin-top: -@popoverArrowWidth;
+    border-width: @popoverArrowWidth @popoverArrowWidth @popoverArrowWidth 0;
+    border-right-color: @popoverArrowColor;
+    &:after {
+      border-width: @popoverArrowOuterWidth @popoverArrowOuterWidth @popoverArrowOuterWidth 0;
+      border-right-color: @popoverArrowOuterColor;
+      bottom: -@popoverArrowOuterWidth;
+      left: -1px;
+    }
+  }
+  &.bottom .arrow {
+    top: -@popoverArrowWidth;
+    left: 50%;
+    margin-left: -@popoverArrowWidth;
+    border-width: 0 @popoverArrowWidth @popoverArrowWidth;
+    border-bottom-color: @popoverArrowColor;
+    &:after {
+      border-width: 0 @popoverArrowOuterWidth @popoverArrowOuterWidth;
+      border-bottom-color: @popoverArrowOuterColor;
+      top: -1px;
+      left: -@popoverArrowOuterWidth;
+    }
+  }
+  &.left .arrow {
+    top: 50%;
+    right: -@popoverArrowWidth;
+    margin-top: -@popoverArrowWidth;
+    border-width: @popoverArrowWidth 0 @popoverArrowWidth @popoverArrowWidth;
+    border-left-color: @popoverArrowColor;
+    &:after {
+      border-width: @popoverArrowOuterWidth 0 @popoverArrowOuterWidth @popoverArrowOuterWidth;
+      border-left-color: @popoverArrowOuterColor;
+      bottom: -@popoverArrowOuterWidth;
+      right: -1px;
+    }
+  }
+}
diff --git a/static/less/progress-bars.less b/static/less/progress-bars.less
new file mode 100644
index 0000000000000000000000000000000000000000..36744d89c707589ef21f50db0986a516f1c78cf7
--- /dev/null
+++ b/static/less/progress-bars.less
@@ -0,0 +1,122 @@
+//
+// Progress bars
+// --------------------------------------------------
+
+
+// ANIMATIONS
+// ----------
+
+// Webkit
+@-webkit-keyframes progress-bar-stripes {
+  from  { background-position: 40px 0; }
+  to    { background-position: 0 0; }
+}
+
+// Firefox
+@-moz-keyframes progress-bar-stripes {
+  from  { background-position: 40px 0; }
+  to    { background-position: 0 0; }
+}
+
+// IE9
+@-ms-keyframes progress-bar-stripes {
+  from  { background-position: 40px 0; }
+  to    { background-position: 0 0; }
+}
+
+// Opera
+@-o-keyframes progress-bar-stripes {
+  from  { background-position: 0 0; }
+  to    { background-position: 40px 0; }
+}
+
+// Spec
+@keyframes progress-bar-stripes {
+  from  { background-position: 40px 0; }
+  to    { background-position: 0 0; }
+}
+
+
+
+// THE BARS
+// --------
+
+// Outer container
+.progress {
+  overflow: hidden;
+  height: @baseLineHeight;
+  margin-bottom: @baseLineHeight;
+  #gradient > .vertical(#f5f5f5, #f9f9f9);
+  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
+  .border-radius(4px);
+}
+
+// Bar of progress
+.progress .bar {
+  width: 0%;
+  height: 100%;
+  color: @white;
+  float: left;
+  font-size: 12px;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+  #gradient > .vertical(#149bdf, #0480be);
+  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
+  .box-sizing(border-box);
+  .transition(width .6s ease);
+}
+.progress .bar + .bar {
+  .box-shadow(~"inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15)");
+}
+
+// Striped bars
+.progress-striped .bar {
+  #gradient > .striped(#149bdf);
+  .background-size(40px 40px);
+}
+
+// Call animation for the active one
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+     -moz-animation: progress-bar-stripes 2s linear infinite;
+      -ms-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+
+
+
+// COLORS
+// ------
+
+// Danger (red)
+.progress-danger .bar, .progress .bar-danger {
+  #gradient > .vertical(#ee5f5b, #c43c35);
+}
+.progress-danger.progress-striped .bar, .progress-striped .bar-danger {
+  #gradient > .striped(#ee5f5b);
+}
+
+// Success (green)
+.progress-success .bar, .progress .bar-success {
+  #gradient > .vertical(#62c462, #57a957);
+}
+.progress-success.progress-striped .bar, .progress-striped .bar-success {
+  #gradient > .striped(#62c462);
+}
+
+// Info (teal)
+.progress-info .bar, .progress .bar-info {
+  #gradient > .vertical(#5bc0de, #339bb9);
+}
+.progress-info.progress-striped .bar, .progress-striped .bar-info {
+  #gradient > .striped(#5bc0de);
+}
+
+// Warning (orange)
+.progress-warning .bar, .progress .bar-warning {
+  #gradient > .vertical(lighten(@orange, 15%), @orange);
+}
+.progress-warning.progress-striped .bar, .progress-striped .bar-warning {
+  #gradient > .striped(lighten(@orange, 15%));
+}
diff --git a/static/less/reset.less b/static/less/reset.less
new file mode 100644
index 0000000000000000000000000000000000000000..fc27e9c878dd54fd99ca75e710a6cd50a9ea558d
--- /dev/null
+++ b/static/less/reset.less
@@ -0,0 +1,134 @@
+//
+// Modals
+// Adapted from http://github.com/necolas/normalize.css
+// --------------------------------------------------
+
+
+// Display in IE6-9 and FF3
+// -------------------------
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+
+// Display block in IE6-9 and FF3
+// -------------------------
+
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+
+// Prevents modern browsers from displaying 'audio' without controls
+// -------------------------
+
+audio:not([controls]) {
+    display: none;
+}
+
+// Base settings
+// -------------------------
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+// Focus states
+a:focus {
+  .tab-focus();
+}
+// Hover & Active
+a:hover,
+a:active {
+  outline: 0;
+}
+
+// Prevents sub and sup affecting line-height in all browsers
+// -------------------------
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -0.5em;
+}
+sub {
+  bottom: -0.25em;
+}
+
+// Img border in a's and image quality
+// -------------------------
+
+img {
+  max-width: 100%; // Make images inherently responsive
+  height: auto; // Make images inherently responsive
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+
+// Prevent max-width from affecting Google Maps
+#map_canvas img {
+  max-width: none;
+}
+
+// Forms
+// -------------------------
+
+// Font size in all browsers, margin changes, misc consistency
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+button,
+input {
+  *overflow: visible; // Inner spacing ie IE6/7
+  line-height: normal; // FF3/4 have !important on line-height in UA stylesheet
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner { // Inner padding and border oddities in FF3/4
+  padding: 0;
+  border: 0;
+}
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer; // Cursors on all buttons applied consistently
+  -webkit-appearance: button; // Style clickable inputs in iOS
+}
+input[type="search"] { // Appearance in Safari/Chrome
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5
+}
+textarea {
+  overflow: auto; // Remove vertical scrollbar in IE6-9
+  vertical-align: top; // Readability and alignment cross-browser
+}
diff --git a/static/less/responsive-1200px-min.less b/static/less/responsive-1200px-min.less
new file mode 100644
index 0000000000000000000000000000000000000000..4f35ba6ca23c34b892bec83977277b0d5043ea0b
--- /dev/null
+++ b/static/less/responsive-1200px-min.less
@@ -0,0 +1,28 @@
+//
+// Responsive: Large desktop and up
+// --------------------------------------------------
+
+
+@media (min-width: 1200px) {
+
+  // Fixed grid
+  #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200);
+
+  // Fluid grid
+  #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200);
+
+  // Input grid
+  #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200);
+
+  // Thumbnails
+  .thumbnails {
+    margin-left: -@gridGutterWidth1200;
+  }
+  .thumbnails > li {
+    margin-left: @gridGutterWidth1200;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+
+}
diff --git a/static/less/responsive-767px-max.less b/static/less/responsive-767px-max.less
new file mode 100644
index 0000000000000000000000000000000000000000..b2e3da25c03c9120637a38fbcbcb0ec5ed9f8fda
--- /dev/null
+++ b/static/less/responsive-767px-max.less
@@ -0,0 +1,167 @@
+//
+// Responsive: Landscape phone to desktop/tablet
+// --------------------------------------------------
+
+
+@media (max-width: 767px) {
+
+  // Padding to set content in a bit
+  body {
+    padding-left: 20px;
+    padding-right: 20px;
+  }
+  // Negative indent the now static "fixed" navbar
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    margin-left: -20px;
+    margin-right: -20px;
+  }
+  // Remove padding on container given explicit padding set on body
+  .container-fluid {
+    padding: 0;
+  }
+
+  // TYPOGRAPHY
+  // ----------
+  // Reset horizontal dl
+  .dl-horizontal {
+    dt {
+      float: none;
+      clear: none;
+      width: auto;
+      text-align: left;
+    }
+    dd {
+      margin-left: 0;
+    }
+  }
+
+  // GRID & CONTAINERS
+  // -----------------
+  // Remove width from containers
+  .container {
+    width: auto;
+  }
+  // Fluid rows
+  .row-fluid {
+    width: 100%;
+  }
+  // Undo negative margin on rows and thumbnails
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0; // Reset the default margin for all li elements when no .span* classes are present
+  }
+  // Make all grid-sized elements block level again
+  [class*="span"],
+  .row-fluid [class*="span"] {
+    float: none;
+    display: block;
+    width: auto;
+    margin-left: 0;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    .box-sizing(border-box);
+  }
+
+  // FORM FIELDS
+  // -----------
+  // Make span* classes full width
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    .input-block-level();
+  }
+  // But don't let it screw up prepend/append inputs
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block; // redeclare so they don't wrap to new lines
+    width: auto;
+  }
+
+  // Modals
+  .modal {
+    position: fixed;
+    top:   20px;
+    left:  20px;
+    right: 20px;
+    width: auto;
+    margin: 0;
+    &.fade.in { top: auto; }
+  }
+
+}
+
+
+
+// UP TO LANDSCAPE PHONE
+// ---------------------
+
+@media (max-width: 480px) {
+
+  // Smooth out the collapsing/expanding nav
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0); // activate the GPU
+  }
+
+  // Block level the page header small tag for readability
+  .page-header h1 small {
+    display: block;
+    line-height: @baseLineHeight;
+  }
+
+  // Update checkboxes for iOS
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+
+  // Remove the horizontal form styles
+  .form-horizontal .control-group > label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  // Move over all input controls and content
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  // Move the options list down to align with labels
+  .form-horizontal .control-list {
+    padding-top: 0; // has to be padding because margin collaspes
+  }
+  // Move over buttons in .form-actions to align with .controls
+  .form-horizontal .form-actions {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+
+  // Modals
+  .modal {
+    top:   10px;
+    left:  10px;
+    right: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+
+  // Carousel
+  .carousel-caption {
+    position: static;
+  }
+
+}
diff --git a/static/less/responsive-768px-979px.less b/static/less/responsive-768px-979px.less
new file mode 100644
index 0000000000000000000000000000000000000000..8e8c486a069d8b2c393f605162d1d76b9d7fd0fd
--- /dev/null
+++ b/static/less/responsive-768px-979px.less
@@ -0,0 +1,19 @@
+//
+// Responsive: Tablet to desktop
+// --------------------------------------------------
+
+
+@media (min-width: 768px) and (max-width: 979px) {
+
+  // Fixed grid
+  #grid > .core(@gridColumnWidth768, @gridGutterWidth768);
+
+  // Fluid grid
+  #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768);
+
+  // Input grid
+  #grid > .input(@gridColumnWidth768, @gridGutterWidth768);
+
+  // No need to reset .thumbnails here since it's the same @gridGutterWidth
+
+}
diff --git a/static/less/responsive-navbar.less b/static/less/responsive-navbar.less
new file mode 100644
index 0000000000000000000000000000000000000000..a067d0403a45f939ea1284ef009cbd16e044b03f
--- /dev/null
+++ b/static/less/responsive-navbar.less
@@ -0,0 +1,169 @@
+//
+// Responsive: Navbar
+// --------------------------------------------------
+
+
+// TABLETS AND BELOW
+// -----------------
+@media (max-width: @navbarCollapseWidth) {
+
+  // UNFIX THE TOPBAR
+  // ----------------
+  // Remove any padding from the body
+  body {
+    padding-top: 0;
+  }
+  // Unfix the navbars
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+//    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: @baseLineHeight;
+  }
+  .navbar-fixed-bottom {
+    margin-top: @baseLineHeight;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding-left: 5px;
+    padding-right: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+	margin-left: 10px;
+	margin-right: 10px;
+  }
+  // Account for brand name
+  .navbar .brand {
+    padding-left: 10px;
+    padding-right: 10px;
+    margin: 0 0 0 -5px;
+  }
+
+  // COLLAPSIBLE NAVBAR
+  // ------------------
+  // Nav collapse clears brand
+  .nav-collapse {
+    clear: both;
+  }
+  // Block-level the nav
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 (@baseLineHeight / 2);
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: @navbarText;
+    text-shadow: none;
+  }
+  // Nav and dropdown links in navbar
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: @navbarLinkColor;
+    .border-radius(3px);
+  }
+  // Buttons
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    .border-radius(4px);
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .dropdown-menu a:hover {
+    background-color: @navbarBackground;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover {
+    background-color: @navbarInverseBackground;
+  }
+  // Buttons in the navbar
+  .nav-collapse.in .btn-group {
+    margin-top: 5px;
+    padding: 0;
+  }
+  // Dropdowns in the navbar
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    float: none;
+    display: block;
+    max-width: none;
+    margin: 0 15px;
+    padding: 0;
+    background-color: transparent;
+    border: none;
+    .border-radius(0);
+    .box-shadow(none);
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  // Forms in navbar
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: (@baseLineHeight / 2) 15px;
+    margin: (@baseLineHeight / 2) 0;
+    border-top: 1px solid @navbarBackground;
+    border-bottom: 1px solid @navbarBackground;
+    .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)");
+  }
+  // Pull right (secondary) nav content
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  // Hide everything in the navbar save .brand and toggle button */
+  .nav-collapse,
+  .nav-collapse.collapse {
+    overflow: hidden;
+    height: 0;
+  }
+  // Navbar button
+  .navbar .btn-navbar {
+    display: block;
+  }
+
+  // STATIC NAVBAR
+  // -------------
+  .navbar-static .navbar-inner {
+    padding-left:  10px;
+    padding-right: 10px;
+  }
+
+
+}
+
+
+// DEFAULT DESKTOP
+// ---------------
+
+@media (min-width: 980px) {
+
+  // Required to make the collapsing navbar work on regular desktops
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+
+}
diff --git a/static/less/responsive-utilities.less b/static/less/responsive-utilities.less
new file mode 100644
index 0000000000000000000000000000000000000000..2c3f6c15fe2e55e2d0ec43f3a4c81667601f96b4
--- /dev/null
+++ b/static/less/responsive-utilities.less
@@ -0,0 +1,43 @@
+//
+// Responsive: Utility classes
+// --------------------------------------------------
+
+
+// Hide from screenreaders and browsers
+// Credit: HTML5 Boilerplate
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+// Visibility utilities
+
+// For desktops
+.visible-phone     { display: none !important; }
+.visible-tablet    { display: none !important; }
+.hidden-phone      { }
+.hidden-tablet     { }
+.hidden-desktop    { display: none !important; }
+.visible-desktop   { display: inherit !important; }
+
+// Tablets & small desktops only
+@media (min-width: 768px) and (max-width: 979px) {
+  // Hide everything else
+  .hidden-desktop    { display: inherit !important; }
+  .visible-desktop   { display: none !important ; }
+  // Show
+  .visible-tablet    { display: inherit !important; }
+  // Hide
+  .hidden-tablet     { display: none !important; }
+}
+
+// Phones only
+@media (max-width: 767px) {
+  // Hide everything else
+  .hidden-desktop    { display: inherit !important; }
+  .visible-desktop   { display: none !important; }
+  // Show
+  .visible-phone     { display: inherit !important; } // Use inherit to restore previous behavior
+  // Hide
+  .hidden-phone      { display: none !important; }
+}
diff --git a/static/less/responsive.less b/static/less/responsive.less
new file mode 100644
index 0000000000000000000000000000000000000000..a76ef8a80f23834deea95c475afccadf74a0a28f
--- /dev/null
+++ b/static/less/responsive.less
@@ -0,0 +1,49 @@
+/*!
+ * Bootstrap Responsive v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+
+// Responsive.less
+// For phone and tablet devices
+// -------------------------------------------------------------
+
+
+// REPEAT VARIABLES & MIXINS
+// -------------------------
+// Required since we compile the responsive stuff separately
+
+@import "variables.less"; // Modify this for custom colors, font-sizes, etc
+@import "mixins.less";
+
+
+// RESPONSIVE CLASSES
+// ------------------
+
+@import "responsive-utilities.less";
+
+@import "m2m.eclipse.org.less";
+
+// MEDIA QUERIES
+// ------------------
+
+// Large desktops
+@import "responsive-1200px-min.less";
+
+// Tablets to regular desktops
+@import "responsive-768px-979px.less";
+
+// Phones to portrait tablets and narrow desktops
+@import "responsive-767px-max.less";
+
+
+// RESPONSIVE NAVBAR
+// ------------------
+
+// From 979px and below, show a button to toggle navbar contents
+@import "responsive-navbar.less";
diff --git a/static/less/scaffolding.less b/static/less/scaffolding.less
new file mode 100644
index 0000000000000000000000000000000000000000..b75e1ec70978beedd864f7892313d7877cc9e53b
--- /dev/null
+++ b/static/less/scaffolding.less
@@ -0,0 +1,50 @@
+//
+// Scaffolding
+// --------------------------------------------------
+
+
+// Body reset
+// -------------------------
+
+body {
+  margin: 0;
+  font-family: @baseFontFamily;
+  font-size: @baseFontSize;
+  line-height: @baseLineHeight;
+  color: @textColor;
+  background: @bodyBackground;
+}
+
+// Links
+// -------------------------
+
+a {
+  color: @linkColor;
+  text-decoration: none;
+}
+a:hover {
+  color: @linkColorHover;
+  text-decoration: underline;
+}
+
+
+// Images
+// -------------------------
+
+.img-rounded {
+  .border-radius(6px);
+}
+
+.img-polaroid {
+  padding: 4px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0,0,0,.2);
+  -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+     -moz-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+          box-shadow: 0 1px 3px rgba(0,0,0,.1);
+}
+
+.img-circle {
+  .border-radius(500px);
+}
diff --git a/static/less/sprites.less b/static/less/sprites.less
new file mode 100644
index 0000000000000000000000000000000000000000..8d5e40e7ab68407d6ba95b31de3b6fee6830a1e8
--- /dev/null
+++ b/static/less/sprites.less
@@ -0,0 +1,187 @@
+//
+// Sprites
+// --------------------------------------------------
+
+
+// ICONS
+// -----
+
+// All icons receive the styles of the <i> tag with a base class
+// of .i and are then given a unique class to add width, height,
+// and background-position. Your resulting HTML will look like
+// <i class="icon-inbox"></i>.
+
+// For the white version of the icons, just add the .icon-white class:
+// <i class="icon-inbox icon-white"></i>
+
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  .ie7-restore-right-whitespace();
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("@{iconSpritePath}");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+  margin-top: 1px;
+}
+
+/* White icons with optional class, or on hover/active states of certain elements */
+.icon-white,
+.nav > .active > a > [class^="icon-"],
+.nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"] {
+  background-image: url("@{iconWhiteSpritePath}");
+}
+
+.icon-glass              { background-position: 0      0; }
+.icon-music              { background-position: -24px  0; }
+.icon-search             { background-position: -48px  0; }
+.icon-envelope           { background-position: -72px  0; }
+.icon-heart              { background-position: -96px  0; }
+.icon-star               { background-position: -120px 0; }
+.icon-star-empty         { background-position: -144px 0; }
+.icon-user               { background-position: -168px 0; }
+.icon-film               { background-position: -192px 0; }
+.icon-th-large           { background-position: -216px 0; }
+.icon-th                 { background-position: -240px 0; }
+.icon-th-list            { background-position: -264px 0; }
+.icon-ok                 { background-position: -288px 0; }
+.icon-remove             { background-position: -312px 0; }
+.icon-zoom-in            { background-position: -336px 0; }
+.icon-zoom-out           { background-position: -360px 0; }
+.icon-off                { background-position: -384px 0; }
+.icon-signal             { background-position: -408px 0; }
+.icon-cog                { background-position: -432px 0; }
+.icon-trash              { background-position: -456px 0; }
+
+.icon-home               { background-position: 0      -24px; }
+.icon-file               { background-position: -24px  -24px; }
+.icon-time               { background-position: -48px  -24px; }
+.icon-road               { background-position: -72px  -24px; }
+.icon-download-alt       { background-position: -96px  -24px; }
+.icon-download           { background-position: -120px -24px; }
+.icon-upload             { background-position: -144px -24px; }
+.icon-inbox              { background-position: -168px -24px; }
+.icon-play-circle        { background-position: -192px -24px; }
+.icon-repeat             { background-position: -216px -24px; }
+.icon-refresh            { background-position: -240px -24px; }
+.icon-list-alt           { background-position: -264px -24px; }
+.icon-lock               { background-position: -287px -24px; } // 1px off
+.icon-flag               { background-position: -312px -24px; }
+.icon-headphones         { background-position: -336px -24px; }
+.icon-volume-off         { background-position: -360px -24px; }
+.icon-volume-down        { background-position: -384px -24px; }
+.icon-volume-up          { background-position: -408px -24px; }
+.icon-qrcode             { background-position: -432px -24px; }
+.icon-barcode            { background-position: -456px -24px; }
+
+.icon-tag                { background-position: 0      -48px; }
+.icon-tags               { background-position: -25px  -48px; } // 1px off
+.icon-book               { background-position: -48px  -48px; }
+.icon-bookmark           { background-position: -72px  -48px; }
+.icon-print              { background-position: -96px  -48px; }
+.icon-camera             { background-position: -120px -48px; }
+.icon-font               { background-position: -144px -48px; }
+.icon-bold               { background-position: -167px -48px; } // 1px off
+.icon-italic             { background-position: -192px -48px; }
+.icon-text-height        { background-position: -216px -48px; }
+.icon-text-width         { background-position: -240px -48px; }
+.icon-align-left         { background-position: -264px -48px; }
+.icon-align-center       { background-position: -288px -48px; }
+.icon-align-right        { background-position: -312px -48px; }
+.icon-align-justify      { background-position: -336px -48px; }
+.icon-list               { background-position: -360px -48px; }
+.icon-indent-left        { background-position: -384px -48px; }
+.icon-indent-right       { background-position: -408px -48px; }
+.icon-facetime-video     { background-position: -432px -48px; }
+.icon-picture            { background-position: -456px -48px; }
+
+.icon-pencil             { background-position: 0      -72px; }
+.icon-map-marker         { background-position: -24px  -72px; }
+.icon-adjust             { background-position: -48px  -72px; }
+.icon-tint               { background-position: -72px  -72px; }
+.icon-edit               { background-position: -96px  -72px; }
+.icon-share              { background-position: -120px -72px; }
+.icon-check              { background-position: -144px -72px; }
+.icon-move               { background-position: -168px -72px; }
+.icon-step-backward      { background-position: -192px -72px; }
+.icon-fast-backward      { background-position: -216px -72px; }
+.icon-backward           { background-position: -240px -72px; }
+.icon-play               { background-position: -264px -72px; }
+.icon-pause              { background-position: -288px -72px; }
+.icon-stop               { background-position: -312px -72px; }
+.icon-forward            { background-position: -336px -72px; }
+.icon-fast-forward       { background-position: -360px -72px; }
+.icon-step-forward       { background-position: -384px -72px; }
+.icon-eject              { background-position: -408px -72px; }
+.icon-chevron-left       { background-position: -432px -72px; }
+.icon-chevron-right      { background-position: -456px -72px; }
+
+.icon-plus-sign          { background-position: 0      -96px; }
+.icon-minus-sign         { background-position: -24px  -96px; }
+.icon-remove-sign        { background-position: -48px  -96px; }
+.icon-ok-sign            { background-position: -72px  -96px; }
+.icon-question-sign      { background-position: -96px  -96px; }
+.icon-info-sign          { background-position: -120px -96px; }
+.icon-screenshot         { background-position: -144px -96px; }
+.icon-remove-circle      { background-position: -168px -96px; }
+.icon-ok-circle          { background-position: -192px -96px; }
+.icon-ban-circle         { background-position: -216px -96px; }
+.icon-arrow-left         { background-position: -240px -96px; }
+.icon-arrow-right        { background-position: -264px -96px; }
+.icon-arrow-up           { background-position: -289px -96px; } // 1px off
+.icon-arrow-down         { background-position: -312px -96px; }
+.icon-share-alt          { background-position: -336px -96px; }
+.icon-resize-full        { background-position: -360px -96px; }
+.icon-resize-small       { background-position: -384px -96px; }
+.icon-plus               { background-position: -408px -96px; }
+.icon-minus              { background-position: -433px -96px; }
+.icon-asterisk           { background-position: -456px -96px; }
+
+.icon-exclamation-sign   { background-position: 0      -120px; }
+.icon-gift               { background-position: -24px  -120px; }
+.icon-leaf               { background-position: -48px  -120px; }
+.icon-fire               { background-position: -72px  -120px; }
+.icon-eye-open           { background-position: -96px  -120px; }
+.icon-eye-close          { background-position: -120px -120px; }
+.icon-warning-sign       { background-position: -144px -120px; }
+.icon-plane              { background-position: -168px -120px; }
+.icon-calendar           { background-position: -192px -120px; }
+.icon-random             { background-position: -216px -120px; width: 16px; }
+.icon-comment            { background-position: -240px -120px; }
+.icon-magnet             { background-position: -264px -120px; }
+.icon-chevron-up         { background-position: -288px -120px; }
+.icon-chevron-down       { background-position: -313px -119px; } // 1px, 1px off
+.icon-retweet            { background-position: -336px -120px; }
+.icon-shopping-cart      { background-position: -360px -120px; }
+.icon-folder-close       { background-position: -384px -120px; }
+.icon-folder-open        { background-position: -408px -120px; width: 16px; }
+.icon-resize-vertical    { background-position: -432px -119px; } // 1px, 1px off
+.icon-resize-horizontal  { background-position: -456px -118px; } // 1px, 2px off
+
+.icon-hdd                     { background-position: 0      -144px; }
+.icon-bullhorn                { background-position: -24px  -144px; }
+.icon-bell                    { background-position: -48px  -144px; }
+.icon-certificate             { background-position: -72px  -144px; }
+.icon-thumbs-up               { background-position: -96px  -144px; }
+.icon-thumbs-down             { background-position: -120px -144px; }
+.icon-hand-right              { background-position: -144px -144px; }
+.icon-hand-left               { background-position: -168px -144px; }
+.icon-hand-up                 { background-position: -192px -144px; }
+.icon-hand-down               { background-position: -216px -144px; }
+.icon-circle-arrow-right      { background-position: -240px -144px; }
+.icon-circle-arrow-left       { background-position: -264px -144px; }
+.icon-circle-arrow-up         { background-position: -288px -144px; }
+.icon-circle-arrow-down       { background-position: -312px -144px; }
+.icon-globe                   { background-position: -336px -144px; }
+.icon-wrench                  { background-position: -360px -144px; }
+.icon-tasks                   { background-position: -384px -144px; }
+.icon-filter                  { background-position: -408px -144px; }
+.icon-briefcase               { background-position: -432px -144px; }
+.icon-fullscreen              { background-position: -456px -144px; }
diff --git a/static/less/tables.less b/static/less/tables.less
new file mode 100644
index 0000000000000000000000000000000000000000..853b97e3902c1ee425128e0ba3c79b3fa29d4e14
--- /dev/null
+++ b/static/less/tables.less
@@ -0,0 +1,225 @@
+//
+// Tables
+// --------------------------------------------------
+
+
+// BASE TABLES
+// -----------------
+
+table {
+  max-width: 100%;
+  background-color: @tableBackground;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+// BASELINE STYLES
+// ---------------
+
+.table {
+  width: 100%;
+  margin-bottom: @baseLineHeight;
+  // Cells
+  th,
+  td {
+    padding: 8px;
+    line-height: @baseLineHeight;
+    text-align: left;
+    vertical-align: top;
+    border-top: 1px solid @tableBorder;
+  }
+  th {
+    font-weight: bold;
+  }
+  // Bottom align for column headings
+  thead th {
+    vertical-align: bottom;
+  }
+  // Remove top border from thead by default
+  caption + thead tr:first-child th,
+  caption + thead tr:first-child td,
+  colgroup + thead tr:first-child th,
+  colgroup + thead tr:first-child td,
+  thead:first-child tr:first-child th,
+  thead:first-child tr:first-child td {
+    border-top: 0;
+  }
+  // Account for multiple tbody instances
+  tbody + tbody {
+    border-top: 2px solid @tableBorder;
+  }
+}
+
+
+
+// CONDENSED TABLE W/ HALF PADDING
+// -------------------------------
+
+.table-condensed {
+  th,
+  td {
+    padding: 4px 5px;
+  }
+}
+
+
+// BORDERED VERSION
+// ----------------
+
+.table-bordered {
+  border: 1px solid @tableBorder;
+  border-collapse: separate; // Done so we can round those corners!
+  *border-collapse: collapse; // IE7 can't round corners anyway
+  border-left: 0;
+  .border-radius(4px);
+  th,
+  td {
+    border-left: 1px solid @tableBorder;
+  }
+  // Prevent a double border
+  caption + thead tr:first-child th,
+  caption + tbody tr:first-child th,
+  caption + tbody tr:first-child td,
+  colgroup + thead tr:first-child th,
+  colgroup + tbody tr:first-child th,
+  colgroup + tbody tr:first-child td,
+  thead:first-child tr:first-child th,
+  tbody:first-child tr:first-child th,
+  tbody:first-child tr:first-child td {
+    border-top: 0;
+  }
+  // For first th or td in the first row in the first thead or tbody
+  thead:first-child tr:first-child th:first-child,
+  tbody:first-child tr:first-child td:first-child {
+    -webkit-border-top-left-radius: 4px;
+            border-top-left-radius: 4px;
+        -moz-border-radius-topleft: 4px;
+  }
+  thead:first-child tr:first-child th:last-child,
+  tbody:first-child tr:first-child td:last-child {
+    -webkit-border-top-right-radius: 4px;
+            border-top-right-radius: 4px;
+        -moz-border-radius-topright: 4px;
+  }
+  // For first th or td in the first row in the first thead or tbody
+  thead:last-child tr:last-child th:first-child,
+  tbody:last-child tr:last-child td:first-child,
+  tfoot:last-child tr:last-child td:first-child {
+    .border-radius(0 0 0 4px);
+    -webkit-border-bottom-left-radius: 4px;
+            border-bottom-left-radius: 4px;
+        -moz-border-radius-bottomleft: 4px;
+  }
+  thead:last-child tr:last-child th:last-child,
+  tbody:last-child tr:last-child td:last-child,
+  tfoot:last-child tr:last-child td:last-child {
+    -webkit-border-bottom-right-radius: 4px;
+            border-bottom-right-radius: 4px;
+        -moz-border-radius-bottomright: 4px;
+  }
+
+  // Special fixes to round the left border on the first td/th
+  caption + thead tr:first-child th:first-child,
+  caption + tbody tr:first-child td:first-child,
+  colgroup + thead tr:first-child th:first-child,
+  colgroup + tbody tr:first-child td:first-child {
+    -webkit-border-top-left-radius: 4px;
+            border-top-left-radius: 4px;
+        -moz-border-radius-topleft: 4px;
+  }
+  caption + thead tr:first-child th:last-child,
+  caption + tbody tr:first-child td:last-child,
+  colgroup + thead tr:first-child th:last-child,
+  colgroup + tbody tr:first-child td:last-child {
+    -webkit-border-top-right-radius: 4px;
+            border-top-right-radius: 4px;
+          -moz-border-right-topleft: 4px;
+  }
+
+}
+
+
+
+
+// ZEBRA-STRIPING
+// --------------
+
+// Default zebra-stripe styles (alternating gray and transparent backgrounds)
+.table-striped {
+  tbody {
+    tr:nth-child(odd) td,
+    tr:nth-child(odd) th {
+      background-color: @tableBackgroundAccent;
+    }
+  }
+}
+
+
+// HOVER EFFECT
+// ------------
+// Placed here since it has to come after the potential zebra striping
+.table-hover {
+  tbody {
+    tr:hover td,
+    tr:hover th {
+      background-color: @tableBackgroundHover;
+    }
+  }
+}
+
+
+// TABLE CELL SIZING
+// -----------------
+
+// Reset default grid behavior
+table [class*=span],
+.row-fluid table [class*=span] {
+  display: table-cell;
+  float: none; // undo default grid column styles
+  margin-left: 0; // undo default grid column styles
+}
+
+// Change the column widths to account for td/th padding
+table {
+  .span1     { .tableColumns(1); }
+  .span2     { .tableColumns(2); }
+  .span3     { .tableColumns(3); }
+  .span4     { .tableColumns(4); }
+  .span5     { .tableColumns(5); }
+  .span6     { .tableColumns(6); }
+  .span7     { .tableColumns(7); }
+  .span8     { .tableColumns(8); }
+  .span9     { .tableColumns(9); }
+  .span10    { .tableColumns(10); }
+  .span11    { .tableColumns(11); }
+  .span12    { .tableColumns(12); }
+  .span13    { .tableColumns(13); }
+  .span14    { .tableColumns(14); }
+  .span15    { .tableColumns(15); }
+  .span16    { .tableColumns(16); }
+  .span17    { .tableColumns(17); }
+  .span18    { .tableColumns(18); }
+  .span19    { .tableColumns(19); }
+  .span20    { .tableColumns(20); }
+  .span21    { .tableColumns(21); }
+  .span22    { .tableColumns(22); }
+  .span23    { .tableColumns(23); }
+  .span24    { .tableColumns(24); }
+}
+
+
+// TABLE BACKGROUNDS
+// -----------------
+// Exact selectors below required to override .table-striped
+
+.table {
+  tbody tr.success td {
+    background-color: @successBackground;
+  }
+  tbody tr.error td {
+    background-color: @errorBackground;
+  }
+  tbody tr.info td {
+    background-color: @infoBackground;
+  }
+}
diff --git a/static/less/tests/css-tests.css b/static/less/tests/css-tests.css
new file mode 100644
index 0000000000000000000000000000000000000000..6001f53aab8f2809be5c58f9a7d7c71bfb9c17c2
--- /dev/null
+++ b/static/less/tests/css-tests.css
@@ -0,0 +1,67 @@
+/*!
+ * Bootstrap CSS Tests
+ */
+
+
+/* Remove background image */
+body {
+  background-image: none;
+}
+
+/* Space out subhead */
+.subhead {
+  margin-bottom: 36px;
+}
+/*h4 {
+  margin-bottom: 5px;
+}
+*/
+
+.type-test {
+  margin-bottom: 20px;
+  padding: 0 20px 20px;
+  background: url(../../docs/assets/img/grid-baseline-20px.png);
+}
+.type-test h1,
+.type-test h2,
+.type-test h3,
+.type-test h4,
+.type-test h5,
+.type-test h6 {
+  background-color: rgba(255,0,0,.2);
+}
+
+
+/* colgroup tests */
+.col1 {
+  background-color: rgba(255,0,0,.1);
+}
+.col2 {
+  background-color: rgba(0,255,0,.1);
+}
+.col3 {
+  background-color: rgba(0,0,255,.1);
+}
+
+
+/* Fluid row inputs */
+#rowInputs .row > [class*=span],
+#fluidRowInputs .row-fluid > [class*=span] {
+  background-color: rgba(255,0,0,.1);
+}
+
+
+/* Fluid grid */
+.fluid-grid {
+  margin-bottom: 45px;
+}
+.fluid-grid .row {
+  height: 40px;
+  padding-top: 10px;
+  margin-top: 10px;
+  color: #ddd;
+  text-align: center;
+}
+.fluid-grid .span1 {
+  background-color: #999;
+}
diff --git a/static/less/tests/css-tests.html b/static/less/tests/css-tests.html
new file mode 100644
index 0000000000000000000000000000000000000000..6786454cc7ea744443115cf97bdaf21b096f012a
--- /dev/null
+++ b/static/less/tests/css-tests.html
@@ -0,0 +1,1180 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>CSS Tests · Twitter Bootstrap</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <!-- Le styles -->
+    <link href="../../docs/assets/css/bootstrap.css" rel="stylesheet">
+    <link href="../../docs/assets/css/bootstrap-responsive.css" rel="stylesheet">
+    <link href="../../docs/assets/css/docs.css" rel="stylesheet">
+    <link href="../../docs/assets/js/google-code-prettify/prettify.css" rel="stylesheet">
+
+    <!-- CSS just for the tests page -->
+    <link href="css-tests.css" rel="stylesheet">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le fav and touch icons -->
+    <link rel="shortcut icon" href="../../docs/assets/ico/favicon.ico">
+    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../../docs/assets/ico/apple-touch-icon-144-precomposed.png">
+    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../../docs/assets/ico/apple-touch-icon-114-precomposed.png">
+    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../../docs/assets/ico/apple-touch-icon-72-precomposed.png">
+    <link rel="apple-touch-icon-precomposed" href="../../docs/assets/ico/apple-touch-icon-57-precomposed.png">
+  </head>
+
+  <body>
+
+
+  <!-- Navbar
+    ================================================== -->
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="../../docs/index.html">Bootstrap</a>
+        </div>
+      </div>
+    </div>
+
+
+<!-- Masthead
+================================================== -->
+<header class="jumbotron subhead" id="overview">
+  <div class="container">
+    <h1>CSS Tests</h1>
+    <p class="lead">One stop shop for quick debugging and edge-case tests of CSS.</p>
+  </div>
+</header>
+
+
+<div class="bs-docs-canvas">
+
+  <div class="container">
+
+
+
+<!-- Typography
+================================================== -->
+
+<div class="page-header">
+  <h1>Typography</h1>
+</div>
+
+<div class="row">
+  <div class="span6">
+    <div class="type-test">
+      <h1>h1. Heading 1</h1>
+      <h2>h2. Heading 2</h2>
+      <h3>h3. Heading 3</h3>
+      <h4>h4. Heading 4</h4>
+      <h5>h5. Heading 5</h5>
+      <h6>h6. Heading 6</h6>
+      <p>Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
+    </div>
+  </div>
+  <div class="span6">
+    <div class="type-test">
+      <h1>h1. Heading 1</h1>
+      <p>Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
+      <h2>h2. Heading 2</h2>
+      <p>Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
+      <h3>h3. Heading 3</h3>
+      <p>Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
+      <h4>h4. Heading 4</h4>
+      <p>Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
+      <h5>h5. Heading 5</h5>
+      <p>Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
+      <h6>h6. Heading 6</h6>
+      <p>Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
+    </div>
+  </div>
+</div>
+
+
+
+<!-- Fluid grid
+================================================== -->
+
+<div class="page-header">
+  <h1>Fluid grids</h1>
+</div>
+
+<div class="fluid-grid">
+  <div class="row">
+    <div class="span12">12
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="span11">11
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+    <div class="span1">1
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="span10">10
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+    <div class="span2">2
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="span9">9
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+    <div class="span3">3
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="span8">8
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+    <div class="span4">4
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="span7">7
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+    <div class="span5">5
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="span6">6
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+    <div class="span6">6
+      <div class="row-fluid">
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+        <div class="span1">1</div>
+      </div>
+    </div>
+  </div>
+</div> <!-- fluid grids -->
+
+
+
+<!-- Tables
+================================================== -->
+
+<div class="page-header">
+  <h1>Tables</h1>
+</div>
+
+<div class="row">
+  <div class="span6">
+    <h4>Bordered without thead</h4>
+    <table class="table table-bordered">
+      <tbody>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+      </tbody>
+    </table>
+    <h4>Bordered without thead, with caption</h4>
+    <table class="table table-bordered">
+      <caption>Table caption</caption>
+      <tbody>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+      </tbody>
+    </table>
+    <h4>Bordered without thead, with colgroup</h4>
+    <table class="table table-bordered">
+      <colgroup>
+        <col class="col1">
+        <col class="col2">
+        <col class="col3">
+      </colgroup>
+      <tbody>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+      </tbody>
+      <tfoot>
+        <tr>
+          <td>3</td>
+          <td>6</td>
+          <td>9</td>
+        </tr>
+      </tfoot>
+    </table>
+    <h4>Bordered with thead, with colgroup</h4>
+    <table class="table table-bordered">
+      <colgroup>
+        <col class="col1">
+        <col class="col2">
+        <col class="col3">
+      </colgroup>
+      <thead>
+        <tr>
+          <th>A</th>
+          <th>B</th>
+          <th>C</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+      </tbody>
+      <tfoot>
+        <tr>
+          <td>3</td>
+          <td>6</td>
+          <td>9</td>
+        </tr>
+      </tfoot>
+    </table>
+  </div><!--/span-->
+  <div class="span6">
+    <h4>Bordered with thead and caption</h4>
+    <table class="table table-bordered">
+      <caption>Table caption</caption>
+      <thead>
+        <tr>
+          <th>1</th>
+          <th>2</th>
+          <th>3</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>2</td>
+          <td>3</td>
+        </tr>
+      </tbody>
+      <tfoot>
+        <tr>
+          <td>3</td>
+          <td>6</td>
+          <td>9</td>
+        </tr>
+      </tfoot>
+    </table>
+    <h4>Bordered with rowspan and colspan</h4>
+    <table class="table table-bordered">
+      <thead>
+        <tr>
+          <th>1</th>
+          <th>2</th>
+          <th>3</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td colspan="2">1 and 2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td rowspan="2">2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td rowspan="2">1</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td colspan="2">2 and 3</td>
+        </tr>
+      </tbody>
+    </table>
+  </div><!--/span-->
+</div><!--/row-->
+
+
+<h4>Grid sizing</h4>
+<div class="row">
+  <div class="span12">
+    <table class="table table-bordered">
+      <thead>
+        <tr>
+          <th class="span3">1</th>
+          <th class="span4">2</th>
+          <th>3</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td colspan="2">1 and 2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td rowspan="2">2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td rowspan="2">1</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td colspan="2">2 and 3</td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</div><!--/row-->
+
+<h4>Fluid grid sizing</h4>
+<div class="row-fluid">
+  <div class="span12">
+    <table class="table table-bordered">
+      <thead>
+        <tr>
+          <th class="span3">1</th>
+          <th class="span4">2</th>
+          <th>3</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td colspan="2">1 and 2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td rowspan="2">2</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td rowspan="2">1</td>
+          <td>3</td>
+        </tr>
+        <tr>
+          <td colspan="2">2 and 3</td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</div><!--/row-->
+
+
+
+<!-- Forms
+================================================== -->
+
+<div class="page-header">
+  <h1>Forms</h1>
+</div>
+
+<div class="row">
+  <div class="span4">
+    <h4>Prepend and append on inputs</h4>
+    <form>
+      <div class="controls">
+        <div class="input-prepend">
+          <span class="add-on">@</span>
+          <input class="span2" id="prependedInput" size="16" type="text">
+        </div>
+      </div>
+      <div class="controls">
+        <div class="input-append">
+          <input class="span2" id="prependedInput" size="16" type="text">
+          <span class="add-on">@</span>
+        </div>
+      </div>
+      <div class="controls">
+        <div class="input-prepend input-append">
+          <span class="add-on">$</span>
+          <input class="span2" id="prependedInput" size="16" type="text">
+          <span class="add-on">.00</span>
+        </div>
+      </div>
+    </form>
+  </div><!--/span-->
+  <div class="span6">
+    <h4>Prepend and append with uneditable</h4>
+    <form>
+      <div class="input-prepend">
+        <span class="add-on">$</span>
+        <span class="span2 uneditable-input">Some value here</span>
+      </div>
+      <div class="input-append">
+        <span class="span2 uneditable-input">Some value here</span>
+        <span class="add-on">.00</span>
+      </div>
+      <div class="input-prepend input-append">
+        <span class="add-on">$</span>
+        <span class="span2 uneditable-input">Some value here</span>
+        <span class="add-on">.00</span>
+      </div>
+    </form>
+  </div><!--/span-->
+</div><!--/row-->
+
+<h4>Fluid prepended and appended inputs</h4>
+<div class="row-fluid">
+  <div class="span6">
+    <form>
+      <div class="controls">
+        <div class="input-prepend">
+          <span class="add-on">@</span><input class="span2" id="prependedInput" size="16" type="text">
+        </div>
+      </div>
+      <div class="controls">
+        <div class="input-append">
+          <input class="span2" id="prependedInput" size="16" type="text"><span class="add-on">@</span>
+        </div>
+      </div>
+      <div class="controls">
+        <div class="input-prepend input-append">
+          <span class="add-on">$</span><input class="span2" id="prependedInput" size="16" type="text"><span class="add-on">.00</span>
+        </div>
+      </div>
+    </form>
+  </div>
+</div>
+
+<h4>Fixed row with inputs</h4>
+<p>Inputs should not extend past the light red background, set on their parent, a <code>.span*</code> column.</p>
+
+<div class="rowInputs">
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span1" placeholder="span1">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span2" placeholder="span2">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span3" placeholder="span3">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span4" placeholder="span4">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span5" placeholder="span5">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span6" placeholder="span6">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span7" placeholder="span7">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span8" placeholder="span8">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span9" placeholder="span9">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span10" placeholder="span10">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span11" placeholder="span11">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row">
+    <div class="span12">
+      <input type="text" class="span12" placeholder="span12">
+    </div><!--/span-->
+  </div><!--/row-->
+</div>
+<br>
+
+<h4>Fluid row with inputs</h4>
+<p>Inputs should not extend past the light red background, set on their parent, a <code>.span*</code> column.</p>
+<div id="fluidRowInputs">
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span1" placeholder="span1">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span2" placeholder="span2">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span3" placeholder="span3">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span4" placeholder="span4">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span5" placeholder="span5">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span6" placeholder="span6">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span7" placeholder="span7">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span8" placeholder="span8">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span9" placeholder="span9">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span10" placeholder="span10">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span11" placeholder="span11">
+    </div><!--/span-->
+  </div><!--/row-->
+  <div class="row-fluid">
+    <div class="span12">
+      <input type="text" class="span12" placeholder="span12">
+    </div><!--/span-->
+  </div><!--/row-->
+</div>
+
+<br>
+
+<h4>Inline form in fluid row</h4>
+
+<div class="row-fluid">
+  <div class="span12">
+    <form class="form-inline">
+      <input type="text" class="span3" placeholder="Email">
+      <input type="password" class="span3" placeholder="Password">
+      <label class="checkbox">
+        <input type="checkbox"> Remember me
+      </label>
+      <button type="submit" class="btn">Sign in</button>
+    </form>
+  </div>
+</div>
+
+
+<br>
+
+
+<h4>Fluid textarea at .span12</h4>
+<div class="row-fluid">
+  <div class="span12">
+    <textarea class="span12"></textarea>
+  </div>
+</div>
+
+
+<br>
+
+
+<h4>Selects</h4>
+<form>
+  <select class="span4">
+    <option>Option</option>
+  </select>
+</form>
+
+
+<br>
+
+
+
+
+<!-- Dropdowns
+================================================== -->
+
+<div class="page-header">
+  <h1>Dropdowns</h1>
+</div>
+
+<h4>Dropdown link with hash URL</h4>
+<ul class="nav nav-pills">
+  <li class="active"><a href="#">Link</a></li>
+  <li><a href="#">Example link</a></li>
+  <li class="dropdown">
+    <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+      Dropdown <span class="caret"></span>
+    </a>
+    <ul class="dropdown-menu">
+      <li><a href="#">Action</a></li>
+      <li><a href="#">Another action</a></li>
+      <li><a href="#">Something else here</a></li>
+      <li class="divider"></li>
+      <li><a href="#">Separated link</a></li>
+    </ul>
+  </li>
+</ul>
+
+<h4>Dropdown link with custom URL and data-target</h4>
+<ul class="nav nav-pills">
+  <li class="active"><a href="#">Link</a></li>
+  <li><a href="#">Example link</a></li>
+  <li class="dropdown">
+    <a class="dropdown-toggle" data-toggle="dropdown" data-target="#" href="path/to/page.html">
+      Dropdown <span class="caret"></span>
+    </a>
+    <ul class="dropdown-menu">
+      <li><a href="#">Action</a></li>
+      <li><a href="#">Another action</a></li>
+      <li><a href="#">Something else here</a></li>
+      <li class="divider"></li>
+      <li><a href="#">Separated link</a></li>
+    </ul>
+  </li>
+</ul>
+
+<h4>Dropdown on a button</h4>
+<div style="position: relative;">
+  <button class="btn" type="button" data-toggle="dropdown">Dropdown <span class="caret"></span></button>
+  <ul class="dropdown-menu">
+    <li><a href="#">Action</a></li>
+    <li><a href="#">Another action</a></li>
+    <li><a href="#">Something else here</a></li>
+    <li class="divider"></li>
+    <li><a href="#">Separated link</a></li>
+  </ul>
+</div>
+
+<br>
+
+
+<!-- Thumbnails
+================================================== -->
+
+<div class="page-header">
+  <h1>Thumbnails</h1>
+</div>
+
+<h4>Default thumbnails (no grid sizing)</h4>
+<ul class="thumbnails">
+  <li class="thumbnail">
+    <img src="http://placehold.it/260x180" alt="">
+  </li>
+  <li class="thumbnail">
+    <img src="http://placehold.it/260x180" alt="">
+  </li>
+  <li class="thumbnail">
+    <img src="http://placehold.it/260x180" alt="">
+  </li>
+  <li class="thumbnail">
+    <img src="http://placehold.it/260x180" alt="">
+  </li>
+</ul>
+
+<!-- NOT CURRENTLY SUPPORTED
+<h4>Offset thumbnails</h4>
+<ul class="thumbnails">
+  <li class="span3 offset3">
+    <a href="#" class="thumbnail">
+      <img src="http://placehold.it/260x180" alt="">
+    </a>
+  </li>
+  <li class="span3">
+    <a href="#" class="thumbnail">
+      <img src="http://placehold.it/260x180" alt="">
+    </a>
+  </li>
+  <li class="span3">
+    <a href="#" class="thumbnail">
+      <img src="http://placehold.it/260x180" alt="">
+    </a>
+  </li>
+</ul>
+-->
+
+<h4>Standard grid sizing</h4>
+<ul class="thumbnails">
+  <li class="span3">
+    <a href="#" class="thumbnail">
+      <img src="http://placehold.it/260x180" alt="">
+    </a>
+  </li>
+  <li class="span3 offset3">
+    <a href="#" class="thumbnail">
+      <img src="http://placehold.it/260x180" alt="">
+    </a>
+  </li>
+  <li class="span3">
+    <a href="#" class="thumbnail">
+      <img src="http://placehold.it/260x180" alt="">
+    </a>
+  </li>
+</ul>
+
+<h4>Fluid thumbnails</h4>
+<div class="row-fluid">
+  <div class="span8">
+    <ul class="thumbnails">
+      <li class="span4">
+        <a href="#" class="thumbnail">
+          <img src="http://placehold.it/260x180" alt="">
+        </a>
+      </li>
+      <li class="span4">
+        <a href="#" class="thumbnail">
+          <img src="http://placehold.it/260x180" alt="">
+        </a>
+      </li>
+      <li class="span4">
+        <a href="#" class="thumbnail">
+          <img src="http://placehold.it/260x180" alt="">
+        </a>
+      </li>
+    </ul>
+  </div>
+</div>
+
+
+
+<!-- Tabs
+================================================== -->
+
+<div class="page-header">
+  <h1>Tabs</h1>
+</div>
+
+<div class="tabbable tabs-left" style="margin-bottom: 18px;">
+  <ul class="nav nav-tabs">
+    <li class="active"><a href="#tab1" data-toggle="tab">Section 1</a></li>
+    <li><a href="#tab2" data-toggle="tab">Section 2</a></li>
+    <li><a href="#tab3" data-toggle="tab">Section 3</a></li>
+  </ul>
+  <div class="tab-content" style="padding-bottom: 9px; border-bottom: 1px solid #ddd;">
+    <div class="tab-pane active" id="tab1">
+      <p>I'm in Section 1.</p>
+
+      <div class="tabbable" style="background: #f5f5f5; padding: 20px;">
+        <ul class="nav nav-tabs">
+          <li class="active"><a href="#tab1-1" data-toggle="tab">1.1</a></li>
+          <li><a href="#tab1-2" data-toggle="tab">1.2</a></li>
+          <li><a href="#tab1-3" data-toggle="tab">1.3</a></li>
+        </ul>
+        <div class="tab-content" style="padding-bottom: 9px; border-bottom: 1px solid #ddd;">
+          <div class="tab-pane active" id="tab1-1">
+            <p>I'm in Section 1.1.</p>
+          </div>
+          <div class="tab-pane" id="tab1-2">
+            <p>I'm in Section 1.2.</p>
+          </div>
+          <div class="tab-pane" id="tab1-3">
+            <p>I'm in Section 1.3.</p>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="tab-pane" id="tab2">
+      <p>Howdy, I'm in Section 2.</p>
+    </div>
+    <div class="tab-pane" id="tab3">
+      <p>What up girl, this is Section 3.</p>
+    </div>
+  </div>
+</div> <!-- /tabbable -->
+
+<br>
+
+
+<!-- Labels
+================================================== -->
+
+<div class="page-header">
+  <h1>Labels</h1>
+</div>
+
+<div class="row">
+  <div class="span4">
+    <h4>Inline label</h4>
+    <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Maecenas sed diam <span class="label label-warning">Label name</span> eget risus varius blandit sit amet non magna. Fusce <code>.class-name</code> dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
+  </div><!--/span-->
+  <div class="span4">
+    <form class="form-horizontal">
+      <label>Example label</label>
+      <input type="text" placeholder="Input"> <span class="help-inline"><span class="label">Hey!</span> Read this.</span>
+    </form>
+  </div><!--/span-->
+  <div class="span4">
+    <button class="btn">Action <span class="badge">2</span></button>
+    <button class="btn">Action <span class="label">2</span></button>
+  </div><!--/span-->
+</div><!--/row-->
+
+<br>
+
+
+<!-- Button groups
+================================================== -->
+
+<div class="page-header">
+  <h1>Buttons</h1>
+</div>
+
+<table class="table table-bordered">
+  <tbody>
+    <tr>
+      <td>
+        Maecenas faucibus mollis interdum. Nulla vitae elit libero, a pharetra augue. Donec ullamcorper nulla non metus auctor fringilla. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.
+      </td>
+      <td>
+        <div class="btn-group">
+          <button class="btn">1</button>
+          <button class="btn">2</button>
+          <button class="btn">3</button>
+          <button class="btn">4</button>
+        </div>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+<h4>Mini buttons: text and icon</h4>
+<div class="btn-group">
+  <button class="btn btn-mini">Button text</button>
+  <button class="btn btn-mini"><i class="icon-cog"></i></button>
+</div>
+
+<br>
+
+
+
+<!-- Responsive utility classes
+================================================== -->
+
+<div class="page-header">
+  <h1>Responsive utility classes</h1>
+</div>
+
+<h4>Visible on...</h4>
+<ul class="responsive-utilities-test visible-on">
+  <li>Phone<span class="visible-phone">✔ Phone</span></li>
+  <li>Tablet<span class="visible-tablet">✔ Tablet</span></li>
+  <li>Desktop<span class="visible-desktop">✔ Desktop</span></li>
+</ul>
+<ul class="responsive-utilities-test visible-on">
+  <li>Phone + Tablet<span class="visible-phone visible-tablet">✔ Phone + Tablet</span></li>
+  <li>Tablet + Desktop<span class="visible-tablet visible-desktop">✔ Tablet + Desktop</span></li>
+  <li>All<span class="visible-phone visible-tablet visible-desktop">✔ All</span></li>
+</ul>
+
+<h4>Hidden on...</h4>
+<ul class="responsive-utilities-test hidden-on">
+  <li>Phone<span class="hidden-phone">✔ Phone</span></li>
+  <li>Tablet<span class="hidden-tablet">✔ Tablet</span></li>
+  <li>Desktop<span class="hidden-desktop">✔ Desktop</span></li>
+</ul>
+<ul class="responsive-utilities-test hidden-on">
+  <li>Phone + Tablet<span class="hidden-phone hidden-tablet">✔ Phone + Tablet</span></li>
+  <li>Tablet + Desktop<span class="hidden-tablet hidden-desktop">✔ Tablet + Desktop</span></li>
+  <li>All<span class="hidden-phone hidden-tablet hidden-desktop">✔ All</span></li>
+</ul>
+
+
+
+
+    </div><!-- /container -->
+
+
+
+    <!-- Footer
+    ================================================== -->
+    <footer class="footer">
+      <div class="container">
+        <p class="pull-right"><a href="#">Back to top</a></p>
+        <p>Designed and built with all the love in the world <a href="http://twitter.com/twitter" target="_blank">@twitter</a> by <a href="http://twitter.com/mdo" target="_blank">@mdo</a> and <a href="http://twitter.com/fat" target="_blank">@fat</a>.</p>
+        <p>Code licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank">Apache License v2.0</a>. Documentation licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
+        <p>Icons from <a href="http://glyphicons.com">Glyphicons Free</a>, licensed under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a>.</p>
+        <ul class="footer-links">
+          <li><a href="http://blog.getbootstrap.com">Read the blog</a></li>
+          <li><a href="https://github.com/twitter/bootstrap/issues?state=open">Submit issues</a></li>
+          <li><a href="https://github.com/twitter/bootstrap/wiki">Roadmap and changelog</a></li>
+        </ul>
+      </div>
+    </footer>
+
+</div>
+
+
+    <!-- Le javascript
+    ================================================== -->
+    <!-- Placed at the end of the document so the pages load faster -->
+    <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
+    <script src="../../docs/assets/js/jquery.js"></script>
+    <script src="../../docs/assets/js/google-code-prettify/prettify.js"></script>
+    <script src="../../docs/assets/js/bootstrap-transition.js"></script>
+    <script src="../../docs/assets/js/bootstrap-alert.js"></script>
+    <script src="../../docs/assets/js/bootstrap-modal.js"></script>
+    <script src="../../docs/assets/js/bootstrap-dropdown.js"></script>
+    <script src="../../docs/assets/js/bootstrap-scrollspy.js"></script>
+    <script src="../../docs/assets/js/bootstrap-tab.js"></script>
+    <script src="../../docs/assets/js/bootstrap-tooltip.js"></script>
+    <script src="../../docs/assets/js/bootstrap-popover.js"></script>
+    <script src="../../docs/assets/js/bootstrap-button.js"></script>
+    <script src="../../docs/assets/js/bootstrap-collapse.js"></script>
+    <script src="../../docs/assets/js/bootstrap-carousel.js"></script>
+    <script src="../../docs/assets/js/bootstrap-typeahead.js"></script>
+    <script src="../../docs/assets/js/application.js"></script>
+
+
+  </body>
+</html>
diff --git a/static/less/tests/forms.html b/static/less/tests/forms.html
new file mode 100644
index 0000000000000000000000000000000000000000..a63d728a0084b6c766c550967c8d4b0c39c390b6
--- /dev/null
+++ b/static/less/tests/forms.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Bootstrap, from Twitter</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <!-- Le styles -->
+    <link href="../../docs/assets/css/bootstrap.css" rel="stylesheet">
+    <link href="../../docs/assets/css/bootstrap-responsive.css" rel="stylesheet">
+    <style>
+      body {
+        padding-top: 30px;
+        padding-bottom: 30px;
+      }
+    </style>
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le fav and touch icons -->
+    <link rel="shortcut icon" href="../../docs/assets/ico/favicon.ico">
+    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../../docs/assets/ico/apple-touch-icon-144-precomposed.png">
+    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../../docs/assets/ico/apple-touch-icon-114-precomposed.png">
+    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../../docs/assets/ico/apple-touch-icon-72-precomposed.png">
+    <link rel="apple-touch-icon-precomposed" href="../../docs/assets/ico/apple-touch-icon-57-precomposed.png">
+  </head>
+
+  <body>
+
+    <form class="container">
+
+      <div class="page-header">
+        <h1>Form controls</h1>
+      </div>
+
+      <div class="row">
+        <div class="span4">
+
+          <label>Select</label>
+          <select>
+            <option>Select</option>
+            <option>Option 2</option>
+            <option>Option 3</option>
+          </select>
+
+          <hr>
+
+          <label>textarea</label>
+          <textarea>Textarea</textarea>
+
+          <hr>
+
+          <label>text</label>
+          <input type="text" value="Text input">
+
+          <hr>
+
+          <label>password</label>
+          <input type="password" value="Password input">
+
+          <hr>
+
+          <label>checkbox</label>
+          <input type="checkbox" value="">
+
+          <hr>
+
+          <label>radio</label>
+          <input type="radio" value="">
+
+          <hr>
+
+          <label>button</label>
+          <input type="button" value="Button">
+
+          <hr>
+
+          <label>submit</label>
+          <input type="submit" value="Submit">
+
+          <hr>
+
+          <label>reset</label>
+          <input type="reset" value="Reset">
+
+        </div><!-- /span4 -->
+        <div class="span4">
+
+          <label>file</label>
+          <input type="file" value="">
+
+          <hr>
+
+          <label>hidden</label>
+          <input type="hidden" value="hidden">
+
+          <hr>
+
+          <label>image</label>
+          <input type="image" value="">
+
+          <hr>
+
+          <label>datetime</label>
+          <input type="datetime" value="">
+
+          <hr>
+
+          <label>datetime-local</label>
+          <input type="datetime-local" value="">
+
+          <hr>
+
+          <label>date</label>
+          <input type="date" value="">
+
+          <hr>
+
+          <label>month</label>
+          <input type="month" value="">
+
+          <hr>
+
+          <label>time</label>
+          <input type="time" value="">
+
+          <hr>
+
+          <label>week</label>
+          <input type="week" value="">
+
+        </div><!-- /span4 -->
+        <div class="span4">
+
+          <label>number</label>
+          <input type="number" value="">
+
+          <hr>
+
+          <label>range</label>
+          <input type="range" value="">
+
+          <hr>
+
+          <label>email</label>
+          <input type="email" value="">
+
+          <hr>
+
+          <label>url</label>
+          <input type="url" value="">
+
+          <hr>
+
+          <label>search</label>
+          <input type="search" value="">
+
+          <hr>
+
+          <label>tel</label>
+          <input type="tel" value="">
+
+          <hr>
+
+          <label>color</label>
+          <input type="color" value="">
+
+        </div><!-- /span4 -->
+      </div><!-- /row -->
+
+    </form> <!-- /container -->
+
+  </body>
+</html>
diff --git a/static/less/tests/navbar.html b/static/less/tests/navbar.html
new file mode 100644
index 0000000000000000000000000000000000000000..17754bf6e80c85534b98fdf195a0fd96c3c2e345
--- /dev/null
+++ b/static/less/tests/navbar.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <title>Bootstrap, from Twitter</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <!-- Le styles -->
+    <link href="../../docs/assets/css/bootstrap.css" rel="stylesheet">
+    <style>
+      body {
+        padding-top: 60px;
+        padding-bottom: 30px;
+      }
+    </style>
+    <link href="../../docs/assets/css/bootstrap-responsive.css" rel="stylesheet">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+
+    <!-- Le fav and touch icons -->
+    <link rel="shortcut icon" href="../../docs/assets/ico/favicon.ico">
+    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../../docs/assets/ico/apple-touch-icon-144-precomposed.png">
+    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../../docs/assets/ico/apple-touch-icon-114-precomposed.png">
+    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../../docs/assets/ico/apple-touch-icon-72-precomposed.png">
+    <link rel="apple-touch-icon-precomposed" href="../../docs/assets/ico/apple-touch-icon-57-precomposed.png">
+  </head>
+
+  <body>
+
+    <!-- Fixed navbar -->
+    <div class="navbar navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </a>
+          <a class="brand" href="#">Project name</a>
+          <div class="nav-collapse">
+            <ul class="nav">
+              <li class="active"><a href="#">Home</a></li>
+              <li><a href="#about">About</a></li>
+              <li><a href="#contact">Contact</a></li>
+            </ul>
+          </div><!--/.nav-collapse -->
+        </div>
+      </div>
+    </div>
+
+    <div class="container">
+
+      <!-- Static navbar -->
+      <div class="navbar">
+        <div class="navbar-inner">
+          <div class="container">
+            <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+              <span class="icon-bar"></span>
+              <span class="icon-bar"></span>
+              <span class="icon-bar"></span>
+            </a>
+            <a class="brand" href="#">Project name</a>
+            <div class="nav-collapse">
+              <ul class="nav">
+                <li class="active"><a href="#">Home</a></li>
+                <li><a href="#about">About</a></li>
+                <li><a href="#contact">Contact</a></li>
+              </ul>
+            </div><!--/.nav-collapse -->
+          </div>
+        </div>
+      </div>
+
+      <!-- Main hero unit for a primary marketing message or call to action -->
+      <div class="hero-unit">
+        <h1>Navbar example</h1>
+        <p>This example is a quick exercise to illustrate how the default, static navbar and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.</p>
+        <p>
+          <a class="btn btn-large btn-primary" href="../components.html#navbar">View navbar docs &raquo;</a>
+        </p>
+      </div>
+
+    </div> <!-- /container -->
+
+    <!-- Le javascript
+    ================================================== -->
+    <!-- Placed at the end of the document so the pages load faster -->
+    <script src="../assets/js/jquery.js"></script>
+    <script src="../assets/js/bootstrap-transition.js"></script>
+    <script src="../assets/js/bootstrap-alert.js"></script>
+    <script src="../assets/js/bootstrap-modal.js"></script>
+    <script src="../assets/js/bootstrap-dropdown.js"></script>
+    <script src="../assets/js/bootstrap-scrollspy.js"></script>
+    <script src="../assets/js/bootstrap-tab.js"></script>
+    <script src="../assets/js/bootstrap-tooltip.js"></script>
+    <script src="../assets/js/bootstrap-popover.js"></script>
+    <script src="../assets/js/bootstrap-button.js"></script>
+    <script src="../assets/js/bootstrap-collapse.js"></script>
+    <script src="../assets/js/bootstrap-carousel.js"></script>
+    <script src="../assets/js/bootstrap-typeahead.js"></script>
+
+  </body>
+</html>
diff --git a/static/less/thumbnails.less b/static/less/thumbnails.less
new file mode 100644
index 0000000000000000000000000000000000000000..91b75f785bd3eb36e101a8bc225b6def708a7cee
--- /dev/null
+++ b/static/less/thumbnails.less
@@ -0,0 +1,52 @@
+//
+// Thumbnails
+// --------------------------------------------------
+
+
+// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files
+
+// Make wrapper ul behave like the grid
+.thumbnails {
+  margin-left: -@gridGutterWidth;
+  list-style: none;
+  .clearfix();
+}
+// Fluid rows have no left margin
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+
+// Float li to make thumbnails appear in a row
+.thumbnails > li {
+  float: left; // Explicity set the float since we don't require .span* classes
+  margin-bottom: @baseLineHeight;
+  margin-left: @gridGutterWidth;
+}
+
+// The actual thumbnail (can be `a` or `div`)
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: @baseLineHeight;
+  border: 1px solid #ddd;
+  .border-radius(4px);
+  .box-shadow(0 1px 3px rgba(0,0,0,.055));
+  .transition(all .2s ease-in-out);
+}
+// Add a hover state for linked versions only
+a.thumbnail:hover {
+  border-color: @linkColor;
+  .box-shadow(0 1px 4px rgba(0,105,214,.25));
+}
+
+// Images and captions
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-left: auto;
+  margin-right: auto;
+}
+.thumbnail .caption {
+  padding: 9px;
+  color: @gray;
+}
diff --git a/static/less/tooltip.less b/static/less/tooltip.less
new file mode 100644
index 0000000000000000000000000000000000000000..fba1856f581de9c6e88f555c7ffdc702d69ff151
--- /dev/null
+++ b/static/less/tooltip.less
@@ -0,0 +1,70 @@
+//
+// Tooltips
+// --------------------------------------------------
+
+
+// Base class
+.tooltip {
+  position: absolute;
+  z-index: @zindexTooltip;
+  display: block;
+  visibility: visible;
+  padding: 5px;
+  font-size: 11px;
+  .opacity(0);
+  &.in     { .opacity(80); }
+  &.top    { margin-top:  -3px; }
+  &.right  { margin-left:  3px; }
+  &.bottom { margin-top:   3px; }
+  &.left   { margin-left: -3px; }
+}
+
+// Wrapper for the tooltip content
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: @tooltipColor;
+  text-align: center;
+  text-decoration: none;
+  background-color: @tooltipBackground;
+  .border-radius(4px);
+}
+
+// Arrows
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip {
+  &.top .tooltip-arrow {
+    bottom: 0;
+    left: 50%;
+    margin-left: -@tooltipArrowWidth;
+    border-width: @tooltipArrowWidth @tooltipArrowWidth 0;
+    border-top-color: @tooltipArrowColor;
+  }
+  &.right .tooltip-arrow {
+    top: 50%;
+    left: 0;
+    margin-top: -@tooltipArrowWidth;
+    border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0;
+    border-right-color: @tooltipArrowColor;
+  }
+  &.left .tooltip-arrow {
+    top: 50%;
+    right: 0;
+    margin-top: -@tooltipArrowWidth;
+    border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth;
+    border-left-color: @tooltipArrowColor;
+  }
+  &.bottom .tooltip-arrow {
+    top: 0;
+    left: 50%;
+    margin-left: -@tooltipArrowWidth;
+    border-width: 0 @tooltipArrowWidth @tooltipArrowWidth;
+    border-bottom-color: @tooltipArrowColor;
+  }
+}
diff --git a/static/less/type.less b/static/less/type.less
new file mode 100644
index 0000000000000000000000000000000000000000..f3fc7559b176434d79c64cf3f0d466d4f1158794
--- /dev/null
+++ b/static/less/type.less
@@ -0,0 +1,206 @@
+//
+// Typography
+// --------------------------------------------------
+
+
+// Body text
+// -------------------------
+
+p {
+  margin: 0 0 @baseLineHeight / 2;
+}
+.lead {
+  margin-bottom: @baseLineHeight;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: @baseLineHeight * 1.2;
+}
+
+
+// Emphasis & misc
+// -------------------------
+
+small {
+  font-size: 85%; // Ex: 14px base font * 85% = about 12px
+}
+strong {
+  font-weight: bold;
+}
+em {
+  font-style: italic;
+}
+cite {
+  font-style: normal;
+}
+.muted {
+  color: @grayLight;
+}
+
+
+// Headings
+// -------------------------
+
+h1, h2, h3, h4, h5, h6 {
+  margin: (@baseLineHeight / 2) 0;
+  font-family: @headingsFontFamily;
+  font-weight: @headingsFontWeight;
+  line-height: 1;
+  color: @headingsColor;
+  text-rendering: optimizelegibility; // Fix the character spacing for headings
+  small {
+    font-weight: normal;
+    line-height: 1;
+    color: @grayLight;
+  }
+}
+h1 { font-size: 36px; line-height: 40px; }
+h2 { font-size: 30px; line-height: 40px; }
+h3 { font-size: 24px; line-height: 40px; }
+h4 { font-size: 18px; line-height: 20px; }
+h5 { font-size: 14px; line-height: 20px; }
+h6 { font-size: 12px; line-height: 20px; }
+
+h1 small { font-size: 24px; }
+h2 small { font-size: 18px; }
+h3 small { font-size: 14px; }
+h4 small { font-size: 14px; }
+
+
+// Page header
+// -------------------------
+
+.page-header {
+  padding-bottom: (@baseLineHeight / 2) - 1;
+  margin: @baseLineHeight 0 (@baseLineHeight * 1.5);
+  border-bottom: 1px solid @grayLighter;
+}
+
+
+
+// Lists
+// --------------------------------------------------
+
+// Unordered and Ordered lists
+ul, ol {
+  padding: 0;
+  margin: 0 0 @baseLineHeight / 2 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+li {
+  line-height: @baseLineHeight;
+}
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+
+// Description Lists
+dl {
+  margin-bottom: @baseLineHeight;
+}
+dt,
+dd {
+  line-height: @baseLineHeight;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: @baseLineHeight / 2;
+}
+// Horizontal layout (like forms)
+.dl-horizontal {
+  dt {
+    float: left;
+    width: 120px;
+    clear: left;
+    text-align: right;
+    .text-overflow();
+  }
+  dd {
+    margin-left: 130px;
+  }
+}
+
+// MISC
+// ----
+
+// Horizontal rules
+hr {
+  margin: @baseLineHeight 0;
+  border: 0;
+  border-top: 1px solid @hrBorder;
+  border-bottom: 1px solid @white;
+}
+
+// Abbreviations and acronyms
+abbr[title] {
+  cursor: help;
+  border-bottom: 1px dotted @grayLight;
+}
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+// Blockquotes
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 @baseLineHeight;
+  border-left: 5px solid @grayLighter;
+  p {
+    margin-bottom: 0;
+    #font > .shorthand(16px,300,@baseLineHeight * 1.25);
+  }
+  small {
+    display: block;
+    line-height: @baseLineHeight;
+    color: @grayLight;
+    &:before {
+      content: '\2014 \00A0';
+    }
+  }
+
+  // Float right with text-align: right
+  &.pull-right {
+    float: right;
+    padding-right: 15px;
+    padding-left: 0;
+    border-right: 5px solid @grayLighter;
+    border-left: 0;
+    p,
+    small {
+      text-align: right;
+    }
+    small {
+      &:before {
+        content: '';
+      }
+      &:after {
+        content: '\00A0 \2014';
+      }
+    }
+  }
+}
+
+// Quotes
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+// Addresses
+address {
+  display: block;
+  margin-bottom: @baseLineHeight;
+  font-style: normal;
+  line-height: @baseLineHeight;
+}
diff --git a/static/less/utilities.less b/static/less/utilities.less
new file mode 100644
index 0000000000000000000000000000000000000000..314b4ffdb45acbb991eedc0782a800535e73b051
--- /dev/null
+++ b/static/less/utilities.less
@@ -0,0 +1,30 @@
+//
+// Utility classes
+// --------------------------------------------------
+
+
+// Quick floats
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+
+// Toggling content
+.hide {
+  display: none;
+}
+.show {
+  display: block;
+}
+
+// Visibility
+.invisible {
+  visibility: hidden;
+}
+
+// For Affix plugin
+.affix {
+  position: fixed;
+}
diff --git a/static/less/variables.less b/static/less/variables.less
new file mode 100644
index 0000000000000000000000000000000000000000..41ec6c5675875dad88169a91fa79748a1411923a
--- /dev/null
+++ b/static/less/variables.less
@@ -0,0 +1,206 @@
+//
+// Variables
+// --------------------------------------------------
+// Global values
+// --------------------------------------------------
+// Grays
+// -------------------------
+@black: #000;
+@grayDarker: #222;
+@grayDark: #333;
+@gray: #555;
+@grayLight: #999;
+@grayLighter: #eee;
+@white: #fff;
+// Accent colors
+// -------------------------
+@blue: #eff4f7;
+@blueDark: #161726;
+@green: #46a546;
+@red: #9d261d;
+@yellow: #ffc40d;
+@orange: #f89406;
+@pink: #c3325f;
+@purple: #572563;
+@purple1: #7c2c90;
+@purpledark: #333450;
+@greylight: #f6f6f6;
+//old @purple:                #782e90;
+// Scaffolding
+// -------------------------
+@bodyBackground: darken(@blue, 5%);
+@textColor: @blueDark;
+// Links
+// -------------------------
+@linkColor: darken(#6BB151, 15%);
+@linkColorHover: lighten(@linkColor, 15%);
+// Typography
+// -------------------------
+@sansFontFamily: Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
+@serifFontFamily: Georgia, "Times New Roman", Times, serif;
+@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace;
+@baseFontSize: 14px;
+@baseFontFamily: @sansFontFamily;
+@baseLineHeight: 20px;
+@altFontFamily: @serifFontFamily;
+@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily
+@headingsFontWeight: bold; // instead of browser default, bold
+@headingsColor: inherit; // empty to use BS default, @textColor
+// Tables
+// -------------------------
+@tableBackground: transparent; // overall background-color
+@tableBackgroundAccent: #f9f9f9; // for striping
+@tableBackgroundHover: #f5f5f5; // for hover
+@tableBorder: #ddd; // table and cell border
+// Buttons
+// -------------------------
+@btnBackground: @white;
+@btnBackgroundHighlight: darken(@white, 10%);
+@btnBorder: #bbb;
+@btnPrimaryBackground: @linkColor;
+@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 20%);
+@btnInfoBackground: #5bc0de;
+@btnInfoBackgroundHighlight: #2f96b4;
+@btnSuccessBackground: #62c462;
+@btnSuccessBackgroundHighlight: #51a351;
+@btnWarningBackground: lighten(@orange, 15%);
+@btnWarningBackgroundHighlight: @orange;
+@btnDangerBackground: #ee5f5b;
+@btnDangerBackgroundHighlight: #bd362f;
+@btnInverseBackground: #444;
+@btnInverseBackgroundHighlight: @grayDarker;
+// Forms
+// -------------------------
+@inputBackground: @white;
+@inputBorder: #ccc;
+@inputBorderRadius: 3px;
+@inputDisabledBackground: @grayLighter;
+@formActionsBackground: #f5f5f5;
+// Dropdowns
+// -------------------------
+@dropdownBackground: @white;
+@dropdownBorder: rgba(0, 0, 0, .2);
+@dropdownDividerTop: #e5e5e5;
+@dropdownDividerBottom: @white;
+@dropdownLinkColor: @grayDark;
+@dropdownLinkColorHover: @white;
+@dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive;
+@dropdownLinkColorActive: @dropdownLinkColor;
+@dropdownLinkBackgroundActive: @linkColor;
+// COMPONENT VARIABLES
+// --------------------------------------------------
+// Z-index master list
+// -------------------------
+// Used for a bird's eye view of components dependent on the z-axis
+// Try to avoid customizing these :)
+@zindexDropdown: 1000;
+@zindexPopover: 1010;
+@zindexTooltip: 1030;
+@zindexFixedNavbar: 1030;
+@zindexModalBackdrop: 1040;
+@zindexModal: 1050;
+// Sprite icons path
+// -------------------------
+@iconSpritePath: "../img/glyphicons-halflings.png";
+@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png";
+// Input placeholder text color
+// -------------------------
+@placeholderText: @grayLight;
+// Hr border color
+// -------------------------
+@hrBorder: @grayLighter;
+// Wells
+// -------------------------
+@wellBackground: #f5f5f5;
+// Navbar
+// -------------------------
+@navbarCollapseWidth: 979px;
+@navbarHeight: 60px;
+@navbarBackground: darken(@navbarBackgroundHighlight, 5%);
+@navbarBackgroundHighlight: @blueDark;
+@navbarBorder: darken(@navbarBackground, 12%);
+@navbarText: @blue;
+@navbarLinkColor: lighten(@blueDark, 70%);
+@navbarLinkColorHover: @blue;
+@navbarLinkColorActive: @blue;
+@navbarLinkBackgroundHover: transparent;
+@navbarLinkBackgroundActive: darken(@navbarBackground, 5%);
+@navbarBrandColor: @navbarLinkColor;
+// Inverted navbar
+@navbarInverseBackground: #111111;
+@navbarInverseBackgroundHighlight: #222222;
+@navbarInverseBorder: #252525;
+@navbarInverseText: @grayLight;
+@navbarInverseLinkColor: @grayLight;
+@navbarInverseLinkColorHover: @white;
+@navbarInverseLinkColorActive: @navbarInverseLinkColorHover;
+@navbarInverseLinkBackgroundHover: transparent;
+@navbarInverseLinkBackgroundActive: @navbarInverseBackground;
+@navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%);
+@navbarInverseSearchBackgroundFocus: @white;
+@navbarInverseSearchBorder: @navbarInverseBackground;
+@navbarInverseSearchPlaceholderColor: #ccc;
+@navbarInverseBrandColor: @navbarInverseLinkColor;
+// Pagination
+// -------------------------
+@paginationBackground: #fff;
+@paginationBorder: #ddd;
+@paginationActiveBackground: #f5f5f5;
+// Hero unit
+// -------------------------
+@heroUnitBackground: @grayLighter;
+@heroUnitHeadingColor: inherit;
+@heroUnitLeadColor: inherit;
+// Form states and alerts
+// -------------------------
+@warningText: #c09853;
+@warningBackground: #fcf8e3;
+@warningBorder: darken(spin(@warningBackground, -10), 3%);
+@errorText: #b94a48;
+@errorBackground: #f2dede;
+@errorBorder: darken(spin(@errorBackground, -10), 3%);
+@successText: #468847;
+@successBackground: #dff0d8;
+@successBorder: darken(spin(@successBackground, -10), 5%);
+@infoText: #3a87ad;
+@infoBackground: #d9edf7;
+@infoBorder: darken(spin(@infoBackground, -10), 7%);
+// Tooltips and popovers
+// -------------------------
+@tooltipColor: #fff;
+@tooltipBackground: #000;
+@tooltipArrowWidth: 5px;
+@tooltipArrowColor: @tooltipBackground;
+@popoverBackground: @blue;
+@popoverArrowWidth: 10px;
+@popoverArrowColor: #fff;
+@popoverTitleBackground: darken(@popoverBackground, 3%);
+// Special enhancement for popovers
+@popoverArrowOuterWidth: @popoverArrowWidth + 1;
+@popoverArrowOuterColor: rgba(0, 0, 0, .25);
+// GRID
+// --------------------------------------------------
+// Default 940px grid
+// -------------------------
+@gridColumns: 12;
+@gridColumnWidth: 60px;
+@gridGutterWidth: 20px;
+@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
+// 1200px min
+@gridColumnWidth1200: 70px;
+@gridGutterWidth1200: 30px;
+@gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));
+// 768px-979px
+@gridColumnWidth768: 42px;
+@gridGutterWidth768: 20px;
+@gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));
+// Fluid grid
+// -------------------------
+@fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth);
+@fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth);
+// 1200px min
+@fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200);
+@fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200);
+// 768px-979px
+@fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768);
+@fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768);
diff --git a/static/less/variables.less.orig b/static/less/variables.less.orig
new file mode 100644
index 0000000000000000000000000000000000000000..8ac84a9d31baae844e9217e7dbc2269fd3467fa6
--- /dev/null
+++ b/static/less/variables.less.orig
@@ -0,0 +1,312 @@
+//
+// Variables
+// --------------------------------------------------
+
+
+// Global values
+// --------------------------------------------------
+
+
+// Grays
+// -------------------------
+@black:                 #000;
+@grayDarker:            #222;
+@grayDark:              #333;
+@gray:                  #555;
+@grayLight:             #999;
+@grayLighter:           #eee;
+@white:                 #fff;
+
+
+// Accent colors
+// -------------------------
+@blue:                  #eff4f7;
+@blueDark:              #161726;
+@green:                 #46a546;
+@red:                   #9d261d;
+@yellow:                #ffc40d;
+@orange:                #f89406;
+@pink:                  #c3325f;
+@purple:                #782e90;
+
+
+// Scaffolding
+// -------------------------
+@bodyBackground:        @blue;
+@textColor:             @blueDark;
+
+
+// Links
+// -------------------------
+@linkColor:             #08c;
+@linkColorHover:        darken(@linkColor, 15%);
+
+
+// Typography
+// -------------------------
+@sansFontFamily:        Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
+@serifFontFamily:       Georgia, "Times New Roman", Times, serif;
+@monoFontFamily:        Monaco, Menlo, Consolas, "Courier New", monospace;
+
+@baseFontSize:          14px;
+@baseFontFamily:        @sansFontFamily;
+@baseLineHeight:        20px;
+@altFontFamily:         @serifFontFamily;
+
+@headingsFontFamily:    inherit; // empty to use BS default, @baseFontFamily
+@headingsFontWeight:    bold;    // instead of browser default, bold
+@headingsColor:         inherit; // empty to use BS default, @textColor
+
+
+// Component sizing
+// -------------------------
+// Based on 14px font-size and 20px line-height
+
+@fontSizeLarge:         @baseFontSize * 1.25; // ~18px
+@fontSizeSmall:         @baseFontSize * 0.85; // ~12px
+@fontSizeMini:          @baseFontSize * 0.75; // ~11px
+
+@paddingLarge:          11px 19px; // 44px
+@paddingSmall:          2px 10px;  // 26px
+@paddingMini:           0 6px;   // 22px
+
+@baseBorderRadius:      4px;
+@borderRadiusLarge:     6px;
+@borderRadiusSmall:     3px;
+
+
+// Tables
+// -------------------------
+@tableBackground:                   transparent; // overall background-color
+@tableBackgroundAccent:             #f9f9f9; // for striping
+@tableBackgroundHover:              #f5f5f5; // for hover
+@tableBorder:                       #ddd; // table and cell border
+
+// Buttons
+// -------------------------
+@btnBackground:                     @white;
+@btnBackgroundHighlight:            darken(@white, 10%);
+@btnBorder:                         #bbb;
+
+@btnPrimaryBackground:              @linkColor;
+@btnPrimaryBackgroundHighlight:     spin(@btnPrimaryBackground, 20%);
+
+@btnInfoBackground:                 #5bc0de;
+@btnInfoBackgroundHighlight:        #2f96b4;
+
+@btnSuccessBackground:              #62c462;
+@btnSuccessBackgroundHighlight:     #51a351;
+
+@btnWarningBackground:              lighten(@orange, 15%);
+@btnWarningBackgroundHighlight:     @orange;
+
+@btnDangerBackground:               #ee5f5b;
+@btnDangerBackgroundHighlight:      #bd362f;
+
+@btnInverseBackground:              #444;
+@btnInverseBackgroundHighlight:     @grayDarker;
+
+
+// Forms
+// -------------------------
+@inputBackground:               @white;
+@inputBorder:                   #ccc;
+@inputBorderRadius:             @baseBorderRadius;
+@inputDisabledBackground:       @grayLighter;
+@formActionsBackground:         #f5f5f5;
+@inputHeight:                   @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border
+
+
+// Dropdowns
+// -------------------------
+@dropdownBackground:            @white;
+@dropdownBorder:                rgba(0,0,0,.2);
+@dropdownDividerTop:            #e5e5e5;
+@dropdownDividerBottom:         @white;
+
+@dropdownLinkColor:             @grayDark;
+@dropdownLinkColorHover:        @white;
+@dropdownLinkColorActive:       @white;
+
+@dropdownLinkBackgroundActive:  @linkColor;
+@dropdownLinkBackgroundHover:   @dropdownLinkBackgroundActive;
+
+
+
+// COMPONENT VARIABLES
+// --------------------------------------------------
+
+
+// Z-index master list
+// -------------------------
+// Used for a bird's eye view of components dependent on the z-axis
+// Try to avoid customizing these :)
+@zindexDropdown:          1000;
+@zindexPopover:           1010;
+@zindexTooltip:           1030;
+@zindexFixedNavbar:       1030;
+@zindexModalBackdrop:     1040;
+@zindexModal:             1050;
+
+
+// Sprite icons path
+// -------------------------
+@iconSpritePath:          "../img/glyphicons-halflings.png";
+@iconWhiteSpritePath:     "../img/glyphicons-halflings-white.png";
+
+
+// Input placeholder text color
+// -------------------------
+@placeholderText:         @grayLight;
+
+
+// Hr border color
+// -------------------------
+@hrBorder:                @grayLighter;
+
+
+// Horizontal forms & lists
+// -------------------------
+@horizontalComponentOffset:       180px;
+
+
+// Wells
+// -------------------------
+@wellBackground:                  #f5f5f5;
+
+
+// Navbar
+// -------------------------
+@navbarCollapseWidth:             979px;
+@navbarCollapseDesktopWidth:      @navbarCollapseWidth + 1;
+
+@navbarHeight:                    40px;
+<<<<<<< HEAD
+@navbarBackground:                darken(@navbarBackgroundHighlight, 5%);
+@navbarBackgroundHighlight:       @blueDark;
+@navbarBorder:                    darken(@navbarBackground, 12%);
+
+@navbarText:                      @blue;
+@navbarLinkColor:                 lighten(@blueDark, 70%);
+@navbarLinkColorHover:            @blue;
+@navbarLinkColorActive:           @blue;
+=======
+@navbarBackgroundHighlight:       #ffffff;
+@navbarBackground:                darken(@navbarBackgroundHighlight, 5%);
+@navbarBorder:                    darken(@navbarBackground, 12%);
+
+@navbarText:                      #777;
+@navbarLinkColor:                 #777;
+@navbarLinkColorHover:            @grayDark;
+@navbarLinkColorActive:           @gray;
+>>>>>>> v2.2.2
+@navbarLinkBackgroundHover:       transparent;
+@navbarLinkBackgroundActive:      darken(@navbarBackground, 5%);
+
+@navbarBrandColor:                @navbarLinkColor;
+
+// Inverted navbar
+@navbarInverseBackground:                #111111;
+@navbarInverseBackgroundHighlight:       #222222;
+@navbarInverseBorder:                    #252525;
+
+@navbarInverseText:                      @grayLight;
+@navbarInverseLinkColor:                 @grayLight;
+@navbarInverseLinkColorHover:            @white;
+@navbarInverseLinkColorActive:           @navbarInverseLinkColorHover;
+@navbarInverseLinkBackgroundHover:       transparent;
+@navbarInverseLinkBackgroundActive:      @navbarInverseBackground;
+
+@navbarInverseSearchBackground:          lighten(@navbarInverseBackground, 25%);
+@navbarInverseSearchBackgroundFocus:     @white;
+@navbarInverseSearchBorder:              @navbarInverseBackground;
+@navbarInverseSearchPlaceholderColor:    #ccc;
+
+@navbarInverseBrandColor:                @navbarInverseLinkColor;
+
+
+// Pagination
+// -------------------------
+@paginationBackground:                #fff;
+@paginationBorder:                    #ddd;
+@paginationActiveBackground:          #f5f5f5;
+
+
+// Hero unit
+// -------------------------
+@heroUnitBackground:              @grayLighter;
+@heroUnitHeadingColor:            inherit;
+@heroUnitLeadColor:               inherit;
+
+
+// Form states and alerts
+// -------------------------
+@warningText:             #c09853;
+@warningBackground:       #fcf8e3;
+@warningBorder:           darken(spin(@warningBackground, -10), 3%);
+
+@errorText:               #b94a48;
+@errorBackground:         #f2dede;
+@errorBorder:             darken(spin(@errorBackground, -10), 3%);
+
+@successText:             #468847;
+@successBackground:       #dff0d8;
+@successBorder:           darken(spin(@successBackground, -10), 5%);
+
+@infoText:                #3a87ad;
+@infoBackground:          #d9edf7;
+@infoBorder:              darken(spin(@infoBackground, -10), 7%);
+
+
+// Tooltips and popovers
+// -------------------------
+@tooltipColor:            #fff;
+@tooltipBackground:       #000;
+@tooltipArrowWidth:       5px;
+@tooltipArrowColor:       @tooltipBackground;
+
+@popoverBackground:       #fff;
+@popoverArrowWidth:       10px;
+@popoverArrowColor:       #fff;
+@popoverTitleBackground:  darken(@popoverBackground, 3%);
+
+// Special enhancement for popovers
+@popoverArrowOuterWidth:  @popoverArrowWidth + 1;
+@popoverArrowOuterColor:  rgba(0,0,0,.25);
+
+
+
+// GRID
+// --------------------------------------------------
+
+
+// Default 940px grid
+// -------------------------
+@gridColumns:             12;
+@gridColumnWidth:         60px;
+@gridGutterWidth:         20px;
+@gridRowWidth:            (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
+
+// 1200px min
+@gridColumnWidth1200:     70px;
+@gridGutterWidth1200:     30px;
+@gridRowWidth1200:        (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));
+
+// 768px-979px
+@gridColumnWidth768:      42px;
+@gridGutterWidth768:      20px;
+@gridRowWidth768:         (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));
+
+
+// Fluid grid
+// -------------------------
+@fluidGridColumnWidth:    percentage(@gridColumnWidth/@gridRowWidth);
+@fluidGridGutterWidth:    percentage(@gridGutterWidth/@gridRowWidth);
+
+// 1200px min
+@fluidGridColumnWidth1200:     percentage(@gridColumnWidth1200/@gridRowWidth1200);
+@fluidGridGutterWidth1200:     percentage(@gridGutterWidth1200/@gridRowWidth1200);
+
+// 768px-979px
+@fluidGridColumnWidth768:      percentage(@gridColumnWidth768/@gridRowWidth768);
+@fluidGridGutterWidth768:      percentage(@gridGutterWidth768/@gridRowWidth768);
diff --git a/static/less/wells.less b/static/less/wells.less
new file mode 100644
index 0000000000000000000000000000000000000000..e4e0a9bebe48bbe302c2a4a004162275c70fc26b
--- /dev/null
+++ b/static/less/wells.less
@@ -0,0 +1,29 @@
+//
+// Wells
+// --------------------------------------------------
+
+
+// Base class
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: @wellBackground;
+  border: 1px solid darken(@wellBackground, 7%);
+  .border-radius(4px);
+  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
+  blockquote {
+    border-color: #ddd;
+    border-color: rgba(0,0,0,.15);
+  }
+}
+
+// Sizes
+.well-large {
+  padding: 24px;
+  .border-radius(6px);
+}
+.well-small {
+  padding: 9px;
+  .border-radius(3px);
+}
diff --git a/static/open-iot-challenge/fonts/FontAwesome.otf b/static/open-iot-challenge/fonts/FontAwesome.otf
new file mode 100644
index 0000000000000000000000000000000000000000..81c9ad949b47f64afeca5642ee2494b6e3147f44
Binary files /dev/null and b/static/open-iot-challenge/fonts/FontAwesome.otf differ
diff --git a/static/open-iot-challenge/fonts/fontawesome-webfont.eot b/static/open-iot-challenge/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000000000000000000000000000000000000..84677bc0c5f37f1fac9d87548c4554b5c91717cf
Binary files /dev/null and b/static/open-iot-challenge/fonts/fontawesome-webfont.eot differ
diff --git a/static/open-iot-challenge/fonts/fontawesome-webfont.svg b/static/open-iot-challenge/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d907b25ae60ec7e3d32e4027aa6e6b7595de97af
--- /dev/null
+++ b/static/open-iot-challenge/fonts/fontawesome-webfont.svg
@@ -0,0 +1,520 @@
+<?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="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" "  horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#xd8;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" horiz-adv-x="1537" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" horiz-adv-x="1537" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -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 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.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.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1536 160q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5v-960z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.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.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -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 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1792" />
+<glyph unicode="&#xf117;" horiz-adv-x="1792" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.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.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+<glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
+<glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
+<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
+<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
+<glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
+<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" />
+<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+<glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" />
+<glyph unicode="&#xf1a1;" horiz-adv-x="1984" d="M831 572q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98zM1292 711q56 0 96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96q0 57 41.5 98t97.5 41zM1984 722q0 -62 -31 -114t-83 -82q5 -33 5 -61 q0 -121 -68.5 -230.5t-197.5 -193.5q-125 -82 -285.5 -125.5t-335.5 -43.5q-176 0 -336.5 43.5t-284.5 125.5q-129 84 -197.5 193t-68.5 231q0 29 5 66q-48 31 -77 81.5t-29 109.5q0 94 66 160t160 66q83 0 148 -55q248 158 592 164l134 423q4 14 17.5 21.5t28.5 4.5 l347 -82q22 50 68.5 81t102.5 31q77 0 131.5 -54.5t54.5 -131.5t-54.5 -132t-131.5 -55q-76 0 -130.5 54t-55.5 131l-315 74l-116 -366q327 -14 560 -166q64 58 151 58q94 0 160 -66t66 -160zM1664 1459q-45 0 -77 -32t-32 -77t32 -77t77 -32t77 32t32 77t-32 77t-77 32z M77 722q0 -67 51 -111q49 131 180 235q-36 25 -82 25q-62 0 -105.5 -43.5t-43.5 -105.5zM1567 105q112 73 171.5 166t59.5 194t-59.5 193.5t-171.5 165.5q-116 75 -265.5 115.5t-313.5 40.5t-313.5 -40.5t-265.5 -115.5q-112 -73 -171.5 -165.5t-59.5 -193.5t59.5 -194 t171.5 -166q116 -75 265.5 -115.5t313.5 -40.5t313.5 40.5t265.5 115.5zM1850 605q57 46 57 117q0 62 -43.5 105.5t-105.5 43.5q-49 0 -86 -28q131 -105 178 -238zM1258 237q11 11 27 11t27 -11t11 -27.5t-11 -27.5q-99 -99 -319 -99h-2q-220 0 -319 99q-11 11 -11 27.5 t11 27.5t27 11t27 -11q77 -77 265 -77h2q188 0 265 77z" />
+<glyph unicode="&#xf1a2;" d="M950 393q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18t8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51zM671 613q0 -37 -26 -64t-63 -27t-63 27t-26 64t26 63t63 26t63 -26t26 -63zM1214 1049q-29 0 -50 21t-21 50 q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21zM1216 1408q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227v894q0 133 94 227t226 94h896zM1321 596q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48 q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43q-51 0 -87 -36.5t-36 -87.5q0 -37 19.5 -67.5t52.5 -45.5 q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54zM971 702q37 0 63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64t26 63t63 26z" />
+<glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -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 103 t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+<glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
+<glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
+<glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
+<glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" />
+<glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" />
+<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
+<glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
+<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" />
+<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
+<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" />
+<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
+<glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
+<glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
+<glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " />
+<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
+<glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
+<glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+<glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1bd;" d="M1397 1408q58 0 98.5 -40.5t40.5 -98.5v-1258q0 -58 -40.5 -98.5t-98.5 -40.5h-1258q-58 0 -98.5 40.5t-40.5 98.5v1258q0 58 40.5 98.5t98.5 40.5h1258zM1465 11v1258q0 28 -20 48t-48 20h-1258q-28 0 -48 -20t-20 -48v-1258q0 -28 20 -48t48 -20h1258q28 0 48 20t20 48 zM694 749l188 -387l533 145v-496q0 -7 -5.5 -12.5t-12.5 -5.5h-1258q-7 0 -12.5 5.5t-5.5 12.5v141l711 195l-212 439q4 1 12 2.5t12 1.5q170 32 303.5 21.5t221 -46t143.5 -94.5q27 -28 -25 -42q-64 -16 -256 -62l-97 198q-111 7 -240 -16zM1397 1287q7 0 12.5 -5.5 t5.5 -12.5v-428q-85 30 -188 52q-294 64 -645 12l-18 -3l-65 134h-233l85 -190q-132 -51 -230 -137v560q0 7 5.5 12.5t12.5 5.5h1258zM286 387q-14 -3 -26 4.5t-14 21.5q-24 203 166 305l129 -270z" />
+<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
+<glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
+<glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
+<glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" />
+<glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" />
+<glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+<glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+<glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
+<glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
+<glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+<glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
+<glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
+<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" />
+<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" />
+<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
+<glyph unicode="&#xf1d4;" d="M825 547l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150l323 -589v-435h134v436zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
+<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
+<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
+<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
+<glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" />
+<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+<glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+<glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+<glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
+<glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
+<glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
+<glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
+<glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+<glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
+<glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+<glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
+<glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1ed;" horiz-adv-x="1792" d="M1112 1090q0 159 -237 159h-70q-32 0 -59.5 -21.5t-34.5 -52.5l-63 -276q-2 -5 -2 -16q0 -24 17 -39.5t41 -15.5h53q69 0 128.5 13t112.5 41t83.5 81.5t30.5 126.5zM1716 938q0 -265 -220 -428q-219 -161 -612 -161h-61q-32 0 -59 -21.5t-34 -52.5l-73 -316 q-8 -36 -40.5 -61.5t-69.5 -25.5h-213q-31 0 -53 20t-22 51q0 10 13 65h151q34 0 64 23.5t38 56.5l73 316q8 33 37.5 57t63.5 24h61q390 0 607 160t217 421q0 129 -51 207q183 -92 183 -335zM1533 1123q0 -264 -221 -428q-218 -161 -612 -161h-60q-32 0 -59.5 -22t-34.5 -53 l-73 -315q-8 -36 -40 -61.5t-69 -25.5h-214q-31 0 -52.5 19.5t-21.5 51.5q0 8 2 20l300 1301q8 36 40.5 61.5t69.5 25.5h444q68 0 125 -4t120.5 -15t113.5 -30t96.5 -50.5t77.5 -74t49.5 -103.5t18.5 -136z" />
+<glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" />
+<glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
+<glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+<glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M322 689h-15q-19 0 -19 18q0 28 19 85q5 15 15 19.5t28 4.5q77 0 77 -49q0 -41 -30.5 -59.5t-74.5 -18.5zM664 528q-47 0 -47 29q0 62 123 62l3 -3q-5 -88 -79 -88zM1438 687h-15q-19 0 -19 19q0 28 19 85q5 15 14.5 19t28.5 4q77 0 77 -49q0 -41 -30.5 -59.5 t-74.5 -18.5zM1780 527q-47 0 -47 30q0 62 123 62l3 -3q-5 -89 -79 -89zM373 894h-128q-8 0 -14.5 -4t-8.5 -7.5t-7 -12.5q-3 -7 -45 -190t-42 -192q0 -7 5.5 -12.5t13.5 -5.5h62q25 0 32.5 34.5l15 69t32.5 34.5q47 0 87.5 7.5t80.5 24.5t63.5 52.5t23.5 84.5 q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM719 798q-38 0 -74 -6q-2 0 -8.5 -1t-9 -1.5l-7.5 -1.5t-7.5 -2t-6.5 -3t-6.5 -4t-5 -5t-4.5 -7t-4 -9q-9 -29 -9 -39t9 -10q5 0 21.5 5t19.5 6q30 8 58 8q74 0 74 -36q0 -11 -10 -14q-8 -2 -18 -3t-21.5 -1.5t-17.5 -1.5 q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5q0 -38 26 -59.5t64 -21.5q24 0 45.5 6.5t33 13t38.5 23.5q-3 -7 -3 -15t5.5 -13.5t12.5 -5.5h56q1 1 7 3.5t7.5 3.5t5 3.5t5 5.5t2.5 8l45 194q4 13 4 30q0 81 -145 81zM1247 793h-74q-22 0 -39 -23q-5 -7 -29.5 -51 t-46.5 -81.5t-26 -38.5l-5 4q0 77 -27 166q-1 5 -3.5 8.5t-6 6.5t-6.5 5t-8.5 3t-8.5 1.5t-9.5 1t-9 0.5h-10h-8.5q-38 0 -38 -21l1 -5q5 -53 25 -151t25 -143q2 -16 2 -24q0 -19 -30.5 -61.5t-30.5 -58.5q0 -13 40 -13q61 0 76 25l245 415q10 20 10 26q0 9 -8 9zM1489 892 h-129q-18 0 -29 -23q-6 -13 -46.5 -191.5t-40.5 -190.5q0 -20 43 -20h7.5h9h9t9.5 1t8.5 2t8.5 3t6.5 4.5t5.5 6t3 8.5l21 91q2 10 10.5 17t19.5 7q47 0 87.5 7t80.5 24.5t63.5 52.5t23.5 84q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM1835 798q-26 0 -74 -6 q-38 -6 -48 -16q-7 -8 -11 -19q-8 -24 -8 -39q0 -10 8 -10q1 0 41 12q30 8 58 8q74 0 74 -36q0 -12 -10 -14q-4 -1 -57 -7q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5t26 -58.5t64 -21.5q24 0 45 6t34 13t38 24q-3 -15 -3 -16q0 -5 2 -8.5t6.5 -5.5t8 -3.5 t10.5 -2t9.5 -0.5h9.5h8q42 0 48 25l45 194q3 15 3 31q0 81 -145 81zM2157 889h-55q-25 0 -33 -40q-10 -44 -36.5 -167t-42.5 -190v-5q0 -16 16 -18h1h57q10 0 18.5 6.5t10.5 16.5l83 374h-1l1 5q0 7 -5.5 12.5t-13.5 5.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048 q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -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 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
+<glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+<glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+<glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
+<glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+<glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
+<glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
+<glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
+<glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
+<glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
+<glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
+<glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
+<glyph unicode="&#xf20d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf20e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/static/open-iot-challenge/fonts/fontawesome-webfont.ttf b/static/open-iot-challenge/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..96a3639cdde5e8ab459c6380e3b9524ee81641dc
Binary files /dev/null and b/static/open-iot-challenge/fonts/fontawesome-webfont.ttf differ
diff --git a/static/open-iot-challenge/fonts/fontawesome-webfont.woff b/static/open-iot-challenge/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000000000000000000000000000000000000..628b6a52a87e62c6f22426e17c01f6a303aa194e
Binary files /dev/null and b/static/open-iot-challenge/fonts/fontawesome-webfont.woff differ
diff --git a/static/open-iot-challenge/images/contest-prizes-01.jpg b/static/open-iot-challenge/images/contest-prizes-01.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8ab71da4acfd985de856755bce639fa1e0bff737
Binary files /dev/null and b/static/open-iot-challenge/images/contest-prizes-01.jpg differ
diff --git a/static/open-iot-challenge/images/contest-prizes-02.jpg b/static/open-iot-challenge/images/contest-prizes-02.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..606d404e97bdf0316a9d37bcd8590820bee6d726
Binary files /dev/null and b/static/open-iot-challenge/images/contest-prizes-02.jpg differ
diff --git a/static/open-iot-challenge/images/contest-prizes-03.jpg b/static/open-iot-challenge/images/contest-prizes-03.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..2dbcaa75e914d159de20486c9dc6f2ad3bac662e
Binary files /dev/null and b/static/open-iot-challenge/images/contest-prizes-03.jpg differ
diff --git a/static/open-iot-challenge/images/discover-bg.jpg b/static/open-iot-challenge/images/discover-bg.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..17b72c1f15f005f9457ce1a7ee33e31ad0fee055
Binary files /dev/null and b/static/open-iot-challenge/images/discover-bg.jpg differ
diff --git a/static/open-iot-challenge/images/footer-bg.jpg b/static/open-iot-challenge/images/footer-bg.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ca041e0f5871f5bf4ab2218bbb32c1a699bab28f
Binary files /dev/null and b/static/open-iot-challenge/images/footer-bg.jpg differ
diff --git a/static/open-iot-challenge/images/header-bg.jpg b/static/open-iot-challenge/images/header-bg.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..789a6f97be4ca2aca625078c0f663bc6600b0ba1
Binary files /dev/null and b/static/open-iot-challenge/images/header-bg.jpg differ
diff --git a/static/open-iot-challenge/images/header-logo.png b/static/open-iot-challenge/images/header-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..25ec782139529b6a30cc71e2389ee32d0620ac72
Binary files /dev/null and b/static/open-iot-challenge/images/header-logo.png differ
diff --git a/static/open-iot-challenge/images/icon-connect.jpg b/static/open-iot-challenge/images/icon-connect.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..c3542d88521a99a1a093417ff9a5a589c072021f
Binary files /dev/null and b/static/open-iot-challenge/images/icon-connect.jpg differ
diff --git a/static/open-iot-challenge/images/icon-download.jpg b/static/open-iot-challenge/images/icon-download.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..2ec9f6823043ebe04d0f2d15a7f8332b07357bb6
Binary files /dev/null and b/static/open-iot-challenge/images/icon-download.jpg differ
diff --git a/static/open-iot-challenge/images/icon-live.jpg b/static/open-iot-challenge/images/icon-live.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7aff3ed85fa0ce968630e077ec791379a0f900b1
Binary files /dev/null and b/static/open-iot-challenge/images/icon-live.jpg differ
diff --git a/static/open-iot-challenge/images/icon-tutorial.jpg b/static/open-iot-challenge/images/icon-tutorial.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..99fa9437ddda5a538e23ced83683210ee6590917
Binary files /dev/null and b/static/open-iot-challenge/images/icon-tutorial.jpg differ
diff --git a/static/open-iot-challenge/images/logo-01.png b/static/open-iot-challenge/images/logo-01.png
new file mode 100644
index 0000000000000000000000000000000000000000..547630522aa9c706f8d7e85dcb015d3e1877fccf
Binary files /dev/null and b/static/open-iot-challenge/images/logo-01.png differ
diff --git a/static/open-iot-challenge/images/logo-02.png b/static/open-iot-challenge/images/logo-02.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d39aff89cf33268232e4652cdc6f091ae21546d
Binary files /dev/null and b/static/open-iot-challenge/images/logo-02.png differ
diff --git a/static/open-iot-challenge/images/m2m_eclipse_logo.png b/static/open-iot-challenge/images/m2m_eclipse_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b50fb1e3ff2a392ae00fde99c88e79f358845a6
Binary files /dev/null and b/static/open-iot-challenge/images/m2m_eclipse_logo.png differ
diff --git a/static/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.jpg b/static/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..0928b0598b8f69b75f679782a0871ed01e2785fd
Binary files /dev/null and b/static/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.jpg differ
diff --git a/static/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.png b/static/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb4d86a6860b7465f4bce11531d729b7c7469ffb
Binary files /dev/null and b/static/open-iot-challenge/images/microej_IoT_Eclipse_Contest2015.png differ
diff --git a/static/open-iot-challenge/images/plus.jpg b/static/open-iot-challenge/images/plus.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..35b1acc94f0ab9e237f8b5af2dc83155e4c57e58
Binary files /dev/null and b/static/open-iot-challenge/images/plus.jpg differ
diff --git a/static/open-iot-challenge/images/purple-check.png b/static/open-iot-challenge/images/purple-check.png
new file mode 100644
index 0000000000000000000000000000000000000000..82abea46667ebaecb627d8abd1335e7a16afefea
Binary files /dev/null and b/static/open-iot-challenge/images/purple-check.png differ
diff --git a/static/open-iot-challenge/images/social-facebook.jpg b/static/open-iot-challenge/images/social-facebook.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..91360a6102bc8ace8c0eaca2b600554ad77bcda5
Binary files /dev/null and b/static/open-iot-challenge/images/social-facebook.jpg differ
diff --git a/static/open-iot-challenge/images/social-twitter.jpg b/static/open-iot-challenge/images/social-twitter.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..2bf6b5991237cb16a7910bbe860e44aedb7d1950
Binary files /dev/null and b/static/open-iot-challenge/images/social-twitter.jpg differ
diff --git a/static/open-iot-challenge/images/social-youtube.jpg b/static/open-iot-challenge/images/social-youtube.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6945061a96c7602e5099b6d393396c8d20f7247e
Binary files /dev/null and b/static/open-iot-challenge/images/social-youtube.jpg differ
diff --git a/static/open-iot-challenge/images/tech-bg.jpg b/static/open-iot-challenge/images/tech-bg.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..86180f17b153ed455f8e2063e183f033ddec7b12
Binary files /dev/null and b/static/open-iot-challenge/images/tech-bg.jpg differ
diff --git a/static/open-iot-challenge/images/tech-board.jpg b/static/open-iot-challenge/images/tech-board.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..0fe822c86087c344353ea48e0d7c485e84c76093
Binary files /dev/null and b/static/open-iot-challenge/images/tech-board.jpg differ
diff --git a/static/open-iot-challenge/index.html b/static/open-iot-challenge/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..1aac094d4bff221775ce5120a6aec2c1e09606cb
--- /dev/null
+++ b/static/open-iot-challenge/index.html
@@ -0,0 +1,442 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>iot.eclipse.org &mdash; Open IoT Developer challenge</title>
+    <link href='http://fonts.googleapis.com/css?family=Lato:100,300,400' rel='stylesheet' type='text/css'>
+    <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+    <link href='http://fonts.googleapis.com/css?family=Sanchez' rel='stylesheet' type='text/css'>
+    <link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
+    <link href="/css/bootstrap/bootstrap-responsive.min.css" rel="stylesheet">
+    <!--    <link href="stylesheet/bootstrap/bootstrap.min.css" rel="stylesheet">
+    <link href="stylesheet/bootstrap/bootstrap-responsive.min.css" rel="stylesheet"> -->
+    <link href="stylesheet/font-awesome.min.css" rel="stylesheet">
+
+
+
+    <link href="stylesheet/theme.css" rel="stylesheet">
+
+    <script type="text/javascript">
+    var _gaq = _gaq || [];
+    _gaq.push(['_setAccount', 'UA-594061-11']);
+    _gaq.push(['_trackPageview']);
+
+    (function() {
+        var ga = document.createElement('script');
+        ga.type = 'text/javascript';
+        ga.async = true;
+        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(ga, s);
+    })();
+    </script>
+
+
+</head>
+
+<body>
+    <div class="navbar navbar-fixed-top">
+        <div class="navbar-inner">
+            <div class="container">
+                <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span>
+                </a> <a class="brand" href="/">iot.eclipse.org</a>
+
+                <div class="nav-collapse">
+                    <ul class="nav">
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/frameworks.html">Services &amp; Frameworks</a>
+                                </li>
+                                <li><a href="/protocols.html">Protocols</a>
+                                </li>
+                                <li><a href="/tools.html">Tools</a>
+                                </li>
+                                <li class="divider"></li>
+                                <li><a href="/java"><strong>Open IoT Stack for Java</strong></a>
+                                </li>
+                            </ul>
+                        </li>
+
+                        <li class="dropdown active">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Community <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/community.html#projects">Projects</a>
+                                </li>
+                                <li><a href="/community.html#news">News</a>
+                                </li>
+                                <li class="divider"></li>
+                                <li class="active"><a href="/open-iot-challenge">Open IoT Challenge </a>
+                                </li>
+                            </ul>
+                        </li>
+
+                        <li><a href="/ecosystem.html">Ecosystem</a>
+                        </li>
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">See it live <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/demo">Live Demo</a>
+                                </li>
+                                <li><a href="/sandbox.html">Sandbox</a>
+                                </li>
+                            </ul>
+                        </li>
+                    </ul>
+
+                    <ul class="nav pull-right">
+                        <li style="margin-left:0px;">
+                            <div style="padding-top: 20px">
+                                <div class="g-plusone" data-href="http://iot.eclipse.org/"></div>
+                            </div>
+                        </li>
+                    </ul>
+                </div>
+                <!--/.nav-collapse -->
+
+            </div>
+        </div>
+    </div>
+
+
+    <!-- Place this tag after the last +1 button tag. -->
+    <script type="text/javascript">
+    (function() {
+        var po = document.createElement('script');
+        po.type = 'text/javascript';
+        po.async = true;
+        po.src = 'https://apis.google.com/js/plusone.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(po, s);
+    })();
+    </script>
+
+    <div class="header">
+        <div class="container">
+            <div class="row">
+                <div class="span12">
+                    <img src="images/header-logo.png" alt="">
+
+                </div>
+                <div class="span4">&nbsp;</div>
+                <div class="span4">
+                    <hr>
+                    <br>
+                    <a class="fa fa-angle-down" href="#content"></a>
+                </div>
+                <div class="span4">&nbsp;</div>
+            </div>
+        </div>
+    </div>
+
+    <div id="content" class="blurb">
+        <div class="container">
+            <div class="row">
+                <div class="span12">
+                    <p>The Internet of Things will be built on open source software and open standards. At Eclipse we are developing a community of IoT projects that make it easy for developers to build IoT solutions.</p>
+                    <p>The Open IoT Challenge is your chance to demonstrate what you can build for the Internet of Things using open standards and open source technology. Best of all, you can compete for <strong>over $20,000 in prizes</strong>, and recognition for&nbsp;your&nbsp;solution.</p>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="tech">
+        <div class="container">
+            <div class="row">
+                <div class="span12">
+                    <h2><strong>Technology</strong> Involved</h2>
+                    <div class="row">
+                        <div class="span2 offset5">
+                            <hr>
+                        </div>
+                    </div>
+                    <p>We believe the IoT will be based on open standards and open source technology so this challenge to highlight current open standards and open source solutions. Developers who participate in the challenge are encouraged to build their solutions using any or all of the following technologies:</p>
+                </div>
+            </div>
+        </div>
+        <div class="tech-bullets">
+            <div class="container">
+                <div class="row">
+                    <div class="span4 offset2">
+                        <div class="clear">
+                            <img class="left" src="images/purple-check.png">
+                            <div class="left">
+                                <p>IoT open standards,
+                                    <br>ex MQTT, CoAP, or LWM2M</p>
+                            </div>
+                        </div>
+                        <br>
+                        <br>
+                        <div class="clear">
+                            <img class="left" src="images/purple-check.png">
+                            <div class="left">
+                                <p><a href="http://www.locationtech.org/" target="_blank">LocationTech</a>, <a href="http://www.osgeo.org" target="_blank">OSGeo</a>, or any other FOSS4G open
+                                    <br>source projects</p>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="span4">
+                        <div class="clear">
+                            <img class="left" src="images/purple-check.png">
+                            <div class="left">
+                                <p><a href="http://iot.eclipse.org" target="_blank">Eclipse IoT</a> projects, such as <a href="https://eclipse.org/kura" target="_blank">Kura</a>, <a href="https://eclipse.org/paho" target="_blank">Paho</a>,
+                                    <br><a href="https://eclipse.org/mosquitto" target="_blank">Mosquitto</a>, <a href="https://eclipse.org/smarthome" target="_blank">Eclipse SmartHome</a>,
+                                    <br><a href="https://eclipse.org/californium" target="_blank">Californium</a>, <a href="https://eclipse.org/leshan" target="_blank">Leshan</a>, <a href="http://om2m.org/" target="_blank">OM2M</a>, &hellip;
+                                </p>
+                            </div>
+                        </div>
+                        <br>
+                        <br>
+                        <div class="clear">
+                            <img class="left" src="images/purple-check.png">
+                            <div class="left">
+                                <p>Other open source projects, including
+                                    <br>other Eclipse projects</p>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="tech-expanded">
+            <div class="container">
+                <div class="row">
+                    <div class="span12">
+                        <hr>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="span6">
+                        <h2>Tell Us <strong>How You Build It</strong></h2>
+                        <p>A key aspect of this challenge is we want participants to document and discuss their experiences of building their IoT solution. For example, participants are encouraged to blog about setting up hardware like Raspberry Pi, establishing topics for MQTT messages, architecture decisions for their IoT solutions, etc.</p>
+                        <p><img src="images/tech-board.jpg" alt="">
+                        </p>
+                    </div>
+                    <div class="span6">
+                        <p>Applications for the developer challenge are now closed.</p>
+                        <p>10 lucky challengers have received a <strong>$150 gift card</strong> to help buy the hardware parts needed for the solution, and there are 45 projects in total who entered the competition!</p>
+                        <p>Submissions of the final solution must be completed by <strong>February 27, 2015</strong>. Ten finalists will be selected to present their solution at EclipseCon 2015 or online via a webinar. Prizes will be awarded for the top 3 solutions.</p>
+                        <a href="https://docs.google.com/forms/d/12ZCLK2p3Z-D49B3z47wIcp0KeyJ9BAN-oPlM6kqX4dY/viewform">
+                            <button>APPLY NOW</button>
+                        </a>
+                        <p><strong>The solutions will be judged on the following criteria:</strong>
+                        </p>
+                        <ul>
+                            <li>Innovation of the solution and applicability to the application domain</li>
+                            <li>Completeness of solution</li>
+                            <li>Use of open standards and open source technology</li>
+                            <li>Amount of community discussion from the participant when they built their solution</li>
+                        </ul>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="span12">
+                        <div class="panel">
+                            <h2>Contest <strong>Rules</strong><span></span></h2>
+                            <ul>
+                                <li>The challenge is open to any individual aged 18 years or older</li>
+                                <li>The solution submitted by the applicants must be a new solution created for this challenge</li>
+                                <li>More than one individual can participate in creating a solution but any prize will be awarded to the key contact who completed the <a href="https://docs.google.com/forms/d/12ZCLK2p3Z-D49B3z47wIcp0KeyJ9BAN-oPlM6kqX4dY/viewform" target="_blank">entry form</a>
+                                </li>
+
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="tech-apply">
+            <div class="container">
+                <div class="row">
+                    <div class="span12">
+                        <a href="https://docs.google.com/forms/d/12ZCLK2p3Z-D49B3z47wIcp0KeyJ9BAN-oPlM6kqX4dY/viewform">
+                            <button>APPLY NOW</button>
+                        </a>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="tech-plus">
+            <div class="container">
+                <div class="row">
+                    <div class="span12">
+                        <a class="tech-activate"><img src="images/plus.jpg">
+                        </a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="contest">
+        <div class="container">
+            <div class="row">
+                <div class="span12">
+                    <h2>Contest <strong>Prizes</strong></h2>
+                    <div class="row">
+                        <div class="span2 offset5">
+                            <hr>
+                        </div>
+                    </div>
+                    <p>The three winners will be awarded with the following prizes, allowing them to continue to innovate and build other IoT projects</p>
+                </div>
+            </div>
+            <div class="bubbles">
+                <div class="row">
+                    <div class="span5">
+                        <div class="panel">
+                            <p><strong>1<sup style="text-transform: lowercase">st</sup> prize</strong>
+
+                                <ul style="font-weight: 300; font-size: 16px; margin-left:0;">
+                                    <li>$750 gift card to be used in an online shop toward electronic supplies and open hardware.
+                                    </li>
+                                    <li>A full <a class="img-microej" data-original-title="">MicroEJ license</a> ($5500)</li>
+                                    <li>3 <a href="#" rel="popover" data-content="2 MB of Flash memory, 256 KB of RAM), a 2.4&rdquo; QVGA TFT LCD, SDRAM 64 Mbits, MEMS motion sensor, 3-axis digital output gyroscope, 6 LEDs, USB OTG" data-original-title="STM32F429ZIT development board" id="cortex">Cortex-M4 development boards</a>
+                                    </li>
+                                </ul>
+
+                            </p><span class="arrow-right"></span>
+                        </div>
+                    </div>
+                    <div class="span2"><img src="images/contest-prizes-01.jpg" alt="">
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="span2 offset5"><img src="images/contest-prizes-02.jpg" alt="">
+                    </div>
+                    <div class="span5">
+                        <div class="panel">
+                            <p><strong>2<sup style="text-transform: lowercase">nd</sup> prize</strong>
+
+                                <ul style="font-weight: 300; font-size: 16px; margin-left:0;">
+                                    <li>$500 gift card to be used in an online shop toward electronic supplies and open hardware.
+                                    </li>
+                                    <li>A full <a class="img-microej" data-original-title="">MicroEJ license</a> ($5500) </li>
+                                    <li>2 <a href="#" rel="popover" data-content="2 MB of Flash memory, 256 KB of RAM), a 2.4&rdquo; QVGA TFT LCD, SDRAM 64 Mbits, MEMS motion sensor, 3-axis digital output gyroscope, 6 LEDs, USB OTG" data-original-title="STM32F429ZIT development board" id="cortex">Cortex-M4 development boards</a>
+                                    </li>
+                                </ul>
+
+                            </p><span class="arrow-left"></span>
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="span5">
+                        <div class="panel">
+                            <p><strong>3<sup style="text-transform: lowercase">rd</sup> prize</strong>
+
+                                <ul style="font-weight: 300; font-size: 16px; margin-left:0;">
+                                    <li>$250 gift card to be used in an online shop toward electronic supplies and open hardware.
+                                    </li>
+                                    <li>A full <a class="img-microej" data-original-title="">MicroEJ license</a> ($5500) </li>
+                                    <li>1 <a href="#" rel="popover" data-content="2 MB of Flash memory, 256 KB of RAM), a 2.4&rdquo; QVGA TFT LCD, SDRAM 64 Mbits, MEMS motion sensor, 3-axis digital output gyroscope, 6 LEDs, USB OTG" data-original-title="STM32F429ZIT development board" id="cortex">Cortex-M4 development boards</a>
+                                    </li>
+                                </ul>
+
+                            </p><span class="arrow-right"></span>
+                        </div>
+                    </div>
+                    <div class="span2"><img src="images/contest-prizes-03.jpg" alt="">
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- 
+<div class="sponsors">
+    <div class="container">
+        <div class="row">
+            <div class="span12">
+                <img src="images/sponsors-ubuntu.jpg" alt="ubuntu">
+                <img src="images/sponsors-dc.jpg" alt="ubuntu">
+                <img src="images/sponsors-2lemetry.jpg" alt="ubuntu">
+                <img src="images/sponsors-actuate.jpg" alt="ubuntu">
+                <img src="images/sponsors-m2m.jpg" alt="ubuntu">
+                <img src="images/sponsors-eurotech.jpg" alt="ubuntu">
+                <img src="images/sponsors-bitreactive.jpg" alt="ubuntu">
+                <img src="images/sponsors-axeda.jpg" alt="ubuntu">
+                <img src="images/sponsors-sierra.jpg" alt="ubuntu">
+                <img src="images/sponsors-openhab.jpg" alt="ubuntu">
+            </div>
+        </div>
+    </div>
+</div>
+ -->
+
+
+    <div class="footer">
+        <div class="container">
+            <div class="row">
+                <div class="span8">
+                    <div class="clear">
+                        <ul class="menu list-inline">
+                            <li><a href="/">Home</a>
+                            </li>
+                            <li><a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a>
+                            </li>
+                            <li><a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a>
+                            </li>
+                            <li><a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a>
+                            </li>
+                            <li><a href="http://www.eclipse.org/legal/" target="_blank">Legal</a>
+                            </li>
+                            <li><a href="contact.html" data-toggle="modal" data-target="#contact-modal">Contact Us</a>
+                            </li>
+                            <li class="pull-right">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</li>
+                        </ul>
+                        <!-- <ul class="list-inline">
+    <li><img src="images/social-facebook.jpg">
+    </li>
+    <li><img src="images/social-twitter.jpg">
+    </li>
+    <li><img src="images/social-youtube.jpg">
+    </li>
+</ul>
+ -->
+                    </div>
+
+                </div>
+                <div class="span4">
+
+
+                    <div class="twitter-header">
+                        <div class="fa fa-twitter left"></div>
+                        <h2>@eclipseiot</h2>
+                    </div>
+
+                    <a class="twitter-timeline" href="https://twitter.com/EclipseIoT" data-widget-id="543047114042138624">Tweets by @EclipseIoT</a>
+                    <script>
+                    ! function(d, s, id) {
+                        var js, fjs = d.getElementsByTagName(s)[0],
+                            p = /^http:/.test(d.location) ? 'http' : 'https';
+                        if (!d.getElementById(id)) {
+                            js = d.createElement(s);
+                            js.id = id;
+                            js.src = p + "://platform.twitter.com/widgets.js";
+                            fjs.parentNode.insertBefore(js, fjs);
+                        }
+                    }(document, "script", "twitter-wjs");
+                    </script>
+
+
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+
+    <!-- JS is at the end of the document so the pages load faster -->
+    <script src="js/jquery.min.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/smoothscroll.js"></script>
+    <script src="js/custom.js"></script>
+
+    <script src="/js/index.js"></script>
+
+
+</body>
+
+</html>
diff --git a/static/open-iot-challenge/js/bootstrap/bootstrap.min.js b/static/open-iot-challenge/js/bootstrap/bootstrap.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..089cf42e888958ab1f88123030bc019e9d8401c1
--- /dev/null
+++ b/static/open-iot-challenge/js/bootstrap/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){e(function(){"use strict";e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()},e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e(function(){e("body").on("click.alert.data-api",t,n.prototype.close)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.parent('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")},e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e(function(){e("body").on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=n,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},to:function(t){var n=this.$element.find(".item.active"),r=n.parent().children(),i=r.index(n),s=this;if(t>r.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){s.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",e(r[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f=e.Event("slide",{relatedTarget:i[0]});this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u]();if(i.hasClass("active"))return;if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}},e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e(function(){e("body").on("click.carousel.data-api","[data-slide]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=!i.data("modal")&&e.extend({},i.data(),n.data());i.carousel(s),t.preventDefault()})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning)return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning)return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=typeof n=="object"&&n;i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e(function(){e("body").on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})})}(window.jQuery),!function(e){"use strict";function r(){i(e(t)).removeClass("open")}function i(t){var n=t.attr("data-target"),r;return n||(n=t.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,"")),r=e(n),r.length||(r=t.parent()),r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||(s.toggleClass("open"),n.focus()),!1},keydown:function(t){var n,r,s,o,u,a;if(!/(38|40|27)/.test(t.keyCode))return;n=e(this),t.preventDefault(),t.stopPropagation();if(n.is(".disabled, :disabled"))return;o=i(n),u=o.hasClass("open");if(!u||u&&t.keyCode==27)return n.click();r=e("[role=menu] li:not(.divider) a",o);if(!r.length)return;a=r.index(r.filter(":focus")),t.keyCode==38&&a>0&&a--,t.keyCode==40&&a<r.length-1&&a++,~a||(a=0),r.eq(a).focus()}},e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e(function(){e("html").on("click.dropdown.data-api touchstart.dropdown.data-api",r),e("body").on("click.dropdown touchstart.dropdown.data-api",".dropdown",function(e){e.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;e("body").addClass("modal-open"),this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1).focus(),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.trigger("shown")}):t.$element.trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,e("body").removeClass("modal-open"),this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(e){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,e.proxy(this.removeBackdrop,this)):this.removeBackdrop()):t&&t()}},e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e(function(){e("body").on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):this.options.trigger!="manual"&&(i=this.options.trigger=="hover"?"mouseenter":"focus",s=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this))),this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,t,this.$element.data()),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)return n.show();clearTimeout(this.timeout),n.hoverState="in",this.timeout=setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var e,t,n,r,i,s,o;if(this.hasContent()&&this.enabled){e=this.tip(),this.setContent(),this.options.animation&&e.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,t=/in/.test(s),e.remove().css({top:0,left:0,display:"block"}).appendTo(t?this.$element:document.body),n=this.getPosition(t),r=e[0].offsetWidth,i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.css(o).addClass(s).addClass("in")}},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).remove()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.remove()})}var t=this,n=this.tip();return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?r():n.remove(),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content > *")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-content")||(typeof n.content=="function"?n.content.call(t[0]):n.content),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var t=e(this),n=t.data("target")||t.attr("href"),r=/^#\w/.test(n)&&e(n);return r&&r.length&&[[r.position().top,n]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}},e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active a").last()[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}},e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e(function(){e("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=e(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:t.top+t.height,left:t.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),(e.browser.webkit||e.browser.msie)&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this))},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=!~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(e){var t=this;setTimeout(function(){t.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(t){this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")}},e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e(function(){e("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;t.preventDefault(),n.typeahead(n.data())})})}(window.jQuery);
\ No newline at end of file
diff --git a/static/open-iot-challenge/js/bootstrap/min/bootstrap.min-min.js b/static/open-iot-challenge/js/bootstrap/min/bootstrap.min-min.js
new file mode 100644
index 0000000000000000000000000000000000000000..d91ea08f50431b2f4b6f66a66d37f4496d022340
--- /dev/null
+++ b/static/open-iot-challenge/js/bootstrap/min/bootstrap.min-min.js
@@ -0,0 +1 @@
+!function(t){t(function(){"use strict";t.support.transition=function(){var t=function(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i;for(i in e)if(void 0!==t.style[i])return e[i]}();return t&&{end:t}}()})}(window.jQuery),!function(t){"use strict";var e='[data-dismiss="alert"]',i=function(i){t(i).on("click",e,this.close)};i.prototype.close=function(e){function i(){o.trigger("closed").remove()}var s=t(this),n=s.attr("data-target"),o;n||(n=s.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,"")),o=t(n),e&&e.preventDefault(),o.length||(o=s.hasClass("alert")?s:s.parent()),o.trigger(e=t.Event("close")),e.isDefaultPrevented()||(o.removeClass("in"),t.support.transition&&o.hasClass("fade")?o.on(t.support.transition.end,i):i())},t.fn.alert=function(e){return this.each(function(){var s=t(this),n=s.data("alert");n||s.data("alert",n=new i(this)),"string"==typeof e&&n[e].call(s)})},t.fn.alert.Constructor=i,t(function(){t("body").on("click.alert.data-api",e,i.prototype.close)})}(window.jQuery),!function(t){"use strict";var e=function(e,i){this.$element=t(e),this.options=t.extend({},t.fn.button.defaults,i)};e.prototype.setState=function(t){var e="disabled",i=this.$element,s=i.data(),n=i.is("input")?"val":"html";t+="Text",s.resetText||i.data("resetText",i[n]()),i[n](s[t]||this.options[t]),setTimeout(function(){"loadingText"==t?i.addClass(e).attr(e,e):i.removeClass(e).removeAttr(e)},0)},e.prototype.toggle=function(){var t=this.$element.parent('[data-toggle="buttons-radio"]');t&&t.find(".active").removeClass("active"),this.$element.toggleClass("active")},t.fn.button=function(i){return this.each(function(){var s=t(this),n=s.data("button"),o="object"==typeof i&&i;n||s.data("button",n=new e(this,o)),"toggle"==i?n.toggle():i&&n.setState(i)})},t.fn.button.defaults={loadingText:"loading..."},t.fn.button.Constructor=e,t(function(){t("body").on("click.button.data-api","[data-toggle^=button]",function(e){var i=t(e.target);i.hasClass("btn")||(i=i.closest(".btn")),i.button("toggle")})})}(window.jQuery),!function(t){"use strict";var e=function(e,i){this.$element=t(e),this.options=i,this.options.slide&&this.slide(this.options.slide),"hover"==this.options.pause&&this.$element.on("mouseenter",t.proxy(this.pause,this)).on("mouseleave",t.proxy(this.cycle,this))};e.prototype={cycle:function(e){return e||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},to:function(e){var i=this.$element.find(".item.active"),s=i.parent().children(),n=s.index(i),o=this;if(!(e>s.length-1||0>e))return this.sliding?this.$element.one("slid",function(){o.to(e)}):n==e?this.pause().cycle():this.slide(e>n?"next":"prev",t(s[e]))},pause:function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition.end&&(this.$element.trigger(t.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){return this.sliding?void 0:this.slide("next")},prev:function(){return this.sliding?void 0:this.slide("prev")},slide:function(e,i){var s=this.$element.find(".item.active"),n=i||s[e](),o=this.interval,a="next"==e?"left":"right",r="next"==e?"first":"last",h=this,l=t.Event("slide",{relatedTarget:n[0]});if(this.sliding=!0,o&&this.pause(),n=n.length?n:this.$element.find(".item")[r](),!n.hasClass("active")){if(t.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(l),l.isDefaultPrevented())return;n.addClass(e),n[0].offsetWidth,s.addClass(a),n.addClass(a),this.$element.one(t.support.transition.end,function(){n.removeClass([e,a].join(" ")).addClass("active"),s.removeClass(["active",a].join(" ")),h.sliding=!1,setTimeout(function(){h.$element.trigger("slid")},0)})}else{if(this.$element.trigger(l),l.isDefaultPrevented())return;s.removeClass("active"),n.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return o&&this.cycle(),this}}},t.fn.carousel=function(i){return this.each(function(){var s=t(this),n=s.data("carousel"),o=t.extend({},t.fn.carousel.defaults,"object"==typeof i&&i),a="string"==typeof i?i:o.slide;n||s.data("carousel",n=new e(this,o)),"number"==typeof i?n.to(i):a?n[a]():o.interval&&n.cycle()})},t.fn.carousel.defaults={interval:5e3,pause:"hover"},t.fn.carousel.Constructor=e,t(function(){t("body").on("click.carousel.data-api","[data-slide]",function(e){var i=t(this),s,n=t(i.attr("data-target")||(s=i.attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")),o=!n.data("modal")&&t.extend({},n.data(),i.data());n.carousel(o),e.preventDefault()})})}(window.jQuery),!function(t){"use strict";var e=function(e,i){this.$element=t(e),this.options=t.extend({},t.fn.collapse.defaults,i),this.options.parent&&(this.$parent=t(this.options.parent)),this.options.toggle&&this.toggle()};e.prototype={constructor:e,dimension:function(){var t=this.$element.hasClass("width");return t?"width":"height"},show:function(){var e,i,s,n;if(!this.transitioning){if(e=this.dimension(),i=t.camelCase(["scroll",e].join("-")),s=this.$parent&&this.$parent.find("> .accordion-group > .in"),s&&s.length){if(n=s.data("collapse"),n&&n.transitioning)return;s.collapse("hide"),n||s.data("collapse",null)}this.$element[e](0),this.transition("addClass",t.Event("show"),"shown"),t.support.transition&&this.$element[e](this.$element[0][i])}},hide:function(){var e;this.transitioning||(e=this.dimension(),this.reset(this.$element[e]()),this.transition("removeClass",t.Event("hide"),"hidden"),this.$element[e](0))},reset:function(t){var e=this.dimension();return this.$element.removeClass("collapse")[e](t||"auto")[0].offsetWidth,this.$element[null!==t?"addClass":"removeClass"]("collapse"),this},transition:function(e,i,s){var n=this,o=function(){"show"==i.type&&n.reset(),n.transitioning=0,n.$element.trigger(s)};this.$element.trigger(i),i.isDefaultPrevented()||(this.transitioning=1,this.$element[e]("in"),t.support.transition&&this.$element.hasClass("collapse")?this.$element.one(t.support.transition.end,o):o())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},t.fn.collapse=function(i){return this.each(function(){var s=t(this),n=s.data("collapse"),o="object"==typeof i&&i;n||s.data("collapse",n=new e(this,o)),"string"==typeof i&&n[i]()})},t.fn.collapse.defaults={toggle:!0},t.fn.collapse.Constructor=e,t(function(){t("body").on("click.collapse.data-api","[data-toggle=collapse]",function(e){var i=t(this),s,n=i.attr("data-target")||e.preventDefault()||(s=i.attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,""),o=t(n).data("collapse")?"toggle":i.data();i[t(n).hasClass("in")?"addClass":"removeClass"]("collapsed"),t(n).collapse(o)})})}(window.jQuery),!function(t){"use strict";function e(){i(t(s)).removeClass("open")}function i(e){var i=e.attr("data-target"),s;return i||(i=e.attr("href"),i=i&&i.replace(/.*(?=#[^\s]*$)/,"")),s=t(i),s.length||(s=e.parent()),s}var s="[data-toggle=dropdown]",n=function(e){var i=t(e).on("click.dropdown.data-api",this.toggle);t("html").on("click.dropdown.data-api",function(){i.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(s){var n=t(this),o,a;if(!n.is(".disabled, :disabled"))return o=i(n),a=o.hasClass("open"),e(),a||(o.toggleClass("open"),n.focus()),!1},keydown:function(e){var s,n,o,a,r,h;if(/(38|40|27)/.test(e.keyCode)&&(s=t(this),e.preventDefault(),e.stopPropagation(),!s.is(".disabled, :disabled"))){if(a=i(s),r=a.hasClass("open"),!r||r&&27==e.keyCode)return s.click();n=t("[role=menu] li:not(.divider) a",a),n.length&&(h=n.index(n.filter(":focus")),38==e.keyCode&&h>0&&h--,40==e.keyCode&&h<n.length-1&&h++,~h||(h=0),n.eq(h).focus())}}},t.fn.dropdown=function(e){return this.each(function(){var i=t(this),s=i.data("dropdown");s||i.data("dropdown",s=new n(this)),"string"==typeof e&&s[e].call(i)})},t.fn.dropdown.Constructor=n,t(function(){t("html").on("click.dropdown.data-api touchstart.dropdown.data-api",e),t("body").on("click.dropdown touchstart.dropdown.data-api",".dropdown",function(t){t.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",s,n.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",s+", [role=menu]",n.prototype.keydown)})}(window.jQuery),!function(t){"use strict";var e=function(e,i){this.options=i,this.$element=t(e).delegate('[data-dismiss="modal"]',"click.dismiss.modal",t.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};e.prototype={constructor:e,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var e=this,i=t.Event("show");this.$element.trigger(i),this.isShown||i.isDefaultPrevented()||(t("body").addClass("modal-open"),this.isShown=!0,this.escape(),this.backdrop(function(){var i=t.support.transition&&e.$element.hasClass("fade");e.$element.parent().length||e.$element.appendTo(document.body),e.$element.show(),i&&e.$element[0].offsetWidth,e.$element.addClass("in").attr("aria-hidden",!1).focus(),e.enforceFocus(),i?e.$element.one(t.support.transition.end,function(){e.$element.trigger("shown")}):e.$element.trigger("shown")}))},hide:function(e){e&&e.preventDefault();var i=this;e=t.Event("hide"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,t("body").removeClass("modal-open"),this.escape(),t(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),t.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var e=this;t(document).on("focusin.modal",function(t){e.$element[0]!==t.target&&!e.$element.has(t.target).length&&e.$element.focus()})},escape:function(){var t=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(e){27==e.which&&t.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var e=this,i=setTimeout(function(){e.$element.off(t.support.transition.end),e.hideModal()},500);this.$element.one(t.support.transition.end,function(){clearTimeout(i),e.hideModal()})},hideModal:function(t){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(e){var i=this,s=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var n=t.support.transition&&s;this.$backdrop=t('<div class="modal-backdrop '+s+'" />').appendTo(document.body),"static"!=this.options.backdrop&&this.$backdrop.click(t.proxy(this.hide,this)),n&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),n?this.$backdrop.one(t.support.transition.end,e):e()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(t.support.transition.end,t.proxy(this.removeBackdrop,this)):this.removeBackdrop()):e&&e()}},t.fn.modal=function(i){return this.each(function(){var s=t(this),n=s.data("modal"),o=t.extend({},t.fn.modal.defaults,s.data(),"object"==typeof i&&i);n||s.data("modal",n=new e(this,o)),"string"==typeof i?n[i]():o.show&&n.show()})},t.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},t.fn.modal.Constructor=e,t(function(){t("body").on("click.modal.data-api",'[data-toggle="modal"]',function(e){var i=t(this),s=i.attr("href"),n=t(i.attr("data-target")||s&&s.replace(/.*(?=#[^\s]+$)/,"")),o=n.data("modal")?"toggle":t.extend({remote:!/#/.test(s)&&s},n.data(),i.data());e.preventDefault(),n.modal(o).one("hide",function(){i.focus()})})})}(window.jQuery),!function(t){"use strict";var e=function(t,e){this.init("tooltip",t,e)};e.prototype={constructor:e,init:function(e,i,s){var n,o;this.type=e,this.$element=t(i),this.options=this.getOptions(s),this.enabled=!0,"click"==this.options.trigger?this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this)):"manual"!=this.options.trigger&&(n="hover"==this.options.trigger?"mouseenter":"focus",o="hover"==this.options.trigger?"mouseleave":"blur",this.$element.on(n+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(o+"."+this.type,this.options.selector,t.proxy(this.leave,this))),this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(e){return e=t.extend({},t.fn[this.type].defaults,e,this.$element.data()),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},enter:function(e){var i=t(e.currentTarget)[this.type](this._options).data(this.type);return i.options.delay&&i.options.delay.show?(clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show),void 0):i.show()},leave:function(e){var i=t(e.currentTarget)[this.type](this._options).data(this.type);return this.timeout&&clearTimeout(this.timeout),i.options.delay&&i.options.delay.hide?(i.hoverState="out",void(this.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide))):i.hide()},show:function(){var t,e,i,s,n,o,a;if(this.hasContent()&&this.enabled){switch(t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),o="function"==typeof this.options.placement?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,e=/in/.test(o),t.remove().css({top:0,left:0,display:"block"}).appendTo(e?this.$element:document.body),i=this.getPosition(e),s=t[0].offsetWidth,n=t[0].offsetHeight,e?o.split(" ")[1]:o){case"bottom":a={top:i.top+i.height,left:i.left+i.width/2-s/2};break;case"top":a={top:i.top-n,left:i.left+i.width/2-s/2};break;case"left":a={top:i.top+i.height/2-n/2,left:i.left-s};break;case"right":a={top:i.top+i.height/2-n/2,left:i.left+i.width}}t.css(a).addClass(o).addClass("in")}},setContent:function(){var t=this.tip(),e=this.getTitle();t.find(".tooltip-inner")[this.options.html?"html":"text"](e),t.removeClass("fade in top bottom left right")},hide:function(){function e(){var e=setTimeout(function(){s.off(t.support.transition.end).remove()},500);s.one(t.support.transition.end,function(){clearTimeout(e),s.remove()})}var i=this,s=this.tip();return s.removeClass("in"),t.support.transition&&this.$tip.hasClass("fade")?e():s.remove(),this},fixTitle:function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(e){return t.extend({},e?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var t,e=this.$element,i=this.options;return t=e.attr("data-original-title")||("function"==typeof i.title?i.title.call(e[0]):i.title)},tip:function(){return this.$tip=this.$tip||t(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},t.fn.tooltip=function(i){return this.each(function(){var s=t(this),n=s.data("tooltip"),o="object"==typeof i&&i;n||s.data("tooltip",n=new e(this,o)),"string"==typeof i&&n[i]()})},t.fn.tooltip.Constructor=e,t.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(t){"use strict";var e=function(t,e){this.init("popover",t,e)};e.prototype=t.extend({},t.fn.tooltip.Constructor.prototype,{constructor:e,setContent:function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content > *")[this.options.html?"html":"text"](i),t.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var t,e=this.$element,i=this.options;return t=e.attr("data-content")||("function"==typeof i.content?i.content.call(e[0]):i.content)},tip:function(){return this.$tip||(this.$tip=t(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),t.fn.popover=function(i){return this.each(function(){var s=t(this),n=s.data("popover"),o="object"==typeof i&&i;n||s.data("popover",n=new e(this,o)),"string"==typeof i&&n[i]()})},t.fn.popover.Constructor=e,t.fn.popover.defaults=t.extend({},t.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(t){"use strict";function e(e,i){var s=t.proxy(this.process,this),n=t(t(e).is("body")?window:e),o;this.options=t.extend({},t.fn.scrollspy.defaults,i),this.$scrollElement=n.on("scroll.scroll-spy.data-api",s),this.selector=(this.options.target||(o=t(e).attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=t("body"),this.refresh(),this.process()}e.prototype={constructor:e,refresh:function(){var e=this,i;this.offsets=t([]),this.targets=t([]),i=this.$body.find(this.selector).map(function(){var e=t(this),i=e.data("target")||e.attr("href"),s=/^#\w/.test(i)&&t(i);return s&&s.length&&[[s.position().top,i]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){e.offsets.push(this[0]),e.targets.push(this[1])})},process:function(){var t=this.$scrollElement.scrollTop()+this.options.offset,e=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,i=e-this.$scrollElement.height(),s=this.offsets,n=this.targets,o=this.activeTarget,a;if(t>=i)return o!=(a=n.last()[0])&&this.activate(a);for(a=s.length;a--;)o!=n[a]&&t>=s[a]&&(!s[a+1]||t<=s[a+1])&&this.activate(n[a])},activate:function(e){var i,s;this.activeTarget=e,t(this.selector).parent(".active").removeClass("active"),s=this.selector+'[data-target="'+e+'"],'+this.selector+'[href="'+e+'"]',i=t(s).parent("li").addClass("active"),i.parent(".dropdown-menu").length&&(i=i.closest("li.dropdown").addClass("active")),i.trigger("activate")}},t.fn.scrollspy=function(i){return this.each(function(){var s=t(this),n=s.data("scrollspy"),o="object"==typeof i&&i;n||s.data("scrollspy",n=new e(this,o)),"string"==typeof i&&n[i]()})},t.fn.scrollspy.Constructor=e,t.fn.scrollspy.defaults={offset:10},t(window).on("load",function(){t('[data-spy="scroll"]').each(function(){var e=t(this);e.scrollspy(e.data())})})}(window.jQuery),!function(t){"use strict";var e=function(e){this.element=t(e)};e.prototype={constructor:e,show:function(){var e=this.element,i=e.closest("ul:not(.dropdown-menu)"),s=e.attr("data-target"),n,o,a;s||(s=e.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,"")),e.parent("li").hasClass("active")||(n=i.find(".active a").last()[0],a=t.Event("show",{relatedTarget:n}),e.trigger(a),a.isDefaultPrevented()||(o=t(s),this.activate(e.parent("li"),i),this.activate(o,o.parent(),function(){e.trigger({type:"shown",relatedTarget:n})})))},activate:function(e,i,s){function n(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),e.addClass("active"),a?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu")&&e.closest("li.dropdown").addClass("active"),s&&s()}var o=i.find("> .active"),a=s&&t.support.transition&&o.hasClass("fade");a?o.one(t.support.transition.end,n):n(),o.removeClass("in")}},t.fn.tab=function(i){return this.each(function(){var s=t(this),n=s.data("tab");n||s.data("tab",n=new e(this)),"string"==typeof i&&n[i]()})},t.fn.tab.Constructor=e,t(function(){t("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(e){e.preventDefault(),t(this).tab("show")})})}(window.jQuery),!function(t){"use strict";var e=function(e,i){this.$element=t(e),this.options=t.extend({},t.fn.typeahead.defaults,i),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=t(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};e.prototype={constructor:e,select:function(){var t=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(t)).change(),this.hide()},updater:function(t){return t},show:function(){var e=t.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:e.top+e.height,left:e.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(e){var i;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(i=t.isFunction(this.source)?this.source(this.query,t.proxy(this.process,this)):this.source,i?this.process(i):this)},process:function(e){var i=this;return e=t.grep(e,function(t){return i.matcher(t)}),e=this.sorter(e),e.length?this.render(e.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(t){return~t.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(t){for(var e=[],i=[],s=[],n;n=t.shift();)n.toLowerCase().indexOf(this.query.toLowerCase())?~n.indexOf(this.query)?i.push(n):s.push(n):e.push(n);return e.concat(i,s)},highlighter:function(t){var e=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return t.replace(new RegExp("("+e+")","ig"),function(t,e){return"<strong>"+e+"</strong>"})},render:function(e){var i=this;return e=t(e).map(function(e,s){return e=t(i.options.item).attr("data-value",s),e.find("a").html(i.highlighter(s)),e[0]}),e.first().addClass("active"),this.$menu.html(e),this},next:function(e){var i=this.$menu.find(".active").removeClass("active"),s=i.next();s.length||(s=t(this.$menu.find("li")[0])),s.addClass("active")},prev:function(t){var e=this.$menu.find(".active").removeClass("active"),i=e.prev();i.length||(i=this.$menu.find("li").last()),i.addClass("active")},listen:function(){this.$element.on("blur",t.proxy(this.blur,this)).on("keypress",t.proxy(this.keypress,this)).on("keyup",t.proxy(this.keyup,this)),(t.browser.webkit||t.browser.msie)&&this.$element.on("keydown",t.proxy(this.keydown,this)),this.$menu.on("click",t.proxy(this.click,this)).on("mouseenter","li",t.proxy(this.mouseenter,this))},move:function(t){if(this.shown){switch(t.keyCode){case 9:case 13:case 27:t.preventDefault();break;case 38:t.preventDefault(),this.prev();break;case 40:t.preventDefault(),this.next()}t.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=!~t.inArray(e.keyCode,[40,38,9,13,27]),this.move(e)},keypress:function(t){this.suppressKeyPressRepeat||this.move(t)},keyup:function(t){switch(t.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}t.stopPropagation(),t.preventDefault()},blur:function(t){var e=this;setTimeout(function(){e.hide()},150)},click:function(t){t.stopPropagation(),t.preventDefault(),this.select()},mouseenter:function(e){this.$menu.find(".active").removeClass("active"),t(e.currentTarget).addClass("active")}},t.fn.typeahead=function(i){return this.each(function(){var s=t(this),n=s.data("typeahead"),o="object"==typeof i&&i;n||s.data("typeahead",n=new e(this,o)),"string"==typeof i&&n[i]()})},t.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},t.fn.typeahead.Constructor=e,t(function(){t("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(e){var i=t(this);i.data("typeahead")||(e.preventDefault(),i.typeahead(i.data()))})})}(window.jQuery);
\ No newline at end of file
diff --git a/static/open-iot-challenge/js/custom.js b/static/open-iot-challenge/js/custom.js
new file mode 100644
index 0000000000000000000000000000000000000000..67d6192f520adcc806e1c35607e37ae4e00047d8
--- /dev/null
+++ b/static/open-iot-challenge/js/custom.js
@@ -0,0 +1,6 @@
+$(document).ready(function(){
+
+	$('.tech-activate').click(function(){
+		$('.tech-expanded').slideToggle(300);
+	});
+});
\ No newline at end of file
diff --git a/static/open-iot-challenge/js/index.js b/static/open-iot-challenge/js/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..8e0254778d167bc87075f4a72f4cdf8188781f97
--- /dev/null
+++ b/static/open-iot-challenge/js/index.js
@@ -0,0 +1,25 @@
+/**
+ * Onload handler
+ */
+$(document).ready(function() {
+    // Enable dropdowns
+    $('.dropdown-toggle').dropdown();
+
+    $('#iot-definition').popover({
+        placement: 'bottom',
+        trigger: 'hover'
+    });
+
+});
+
+$(window).bind("load", function() {
+    $('.home-box').addClass('loaded');
+});
+
+
+($("a[data-toggle=modal]")).click(function() {
+    var target, url;
+    target = ($(this)).attr('data-target');
+    url = ($(this)).attr('href');
+    return ($(target)).load(url);
+});
\ No newline at end of file
diff --git a/static/open-iot-challenge/js/jquery.min.js b/static/open-iot-challenge/js/jquery.min.js
new file mode 100755
index 0000000000000000000000000000000000000000..00c4e23a27b15f6158ea46a016beb0ae95c6596d
--- /dev/null
+++ b/static/open-iot-challenge/js/jquery.min.js
@@ -0,0 +1,9252 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			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 = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context ? context.ownerDocument || context : document );
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// 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 ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we 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: $(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 current version of jQuery being used
+	jquery: "1.7.1",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// 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, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// 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 ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.add( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	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: 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({
+	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 ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// 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.fireWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).off( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery.Callbacks( "once memory" );
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// 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 || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// 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.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array, i ) {
+		var len;
+
+		if ( array ) {
+			if ( indexOf ) {
+				return indexOf.call( array, elem, i );
+			}
+
+			len = array.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in array && array[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; 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 ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; 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, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// 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 ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.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 ) {
+		if ( typeof context === "string" ) {
+			var 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
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( 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 || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+	var object = flagsCache[ flags ] = {},
+		i, length;
+	flags = flags.split( /\s+/ );
+	for ( i = 0, length = flags.length; i < length; i++ ) {
+		object[ flags[i] ] = true;
+	}
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	flags:	an optional list of space-separated flags that will change how
+ *			the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *	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( flags ) {
+
+	// Convert flags from String-formatted to Object-formatted
+	// (we check in cache first)
+	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+	var // Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = [],
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// 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,
+		// Add one or several callbacks to the list
+		add = function( args ) {
+			var i,
+				length,
+				elem,
+				type,
+				actual;
+			for ( i = 0, length = args.length; i < length; i++ ) {
+				elem = args[ i ];
+				type = jQuery.type( elem );
+				if ( type === "array" ) {
+					// Inspect recursively
+					add( elem );
+				} else if ( type === "function" ) {
+					// Add if not in unique mode and callback is not in
+					if ( !flags.unique || !self.has( elem ) ) {
+						list.push( elem );
+					}
+				}
+			}
+		},
+		// Fire callbacks
+		fire = function( context, args ) {
+			args = args || [];
+			memory = !flags.memory || [ context, args ];
+			firing = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+					memory = true; // Mark as halted
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( !flags.once ) {
+					if ( stack && stack.length ) {
+						memory = stack.shift();
+						self.fireWith( memory[ 0 ], memory[ 1 ] );
+					}
+				} else if ( memory === true ) {
+					self.disable();
+				} else {
+					list = [];
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					var length = list.length;
+					add( 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, unless previous
+					// firing was halted (stopOnFalse)
+					} else if ( memory && memory !== true ) {
+						firingStart = length;
+						fire( memory[ 0 ], memory[ 1 ] );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					var args = arguments,
+						argIndex = 0,
+						argLength = args.length;
+					for ( ; argIndex < argLength ; argIndex++ ) {
+						for ( var i = 0; i < list.length; i++ ) {
+							if ( args[ argIndex ] === list[ i ] ) {
+								// Handle firingIndex and firingLength
+								if ( firing ) {
+									if ( i <= firingLength ) {
+										firingLength--;
+										if ( i <= firingIndex ) {
+											firingIndex--;
+										}
+									}
+								}
+								// Remove the element
+								list.splice( i--, 1 );
+								// If we have some unicity property then
+								// we only need to do this once
+								if ( flags.unique ) {
+									break;
+								}
+							}
+						}
+					}
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				if ( list ) {
+					var i = 0,
+						length = list.length;
+					for ( ; i < length; i++ ) {
+						if ( fn === list[ i ] ) {
+							return true;
+						}
+					}
+				}
+				return false;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				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 || memory === true ) {
+					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 ( stack ) {
+					if ( firing ) {
+						if ( !flags.once ) {
+							stack.push( [ context, args ] );
+						}
+					} else if ( !( flags.once && memory ) ) {
+						fire( context, 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 !!memory;
+			}
+		};
+
+	return self;
+};
+
+
+
+
+var // Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var doneList = jQuery.Callbacks( "once memory" ),
+			failList = jQuery.Callbacks( "once memory" ),
+			progressList = jQuery.Callbacks( "memory" ),
+			state = "pending",
+			lists = {
+				resolve: doneList,
+				reject: failList,
+				notify: progressList
+			},
+			promise = {
+				done: doneList.add,
+				fail: failList.add,
+				progress: progressList.add,
+
+				state: function() {
+					return state;
+				},
+
+				// Deprecated
+				isResolved: doneList.fired,
+				isRejected: failList.fired,
+
+				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+					return this;
+				},
+				always: function() {
+					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+					return this;
+				},
+				pipe: function( fnDone, fnFail, fnProgress ) {
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( {
+							done: [ fnDone, "resolve" ],
+							fail: [ fnFail, "reject" ],
+							progress: [ fnProgress, "notify" ]
+						}, function( handler, data ) {
+							var fn = data[ 0 ],
+								action = data[ 1 ],
+								returned;
+							if ( jQuery.isFunction( fn ) ) {
+								deferred[ handler ](function() {
+									returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								});
+							} else {
+								deferred[ handler ]( newDefer[ action ] );
+							}
+						});
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					if ( obj == null ) {
+						obj = promise;
+					} else {
+						for ( var key in promise ) {
+							obj[ key ] = promise[ key ];
+						}
+					}
+					return obj;
+				}
+			},
+			deferred = promise.promise({}),
+			key;
+
+		for ( key in lists ) {
+			deferred[ key ] = lists[ key ].fire;
+			deferred[ key + "With" ] = lists[ key ].fireWith;
+		}
+
+		// Handle state
+		deferred.done( function() {
+			state = "resolved";
+		}, failList.disable, progressList.lock ).fail( function() {
+			state = "rejected";
+		}, doneList.disable, progressList.lock );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = sliceDeferred.call( arguments, 0 ),
+			i = 0,
+			length = args.length,
+			pValues = new Array( length ),
+			count = length,
+			pCount = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					deferred.resolveWith( deferred, args );
+				}
+			};
+		}
+		function progressFunc( i ) {
+			return function( value ) {
+				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				deferred.notifyWith( promise, pValues );
+			};
+		}
+		if ( length > 1 ) {
+			for ( ; i < length; i++ ) {
+				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return promise;
+	}
+});
+
+
+
+
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		marginDiv,
+		fragment,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported,
+		div = document.createElement( "div" ),
+		documentElement = document.documentElement;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true
+	};
+
+	// Make sure checked status is properly cloned
+	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;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	div.innerHTML = "";
+
+	// Check if div with explicit width and no margin-right incorrectly
+	// gets computed margin-right based on width of container. For more
+	// info see bug #3333
+	// Fails in WebKit before Feb 2011 nightlies
+	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+	if ( window.getComputedStyle ) {
+		marginDiv = document.createElement( "div" );
+		marginDiv.style.width = "0";
+		marginDiv.style.marginRight = "0";
+		div.style.width = "2px";
+		div.appendChild( marginDiv );
+		support.reliableMarginRight =
+			( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+	}
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	fragment.removeChild( div );
+
+	// Null elements to avoid leaks in IE
+	fragment = select = opt = marginDiv = div = input = null;
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, outer, inner, table, td, offsetSupport,
+			conMarginTop, ptlm, vb, style, html,
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		conMarginTop = 1;
+		ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
+		vb = "visibility:hidden;border:0;";
+		style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
+		html = "<div " + style + "><div></div></div>" +
+			"<table " + style + " cellpadding='0' cellspacing='0'>" +
+			"<tr><td></td></tr></table>";
+
+		container = document.createElement("div");
+		container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName( "td" );
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Figure out if the W3C box model works as expected
+		div.innerHTML = "";
+		div.style.width = div.style.paddingLeft = "1px";
+		jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "";
+			div.innerHTML = "<div style='width:4px;'></div>";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+		}
+
+		div.style.cssText = ptlm + vb;
+		div.innerHTML = html;
+
+		outer = div.firstChild;
+		inner = outer.firstChild;
+		td = outer.nextSibling.firstChild.firstChild;
+
+		offsetSupport = {
+			doesNotAddBorder: ( inner.offsetTop !== 5 ),
+			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+		};
+
+		inner.style.position = "fixed";
+		inner.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+		inner.style.position = inner.style.top = "";
+
+		outer.style.overflow = "hidden";
+		outer.style.position = "relative";
+
+		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+		body.removeChild( container );
+		div  = container = null;
+
+		jQuery.extend( support, offsetSupport );
+	});
+
+	return support;
+})();
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var privateCache, thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+			isEvents = name === "events";
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = ++jQuery.uuid;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		privateCache = thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Users should not attempt to inspect the internal events object using jQuery.data,
+		// it is undocumented and subject to change. But does anyone listen? No.
+		if ( isEvents && !thisCache[ name ] ) {
+			return privateCache.events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ internalKey ] : internalKey;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split( " " );
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the cache and need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ internalKey ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( internalKey );
+			} else {
+				elem[ internalKey ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, attr, name,
+			data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
+					attr = this[0].attributes;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+					jQuery._data( this[0], "parsedAttrs", true );
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var self = jQuery( this ),
+					args = [ parts[0], value ];
+
+				self.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var 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 :
+				jQuery.isNumeric( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery._data( elem, deferDataKey );
+	if ( defer &&
+		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery._data( elem, queueDataKey ) &&
+				!jQuery._data( elem, markDataKey ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.fire();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = ( type || "fx" ) + "mark";
+			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+			if ( count ) {
+				jQuery._data( elem, key, count );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		var q;
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			q = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			hooks = {};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			jQuery._data( elem, type + ".run", hooks );
+			fn.call( elem, function() {
+				jQuery.dequeue( elem, type );
+			}, hooks );
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue " + type + ".run", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function() {
+			var queue = jQuery.queue( this, type, data );
+
+			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, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+				count++;
+				tmp.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise();
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.prop );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = ( value || "" ).split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		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 ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( 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 ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+				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 self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.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.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+			// 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, i, max, option,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (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 );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, l,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+			attrNames = value.toLowerCase().split( rspace );
+			l = attrNames.length;
+
+			for ( ; i < l; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					jQuery.attr( elem, name, "" );
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( rboolean.test( name ) && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else 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 it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	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 ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.nodeValue = value + "" );
+		}
+	};
+
+	// Apply the nodeHook to tabindex
+	jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = "" + value );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+
+
+
+
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+	rhoverHack = /\bhover(\.\S+)?\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+	quickParse = function( selector ) {
+		var quick = rquickIs.exec( selector );
+		if ( quick ) {
+			//   0  1    2   3
+			// [ _, tag, id, class ]
+			quick[1] = ( quick[1] || "" ).toLowerCase();
+			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+		}
+		return quick;
+	},
+	quickIs = function( elem, m ) {
+		var attrs = elem.attributes || {};
+		return (
+			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+			(!m[2] || (attrs.id || {}).value === m[2]) &&
+			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+		);
+	},
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, quick, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// 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
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = 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 !== "undefined" && (!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
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// 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: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				quick: quickParse( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			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;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			t, tns, type, origType, namespaces, origCount,
+			j, events, special, handle, eventType, handleObj;
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// 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;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.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 ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, [ "events", "handle" ], true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+		// 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 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// 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 ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( 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)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			old = null;
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old && old === elem.ownerDocument ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && 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( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						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 ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = [].slice.call( arguments, 0 ),
+			run_all = !event.exclusive && !event.namespace,
+			handlerQueue = [],
+			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
+
+			// Pregenerate a single jQuery object for reuse with .is()
+			jqcur = jQuery(this);
+			jqcur.context = this.ownerDocument || this;
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+				selMatch = {};
+				matches = [];
+				jqcur[0] = cur;
+				for ( i = 0; i < delegateCount; i++ ) {
+					handleObj = handlers[ i ];
+					sel = handleObj.selector;
+
+					if ( selMatch[ sel ] === undefined ) {
+						selMatch[ sel ] = (
+							handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+						);
+					}
+					if ( selMatch[ sel ] ) {
+						matches.push( handleObj );
+					}
+				}
+				if ( matches.length ) {
+					handlerQueue.push({ elem: cur, matches: matches });
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement 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 fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// 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 relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// 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,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+		if ( event.metaKey === undefined ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady
+		},
+
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	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();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+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.returnValue === false ||
+			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;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return 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 = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector,
+				ret;
+
+			// 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;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !form._submit_attached ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						// If form was submitted by the user, bubble the event up the tree
+						if ( this.parentNode && !event.isTrigger ) {
+							jQuery.event.simulate( "submit", this.parentNode, event, true );
+						}
+					});
+					form._submit_attached = true;
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+							jQuery.event.simulate( "change", this, event, true );
+						}
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					elem._change_attached = true;
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+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 = 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.call( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			var handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( var 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 );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	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 );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+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 ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2012, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	expando = "sizcache" + (Math.random() + '').replace('.', ''),
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rReturn = /\r\n/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+
+			parts.push( m[1] );
+
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context, seed );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+
+				set = posProcess( selector, set, seed );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set, i, len, match, type, left;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+		type = Expr.order[i];
+
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		type, found, item, filter, left,
+		i, pass,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				filter = Expr.filter[ type ];
+				left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							pass = not ^ found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+		nodeType = elem.nodeType,
+		ret = "";
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 ) {
+			// Use textContent || innerText for elements
+			if ( typeof elem.textContent === 'string' ) {
+				return elem.textContent;
+			} else if ( typeof elem.innerText === 'string' ) {
+				// Replace IE's carriage returns
+				return elem.innerText.replace( rReturn, '' );
+			} else {
+				// Traverse it's children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( i = 0; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			if ( node.nodeType !== 8 ) {
+				ret += getText( node );
+			}
+		}
+	}
+	return ret;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+
+		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;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// 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" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var first, last,
+				doneName, parent, cache,
+				count, diff,
+				type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					if ( type === "first" ) {
+						return true;
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					return true;
+
+				case "nth":
+					first = match[2];
+					last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					doneName = match[0];
+					parent = elem.parentNode;
+
+					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+						count = 0;
+
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						}
+
+						parent[ expando ] = doneName;
+					}
+
+					diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+		},
+
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Sizzle.attr ?
+					Sizzle.attr( elem, name ) :
+					Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				!type && Sizzle.attr ?
+				result != null :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+
+		var cur = a.nextSibling;
+		}
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// 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 and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// 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
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try {
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem[ expando ] = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem[ expando ] = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+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 : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet, seed );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// 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 self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				POS.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		// Array (deprecated as of jQuery 1.7)
+		if ( jQuery.isArray( selectors ) ) {
+			var level = 1;
+
+			while ( cur && cur.ownerDocument && cur !== context ) {
+				for ( i = 0; i < selectors.length; i++ ) {
+
+					if ( jQuery( cur ).is( selectors[ i ] ) ) {
+						ret.push({ selector: selectors[ i ], elem: cur, level: level });
+					}
+				}
+
+				cur = cur.parentNode;
+				level++;
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// 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.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	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( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+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 jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "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 jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")", "i"),
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		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
+			var 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.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				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();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery.clean(arguments) );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		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 ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || ( l > 1 && i < lastIndex ) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc,
+	first = args[ 0 ];
+
+	// nodes may contain either an explicit document object,
+	// a jQuery collection or context object.
+	// If nodes[0] contains a valid object to assign to doc
+	if ( nodes && nodes[0] ) {
+		doc = nodes[0].ownerDocument || nodes[0];
+	}
+
+	// Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ first ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	var nodeName = ( elem.nodeName || "" ).toLowerCase();
+	if ( nodeName === "input" ) {
+		fixDefaultChecked( elem );
+	// Skip scripts, get other children
+	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+	var div = document.createElement( "div" );
+	safeFragment.appendChild( div );
+
+	div.innerHTML = elem.outerHTML;
+	return div.firstChild;
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			// IE<=8 does not properly clone detached, unknown element nodes
+			clone = jQuery.support.html5Clone || !rnoshimcache.test( "<" + elem.nodeName ) ?
+				elem.cloneNode( true ) :
+				shimCloneNode( elem );
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType;
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [], j;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div");
+
+					// Append wrapper element to unknown element safe doc fragment
+					if ( context === document ) {
+						// Use the fragment we've already created for this document
+						safeFragment.appendChild( div );
+					} else {
+						// Use a fragment created with the owner document
+						createSafeFragment( context ).appendChild( div );
+					}
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id,
+			cache = jQuery.cache,
+			special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						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 );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+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", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": 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": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// 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, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || 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";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} 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 ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWH( elem, name, extra );
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				return val;
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat( value );
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( (defaultView = elem.ownerDocument.defaultView) &&
+				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left, rsLeft, uncomputed,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret === null && style && (uncomputed = style[ name ]) ) {
+			ret = uncomputed;
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ( ret || 0 );
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		which = name === "width" ? cssWidth : cssHeight,
+		i = 0,
+		len = which.length;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			for ( ; i < len; i++ ) {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+				}
+			}
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ] || 0;
+	}
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		for ( ; i < len; i++ ) {
+			val += parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+			}
+		}
+	}
+
+	return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	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 = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #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 = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// 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 );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// 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 ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+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({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// 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 ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.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: {
+			context: true,
+			url: true
+		}
+	},
+
+	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 // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// 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 === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// 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;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					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( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ 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" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		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 prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// 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 If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// 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
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// 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;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = 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 ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	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 {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// 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
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for ( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for ( key in s.converters ) {
+				if ( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if ( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for ( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+		( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.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 ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback );
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = 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 ( display === "" && jQuery.css(elem, "display") === "none" ) {
+						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			var elem, display,
+				i = 0,
+				j = this.length;
+
+			for ( ; i < j; i++ ) {
+				elem = this[i];
+				if ( elem.style ) {
+					display = jQuery.css( elem, "display" );
+
+					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+						jQuery._data( elem, "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed( speed, easing, callback );
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		function doAnimation() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p, e,
+				parts, start, end, unit,
+				method;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			for ( p in prop ) {
+
+				// property name normalization
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				val = prop[ name ];
+
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+
+						// inline-level elements accept inline-block;
+						// block-level elements need to be inline with layout
+						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+							this.style.display = "inline-block";
+
+						} else {
+							this.style.zoom = 1;
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test( val ) ) {
+
+					// Tracks whether to show or hide based on private
+					// data attached to the element
+					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+					if ( method ) {
+						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+						e[ method ]();
+					} else {
+						e[ val ]();
+					}
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ( (end || 1) / e.cur() ) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		}
+
+		return optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+
+	stop: function( type, clearQueue, gotoEnd ) {
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var index,
+				hadTimers = false,
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+
+			function stopQueue( elem, data, index ) {
+				var hooks = data[ index ];
+				jQuery.removeData( elem, index, true );
+				hooks.stop( gotoEnd );
+			}
+
+			if ( type == null ) {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+						stopQueue( this, data, index );
+					}
+				}
+			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+				stopQueue( this, data, index );
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					if ( gotoEnd ) {
+
+						// force the next step to be the last
+						timers[ index ]( true );
+					} else {
+						timers[ index ].saveState();
+					}
+					hadTimers = true;
+					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 ( !( gotoEnd && hadTimers ) ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx( "show", 1 ),
+	slideUp: genFx( "hide", 1 ),
+	slideToggle: genFx( "toggle", 1 ),
+	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.extend({
+	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( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue ) {
+				jQuery.dequeue( this, opt.queue );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.end = to;
+		this.now = this.start = from;
+		this.pos = this.state = 0;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+		function t( gotoEnd ) {
+			return self.step( gotoEnd );
+		}
+
+		t.queue = this.options.queue;
+		t.elem = this.elem;
+		t.saveState = function() {
+			if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+				jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+			}
+		};
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any flash of content
+		if ( dataShow !== undefined ) {
+			// This show is picking up where a previous hide or show left off
+			this.custom( this.cur(), dataShow );
+		} else {
+			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+		}
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom( this.cur(), 0 );
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var p, n, complete,
+			t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( p in options.animatedProperties ) {
+				if ( options.animatedProperties[ p ] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+						elem.style[ "overflow" + value ] = options.overflow[ index ];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery( elem ).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[ p ] );
+						jQuery.removeData( elem, "fxshow" + p, true );
+						// Toggle data is no longer needed
+						jQuery.removeData( elem, "toggle" + p, true );
+					}
+				}
+
+				// Execute the complete function
+				// in the event that the complete function throws an exception
+				// we must ensure it won't be called twice. #5684
+
+				complete = options.complete;
+				if ( complete ) {
+
+					options.complete = false;
+					complete.call( elem );
+				}
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ( (this.end - this.start) * this.pos );
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timer,
+			timers = jQuery.timers,
+			i = 0;
+
+		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();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+// Adds width/height step functions
+// Do not set anything below 0
+jQuery.each([ "width", "height" ], function( i, prop ) {
+	jQuery.fx.step[ prop ] = function( fx ) {
+		jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+	};
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// 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 null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function( val ) {
+		var elem, win;
+
+		if ( val === undefined ) {
+			elem = this[ 0 ];
+
+			if ( !elem ) {
+				return null;
+			}
+
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+
+		// Set the scroll offset
+		return this.each(function() {
+			win = getWindow( this );
+
+			if ( win ) {
+				win.scrollTo(
+					!i ? val : jQuery( win ).scrollLeft(),
+					 i ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				this[ method ] = val;
+			}
+		});
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ],
+				body = elem.document.body;
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				body && body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNumeric( ret ) ? ret : orig;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use 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.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
diff --git a/static/open-iot-challenge/js/min/jquery.min-min.js b/static/open-iot-challenge/js/min/jquery.min-min.js
new file mode 100644
index 0000000000000000000000000000000000000000..7b226c2bf029fb0ab8563f850f2fa19bacb4a221
--- /dev/null
+++ b/static/open-iot-challenge/js/min/jquery.min-min.js
@@ -0,0 +1,3 @@
+!function(e,t){function n(e){var t=B[e]={},n,r;for(e=e.split(/\s+/),n=0,r=e.length;r>n;n++)t[e[n]]=!0;return t}function r(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(W,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:H.isNumeric(r)?parseFloat(r):q.test(r)?H.parseJSON(r):r}catch(o){}H.data(e,n,r)}else r=t}return r}function i(e){for(var t in e)if(("data"!==t||!H.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function o(e,t,n){var r=t+"defer",i=t+"queue",o=t+"mark",a=H._data(e,r);!a||"queue"!==n&&H._data(e,i)||"mark"!==n&&H._data(e,o)||setTimeout(function(){H._data(e,i)||H._data(e,o)||(H.removeData(e,r,!0),a.fire())},0)}function a(){return!1}function s(){return!0}function l(e){return!e||!e.parentNode||11===e.parentNode.nodeType}function u(e,t,n){if(t=t||0,H.isFunction(t))return H.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return H.grep(e,function(e,r){return e===t===n});if("string"==typeof t){var r=H.grep(e,function(e){return 1===e.nodeType});if(dt.test(t))return H.filter(t,r,!n);t=H.filter(t,r)}return H.grep(e,function(e,r){return H.inArray(e,t)>=0===n})}function c(e){var t=gt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function f(e,t){return H.nodeName(e,"table")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function d(e,t){if(1===t.nodeType&&H.hasData(e)){var n,r,i,o=H._data(e),a=H._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)H.event.add(t,n+(s[n][r].namespace?".":"")+s[n][r].namespace,s[n][r],s[n][r].data)}a.data&&(a.data=H.extend({},a.data))}}function p(e,t){var n;1===t.nodeType&&(t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),"object"===n?t.outerHTML=e.outerHTML:"input"!==n||"checkbox"!==e.type&&"radio"!==e.type?"option"===n?t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue):(e.checked&&(t.defaultChecked=t.checked=e.checked),t.value!==e.value&&(t.value=e.value)),t.removeAttribute(H.expando))}function h(e){return"undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName("*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll("*"):[]}function m(e){("checkbox"===e.type||"radio"===e.type)&&(e.defaultChecked=e.checked)}function g(e){var t=(e.nodeName||"").toLowerCase();"input"===t?m(e):"script"!==t&&"undefined"!=typeof e.getElementsByTagName&&H.grep(e.getElementsByTagName("input"),m)}function y(e){var t=M.createElement("div");return jt.appendChild(t),t.innerHTML=e.outerHTML,t.firstChild}function v(e,t){t.src?H.ajax({url:t.src,async:!1,dataType:"script"}):H.globalEval((t.text||t.textContent||t.innerHTML||"").replace(At,"/*$0*/")),t.parentNode&&t.parentNode.removeChild(t)}function b(e,t,n){var r="width"===t?e.offsetWidth:e.offsetHeight,i="width"===t?Pt:qt,o=0,a=i.length;if(r>0){if("border"!==n)for(;a>o;o++)n||(r-=parseFloat(H.css(e,"padding"+i[o]))||0),"margin"===n?r+=parseFloat(H.css(e,n+i[o]))||0:r-=parseFloat(H.css(e,"border"+i[o]+"Width"))||0;return r+"px"}if(r=Wt(e,t,t),(0>r||null==r)&&(r=e.style[t]||0),r=parseFloat(r)||0,n)for(;a>o;o++)r+=parseFloat(H.css(e,"padding"+i[o]))||0,"padding"!==n&&(r+=parseFloat(H.css(e,"border"+i[o]+"Width"))||0),"margin"===n&&(r+=parseFloat(H.css(e,n+i[o]))||0);return r+"px"}function x(e){return function(t,n){if("string"!=typeof t&&(n=t,t="*"),H.isFunction(n))for(var r=t.toLowerCase().split(tn),i=0,o=r.length,a,s,l;o>i;i++)a=r[i],l=/^\+/.test(a),l&&(a=a.substr(1)||"*"),s=e[a]=e[a]||[],s[l?"unshift":"push"](n)}}function T(e,n,r,i,o,a){o=o||n.dataTypes[0],a=a||{},a[o]=!0;for(var s=e[o],l=0,u=s?s.length:0,c=e===an,f;u>l&&(c||!f);l++)f=s[l](n,r,i),"string"==typeof f&&(!c||a[f]?f=t:(n.dataTypes.unshift(f),f=T(e,n,r,i,f,a)));return!c&&f||a["*"]||(f=T(e,n,r,i,"*",a)),f}function w(e,n){var r,i,o=H.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((o[r]?e:i||(i={}))[r]=n[r]);i&&H.extend(!0,e,i)}function N(e,t,n,r){if(H.isArray(t))H.each(t,function(t,i){n||Xt.test(e)?r(e,i):N(e+"["+("object"==typeof i||H.isArray(i)?t:"")+"]",i,n,r)});else if(n||null==t||"object"!=typeof t)r(e,t);else for(var i in t)N(e+"["+i+"]",t[i],n,r)}function C(e,n,r){var i=e.contents,o=e.dataTypes,a=e.responseFields,s,l,u,c;for(l in a)l in r&&(n[a[l]]=r[l]);for(;"*"===o[0];)o.shift(),s===t&&(s=e.mimeType||n.getResponseHeader("content-type"));if(s)for(l in i)if(i[l]&&i[l].test(s)){o.unshift(l);break}if(o[0]in r)u=o[0];else{for(l in r){if(!o[0]||e.converters[l+" "+o[0]]){u=l;break}c||(c=l)}u=u||c}return u?(u!==o[0]&&o.unshift(u),r[u]):void 0}function E(e,n){e.dataFilter&&(n=e.dataFilter(n,e.dataType));var r=e.dataTypes,i={},o,a,s=r.length,l,u=r[0],c,f,d,p,h;for(o=1;s>o;o++){if(1===o)for(a in e.converters)"string"==typeof a&&(i[a.toLowerCase()]=e.converters[a]);if(c=u,u=r[o],"*"===u)u=c;else if("*"!==c&&c!==u){if(f=c+" "+u,d=i[f]||i["* "+u],!d){h=t;for(p in i)if(l=p.split(" "),(l[0]===c||"*"===l[0])&&(h=i[l[1]+" "+u])){p=i[p],p===!0?d=h:h===!0&&(d=p);break}}d||h||H.error("No conversion from "+f.replace(" "," to ")),d!==!0&&(n=d?d(n):h(p(n)))}}return n}function k(){try{return new e.XMLHttpRequest}catch(t){}}function S(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function A(){return setTimeout(L,0),Cn=H.now()}function L(){Cn=t}function j(e,t){var n={};return H.each(Nn.concat.apply([],Nn.slice(0,t)),function(){n[this]=e}),n}function F(e){if(!yn[e]){var t=M.body,n=H("<"+e+">").appendTo(t),r=n.css("display");n.remove(),("none"===r||""===r)&&(vn||(vn=M.createElement("iframe"),vn.frameBorder=vn.width=vn.height=0),t.appendChild(vn),bn&&vn.createElement||(bn=(vn.contentWindow||vn.contentDocument).document,bn.write(("CSS1Compat"===M.compatMode?"<!doctype html>":"")+"<html><body>"),bn.close()),n=bn.createElement(e),bn.body.appendChild(n),r=H.css(n,"display"),t.removeChild(vn)),yn[e]=r}return yn[e]}function D(e){return H.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var M=e.document,O=e.navigator,_=e.location,H=function(){function n(){if(!r.isReady){try{M.documentElement.doScroll("left")}catch(e){return void setTimeout(n,1)}r.ready()}}var r=function(e,t){return new r.fn.init(e,t,a)},i=e.jQuery,o=e.$,a,s=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,l=/\S/,u=/^\s+/,c=/\s+$/,f=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,d=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,h=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,m=/(?:^|:|,)(?:\s*\[)+/g,g=/(webkit)[ \/]([\w.]+)/,y=/(opera)(?:.*version)?[ \/]([\w.]+)/,v=/(msie) ([\w.]+)/,b=/(mozilla)(?:.*? rv:([\w.]+))?/,x=/-([a-z]|[0-9])/gi,T=/^-ms-/,w=function(e,t){return(t+"").toUpperCase()},N=O.userAgent,C,E,k,S=Object.prototype.toString,A=Object.prototype.hasOwnProperty,L=Array.prototype.push,j=Array.prototype.slice,F=String.prototype.trim,D=Array.prototype.indexOf,_={};return r.fn=r.prototype={constructor:r,init:function(e,n,i){var o,a,l,u;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if("body"===e&&!n&&M.body)return this.context=M,this[0]=M.body,this.selector=e,this.length=1,this;if("string"==typeof e){if(o="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:s.exec(e),!o||!o[1]&&n)return!n||n.jquery?(n||i).find(e):this.constructor(n).find(e);if(o[1])return n=n instanceof r?n[0]:n,u=n?n.ownerDocument||n:M,l=f.exec(e),l?r.isPlainObject(n)?(e=[M.createElement(l[1])],r.fn.attr.call(e,n,!0)):e=[u.createElement(l[1])]:(l=r.buildFragment([o[1]],[u]),e=(l.cacheable?r.clone(l.fragment):l.fragment).childNodes),r.merge(this,e);if(a=M.getElementById(o[2]),a&&a.parentNode){if(a.id!==o[2])return i.find(e);this.length=1,this[0]=a}return this.context=M,this.selector=e,this}return r.isFunction(e)?i.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),r.makeArray(e,this))},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return j.call(this,0)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e,t,n){var i=this.constructor();return r.isArray(e)?L.apply(i,e):r.merge(i,e),i.prevObject=this,i.context=this.context,"find"===t?i.selector=this.selector+(this.selector?" ":"")+n:t&&(i.selector=this.selector+"."+t+"("+n+")"),i},each:function(e,t){return r.each(this,e,t)},ready:function(e){return r.bindReady(),E.add(e),this},eq:function(e){return e=+e,-1===e?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(j.apply(this,arguments),"slice",j.call(arguments).join(","))},map:function(e){return this.pushStack(r.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:L,sort:[].sort,splice:[].splice},r.fn.init.prototype=r.fn,r.extend=r.fn.extend=function(){var e,n,i,o,a,s,l=arguments[0]||{},u=1,c=arguments.length,f=!1;for("boolean"==typeof l&&(f=l,l=arguments[1]||{},u=2),"object"==typeof l||r.isFunction(l)||(l={}),c===u&&(l=this,--u);c>u;u++)if(null!=(e=arguments[u]))for(n in e)i=l[n],o=e[n],l!==o&&(f&&o&&(r.isPlainObject(o)||(a=r.isArray(o)))?(a?(a=!1,s=i&&r.isArray(i)?i:[]):s=i&&r.isPlainObject(i)?i:{},l[n]=r.extend(f,s,o)):o!==t&&(l[n]=o));return l},r.extend({noConflict:function(t){return e.$===r&&(e.$=o),t&&e.jQuery===r&&(e.jQuery=i),r},isReady:!1,readyWait:1,holdReady:function(e){e?r.readyWait++:r.ready(!0)},ready:function(e){if(e===!0&&!--r.readyWait||e!==!0&&!r.isReady){if(!M.body)return setTimeout(r.ready,1);if(r.isReady=!0,e!==!0&&--r.readyWait>0)return;E.fireWith(M,[r]),r.fn.trigger&&r(M).trigger("ready").off("ready")}},bindReady:function(){if(!E){if(E=r.Callbacks("once memory"),"complete"===M.readyState)return setTimeout(r.ready,1);if(M.addEventListener)M.addEventListener("DOMContentLoaded",k,!1),e.addEventListener("load",r.ready,!1);else if(M.attachEvent){M.attachEvent("onreadystatechange",k),e.attachEvent("onload",r.ready);var t=!1;try{t=null==e.frameElement}catch(i){}M.documentElement.doScroll&&t&&n()}}},isFunction:function(e){return"function"===r.type(e)},isArray:Array.isArray||function(e){return"array"===r.type(e)},isWindow:function(e){return e&&"object"==typeof e&&"setInterval"in e},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?String(e):_[S.call(e)]||"object"},isPlainObject:function(e){if(!e||"object"!==r.type(e)||e.nodeType||r.isWindow(e))return!1;try{if(e.constructor&&!A.call(e,"constructor")&&!A.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var i;for(i in e);return i===t||A.call(e,i)},isEmptyObject:function(e){for(var t in e)return!1;return!0},error:function(e){throw new Error(e)},parseJSON:function(t){return"string"==typeof t&&t?(t=r.trim(t),e.JSON&&e.JSON.parse?e.JSON.parse(t):d.test(t.replace(p,"@").replace(h,"]").replace(m,""))?new Function("return "+t)():void r.error("Invalid JSON: "+t)):null},parseXML:function(n){var i,o;try{e.DOMParser?(o=new DOMParser,i=o.parseFromString(n,"text/xml")):(i=new ActiveXObject("Microsoft.XMLDOM"),i.async="false",i.loadXML(n))}catch(a){i=t}return i&&i.documentElement&&!i.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+n),i},noop:function(){},globalEval:function(t){t&&l.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(T,"ms-").replace(x,w)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toUpperCase()===t.toUpperCase()},each:function(e,n,i){var o,a=0,s=e.length,l=s===t||r.isFunction(e);if(i)if(l){for(o in e)if(n.apply(e[o],i)===!1)break}else for(;s>a&&n.apply(e[a++],i)!==!1;);else if(l){for(o in e)if(n.call(e[o],o,e[o])===!1)break}else for(;s>a&&n.call(e[a],a,e[a++])!==!1;);return e},trim:F?function(e){return null==e?"":F.call(e)}:function(e){return null==e?"":e.toString().replace(u,"").replace(c,"")},makeArray:function(e,t){var n=t||[];if(null!=e){var i=r.type(e);null==e.length||"string"===i||"function"===i||"regexp"===i||r.isWindow(e)?L.call(n,e):r.merge(n,e)}return n},inArray:function(e,t,n){var r;if(t){if(D)return D.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=e.length,i=0;if("number"==typeof n.length)for(var o=n.length;o>i;i++)e[r++]=n[i];else for(;n[i]!==t;)e[r++]=n[i++];return e.length=r,e},grep:function(e,t,n){var r=[],i;n=!!n;for(var o=0,a=e.length;a>o;o++)i=!!t(e[o],o),n!==i&&r.push(e[o]);return r},map:function(e,n,i){var o,a,s=[],l=0,u=e.length,c=e instanceof r||u!==t&&"number"==typeof u&&(u>0&&e[0]&&e[u-1]||0===u||r.isArray(e));if(c)for(;u>l;l++)o=n(e[l],l,i),null!=o&&(s[s.length]=o);else for(a in e)o=n(e[a],a,i),null!=o&&(s[s.length]=o);return s.concat.apply([],s)},guid:1,proxy:function(e,n){if("string"==typeof n){var i=e[n];n=e,e=i}if(!r.isFunction(e))return t;var o=j.call(arguments,2),a=function(){return e.apply(n,o.concat(j.call(arguments)))};return a.guid=e.guid=e.guid||a.guid||r.guid++,a},access:function(e,n,i,o,a,s){var l=e.length;if("object"==typeof n){for(var u in n)r.access(e,u,n[u],o,a,i);return e}if(i!==t){o=!s&&o&&r.isFunction(i);for(var c=0;l>c;c++)a(e[c],n,o?i.call(e[c],c,a(e[c],n)):i,s);return e}return l?a(e[0],n):t},now:function(){return(new Date).getTime()},uaMatch:function(e){e=e.toLowerCase();var t=g.exec(e)||y.exec(e)||v.exec(e)||e.indexOf("compatible")<0&&b.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},sub:function(){function e(t,n){return new e.fn.init(t,n)}r.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function n(i,o){return o&&o instanceof r&&!(o instanceof e)&&(o=e(o)),r.fn.init.call(this,i,o,t)},e.fn.init.prototype=e.fn;var t=e(M);return e},browser:{}}),r.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){_["[object "+t+"]"]=t.toLowerCase()}),C=r.uaMatch(N),C.browser&&(r.browser[C.browser]=!0,r.browser.version=C.version),r.browser.webkit&&(r.browser.safari=!0),l.test(" ")&&(u=/^[\s\xA0]+/,c=/[\s\xA0]+$/),a=r(M),M.addEventListener?k=function(){M.removeEventListener("DOMContentLoaded",k,!1),r.ready()}:M.attachEvent&&(k=function(){"complete"===M.readyState&&(M.detachEvent("onreadystatechange",k),r.ready())}),r}(),B={};H.Callbacks=function(e){e=e?B[e]||n(e):{};var r=[],i=[],o,a,s,l,u,c=function(t){var n,i,o,a,s;for(n=0,i=t.length;i>n;n++)o=t[n],a=H.type(o),"array"===a?c(o):"function"===a&&(e.unique&&d.has(o)||r.push(o))},f=function(t,n){for(n=n||[],o=!e.memory||[t,n],a=!0,u=s||0,s=0,l=r.length;r&&l>u;u++)if(r[u].apply(t,n)===!1&&e.stopOnFalse){o=!0;break}a=!1,r&&(e.once?o===!0?d.disable():r=[]:i&&i.length&&(o=i.shift(),d.fireWith(o[0],o[1])))},d={add:function(){if(r){var e=r.length;c(arguments),a?l=r.length:o&&o!==!0&&(s=e,f(o[0],o[1]))}return this},remove:function(){if(r)for(var t=arguments,n=0,i=t.length;i>n;n++)for(var o=0;o<r.length&&(t[n]!==r[o]||(a&&l>=o&&(l--,u>=o&&u--),r.splice(o--,1),!e.unique));o++);return this},has:function(e){if(r)for(var t=0,n=r.length;n>t;t++)if(e===r[t])return!0;return!1},empty:function(){return r=[],this},disable:function(){return r=i=o=t,this},disabled:function(){return!r},lock:function(){return i=t,o&&o!==!0||d.disable(),this},locked:function(){return!i},fireWith:function(t,n){return i&&(a?e.once||i.push([t,n]):e.once&&o||f(t,n)),this},fire:function(){return d.fireWith(this,arguments),this},fired:function(){return!!o}};return d};var P=[].slice;H.extend({Deferred:function(e){var t=H.Callbacks("once memory"),n=H.Callbacks("once memory"),r=H.Callbacks("memory"),i="pending",o={resolve:t,reject:n,notify:r},a={done:t.add,fail:n.add,progress:r.add,state:function(){return i},isResolved:t.fired,isRejected:n.fired,then:function(e,t,n){return s.done(e).fail(t).progress(n),this},always:function(){return s.done.apply(s,arguments).fail.apply(s,arguments),this},pipe:function(e,t,n){return H.Deferred(function(r){H.each({done:[e,"resolve"],fail:[t,"reject"],progress:[n,"notify"]},function(e,t){var n=t[0],i=t[1],o;s[e](H.isFunction(n)?function(){o=n.apply(this,arguments),o&&H.isFunction(o.promise)?o.promise().then(r.resolve,r.reject,r.notify):r[i+"With"](this===s?r:this,[o])}:r[i])})}).promise()},promise:function(e){if(null==e)e=a;else for(var t in a)e[t]=a[t];return e}},s=a.promise({}),l;for(l in o)s[l]=o[l].fire,s[l+"With"]=o[l].fireWith;return s.done(function(){i="resolved"},n.disable,r.lock).fail(function(){i="rejected"},t.disable,r.lock),e&&e.call(s,s),s},when:function(e){function t(e){return function(t){r[e]=arguments.length>1?P.call(arguments,0):t,--s||u.resolveWith(u,r)}}function n(e){return function(t){a[e]=arguments.length>1?P.call(arguments,0):t,u.notifyWith(c,a)}}var r=P.call(arguments,0),i=0,o=r.length,a=new Array(o),s=o,l=o,u=1>=o&&e&&H.isFunction(e.promise)?e:H.Deferred(),c=u.promise();if(o>1){for(;o>i;i++)r[i]&&r[i].promise&&H.isFunction(r[i].promise)?r[i].promise().then(t(i),u.reject,n(i)):--s;s||u.resolveWith(u,r)}else u!==e&&u.resolveWith(u,o?[e]:[]);return c}}),H.support=function(){var t,n,r,i,o,a,s,l,u,c,f,d,p,h=M.createElement("div"),m=M.documentElement;if(h.setAttribute("className","t"),h.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",n=h.getElementsByTagName("*"),r=h.getElementsByTagName("a")[0],!n||!n.length||!r)return{};i=M.createElement("select"),o=i.appendChild(M.createElement("option")),a=h.getElementsByTagName("input")[0],t={leadingWhitespace:3===h.firstChild.nodeType,tbody:!h.getElementsByTagName("tbody").length,htmlSerialize:!!h.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.55/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:"on"===a.value,optSelected:o.selected,getSetAttribute:"t"!==h.className,enctype:!!M.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==M.createElement("nav").cloneNode(!0).outerHTML,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,i.disabled=!0,t.optDisabled=!o.disabled;try{delete h.test}catch(g){t.deleteExpando=!1}if(!h.addEventListener&&h.attachEvent&&h.fireEvent&&(h.attachEvent("onclick",function(){t.noCloneEvent=!1}),h.cloneNode(!0).fireEvent("onclick")),a=M.createElement("input"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","checked"),h.appendChild(a),l=M.createDocumentFragment(),l.appendChild(h.lastChild),t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=a.checked,l.removeChild(a),l.appendChild(h),h.innerHTML="",e.getComputedStyle&&(s=M.createElement("div"),s.style.width="0",s.style.marginRight="0",h.style.width="2px",h.appendChild(s),t.reliableMarginRight=0===(parseInt((e.getComputedStyle(s,null)||{marginRight:0}).marginRight,10)||0)),h.attachEvent)for(d in{submit:1,change:1,focusin:1})f="on"+d,p=f in h,p||(h.setAttribute(f,"return;"),p="function"==typeof h[f]),t[d+"Bubbles"]=p;return l.removeChild(h),l=i=o=s=h=a=null,H(function(){var e,n,r,i,o,a,s,l,c,f,d,m=M.getElementsByTagName("body")[0];m&&(s=1,l="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",c="visibility:hidden;border:0;",f="style='"+l+"border:5px solid #000;padding:0;'",d="<div "+f+"><div></div></div><table "+f+" cellpadding='0' cellspacing='0'><tr><td></td></tr></table>",e=M.createElement("div"),e.style.cssText=c+"width:0;height:0;position:static;top:0;margin-top:"+s+"px",m.insertBefore(e,m.firstChild),h=M.createElement("div"),e.appendChild(h),h.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",u=h.getElementsByTagName("td"),p=0===u[0].offsetHeight,u[0].style.display="",u[1].style.display="none",t.reliableHiddenOffsets=p&&0===u[0].offsetHeight,h.innerHTML="",h.style.width=h.style.paddingLeft="1px",H.boxModel=t.boxModel=2===h.offsetWidth,"undefined"!=typeof h.style.zoom&&(h.style.display="inline",h.style.zoom=1,t.inlineBlockNeedsLayout=2===h.offsetWidth,h.style.display="",h.innerHTML="<div style='width:4px;'></div>",t.shrinkWrapBlocks=2!==h.offsetWidth),h.style.cssText=l+c,h.innerHTML=d,n=h.firstChild,r=n.firstChild,o=n.nextSibling.firstChild.firstChild,a={doesNotAddBorder:5!==r.offsetTop,doesAddBorderForTableAndCells:5===o.offsetTop},r.style.position="fixed",r.style.top="20px",a.fixedPosition=20===r.offsetTop||15===r.offsetTop,r.style.position=r.style.top="",n.style.overflow="hidden",n.style.position="relative",a.subtractsBorderForOverflowNotVisible=-5===r.offsetTop,a.doesNotIncludeMarginInBodyOffset=m.offsetTop!==s,m.removeChild(e),h=e=null,H.extend(t,a))}),t}();var q=/^(?:\{.*\}|\[.*\])$/,W=/([A-Z])/g;H.extend({cache:{},uuid:0,expando:"jQuery"+(H.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?H.cache[e[H.expando]]:e[H.expando],!!e&&!i(e)},data:function(e,n,r,i){if(H.acceptData(e)){var o,a,s,l=H.expando,u="string"==typeof n,c=e.nodeType,f=c?H.cache:e,d=c?e[l]:e[l]&&l,p="events"===n;if(d&&f[d]&&(p||i||f[d].data)||!u||r!==t)return d||(c?e[l]=d=++H.uuid:d=l),f[d]||(f[d]={},c||(f[d].toJSON=H.noop)),("object"==typeof n||"function"==typeof n)&&(i?f[d]=H.extend(f[d],n):f[d].data=H.extend(f[d].data,n)),o=a=f[d],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[H.camelCase(n)]=r),p&&!a[n]?o.events:(u?(s=a[n],null==s&&(s=a[H.camelCase(n)])):s=a,s)}},removeData:function(e,t,n){if(H.acceptData(e)){var r,o,a,s=H.expando,l=e.nodeType,u=l?H.cache:e,c=l?e[s]:s;if(u[c]){if(t&&(r=n?u[c]:u[c].data)){H.isArray(t)||(t in r?t=[t]:(t=H.camelCase(t),t=t in r?[t]:t.split(" ")));for(o=0,a=t.length;a>o;o++)delete r[t[o]];if(!(n?i:H.isEmptyObject)(r))return}(n||(delete u[c].data,i(u[c])))&&(H.support.deleteExpando||!u.setInterval?delete u[c]:u[c]=null,l&&(H.support.deleteExpando?delete e[s]:e.removeAttribute?e.removeAttribute(s):e[s]=null))}}},_data:function(e,t,n){return H.data(e,t,n,!0)},acceptData:function(e){if(e.nodeName){var t=H.noData[e.nodeName.toLowerCase()];if(t)return!(t===!0||e.getAttribute("classid")!==t)}return!0}}),H.fn.extend({data:function(e,n){var i,o,a,s=null;if("undefined"==typeof e){if(this.length&&(s=H.data(this[0]),1===this[0].nodeType&&!H._data(this[0],"parsedAttrs"))){o=this[0].attributes;for(var l=0,u=o.length;u>l;l++)a=o[l].name,0===a.indexOf("data-")&&(a=H.camelCase(a.substring(5)),r(this[0],a,s[a]));H._data(this[0],"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){H.data(this,e)}):(i=e.split("."),i[1]=i[1]?"."+i[1]:"",n===t?(s=this.triggerHandler("getData"+i[1]+"!",[i[0]]),s===t&&this.length&&(s=H.data(this[0],e),s=r(this[0],e,s)),s===t&&i[1]?this.data(i[0]):s):this.each(function(){var t=H(this),r=[i[0],n];t.triggerHandler("setData"+i[1]+"!",r),H.data(this,e,n),t.triggerHandler("changeData"+i[1]+"!",r)}))},removeData:function(e){return this.each(function(){H.removeData(this,e)})}}),H.extend({_mark:function(e,t){e&&(t=(t||"fx")+"mark",H._data(e,t,(H._data(e,t)||0)+1))},_unmark:function(e,t,n){if(e!==!0&&(n=t,t=e,e=!1),t){n=n||"fx";var r=n+"mark",i=e?0:(H._data(t,r)||1)-1;i?H._data(t,r,i):(H.removeData(t,r,!0),o(t,n,"mark"))}},queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=H._data(e,t),n&&(!r||H.isArray(n)?r=H._data(e,t,H.makeArray(n)):r.push(n)),r||[]):void 0},dequeue:function(e,t){t=t||"fx";var n=H.queue(e,t),r=n.shift(),i={};"inprogress"===r&&(r=n.shift()),r&&("fx"===t&&n.unshift("inprogress"),H._data(e,t+".run",i),r.call(e,function(){H.dequeue(e,t)},i)),n.length||(H.removeData(e,t+"queue "+t+".run",!0),o(e,t,"queue"))}}),H.fn.extend({queue:function(e,n){return"string"!=typeof e&&(n=e,e="fx"),n===t?H.queue(this[0],e):this.each(function(){var t=H.queue(this,e,n);"fx"===e&&"inprogress"!==t[0]&&H.dequeue(this,e)})},dequeue:function(e){return this.each(function(){H.dequeue(this,e)})},delay:function(e,t){return e=H.fx?H.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){function r(){--s||i.resolveWith(o,[o])}"string"!=typeof e&&(n=e,e=t),e=e||"fx";for(var i=H.Deferred(),o=this,a=o.length,s=1,l=e+"defer",u=e+"queue",c=e+"mark",f;a--;)(f=H.data(o[a],l,t,!0)||(H.data(o[a],u,t,!0)||H.data(o[a],c,t,!0))&&H.data(o[a],l,H.Callbacks("once memory"),!0))&&(s++,f.add(r));return r(),i.promise()}});var I=/[\n\t\r]/g,R=/\s+/,X=/\r/g,z=/^(?:button|input)$/i,V=/^(?:button|input|object|select|textarea)$/i,U=/^a(?:rea)?$/i,G=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,J=H.support.getSetAttribute,Y,Q,K;H.fn.extend({attr:function(e,t){return H.access(this,e,t,!0,H.attr)},removeAttr:function(e){return this.each(function(){H.removeAttr(this,e)})},prop:function(e,t){return H.access(this,e,t,!0,H.prop)},removeProp:function(e){return e=H.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a,s;if(H.isFunction(e))return this.each(function(t){H(this).addClass(e.call(this,t,this.className))});if(e&&"string"==typeof e)for(t=e.split(R),n=0,r=this.length;r>n;n++)if(i=this[n],1===i.nodeType)if(i.className||1!==t.length){for(o=" "+i.className+" ",a=0,s=t.length;s>a;a++)~o.indexOf(" "+t[a]+" ")||(o+=t[a]+" ");i.className=H.trim(o)}else i.className=e;return this},removeClass:function(e){var n,r,i,o,a,s,l;if(H.isFunction(e))return this.each(function(t){H(this).removeClass(e.call(this,t,this.className))});if(e&&"string"==typeof e||e===t)for(n=(e||"").split(R),r=0,i=this.length;i>r;r++)if(o=this[r],1===o.nodeType&&o.className)if(e){for(a=(" "+o.className+" ").replace(I," "),s=0,l=n.length;l>s;s++)a=a.replace(" "+n[s]+" "," ");o.className=H.trim(a)}else o.className="";return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return this.each(H.isFunction(e)?function(n){H(this).toggleClass(e.call(this,n,this.className,t),t)}:function(){if("string"===n)for(var i,o=0,a=H(this),s=t,l=e.split(R);i=l[o++];)s=r?s:!a.hasClass(i),a[s?"addClass":"removeClass"](i);else("undefined"===n||"boolean"===n)&&(this.className&&H._data(this,"__className__",this.className),this.className=this.className||e===!1?"":H._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(I," ").indexOf(t)>-1)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=H.isFunction(e),this.each(function(r){var o=H(this),a;1===this.nodeType&&(a=i?e.call(this,r,o.val()):e,null==a?a="":"number"==typeof a?a+="":H.isArray(a)&&(a=H.map(a,function(e){return null==e?"":e+""})),n=H.valHooks[this.nodeName.toLowerCase()]||H.valHooks[this.type],n&&"set"in n&&n.set(this,a,"value")!==t||(this.value=a))});if(o)return n=H.valHooks[o.nodeName.toLowerCase()]||H.valHooks[o.type],n&&"get"in n&&(r=n.get(o,"value"))!==t?r:(r=o.value,"string"==typeof r?r.replace(X,""):null==r?"":r)}}}),H.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r,i,o=e.selectedIndex,a=[],s=e.options,l="select-one"===e.type;if(0>o)return null;for(n=l?o:0,r=l?o+1:s.length;r>n;n++)if(i=s[n],!(!i.selected||(H.support.optDisabled?i.disabled:null!==i.getAttribute("disabled"))||i.parentNode.disabled&&H.nodeName(i.parentNode,"optgroup"))){if(t=H(i).val(),l)return t;a.push(t)}return l&&!a.length&&s.length?H(s[o]).val():a},set:function(e,t){var n=H.makeArray(t);return H(e).find("option").each(function(){this.selected=H.inArray(H(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(e,n,r,i){var o,a,s,l=e.nodeType;if(e&&3!==l&&8!==l&&2!==l)return i&&n in H.attrFn?H(e)[n](r):"undefined"==typeof e.getAttribute?H.prop(e,n,r):(s=1!==l||!H.isXMLDoc(e),s&&(n=n.toLowerCase(),a=H.attrHooks[n]||(G.test(n)?Q:Y)),r!==t?null===r?void H.removeAttr(e,n):a&&"set"in a&&s&&(o=a.set(e,r,n))!==t?o:(e.setAttribute(n,""+r),r):a&&"get"in a&&s&&null!==(o=a.get(e,n))?o:(o=e.getAttribute(n),null===o?t:o))},removeAttr:function(e,t){var n,r,i,o,a=0;if(t&&1===e.nodeType)for(r=t.toLowerCase().split(R),o=r.length;o>a;a++)i=r[a],i&&(n=H.propFix[i]||i,H.attr(e,i,""),e.removeAttribute(J?i:n),G.test(i)&&n in e&&(e[n]=!1))},attrHooks:{type:{set:function(e,t){if(z.test(e.nodeName)&&e.parentNode)H.error("type property can't be changed");else if(!H.support.radioValue&&"radio"===t&&H.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return Y&&H.nodeName(e,"button")?Y.get(e,t):t in e?e.value:null},set:function(e,t,n){return Y&&H.nodeName(e,"button")?Y.set(e,t,n):void(e.value=t)}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!H.isXMLDoc(e),a&&(n=H.propFix[n]||n,o=H.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||U.test(e.nodeName)&&e.href?0:t}}}}),H.attrHooks.tabindex=H.propHooks.tabIndex,Q={get:function(e,n){var r,i=H.prop(e,n);return i===!0||"boolean"!=typeof i&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?H.removeAttr(e,n):(r=H.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},J||(K={name:!0,id:!0},Y=H.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(K[n]?""!==r.nodeValue:r.specified)?r.nodeValue:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=M.createAttribute(n),e.setAttributeNode(r)),r.nodeValue=t+""}},H.attrHooks.tabindex.set=Y.set,H.each(["width","height"],function(e,t){H.attrHooks[t]=H.extend(H.attrHooks[t],{set:function(e,n){return""===n?(e.setAttribute(t,"auto"),n):void 0}})}),H.attrHooks.contenteditable={get:Y.get,set:function(e,t,n){""===t&&(t="false"),Y.set(e,t,n)}}),H.support.hrefNormalized||H.each(["href","src","width","height"],function(e,n){H.attrHooks[n]=H.extend(H.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null===r?t:r}})}),H.support.style||(H.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=""+t}}),H.support.optSelected||(H.propHooks.selected=H.extend(H.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),H.support.enctype||(H.propFix.enctype="encoding"),H.support.checkOn||H.each(["radio","checkbox"],function(){H.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),H.each(["radio","checkbox"],function(){H.valHooks[this]=H.extend(H.valHooks[this],{set:function(e,t){return H.isArray(t)?e.checked=H.inArray(H(e).val(),t)>=0:void 0}})});var Z=/^(?:textarea|input|select)$/i,et=/^([^\.]*)?(?:\.(.+))?$/,tt=/\bhover(\.\S+)?\b/,nt=/^key/,rt=/^(?:mouse|contextmenu)|click/,it=/^(?:focusinfocus|focusoutblur)$/,ot=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,at=function(e){var t=ot.exec(e);return t&&(t[1]=(t[1]||"").toLowerCase(),t[3]=t[3]&&new RegExp("(?:^|\\s)"+t[3]+"(?:\\s|$)")),t},st=function(e,t){var n=e.attributes||{};return!(t[1]&&e.nodeName.toLowerCase()!==t[1]||t[2]&&(n.id||{}).value!==t[2]||t[3]&&!t[3].test((n["class"]||{}).value))},lt=function(e){return H.event.special.hover?e:e.replace(tt,"mouseenter$1 mouseleave$1")
+};H.event={add:function(e,n,r,i,o){var a,s,l,u,c,f,d,p,h,m,g,y;if(3!==e.nodeType&&8!==e.nodeType&&n&&r&&(a=H._data(e))){for(r.handler&&(h=r,r=h.handler),r.guid||(r.guid=H.guid++),l=a.events,l||(a.events=l={}),s=a.handle,s||(a.handle=s=function(e){return"undefined"==typeof H||e&&H.event.triggered===e.type?t:H.event.dispatch.apply(s.elem,arguments)},s.elem=e),n=H.trim(lt(n)).split(" "),u=0;u<n.length;u++)c=et.exec(n[u])||[],f=c[1],d=(c[2]||"").split(".").sort(),y=H.event.special[f]||{},f=(o?y.delegateType:y.bindType)||f,y=H.event.special[f]||{},p=H.extend({type:f,origType:c[1],data:i,handler:r,guid:r.guid,selector:o,quick:at(o),namespace:d.join(".")},h),g=l[f],g||(g=l[f]=[],g.delegateCount=0,y.setup&&y.setup.call(e,i,d,s)!==!1||(e.addEventListener?e.addEventListener(f,s,!1):e.attachEvent&&e.attachEvent("on"+f,s))),y.add&&(y.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),o?g.splice(g.delegateCount++,0,p):g.push(p),H.event.global[f]=!0;e=null}},global:{},remove:function(e,t,n,r,i){var o=H.hasData(e)&&H._data(e),a,s,l,u,c,f,d,p,h,m,g,y;if(o&&(p=o.events)){for(t=H.trim(lt(t||"")).split(" "),a=0;a<t.length;a++)if(s=et.exec(t[a])||[],l=u=s[1],c=s[2],l){for(h=H.event.special[l]||{},l=(r?h.delegateType:h.bindType)||l,g=p[l]||[],f=g.length,c=c?new RegExp("(^|\\.)"+c.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null,d=0;d<g.length;d++)y=g[d],!i&&u!==y.origType||n&&n.guid!==y.guid||c&&!c.test(y.namespace)||r&&r!==y.selector&&("**"!==r||!y.selector)||(g.splice(d--,1),y.selector&&g.delegateCount--,h.remove&&h.remove.call(e,y));0===g.length&&f!==g.length&&(h.teardown&&h.teardown.call(e,c)!==!1||H.removeEvent(e,l,o.handle),delete p[l])}else for(l in p)H.event.remove(e,l+t[a],n,r,!0);H.isEmptyObject(p)&&(m=o.handle,m&&(m.elem=null),H.removeData(e,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,i,o){if(!i||3!==i.nodeType&&8!==i.nodeType){var a=n.type||n,s=[],l,u,c,f,d,p,h,m,g,y;if(!it.test(a+H.event.triggered)&&(a.indexOf("!")>=0&&(a=a.slice(0,-1),u=!0),a.indexOf(".")>=0&&(s=a.split("."),a=s.shift(),s.sort()),i&&!H.event.customEvent[a]||H.event.global[a]))if(n="object"==typeof n?n[H.expando]?n:new H.Event(a,n):new H.Event(a),n.type=a,n.isTrigger=!0,n.exclusive=u,n.namespace=s.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+s.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,p=a.indexOf(":")<0?"on"+a:"",i){if(n.result=t,n.target||(n.target=i),r=null!=r?H.makeArray(r):[],r.unshift(n),h=H.event.special[a]||{},!h.trigger||h.trigger.apply(i,r)!==!1){if(g=[[i,h.bindType||a]],!o&&!h.noBubble&&!H.isWindow(i)){for(y=h.delegateType||a,f=it.test(y+a)?i:i.parentNode,d=null;f;f=f.parentNode)g.push([f,y]),d=f;d&&d===i.ownerDocument&&g.push([d.defaultView||d.parentWindow||e,y])}for(c=0;c<g.length&&!n.isPropagationStopped();c++)f=g[c][0],n.type=g[c][1],m=(H._data(f,"events")||{})[n.type]&&H._data(f,"handle"),m&&m.apply(f,r),m=p&&f[p],m&&H.acceptData(f)&&m.apply(f,r)===!1&&n.preventDefault();return n.type=a,o||n.isDefaultPrevented()||h._default&&h._default.apply(i.ownerDocument,r)!==!1||"click"===a&&H.nodeName(i,"a")||!H.acceptData(i)||p&&i[a]&&("focus"!==a&&"blur"!==a||0!==n.target.offsetWidth)&&!H.isWindow(i)&&(d=i[p],d&&(i[p]=null),H.event.triggered=a,i[a](),H.event.triggered=t,d&&(i[p]=d)),n.result}}else{l=H.cache;for(c in l)l[c].events&&l[c].events[a]&&H.event.trigger(n,r,l[c].handle.elem,!0)}}},dispatch:function(n){n=H.event.fix(n||e.event);var r=(H._data(this,"events")||{})[n.type]||[],i=r.delegateCount,o=[].slice.call(arguments,0),a=!n.exclusive&&!n.namespace,s=[],l,u,c,f,d,p,h,m,g,y,v;if(o[0]=n,n.delegateTarget=this,i&&!n.target.disabled&&(!n.button||"click"!==n.type))for(f=H(this),f.context=this.ownerDocument||this,c=n.target;c!=this;c=c.parentNode||this){for(p={},m=[],f[0]=c,l=0;i>l;l++)g=r[l],y=g.selector,p[y]===t&&(p[y]=g.quick?st(c,g.quick):f.is(y)),p[y]&&m.push(g);m.length&&s.push({elem:c,matches:m})}for(r.length>i&&s.push({elem:this,matches:r.slice(i)}),l=0;l<s.length&&!n.isPropagationStopped();l++)for(h=s[l],n.currentTarget=h.elem,u=0;u<h.matches.length&&!n.isImmediatePropagationStopped();u++)g=h.matches[u],(a||!n.namespace&&!g.namespace||n.namespace_re&&n.namespace_re.test(g.namespace))&&(n.data=g.data,n.handleObj=g,d=((H.event.special[g.origType]||{}).handle||g.handler).apply(h.elem,o),d!==t&&(n.result=d,d===!1&&(n.preventDefault(),n.stopPropagation())));return n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,a=n.button,s=n.fromElement;return null==e.pageX&&null!=n.clientX&&(r=e.target.ownerDocument||M,i=r.documentElement,o=r.body,e.pageX=n.clientX+(i&&i.scrollLeft||o&&o.scrollLeft||0)-(i&&i.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(i&&i.scrollTop||o&&o.scrollTop||0)-(i&&i.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&s&&(e.relatedTarget=s===e.target?n.toElement:s),e.which||a===t||(e.which=1&a?1:2&a?3:4&a?2:0),e}},fix:function(e){if(e[H.expando])return e;var n,r,i=e,o=H.event.fixHooks[e.type]||{},a=o.props?this.props.concat(o.props):this.props;for(e=H.Event(i),n=a.length;n;)r=a[--n],e[r]=i[r];return e.target||(e.target=i.srcElement||M),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey===t&&(e.metaKey=e.ctrlKey),o.filter?o.filter(e,i):e},special:{ready:{setup:H.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){H.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=H.extend(new H.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?H.event.trigger(i,null,t):H.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},H.event.handle=H.event.dispatch,H.removeEvent=M.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){e.detachEvent&&e.detachEvent("on"+t,n)},H.Event=function(e,t){return this instanceof H.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?s:a):this.type=e,t&&H.extend(this,t),this.timeStamp=e&&e.timeStamp||H.now(),void(this[H.expando]=!0)):new H.Event(e,t)},H.Event.prototype={preventDefault:function(){this.isDefaultPrevented=s;var e=this.originalEvent;e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=s;var e=this.originalEvent;e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=s,this.stopPropagation()},isDefaultPrevented:a,isPropagationStopped:a,isImmediatePropagationStopped:a},H.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){H.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n=this,r=e.relatedTarget,i=e.handleObj,o=i.selector,a;return(!r||r!==n&&!H.contains(n,r))&&(e.type=i.origType,a=i.handler.apply(this,arguments),e.type=t),a}}}),H.support.submitBubbles||(H.event.special.submit={setup:function(){return H.nodeName(this,"form")?!1:void H.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=H.nodeName(n,"input")||H.nodeName(n,"button")?n.form:t;r&&!r._submit_attached&&(H.event.add(r,"submit._submit",function(e){this.parentNode&&!e.isTrigger&&H.event.simulate("submit",this.parentNode,e,!0)}),r._submit_attached=!0)})},teardown:function(){return H.nodeName(this,"form")?!1:void H.event.remove(this,"._submit")}}),H.support.changeBubbles||(H.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(H.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),H.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1,H.event.simulate("change",this,e,!0))})),!1):void H.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!t._change_attached&&(H.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||H.event.simulate("change",this.parentNode,e,!0)}),t._change_attached=!0)})},handle:function(e){var t=e.target;return this!==t||e.isSimulated||e.isTrigger||"radio"!==t.type&&"checkbox"!==t.type?e.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return H.event.remove(this,"._change"),Z.test(this.nodeName)}}),H.support.focusinBubbles||H.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){H.event.simulate(t,e.target,H.event.fix(e),!0)};H.event.special[t]={setup:function(){0===n++&&M.addEventListener(e,r,!0)},teardown:function(){0===--n&&M.removeEventListener(e,r,!0)}}}),H.fn.extend({on:function(e,n,r,i,o){var s,l;if("object"==typeof e){"string"!=typeof n&&(r=n,n=t);for(l in e)this.on(l,n,r,e[l],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=a;else if(!i)return this;return 1===o&&(s=i,i=function(e){return H().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=H.guid++)),this.each(function(){H.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on.call(this,e,t,n,r,1)},off:function(e,n,r){if(e&&e.preventDefault&&e.handleObj){var i=e.handleObj;return H(e.delegateTarget).off(i.namespace?i.type+"."+i.namespace:i.type,i.selector,i.handler),this}if("object"==typeof e){for(var o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=a),this.each(function(){H.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return H(this.context).on(e,this.selector,t,n),this},die:function(e,t){return H(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1==arguments.length?this.off(e,"**"):this.off(t,e,n)},trigger:function(e,t){return this.each(function(){H.event.trigger(e,t,this)})},triggerHandler:function(e,t){return this[0]?H.event.trigger(e,t,this[0],!0):void 0},toggle:function(e){var t=arguments,n=e.guid||H.guid++,r=0,i=function(n){var i=(H._data(this,"lastToggle"+e.guid)||0)%r;return H._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};for(i.guid=n;r<t.length;)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),H.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(e,t){H.fn[t]=function(e,n){return null==n&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},H.attrFn&&(H.attrFn[t]=!0),nt.test(t)&&(H.event.fixHooks[t]=H.event.keyHooks),rt.test(t)&&(H.event.fixHooks[t]=H.event.mouseHooks)}),function(){function e(e,t,n,r,o,a){for(var s=0,l=r.length;l>s;s++){var u=r[s];if(u){var c=!1;for(u=u[e];u;){if(u[i]===n){c=r[u.sizset];break}if(1!==u.nodeType||a||(u[i]=n,u.sizset=s),u.nodeName.toLowerCase()===t){c=u;break}u=u[e]}r[s]=c}}}function n(e,t,n,r,o,a){for(var s=0,l=r.length;l>s;s++){var u=r[s];if(u){var c=!1;for(u=u[e];u;){if(u[i]===n){c=r[u.sizset];break}if(1===u.nodeType)if(a||(u[i]=n,u.sizset=s),"string"!=typeof t){if(u===t){c=!0;break}}else if(d.filter(t,[u]).length>0){c=u;break}u=u[e]}r[s]=c}}}var r=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,i="sizcache"+(Math.random()+"").replace(".",""),o=0,a=Object.prototype.toString,s=!1,l=!0,u=/\\/g,c=/\r\n/g,f=/\W/;[0,0].sort(function(){return l=!1,0});var d=function(e,t,n,i){n=n||[],t=t||M;var o=t;if(1!==t.nodeType&&9!==t.nodeType)return[];if(!e||"string"!=typeof e)return n;var s,l,u,c,f,p,g,y,b=!0,x=d.isXML(t),T=[],N=e;do if(r.exec(""),s=r.exec(N),s&&(N=s[3],T.push(s[1]),s[2])){c=s[3];break}while(s);if(T.length>1&&m.exec(e))if(2===T.length&&h.relative[T[0]])l=w(T[0]+T[1],t,i);else for(l=h.relative[T[0]]?[t]:d(T.shift(),t);T.length;)e=T.shift(),h.relative[e]&&(e+=T.shift()),l=w(e,l,i);else if(!i&&T.length>1&&9===t.nodeType&&!x&&h.match.ID.test(T[0])&&!h.match.ID.test(T[T.length-1])&&(f=d.find(T.shift(),t,x),t=f.expr?d.filter(f.expr,f.set)[0]:f.set[0]),t)for(f=i?{expr:T.pop(),set:v(i)}:d.find(T.pop(),1!==T.length||"~"!==T[0]&&"+"!==T[0]||!t.parentNode?t:t.parentNode,x),l=f.expr?d.filter(f.expr,f.set):f.set,T.length>0?u=v(l):b=!1;T.length;)p=T.pop(),g=p,h.relative[p]?g=T.pop():p="",null==g&&(g=t),h.relative[p](u,g,x);else u=T=[];if(u||(u=l),u||d.error(p||e),"[object Array]"===a.call(u))if(b)if(t&&1===t.nodeType)for(y=0;null!=u[y];y++)u[y]&&(u[y]===!0||1===u[y].nodeType&&d.contains(t,u[y]))&&n.push(l[y]);else for(y=0;null!=u[y];y++)u[y]&&1===u[y].nodeType&&n.push(l[y]);else n.push.apply(n,u);else v(u,n);return c&&(d(c,o,n,i),d.uniqueSort(n)),n};d.uniqueSort=function(e){if(x&&(s=l,e.sort(x),s))for(var t=1;t<e.length;t++)e[t]===e[t-1]&&e.splice(t--,1);return e},d.matches=function(e,t){return d(e,null,null,t)},d.matchesSelector=function(e,t){return d(t,null,null,[e]).length>0},d.find=function(e,t,n){var r,i,o,a,s,l;if(!e)return[];for(i=0,o=h.order.length;o>i;i++)if(s=h.order[i],(a=h.leftMatch[s].exec(e))&&(l=a[1],a.splice(1,1),"\\"!==l.substr(l.length-1)&&(a[1]=(a[1]||"").replace(u,""),r=h.find[s](a,t,n),null!=r))){e=e.replace(h.match[s],"");break}return r||(r="undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName("*"):[]),{set:r,expr:e}},d.filter=function(e,n,r,i){for(var o,a,s,l,u,c,f,p,m,g=e,y=[],v=n,b=n&&n[0]&&d.isXML(n[0]);e&&n.length;){for(s in h.filter)if(null!=(o=h.leftMatch[s].exec(e))&&o[2]){if(c=h.filter[s],f=o[1],a=!1,o.splice(1,1),"\\"===f.substr(f.length-1))continue;if(v===y&&(y=[]),h.preFilter[s])if(o=h.preFilter[s](o,v,r,y,i,b)){if(o===!0)continue}else a=l=!0;if(o)for(p=0;null!=(u=v[p]);p++)u&&(l=c(u,o,p,v),m=i^l,r&&null!=l?m?a=!0:v[p]=!1:m&&(y.push(u),a=!0));if(l!==t){if(r||(v=y),e=e.replace(h.match[s],""),!a)return[];break}}if(e===g){if(null!=a)break;d.error(e)}g=e}return v},d.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};var p=d.getText=function(e){var t,n,r=e.nodeType,i="";if(r){if(1===r||9===r){if("string"==typeof e.textContent)return e.textContent;if("string"==typeof e.innerText)return e.innerText.replace(c,"");for(e=e.firstChild;e;e=e.nextSibling)i+=p(e)}else if(3===r||4===r)return e.nodeValue}else for(t=0;n=e[t];t++)8!==n.nodeType&&(i+=p(n));return i},h=d.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(e,t){var n="string"==typeof t,r=n&&!f.test(t),i=n&&!r;r&&(t=t.toLowerCase());for(var o=0,a=e.length,s;a>o;o++)if(s=e[o]){for(;(s=s.previousSibling)&&1!==s.nodeType;);e[o]=i||s&&s.nodeName.toLowerCase()===t?s||!1:s===t}i&&d.filter(t,e,!0)},">":function(e,t){var n,r="string"==typeof t,i=0,o=e.length;if(r&&!f.test(t)){for(t=t.toLowerCase();o>i;i++)if(n=e[i]){var a=n.parentNode;e[i]=a.nodeName.toLowerCase()===t?a:!1}}else{for(;o>i;i++)n=e[i],n&&(e[i]=r?n.parentNode:n.parentNode===t);r&&d.filter(t,e,!0)}},"":function(t,r,i){var a,s=o++,l=n;"string"!=typeof r||f.test(r)||(r=r.toLowerCase(),a=r,l=e),l("parentNode",r,s,t,a,i)},"~":function(t,r,i){var a,s=o++,l=n;"string"!=typeof r||f.test(r)||(r=r.toLowerCase(),a=r,l=e),l("previousSibling",r,s,t,a,i)}},find:{ID:function(e,t,n){if("undefined"!=typeof t.getElementById&&!n){var r=t.getElementById(e[1]);return r&&r.parentNode?[r]:[]}},NAME:function(e,t){if("undefined"!=typeof t.getElementsByName){for(var n=[],r=t.getElementsByName(e[1]),i=0,o=r.length;o>i;i++)r[i].getAttribute("name")===e[1]&&n.push(r[i]);return 0===n.length?null:n}},TAG:function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e[1]):void 0}},preFilter:{CLASS:function(e,t,n,r,i,o){if(e=" "+e[1].replace(u,"")+" ",o)return e;for(var a=0,s;null!=(s=t[a]);a++)s&&(i^(s.className&&(" "+s.className+" ").replace(/[\t\n\r]/g," ").indexOf(e)>=0)?n||r.push(s):n&&(t[a]=!1));return!1},ID:function(e){return e[1].replace(u,"")},TAG:function(e,t){return e[1].replace(u,"").toLowerCase()},CHILD:function(e){if("nth"===e[1]){e[2]||d.error(e[0]),e[2]=e[2].replace(/^\+|\s*/g,"");var t=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec("even"===e[2]&&"2n"||"odd"===e[2]&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=t[1]+(t[2]||1)-0,e[3]=t[3]-0}else e[2]&&d.error(e[0]);return e[0]=o++,e},ATTR:function(e,t,n,r,i,o){var a=e[1]=e[1].replace(u,"");return!o&&h.attrMap[a]&&(e[1]=h.attrMap[a]),e[4]=(e[4]||e[5]||"").replace(u,""),"~="===e[2]&&(e[4]=" "+e[4]+" "),e},PSEUDO:function(e,t,n,i,o){if("not"===e[1]){if(!((r.exec(e[3])||"").length>1||/^\w/.test(e[3]))){var a=d.filter(e[3],t,n,!0^o);return n||i.push.apply(i,a),!1}e[3]=d(e[3],null,null,t)}else if(h.match.POS.test(e[0])||h.match.CHILD.test(e[0]))return!0;return e},POS:function(e){return e.unshift(!0),e}},filters:{enabled:function(e){return e.disabled===!1&&"hidden"!==e.type},disabled:function(e){return e.disabled===!0},checked:function(e){return e.checked===!0},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!!e.firstChild},empty:function(e){return!e.firstChild},has:function(e,t,n){return!!d(n[3],e).length},header:function(e){return/h\d/i.test(e.nodeName)},text:function(e){var t=e.getAttribute("type"),n=e.type;return"input"===e.nodeName.toLowerCase()&&"text"===n&&(t===n||null===t)},radio:function(e){return"input"===e.nodeName.toLowerCase()&&"radio"===e.type},checkbox:function(e){return"input"===e.nodeName.toLowerCase()&&"checkbox"===e.type},file:function(e){return"input"===e.nodeName.toLowerCase()&&"file"===e.type},password:function(e){return"input"===e.nodeName.toLowerCase()&&"password"===e.type},submit:function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&"submit"===e.type},image:function(e){return"input"===e.nodeName.toLowerCase()&&"image"===e.type},reset:function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&"reset"===e.type},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},input:function(e){return/input|select|textarea|button/i.test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(e,t){return 0===t},last:function(e,t,n,r){return t===r.length-1},even:function(e,t){return t%2===0},odd:function(e,t){return t%2===1},lt:function(e,t,n){return t<n[3]-0},gt:function(e,t,n){return t>n[3]-0},nth:function(e,t,n){return n[3]-0===t},eq:function(e,t,n){return n[3]-0===t}},filter:{PSEUDO:function(e,t,n,r){var i=t[1],o=h.filters[i];if(o)return o(e,n,t,r);if("contains"===i)return(e.textContent||e.innerText||p([e])||"").indexOf(t[3])>=0;if("not"===i){for(var a=t[3],s=0,l=a.length;l>s;s++)if(a[s]===e)return!1;return!0}d.error(i)},CHILD:function(e,t){var n,r,o,a,s,l,u,c=t[1],f=e;switch(c){case"only":case"first":for(;f=f.previousSibling;)if(1===f.nodeType)return!1;if("first"===c)return!0;f=e;case"last":for(;f=f.nextSibling;)if(1===f.nodeType)return!1;return!0;case"nth":if(n=t[2],r=t[3],1===n&&0===r)return!0;if(o=t[0],a=e.parentNode,a&&(a[i]!==o||!e.nodeIndex)){for(l=0,f=a.firstChild;f;f=f.nextSibling)1===f.nodeType&&(f.nodeIndex=++l);a[i]=o}return u=e.nodeIndex-r,0===n?0===u:u%n===0&&u/n>=0}},ID:function(e,t){return 1===e.nodeType&&e.getAttribute("id")===t},TAG:function(e,t){return"*"===t&&1===e.nodeType||!!e.nodeName&&e.nodeName.toLowerCase()===t},CLASS:function(e,t){return(" "+(e.className||e.getAttribute("class"))+" ").indexOf(t)>-1},ATTR:function(e,t){var n=t[1],r=d.attr?d.attr(e,n):h.attrHandle[n]?h.attrHandle[n](e):null!=e[n]?e[n]:e.getAttribute(n),i=r+"",o=t[2],a=t[4];return null==r?"!="===o:!o&&d.attr?null!=r:"="===o?i===a:"*="===o?i.indexOf(a)>=0:"~="===o?(" "+i+" ").indexOf(a)>=0:a?"!="===o?i!==a:"^="===o?0===i.indexOf(a):"$="===o?i.substr(i.length-a.length)===a:"|="===o?i===a||i.substr(0,a.length+1)===a+"-":!1:i&&r!==!1},POS:function(e,t,n,r){var i=t[2],o=h.setFilters[i];return o?o(e,n,t,r):void 0}}},m=h.match.POS,g=function(e,t){return"\\"+(t-0+1)};for(var y in h.match)h.match[y]=new RegExp(h.match[y].source+/(?![^\[]*\])(?![^\(]*\))/.source),h.leftMatch[y]=new RegExp(/(^(?:.|\r|\n)*?)/.source+h.match[y].source.replace(/\\(\d+)/g,g));var v=function(e,t){return e=Array.prototype.slice.call(e,0),t?(t.push.apply(t,e),t):e};try{Array.prototype.slice.call(M.documentElement.childNodes,0)[0].nodeType}catch(b){v=function(e,t){var n=0,r=t||[];if("[object Array]"===a.call(e))Array.prototype.push.apply(r,e);else if("number"==typeof e.length)for(var i=e.length;i>n;n++)r.push(e[n]);else for(;e[n];n++)r.push(e[n]);return r}}var x,T;M.documentElement.compareDocumentPosition?x=function(e,t){return e===t?(s=!0,0):e.compareDocumentPosition&&t.compareDocumentPosition?4&e.compareDocumentPosition(t)?-1:1:e.compareDocumentPosition?-1:1}:(x=function(e,t){if(e===t)return s=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],o=[],a=e.parentNode,l=t.parentNode,u=a;if(a===l)return T(e,t);if(!a)return-1;if(!l)return 1;for(;u;)i.unshift(u),u=u.parentNode;for(u=l;u;)o.unshift(u),u=u.parentNode;n=i.length,r=o.length;for(var c=0;n>c&&r>c;c++)if(i[c]!==o[c])return T(i[c],o[c]);return c===n?T(e,o[c],-1):T(i[c],t,1)},T=function(e,t,n){if(e===t){return n;var r=e.nextSibling}for(;r;){if(r===t)return-1;r=r.nextSibling}return 1}),function(){var e=M.createElement("div"),n="script"+(new Date).getTime(),r=M.documentElement;e.innerHTML="<a name='"+n+"'/>",r.insertBefore(e,r.firstChild),M.getElementById(n)&&(h.find.ID=function(e,n,r){if("undefined"!=typeof n.getElementById&&!r){var i=n.getElementById(e[1]);return i?i.id===e[1]||"undefined"!=typeof i.getAttributeNode&&i.getAttributeNode("id").nodeValue===e[1]?[i]:t:[]}},h.filter.ID=function(e,t){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return 1===e.nodeType&&n&&n.nodeValue===t}),r.removeChild(e),r=e=null}(),function(){var e=M.createElement("div");e.appendChild(M.createComment("")),e.getElementsByTagName("*").length>0&&(h.find.TAG=function(e,t){var n=t.getElementsByTagName(e[1]);if("*"===e[1]){for(var r=[],i=0;n[i];i++)1===n[i].nodeType&&r.push(n[i]);n=r}return n}),e.innerHTML="<a href='#'></a>",e.firstChild&&"undefined"!=typeof e.firstChild.getAttribute&&"#"!==e.firstChild.getAttribute("href")&&(h.attrHandle.href=function(e){return e.getAttribute("href",2)}),e=null}(),M.querySelectorAll&&!function(){var e=d,t=M.createElement("div"),n="__sizzle__";if(t.innerHTML="<p class='TEST'></p>",!t.querySelectorAll||0!==t.querySelectorAll(".TEST").length){d=function(t,r,i,o){if(r=r||M,!o&&!d.isXML(r)){var a=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(t);if(a&&(1===r.nodeType||9===r.nodeType)){if(a[1])return v(r.getElementsByTagName(t),i);if(a[2]&&h.find.CLASS&&r.getElementsByClassName)return v(r.getElementsByClassName(a[2]),i)}if(9===r.nodeType){if("body"===t&&r.body)return v([r.body],i);if(a&&a[3]){var s=r.getElementById(a[3]);if(!s||!s.parentNode)return v([],i);if(s.id===a[3])return v([s],i)}try{return v(r.querySelectorAll(t),i)}catch(l){}}else if(1===r.nodeType&&"object"!==r.nodeName.toLowerCase()){var u=r,c=r.getAttribute("id"),f=c||n,p=r.parentNode,m=/^\s*[+~]/.test(t);c?f=f.replace(/'/g,"\\$&"):r.setAttribute("id",f),m&&p&&(r=r.parentNode);try{if(!m||p)return v(r.querySelectorAll("[id='"+f+"'] "+t),i)}catch(g){}finally{c||u.removeAttribute("id")}}}return e(t,r,i,o)};for(var r in e)d[r]=e[r];t=null}}(),function(){var e=M.documentElement,t=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(t){var n=!t.call(M.createElement("div"),"div"),r=!1;try{t.call(M.documentElement,"[test!='']:sizzle")}catch(i){r=!0}d.matchesSelector=function(e,i){if(i=i.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']"),!d.isXML(e))try{if(r||!h.match.PSEUDO.test(i)&&!/!=/.test(i)){var o=t.call(e,i);if(o||!n||e.document&&11!==e.document.nodeType)return o}}catch(a){}return d(i,null,null,[e]).length>0}}}(),function(){var e=M.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>",e.getElementsByClassName&&0!==e.getElementsByClassName("e").length&&(e.lastChild.className="e",1!==e.getElementsByClassName("e").length&&(h.order.splice(1,0,"CLASS"),h.find.CLASS=function(e,t,n){return"undefined"==typeof t.getElementsByClassName||n?void 0:t.getElementsByClassName(e[1])},e=null))}(),d.contains=M.documentElement.contains?function(e,t){return e!==t&&(e.contains?e.contains(t):!0)}:M.documentElement.compareDocumentPosition?function(e,t){return!!(16&e.compareDocumentPosition(t))}:function(){return!1},d.isXML=function(e){var t=(e?e.ownerDocument||e:0).documentElement;return t?"HTML"!==t.nodeName:!1};var w=function(e,t,n){for(var r,i=[],o="",a=t.nodeType?[t]:t;r=h.match.PSEUDO.exec(e);)o+=r[0],e=e.replace(h.match.PSEUDO,"");e=h.relative[e]?e+"*":e;for(var s=0,l=a.length;l>s;s++)d(e,a[s],i,n);return d.filter(o,i)};d.attr=H.attr,d.selectors.attrMap={},H.find=d,H.expr=d.selectors,H.expr[":"]=H.expr.filters,H.unique=d.uniqueSort,H.text=d.getText,H.isXMLDoc=d.isXML,H.contains=d.contains}();var ut=/Until$/,ct=/^(?:parents|prevUntil|prevAll)/,ft=/,/,dt=/^.[^:#\[\.,]*$/,pt=Array.prototype.slice,ht=H.expr.match.POS,mt={children:!0,contents:!0,next:!0,prev:!0};H.fn.extend({find:function(e){var t=this,n,r;if("string"!=typeof e)return H(e).filter(function(){for(n=0,r=t.length;r>n;n++)if(H.contains(t[n],this))return!0});var i=this.pushStack("","find",e),o,a,s;for(n=0,r=this.length;r>n;n++)if(o=i.length,H.find(e,this[n],i),n>0)for(a=o;a<i.length;a++)for(s=0;o>s;s++)if(i[s]===i[a]){i.splice(a--,1);break}return i},has:function(e){var t=H(e);return this.filter(function(){for(var e=0,n=t.length;n>e;e++)if(H.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(u(this,e,!1),"not",e)},filter:function(e){return this.pushStack(u(this,e,!0),"filter",e)},is:function(e){return!!e&&("string"==typeof e?ht.test(e)?H(e,this.context).index(this[0])>=0:H.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n=[],r,i,o=this[0];if(H.isArray(e)){for(var a=1;o&&o.ownerDocument&&o!==t;){for(r=0;r<e.length;r++)H(o).is(e[r])&&n.push({selector:e[r],elem:o,level:a});o=o.parentNode,a++}return n}var s=ht.test(e)||"string"!=typeof e?H(e,t||this.context):0;for(r=0,i=this.length;i>r;r++)for(o=this[r];o;){if(s?s.index(o)>-1:H.find.matchesSelector(o,e)){n.push(o);break}if(o=o.parentNode,!o||!o.ownerDocument||o===t||11===o.nodeType)break}return n=n.length>1?H.unique(n):n,this.pushStack(n,"closest",e)},index:function(e){return e?"string"==typeof e?H.inArray(this[0],H(e)):H.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n="string"==typeof e?H(e,t):H.makeArray(e&&e.nodeType?[e]:e),r=H.merge(this.get(),n);return this.pushStack(l(n[0])||l(r[0])?r:H.unique(r))},andSelf:function(){return this.add(this.prevObject)}}),H.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return H.dir(e,"parentNode")},parentsUntil:function(e,t,n){return H.dir(e,"parentNode",n)},next:function(e){return H.nth(e,2,"nextSibling")},prev:function(e){return H.nth(e,2,"previousSibling")},nextAll:function(e){return H.dir(e,"nextSibling")},prevAll:function(e){return H.dir(e,"previousSibling")},nextUntil:function(e,t,n){return H.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return H.dir(e,"previousSibling",n)},siblings:function(e){return H.sibling(e.parentNode.firstChild,e)},children:function(e){return H.sibling(e.firstChild)},contents:function(e){return H.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:H.makeArray(e.childNodes)}},function(e,t){H.fn[e]=function(n,r){var i=H.map(this,t,n);return ut.test(e)||(r=n),r&&"string"==typeof r&&(i=H.filter(r,i)),i=this.length>1&&!mt[e]?H.unique(i):i,(this.length>1||ft.test(r))&&ct.test(e)&&(i=i.reverse()),this.pushStack(i,e,pt.call(arguments).join(","))}}),H.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?H.find.matchesSelector(t[0],e)?[t[0]]:[]:H.find.matches(e,t)},dir:function(e,n,r){for(var i=[],o=e[n];o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!H(o).is(r));)1===o.nodeType&&i.push(o),o=o[n];return i},nth:function(e,t,n,r){t=t||1;for(var i=0;e&&(1!==e.nodeType||++i!==t);e=e[n]);return e},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});var gt="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",yt=/ jQuery\d+="(?:\d+|null)"/g,vt=/^\s+/,bt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,xt=/<([\w:]+)/,Tt=/<tbody/i,wt=/<|&#?\w+;/,Nt=/<(?:script|style)/i,Ct=/<(?:script|object|embed|option|style)/i,Et=new RegExp("<(?:"+gt+")","i"),kt=/checked\s*(?:[^=]|=\s*.checked.)/i,St=/\/(java|ecma)script/i,At=/^\s*<!(?:\[CDATA\[|\-\-)/,Lt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},jt=c(M);Lt.optgroup=Lt.option,Lt.tbody=Lt.tfoot=Lt.colgroup=Lt.caption=Lt.thead,Lt.th=Lt.td,H.support.htmlSerialize||(Lt._default=[1,"div<div>","</div>"]),H.fn.extend({text:function(e){return H.isFunction(e)?this.each(function(t){var n=H(this);n.text(e.call(this,t,n.text()))}):"object"!=typeof e&&e!==t?this.empty().append((this[0]&&this[0].ownerDocument||M).createTextNode(e)):H.text(this)},wrapAll:function(e){if(H.isFunction(e))return this.each(function(t){H(this).wrapAll(e.call(this,t))});if(this[0]){var t=H(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return this.each(H.isFunction(e)?function(t){H(this).wrapInner(e.call(this,t))}:function(){var t=H(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=H.isFunction(e);return this.each(function(n){H(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){H.nodeName(this,"body")||H(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){1===this.nodeType&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){1===this.nodeType&&this.insertBefore(e,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=H.clean(arguments);return e.push.apply(e,this.toArray()),this.pushStack(e,"before",arguments)
+}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=this.pushStack(this,"after",arguments);return e.push.apply(e,H.clean(arguments)),e}},remove:function(e,t){for(var n=0,r;null!=(r=this[n]);n++)(!e||H.filter(e,[r]).length)&&(t||1!==r.nodeType||(H.cleanData(r.getElementsByTagName("*")),H.cleanData([r])),r.parentNode&&r.parentNode.removeChild(r));return this},empty:function(){for(var e=0,t;null!=(t=this[e]);e++)for(1===t.nodeType&&H.cleanData(t.getElementsByTagName("*"));t.firstChild;)t.removeChild(t.firstChild);return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return H.clone(this,e,t)})},html:function(e){if(e===t)return this[0]&&1===this[0].nodeType?this[0].innerHTML.replace(yt,""):null;if("string"!=typeof e||Nt.test(e)||!H.support.leadingWhitespace&&vt.test(e)||Lt[(xt.exec(e)||["",""])[1].toLowerCase()])H.isFunction(e)?this.each(function(t){var n=H(this);n.html(e.call(this,t,n.html()))}):this.empty().append(e);else{e=e.replace(bt,"<$1></$2>");try{for(var n=0,r=this.length;r>n;n++)1===this[n].nodeType&&(H.cleanData(this[n].getElementsByTagName("*")),this[n].innerHTML=e)}catch(i){this.empty().append(e)}}return this},replaceWith:function(e){return this[0]&&this[0].parentNode?H.isFunction(e)?this.each(function(t){var n=H(this),r=n.html();n.replaceWith(e.call(this,t,r))}):("string"!=typeof e&&(e=H(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;H(this).remove(),t?H(t).before(e):H(n).append(e)})):this.length?this.pushStack(H(H.isFunction(e)?e():e),"replaceWith",e):this},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){var i,o,a,s,l=e[0],u=[];if(!H.support.checkClone&&3===arguments.length&&"string"==typeof l&&kt.test(l))return this.each(function(){H(this).domManip(e,n,r,!0)});if(H.isFunction(l))return this.each(function(i){var o=H(this);e[0]=l.call(this,i,n?o.html():t),o.domManip(e,n,r)});if(this[0]){if(s=l&&l.parentNode,i=H.support.parentNode&&s&&11===s.nodeType&&s.childNodes.length===this.length?{fragment:s}:H.buildFragment(e,this,u),a=i.fragment,o=1===a.childNodes.length?a=a.firstChild:a.firstChild){n=n&&H.nodeName(o,"tr");for(var c=0,d=this.length,p=d-1;d>c;c++)r.call(n?f(this[c],o):this[c],i.cacheable||d>1&&p>c?H.clone(a,!0,!0):a)}u.length&&H.each(u,v)}return this}}),H.buildFragment=function(e,t,n){var r,i,o,a,s=e[0];return t&&t[0]&&(a=t[0].ownerDocument||t[0]),a.createDocumentFragment||(a=M),!(1===e.length&&"string"==typeof s&&s.length<512&&a===M&&"<"===s.charAt(0))||Ct.test(s)||!H.support.checkClone&&kt.test(s)||!H.support.html5Clone&&Et.test(s)||(i=!0,o=H.fragments[s],o&&1!==o&&(r=o)),r||(r=a.createDocumentFragment(),H.clean(e,a,r,n)),i&&(H.fragments[s]=o?r:1),{fragment:r,cacheable:i}},H.fragments={},H.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){H.fn[e]=function(n){var r=[],i=H(n),o=1===this.length&&this[0].parentNode;if(o&&11===o.nodeType&&1===o.childNodes.length&&1===i.length)return i[t](this[0]),this;for(var a=0,s=i.length;s>a;a++){var l=(a>0?this.clone(!0):this).get();H(i[a])[t](l),r=r.concat(l)}return this.pushStack(r,e,i.selector)}}),H.extend({clone:function(e,t,n){var r,i,o,a=H.support.html5Clone||!Et.test("<"+e.nodeName)?e.cloneNode(!0):y(e);if(!(H.support.noCloneEvent&&H.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||H.isXMLDoc(e)))for(p(e,a),r=h(e),i=h(a),o=0;r[o];++o)i[o]&&p(r[o],i[o]);if(t&&(d(e,a),n))for(r=h(e),i=h(a),o=0;r[o];++o)d(r[o],i[o]);return r=i=null,a},clean:function(e,t,n,r){var i;t=t||M,"undefined"==typeof t.createElement&&(t=t.ownerDocument||t[0]&&t[0].ownerDocument||M);for(var o=[],a,s=0,l;null!=(l=e[s]);s++)if("number"==typeof l&&(l+=""),l){if("string"==typeof l)if(wt.test(l)){l=l.replace(bt,"<$1></$2>");var u=(xt.exec(l)||["",""])[1].toLowerCase(),f=Lt[u]||Lt._default,d=f[0],p=t.createElement("div");for(t===M?jt.appendChild(p):c(t).appendChild(p),p.innerHTML=f[1]+l+f[2];d--;)p=p.lastChild;if(!H.support.tbody){var h=Tt.test(l),m="table"!==u||h?"<table>"!==f[1]||h?[]:p.childNodes:p.firstChild&&p.firstChild.childNodes;for(a=m.length-1;a>=0;--a)H.nodeName(m[a],"tbody")&&!m[a].childNodes.length&&m[a].parentNode.removeChild(m[a])}!H.support.leadingWhitespace&&vt.test(l)&&p.insertBefore(t.createTextNode(vt.exec(l)[0]),p.firstChild),l=p.childNodes}else l=t.createTextNode(l);var y;if(!H.support.appendChecked)if(l[0]&&"number"==typeof(y=l.length))for(a=0;y>a;a++)g(l[a]);else g(l);l.nodeType?o.push(l):o=H.merge(o,l)}if(n)for(i=function(e){return!e.type||St.test(e.type)},s=0;o[s];s++)if(!r||!H.nodeName(o[s],"script")||o[s].type&&"text/javascript"!==o[s].type.toLowerCase()){if(1===o[s].nodeType){var v=H.grep(o[s].getElementsByTagName("script"),i);o.splice.apply(o,[s+1,0].concat(v))}n.appendChild(o[s])}else r.push(o[s].parentNode?o[s].parentNode.removeChild(o[s]):o[s]);return o},cleanData:function(e){for(var t,n,r=H.cache,i=H.event.special,o=H.support.deleteExpando,a=0,s;null!=(s=e[a]);a++)if((!s.nodeName||!H.noData[s.nodeName.toLowerCase()])&&(n=s[H.expando])){if(t=r[n],t&&t.events){for(var l in t.events)i[l]?H.event.remove(s,l):H.removeEvent(s,l,t.handle);t.handle&&(t.handle.elem=null)}o?delete s[H.expando]:s.removeAttribute&&s.removeAttribute(H.expando),delete r[n]}}});var Ft=/alpha\([^)]*\)/i,Dt=/opacity=([^)]*)/,Mt=/([A-Z]|^ms)/g,Ot=/^-?\d+(?:px)?$/i,_t=/^-?\d/,Ht=/^([\-+])=([\-+.\de]+)/,Bt={position:"absolute",visibility:"hidden",display:"block"},Pt=["Left","Right"],qt=["Top","Bottom"],Wt,It,$t;H.fn.css=function(e,n){return 2===arguments.length&&n===t?this:H.access(this,e,n,!0,function(e,n,r){return r!==t?H.style(e,n,r):H.css(e,n)})},H.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity","opacity");return""===n?"1":n}return e.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":H.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s=H.camelCase(n),l=e.style,u=H.cssHooks[s];if(n=H.cssProps[s]||s,r===t)return u&&"get"in u&&(o=u.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Ht.exec(r))&&(r=+(o[1]+1)*+o[2]+parseFloat(H.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||H.cssNumber[s]||(r+="px"),u&&"set"in u&&(r=u.set(e,r))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r){var i,o;return n=H.camelCase(n),o=H.cssHooks[n],n=H.cssProps[n]||n,"cssFloat"===n&&(n="float"),o&&"get"in o&&(i=o.get(e,!0,r))!==t?i:Wt?Wt(e,n):void 0},swap:function(e,t,n){var r={};for(var i in t)r[i]=e.style[i],e.style[i]=t[i];n.call(e);for(i in t)e.style[i]=r[i]}}),H.curCSS=H.css,H.each(["height","width"],function(e,t){H.cssHooks[t]={get:function(e,n,r){var i;return n?0!==e.offsetWidth?b(e,t,r):(H.swap(e,Bt,function(){i=b(e,t,r)}),i):void 0},set:function(e,t){return Ot.test(t)?(t=parseFloat(t),t>=0?t+"px":void 0):t}}}),H.support.opacity||(H.cssHooks.opacity={get:function(e,t){return Dt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?parseFloat(RegExp.$1)/100+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=H.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,t>=1&&""===H.trim(o.replace(Ft,""))&&(n.removeAttribute("filter"),r&&!r.filter)||(n.filter=Ft.test(o)?o.replace(Ft,i):o+" "+i)}}),H(function(){H.support.reliableMarginRight||(H.cssHooks.marginRight={get:function(e,t){var n;return H.swap(e,{display:"inline-block"},function(){n=t?Wt(e,"margin-right","marginRight"):e.style.marginRight}),n}})}),M.defaultView&&M.defaultView.getComputedStyle&&(It=function(e,t){var n,r,i;return t=t.replace(Mt,"-$1").toLowerCase(),(r=e.ownerDocument.defaultView)&&(i=r.getComputedStyle(e,null))&&(n=i.getPropertyValue(t),""!==n||H.contains(e.ownerDocument.documentElement,e)||(n=H.style(e,t))),n}),M.documentElement.currentStyle&&($t=function(e,t){var n,r,i,o=e.currentStyle&&e.currentStyle[t],a=e.style;return null===o&&a&&(i=a[t])&&(o=i),!Ot.test(o)&&_t.test(o)&&(n=a.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),a.left="fontSize"===t?"1em":o||0,o=a.pixelLeft+"px",a.left=n,r&&(e.runtimeStyle.left=r)),""===o?"auto":o}),Wt=It||$t,H.expr&&H.expr.filters&&(H.expr.filters.hidden=function(e){var t=e.offsetWidth,n=e.offsetHeight;return 0===t&&0===n||!H.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||H.css(e,"display"))},H.expr.filters.visible=function(e){return!H.expr.filters.hidden(e)});var Rt=/%20/g,Xt=/\[\]$/,zt=/\r?\n/g,Vt=/#.*$/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Gt=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,Jt=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Qt=/^\/\//,Kt=/\?/,Zt=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,en=/^(?:select|textarea)/i,tn=/\s+/,nn=/([?&])_=[^&]*/,rn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,on=H.fn.load,an={},sn={},ln,un,cn=["*/"]+["*"];try{ln=_.href}catch(fn){ln=M.createElement("a"),ln.href="",ln=ln.href}un=rn.exec(ln.toLowerCase())||[],H.fn.extend({load:function(e,n,r){if("string"!=typeof e&&on)return on.apply(this,arguments);if(!this.length)return this;var i=e.indexOf(" ");if(i>=0){var o=e.slice(i,e.length);e=e.slice(0,i)}var a="GET";n&&(H.isFunction(n)?(r=n,n=t):"object"==typeof n&&(n=H.param(n,H.ajaxSettings.traditional),a="POST"));var s=this;return H.ajax({url:e,type:a,dataType:"html",data:n,complete:function(e,t,n){n=e.responseText,e.isResolved()&&(e.done(function(e){n=e}),s.html(o?H("<div>").append(n.replace(Zt,"")).find(o):n)),r&&s.each(r,[n,t,e])}}),this},serialize:function(){return H.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?H.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||en.test(this.nodeName)||Gt.test(this.type))}).map(function(e,t){var n=H(this).val();return null==n?null:H.isArray(n)?H.map(n,function(e,n){return{name:t.name,value:e.replace(zt,"\r\n")}}):{name:t.name,value:n.replace(zt,"\r\n")}}).get()}}),H.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){H.fn[t]=function(e){return this.on(t,e)}}),H.each(["get","post"],function(e,n){H[n]=function(e,r,i,o){return H.isFunction(r)&&(o=o||i,i=r,r=t),H.ajax({type:n,url:e,data:r,success:i,dataType:o})}}),H.extend({getScript:function(e,n){return H.get(e,t,n,"script")},getJSON:function(e,t,n){return H.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?w(e,H.ajaxSettings):(t=e,e=H.ajaxSettings),w(e,t),e},ajaxSettings:{url:ln,isLocal:Jt.test(un[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":H.parseJSON,"text xml":H.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:x(an),ajaxTransport:x(sn),ajax:function(e,n){function r(e,n,r,f){if(2!==v){v=2,g&&clearTimeout(g),m=t,p=f||"",w.readyState=e>0?4:0;var d,h,y,x=n,T=r?C(i,w,r):t,N,k;if(e>=200&&300>e||304===e)if(i.ifModified&&((N=w.getResponseHeader("Last-Modified"))&&(H.lastModified[c]=N),(k=w.getResponseHeader("Etag"))&&(H.etag[c]=k)),304===e)x="notmodified",d=!0;else try{h=E(i,T),x="success",d=!0}catch(S){x="parsererror",y=S}else y=x,(!x||e)&&(x="error",0>e&&(e=0));w.status=e,w.statusText=""+(n||x),d?s.resolveWith(o,[h,x,w]):s.rejectWith(o,[w,x,y]),w.statusCode(u),u=t,b&&a.trigger("ajax"+(d?"Success":"Error"),[w,i,d?h:y]),l.fireWith(o,[w,x]),b&&(a.trigger("ajaxComplete",[w,i]),--H.active||H.event.trigger("ajaxStop"))}}"object"==typeof e&&(n=e,e=t),n=n||{};var i=H.ajaxSetup({},n),o=i.context||i,a=o!==i&&(o.nodeType||o instanceof H)?H(o):H.event,s=H.Deferred(),l=H.Callbacks("once memory"),u=i.statusCode||{},c,f={},d={},p,h,m,g,y,v=0,b,x,w={readyState:0,setRequestHeader:function(e,t){if(!v){var n=e.toLowerCase();e=d[n]=d[n]||e,f[e]=t}return this},getAllResponseHeaders:function(){return 2===v?p:null},getResponseHeader:function(e){var n;if(2===v){if(!h)for(h={};n=Ut.exec(p);)h[n[1].toLowerCase()]=n[2];n=h[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return v||(i.mimeType=e),this},abort:function(e){return e=e||"abort",m&&m.abort(e),r(0,e),this}};if(s.promise(w),w.success=w.done,w.error=w.fail,w.complete=l.add,w.statusCode=function(e){if(e){var t;if(2>v)for(t in e)u[t]=[u[t],e[t]];else t=e[w.status],w.then(t,t)}return this},i.url=((e||i.url)+"").replace(Vt,"").replace(Qt,un[1]+"//"),i.dataTypes=H.trim(i.dataType||"*").toLowerCase().split(tn),null==i.crossDomain&&(y=rn.exec(i.url.toLowerCase()),i.crossDomain=!(!y||y[1]==un[1]&&y[2]==un[2]&&(y[3]||("http:"===y[1]?80:443))==(un[3]||("http:"===un[1]?80:443)))),i.data&&i.processData&&"string"!=typeof i.data&&(i.data=H.param(i.data,i.traditional)),T(an,i,n,w),2===v)return!1;if(b=i.global,i.type=i.type.toUpperCase(),i.hasContent=!Yt.test(i.type),b&&0===H.active++&&H.event.trigger("ajaxStart"),!i.hasContent&&(i.data&&(i.url+=(Kt.test(i.url)?"&":"?")+i.data,delete i.data),c=i.url,i.cache===!1)){var N=H.now(),k=i.url.replace(nn,"$1_="+N);i.url=k+(k===i.url?(Kt.test(i.url)?"&":"?")+"_="+N:"")}(i.data&&i.hasContent&&i.contentType!==!1||n.contentType)&&w.setRequestHeader("Content-Type",i.contentType),i.ifModified&&(c=c||i.url,H.lastModified[c]&&w.setRequestHeader("If-Modified-Since",H.lastModified[c]),H.etag[c]&&w.setRequestHeader("If-None-Match",H.etag[c])),w.setRequestHeader("Accept",i.dataTypes[0]&&i.accepts[i.dataTypes[0]]?i.accepts[i.dataTypes[0]]+("*"!==i.dataTypes[0]?", "+cn+"; q=0.01":""):i.accepts["*"]);for(x in i.headers)w.setRequestHeader(x,i.headers[x]);if(i.beforeSend&&(i.beforeSend.call(o,w,i)===!1||2===v))return w.abort(),!1;for(x in{success:1,error:1,complete:1})w[x](i[x]);if(m=T(sn,i,n,w)){w.readyState=1,b&&a.trigger("ajaxSend",[w,i]),i.async&&i.timeout>0&&(g=setTimeout(function(){w.abort("timeout")},i.timeout));try{v=1,m.send(f,r)}catch(S){if(!(2>v))throw S;r(-1,S)}}else r(-1,"No Transport");return w},param:function(e,n){var r=[],i=function(e,t){t=H.isFunction(t)?t():t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=H.ajaxSettings.traditional),H.isArray(e)||e.jquery&&!H.isPlainObject(e))H.each(e,function(){i(this.name,this.value)});else for(var o in e)N(o,e[o],n,i);return r.join("&").replace(Rt,"+")}}),H.extend({active:0,lastModified:{},etag:{}});var dn=H.now(),pn=/(\=)\?(&|$)|\?\?/i;H.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return H.expando+"_"+dn++}}),H.ajaxPrefilter("json jsonp",function(t,n,r){var i="application/x-www-form-urlencoded"===t.contentType&&"string"==typeof t.data;if("jsonp"===t.dataTypes[0]||t.jsonp!==!1&&(pn.test(t.url)||i&&pn.test(t.data))){var o,a=t.jsonpCallback=H.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s=e[a],l=t.url,u=t.data,c="$1"+a+"$2";return t.jsonp!==!1&&(l=l.replace(pn,c),t.url===l&&(i&&(u=u.replace(pn,c)),t.data===u&&(l+=(/\?/.test(l)?"&":"?")+t.jsonp+"="+a))),t.url=l,t.data=u,e[a]=function(e){o=[e]},r.always(function(){e[a]=s,o&&H.isFunction(s)&&e[a](o[0])}),t.converters["script json"]=function(){return o||H.error(a+" was not called"),o[0]},t.dataTypes[0]="json","script"}}),H.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return H.globalEval(e),e}}}),H.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),H.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=M.head||M.getElementsByTagName("head")[0]||M.documentElement;return{send:function(i,o){n=M.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){(i||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var hn=e.ActiveXObject?function(){for(var e in gn)gn[e](0,1)}:!1,mn=0,gn;H.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&k()||S()}:k,function(e){H.extend(H.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(H.ajaxSettings.xhr()),H.support.ajax&&H.ajaxTransport(function(n){if(!n.crossDomain||H.support.cors){var r;return{send:function(i,o){var a=n.xhr(),s,l;if(n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async),n.xhrFields)for(l in n.xhrFields)a[l]=n.xhrFields[l];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(l in i)a.setRequestHeader(l,i[l])}catch(u){}a.send(n.hasContent&&n.data||null),r=function(e,i){var l,u,c,f,d;try{if(r&&(i||4===a.readyState))if(r=t,s&&(a.onreadystatechange=H.noop,hn&&delete gn[s]),i)4!==a.readyState&&a.abort();else{l=a.status,c=a.getAllResponseHeaders(),f={},d=a.responseXML,d&&d.documentElement&&(f.xml=d),f.text=a.responseText;try{u=a.statusText}catch(p){u=""}l||!n.isLocal||n.crossDomain?1223===l&&(l=204):l=f.text?200:404}}catch(h){i||o(-1,h)}f&&o(l,u,f,c)},n.async&&4!==a.readyState?(s=++mn,hn&&(gn||(gn={},H(e).unload(hn)),gn[s]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var yn={},vn,bn,xn=/^(?:toggle|show|hide)$/,Tn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,wn,Nn=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],Cn;H.fn.extend({show:function(e,t,n){var r,i;if(e||0===e)return this.animate(j("show",3),e,t,n);for(var o=0,a=this.length;a>o;o++)r=this[o],r.style&&(i=r.style.display,H._data(r,"olddisplay")||"none"!==i||(i=r.style.display=""),""===i&&"none"===H.css(r,"display")&&H._data(r,"olddisplay",F(r.nodeName)));for(o=0;a>o;o++)r=this[o],r.style&&(i=r.style.display,(""===i||"none"===i)&&(r.style.display=H._data(r,"olddisplay")||""));return this},hide:function(e,t,n){if(e||0===e)return this.animate(j("hide",3),e,t,n);for(var r,i,o=0,a=this.length;a>o;o++)r=this[o],r.style&&(i=H.css(r,"display"),"none"===i||H._data(r,"olddisplay")||H._data(r,"olddisplay",i));for(o=0;a>o;o++)this[o].style&&(this[o].style.display="none");return this},_toggle:H.fn.toggle,toggle:function(e,t,n){var r="boolean"==typeof e;return H.isFunction(e)&&H.isFunction(t)?this._toggle.apply(this,arguments):null==e||r?this.each(function(){var t=r?e:H(this).is(":hidden");H(this)[t?"show":"hide"]()}):this.animate(j("toggle",3),e,t,n),this},fadeTo:function(e,t,n,r){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){function i(){o.queue===!1&&H._mark(this);var t=H.extend({},o),n=1===this.nodeType,r=n&&H(this).is(":hidden"),i,a,s,l,u,c,f,d,p;t.animatedProperties={};for(s in e){if(i=H.camelCase(s),s!==i&&(e[i]=e[s],delete e[s]),a=e[i],H.isArray(a)?(t.animatedProperties[i]=a[1],a=e[i]=a[0]):t.animatedProperties[i]=t.specialEasing&&t.specialEasing[i]||t.easing||"swing","hide"===a&&r||"show"===a&&!r)return t.complete.call(this);!n||"height"!==i&&"width"!==i||(t.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],"inline"===H.css(this,"display")&&"none"===H.css(this,"float")&&(H.support.inlineBlockNeedsLayout&&"inline"!==F(this.nodeName)?this.style.zoom=1:this.style.display="inline-block"))}null!=t.overflow&&(this.style.overflow="hidden");for(s in e)l=new H.fx(this,t,s),a=e[s],xn.test(a)?(p=H._data(this,"toggle"+s)||("toggle"===a?r?"show":"hide":0),p?(H._data(this,"toggle"+s,"show"===p?"hide":"show"),l[p]()):l[a]()):(u=Tn.exec(a),c=l.cur(),u?(f=parseFloat(u[2]),d=u[3]||(H.cssNumber[s]?"":"px"),"px"!==d&&(H.style(this,s,(f||1)+d),c=(f||1)/l.cur()*c,H.style(this,s,c+d)),u[1]&&(f=("-="===u[1]?-1:1)*f+c),l.custom(c,f,d)):l.custom(c,a,""));return!0}var o=H.speed(t,n,r);return H.isEmptyObject(e)?this.each(o.complete,[!1]):(e=H.extend({},e),o.queue===!1?this.each(i):this.queue(o.queue,i))},stop:function(e,n,r){return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){function t(e,t,n){var i=t[n];H.removeData(e,n,!0),i.stop(r)}var n,i=!1,o=H.timers,a=H._data(this);if(r||H._unmark(!0,this),null==e)for(n in a)a[n]&&a[n].stop&&n.indexOf(".run")===n.length-4&&t(this,a,n);else a[n=e+".run"]&&a[n].stop&&t(this,a,n);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(r?o[n](!0):o[n].saveState(),i=!0,o.splice(n,1));r&&i||H.dequeue(this,e)})}}),H.each({slideDown:j("show",1),slideUp:j("hide",1),slideToggle:j("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){H.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),H.extend({speed:function(e,t,n){var r=e&&"object"==typeof e?H.extend({},e):{complete:n||!n&&t||H.isFunction(e)&&e,duration:e,easing:n&&t||t&&!H.isFunction(t)&&t};return r.duration=H.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in H.fx.speeds?H.fx.speeds[r.duration]:H.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(e){H.isFunction(r.old)&&r.old.call(this),r.queue?H.dequeue(this,r.queue):e!==!1&&H._unmark(this)},r},easing:{linear:function(e,t,n,r){return n+r*e},swing:function(e,t,n,r){return(-Math.cos(e*Math.PI)/2+.5)*r+n}},timers:[],fx:function(e,t,n){this.options=t,this.elem=e,this.prop=n,t.orig=t.orig||{}}}),H.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(H.fx.step[this.prop]||H.fx.step._default)(this)},cur:function(){if(null!=this.elem[this.prop]&&(!this.elem.style||null==this.elem.style[this.prop]))return this.elem[this.prop];var e,t=H.css(this.elem,this.prop);return isNaN(e=parseFloat(t))?t&&"auto"!==t?t:0:e},custom:function(e,n,r){function i(e){return o.step(e)}var o=this,a=H.fx;this.startTime=Cn||A(),this.end=n,this.now=this.start=e,this.pos=this.state=0,this.unit=r||this.unit||(H.cssNumber[this.prop]?"":"px"),i.queue=this.options.queue,i.elem=this.elem,i.saveState=function(){o.options.hide&&H._data(o.elem,"fxshow"+o.prop)===t&&H._data(o.elem,"fxshow"+o.prop,o.start)},i()&&H.timers.push(i)&&!wn&&(wn=setInterval(a.tick,a.interval))},show:function(){var e=H._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=e||H.style(this.elem,this.prop),this.options.show=!0,e!==t?this.custom(this.cur(),e):this.custom("width"===this.prop||"height"===this.prop?1:0,this.cur()),H(this.elem).show()},hide:function(){this.options.orig[this.prop]=H._data(this.elem,"fxshow"+this.prop)||H.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(e){var t,n,r,i=Cn||A(),o=!0,a=this.elem,s=this.options;if(e||i>=s.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),s.animatedProperties[this.prop]=!0;for(t in s.animatedProperties)s.animatedProperties[t]!==!0&&(o=!1);if(o){if(null==s.overflow||H.support.shrinkWrapBlocks||H.each(["","X","Y"],function(e,t){a.style["overflow"+t]=s.overflow[e]}),s.hide&&H(a).hide(),s.hide||s.show)for(t in s.animatedProperties)H.style(a,t,s.orig[t]),H.removeData(a,"fxshow"+t,!0),H.removeData(a,"toggle"+t,!0);r=s.complete,r&&(s.complete=!1,r.call(a))}return!1}return 1/0==s.duration?this.now=i:(n=i-this.startTime,this.state=n/s.duration,this.pos=H.easing[s.animatedProperties[this.prop]](this.state,n,0,1,s.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update(),!0}},H.extend(H.fx,{tick:function(){for(var e,t=H.timers,n=0;n<t.length;n++)e=t[n],e()||t[n]!==e||t.splice(n--,1);t.length||H.fx.stop()},interval:13,stop:function(){clearInterval(wn),wn=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){H.style(e.elem,"opacity",e.now)},_default:function(e){e.elem.style&&null!=e.elem.style[e.prop]?e.elem.style[e.prop]=e.now+e.unit:e.elem[e.prop]=e.now}}}),H.each(["width","height"],function(e,t){H.fx.step[t]=function(e){H.style(e.elem,t,Math.max(0,e.now)+e.unit)}}),H.expr&&H.expr.filters&&(H.expr.filters.animated=function(e){return H.grep(H.timers,function(t){return e===t.elem}).length});var En=/^t(?:able|d|h)$/i,kn=/^(?:body|html)$/i;H.fn.offset="getBoundingClientRect"in M.documentElement?function(e){var t=this[0],n;if(e)return this.each(function(t){H.offset.setOffset(this,e,t)});if(!t||!t.ownerDocument)return null;if(t===t.ownerDocument.body)return H.offset.bodyOffset(t);try{n=t.getBoundingClientRect()}catch(r){}var i=t.ownerDocument,o=i.documentElement;if(!n||!H.contains(o,t))return n?{top:n.top,left:n.left}:{top:0,left:0};var a=i.body,s=D(i),l=o.clientTop||a.clientTop||0,u=o.clientLeft||a.clientLeft||0,c=s.pageYOffset||H.support.boxModel&&o.scrollTop||a.scrollTop,f=s.pageXOffset||H.support.boxModel&&o.scrollLeft||a.scrollLeft,d=n.top+c-l,p=n.left+f-u;return{top:d,left:p}}:function(e){var t=this[0];if(e)return this.each(function(t){H.offset.setOffset(this,e,t)});if(!t||!t.ownerDocument)return null;if(t===t.ownerDocument.body)return H.offset.bodyOffset(t);for(var n,r=t.offsetParent,i=t,o=t.ownerDocument,a=o.documentElement,s=o.body,l=o.defaultView,u=l?l.getComputedStyle(t,null):t.currentStyle,c=t.offsetTop,f=t.offsetLeft;(t=t.parentNode)&&t!==s&&t!==a&&(!H.support.fixedPosition||"fixed"!==u.position);)n=l?l.getComputedStyle(t,null):t.currentStyle,c-=t.scrollTop,f-=t.scrollLeft,t===r&&(c+=t.offsetTop,f+=t.offsetLeft,!H.support.doesNotAddBorder||H.support.doesAddBorderForTableAndCells&&En.test(t.nodeName)||(c+=parseFloat(n.borderTopWidth)||0,f+=parseFloat(n.borderLeftWidth)||0),i=r,r=t.offsetParent),H.support.subtractsBorderForOverflowNotVisible&&"visible"!==n.overflow&&(c+=parseFloat(n.borderTopWidth)||0,f+=parseFloat(n.borderLeftWidth)||0),u=n;return("relative"===u.position||"static"===u.position)&&(c+=s.offsetTop,f+=s.offsetLeft),H.support.fixedPosition&&"fixed"===u.position&&(c+=Math.max(a.scrollTop,s.scrollTop),f+=Math.max(a.scrollLeft,s.scrollLeft)),{top:c,left:f}},H.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return H.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(H.css(e,"marginTop"))||0,n+=parseFloat(H.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=H.css(e,"position");"static"===r&&(e.style.position="relative");var i=H(e),o=i.offset(),a=H.css(e,"top"),s=H.css(e,"left"),l=("absolute"===r||"fixed"===r)&&H.inArray("auto",[a,s])>-1,u={},c={},f,d;l?(c=i.position(),f=c.top,d=c.left):(f=parseFloat(a)||0,d=parseFloat(s)||0),H.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+f),null!=t.left&&(u.left=t.left-o.left+d),"using"in t?t.using.call(e,u):i.css(u)}},H.fn.extend({position:function(){if(!this[0])return null;var e=this[0],t=this.offsetParent(),n=this.offset(),r=kn.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(H.css(e,"marginTop"))||0,n.left-=parseFloat(H.css(e,"marginLeft"))||0,r.top+=parseFloat(H.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(H.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||M.body;e&&!kn.test(e.nodeName)&&"static"===H.css(e,"position");)e=e.offsetParent;return e})}}),H.each(["Left","Top"],function(e,n){var r="scroll"+n;H.fn[r]=function(n){var i,o;return n===t?(i=this[0])?(o=D(i),o?"pageXOffset"in o?o[e?"pageYOffset":"pageXOffset"]:H.support.boxModel&&o.document.documentElement[r]||o.document.body[r]:i[r]):null:this.each(function(){o=D(this),o?o.scrollTo(e?H(o).scrollLeft():n,e?n:H(o).scrollTop()):this[r]=n})}}),H.each(["Height","Width"],function(e,n){var r=n.toLowerCase();H.fn["inner"+n]=function(){var e=this[0];return e?e.style?parseFloat(H.css(e,r,"padding")):this[r]():null},H.fn["outer"+n]=function(e){var t=this[0];return t?t.style?parseFloat(H.css(t,r,e?"margin":"border")):this[r]():null},H.fn[r]=function(e){var i=this[0];if(!i)return null==e?null:this;if(H.isFunction(e))return this.each(function(t){var n=H(this);n[r](e.call(this,t,n[r]()))});if(H.isWindow(i)){var o=i.document.documentElement["client"+n],a=i.document.body;return"CSS1Compat"===i.document.compatMode&&o||a&&a["client"+n]||o}if(9===i.nodeType)return Math.max(i.documentElement["client"+n],i.body["scroll"+n],i.documentElement["scroll"+n],i.body["offset"+n],i.documentElement["offset"+n]);if(e===t){var s=H.css(i,r),l=parseFloat(s);return H.isNumeric(l)?l:s}return this.css(r,"string"==typeof e?e:e+"px")}}),e.jQuery=e.$=H,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return H})}(window);
\ No newline at end of file
diff --git a/static/open-iot-challenge/js/shuffle.js b/static/open-iot-challenge/js/shuffle.js
new file mode 100644
index 0000000000000000000000000000000000000000..9bdc80749c39c19416ff1d39abfd168acc60f857
--- /dev/null
+++ b/static/open-iot-challenge/js/shuffle.js
@@ -0,0 +1,11 @@
+$.fn.shuffle = function() {
+    return this.each(function() {
+        var items = $(this).children().clone(true);
+        return (items.length) ? $(this).html($.shuffle(items)) : this;
+    });
+}
+
+$.shuffle = function(arr) {
+    for (var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
+    return arr;
+}
\ No newline at end of file
diff --git a/static/open-iot-challenge/js/smoothscroll.js b/static/open-iot-challenge/js/smoothscroll.js
new file mode 100755
index 0000000000000000000000000000000000000000..d3306ad8c6dddd184c9513ad0640432d90a9a47f
--- /dev/null
+++ b/static/open-iot-challenge/js/smoothscroll.js
@@ -0,0 +1 @@
+var ss={fixAllLinks:function(){var e=document.getElementsByTagName("a");for(var t=0;t<e.length;t++){var n=e[t];if(n.href&&n.href.indexOf("#")!=-1&&(n.pathname==location.pathname||"/"+n.pathname==location.pathname)&&n.search==location.search){ss.addEvent(n,"click",ss.smoothScroll)}}},smoothScroll:function(e){if(window.event){target=window.event.srcElement}else if(e){target=e.target}else return;if(target.nodeName.toLowerCase()!="a"){target=target.parentNode}if(target.nodeName.toLowerCase()!="a")return;anchor=target.hash.substr(1);var t=document.getElementsByTagName("a");var n=null;for(var r=0;r<t.length;r++){var i=t[r];if(i.name&&i.name==anchor){n=i;break}}if(!n)n=document.getElementById(anchor);if(!n)return true;var s=n.offsetLeft;var o=n.offsetTop;var u=n;while(u.offsetParent&&u.offsetParent!=document.body){u=u.offsetParent;s+=u.offsetLeft;o+=u.offsetTop}clearInterval(ss.INTERVAL);cypos=ss.getCurrentYPos();ss_stepsize=parseInt((o-cypos)/ss.STEPS);ss.INTERVAL=setInterval("ss.scrollWindow("+ss_stepsize+","+o+',"'+anchor+'")',10);if(window.event){window.event.cancelBubble=true;window.event.returnValue=false}if(e&&e.preventDefault&&e.stopPropagation){e.preventDefault();e.stopPropagation()}},scrollWindow:function(e,t,n){wascypos=ss.getCurrentYPos();isAbove=wascypos<t;window.scrollTo(0,wascypos+e);iscypos=ss.getCurrentYPos();isAboveNow=iscypos<t;if(isAbove!=isAboveNow||wascypos==iscypos){window.scrollTo(0,t);clearInterval(ss.INTERVAL);location.hash=n}},getCurrentYPos:function(){if(document.body&&document.body.scrollTop)return document.body.scrollTop;if(document.documentElement&&document.documentElement.scrollTop)return document.documentElement.scrollTop;if(window.pageYOffset)return window.pageYOffset;return 0},addEvent:function(e,t,n,r){if(e.addEventListener){e.addEventListener(t,n,r);return true}else if(e.attachEvent){var i=e.attachEvent("on"+t,n);return i}else{alert("Handler could not be removed")}}};ss.STEPS=25;ss.addEvent(window,"load",ss.fixAllLinks)
\ No newline at end of file
diff --git a/static/open-iot-challenge/js/tweecool.min.js b/static/open-iot-challenge/js/tweecool.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..6ef31548a006260a2df60a4eb27b6327aae15c99
--- /dev/null
+++ b/static/open-iot-challenge/js/tweecool.min.js
@@ -0,0 +1,8 @@
+/*Name : TweeCool
+ *version: 1.3 
+ *Description: get the latest tweets from twitter.
+ *Website: www.tweecool.com
+ *Licence: no licence, feel free to do whatever you want.
+ * Author: TweeCool
+ */
+(function(a){a.fn.extend({tweecool:function(b){var c={username:"tweecool",limit:5,profile_image:true,show_time:true,show_media:false,show_media_size:"thumb"};var b=a.extend(c,b);function d(h){var k=new Date();var o=Date.parse(k);var p=Date.parse(h);var e=(o-p)/1000;var g=1,i=60,j=60*60,n=60*60*24,f=60*60*24*7,l=60*60*24*30,m=60*60*24*365;if(e>g&&e<i){return Math.round(e/g)+" seconds ago"}else{if(e>=i&&e<j){return Math.round(e/i)+" minutes ago"}else{if(e>=j&&e<n){return Math.round(e/j)+" hours ago"}else{if(e>=n&&e<f){return Math.round(e/n)+" days ago"}else{if(e>=f&&e<l){return Math.round(e/f)+" weeks ago"}else{if(e>=l&&e<m){return Math.round(e/l)+" months ago"}else{return"over a year ago"}}}}}}}return this.each(function(){var h=b;var i=a(this);var e=a("<ul>").appendTo(i);var f=/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;var g="";a.getJSON("https://www.api.tweecool.com/?screenname="+h.username+"&count="+h.limit,function(k){if(k.errors||k==null){i.html("No tweets available.");return false}if(h.profile_image){var j='<a href="https://twitter.com/'+h.username+'" target="_blank"><img src="'+k.user.profile_image_url+'" alt="'+h.username+'" /></a>'}else{j=""}a.each(k.tweets,function(l,n){if(h.show_time){var m=d(n.created_at)}else{var m=""}if(h.show_media&&n.media_url){g='<a href="https://twitter.com/'+h.username+'" target="_blank"><img src="'+n.media_url+":"+h.show_media_size+'" alt="'+h.username+'" class="media" /></a>'}e.append("<li>"+j+'<div class="tweets_txt">'+n.text.replace(f,'<a href="$1" target="_blank">$1</a>')+g+" <span>"+m+"</span></div></li>")})}).fail(function(k,l,j){i.html("No tweets available")})})}})})(jQuery);
\ No newline at end of file
diff --git a/static/open-iot-challenge/js/tweetie.min.js b/static/open-iot-challenge/js/tweetie.min.js
new file mode 100755
index 0000000000000000000000000000000000000000..a9b2dfdd7eac2262a833f6c8d25c958e07182778
--- /dev/null
+++ b/static/open-iot-challenge/js/tweetie.min.js
@@ -0,0 +1 @@
+(function(e){"use strict";e.fn.twittie=function(){var t=arguments[0]instanceof Object?arguments[0]:{},n=typeof arguments[0]==="function"?arguments[0]:arguments[1];var r=e.extend({username:null,list:null,hashtag:null,count:10,hideReplies:false,dateFormat:"%b/%d/%Y",template:"{{date}} - {{tweet}}",apiPath:"api/tweet.php",loadingText:"Loading..."},t);if(r.list&&!r.username){e.error("If you want to fetch tweets from a list, you must define the username of the list owner.")}var i=function(e){var t=e.replace(/(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/ig,'<a href="$1" target="_blank" title="Visit this link">$1</a>').replace(/#([a-zA-Z0-9_]+)/g,'<a href="https://twitter.com/search?q=%23$1&src=hash" target="_blank" title="Search for #$1">#$1</a>').replace(/@([a-zA-Z0-9_]+)/g,'<a href="https://twitter.com/$1" target="_blank" title="$1 on Twitter">@$1</a>');return t};var s=function(e){var t=e.split(" ");e=new Date(Date.parse(t[1]+" "+t[2]+", "+t[5]+" "+t[3]+" UTC"));var n=["January","February","March","April","May","June","July","August","September","October","November","December"];var i={"%d":e.getDate(),"%m":e.getMonth()+1,"%b":n[e.getMonth()].substr(0,3),"%B":n[e.getMonth()],"%y":String(e.getFullYear()).slice(-2),"%Y":e.getFullYear()};var s=r.dateFormat;var o=r.dateFormat.match(/%[dmbByY]/g);for(var u=0,a=o.length;u<a;u++){s=s.replace(o[u],i[o[u]])}return s};var o=function(e){var t=r.template;var n=["date","tweet","avatar","url","retweeted","screen_name","user_name"];for(var i=0,s=n.length;i<s;i++){t=t.replace(new RegExp("{{"+n[i]+"}}","gi"),e[n[i]])}return t};this.html("<span>"+r.loadingText+"</span>");var u=this;e.getJSON(r.apiPath,{username:r.username,list:r.list,hashtag:r.hashtag,count:r.count,exclude_replies:r.hideReplies},function(e){u.find("span").fadeOut("fast",function(){u.html("<ul></ul>");for(var t=0;t<r.count;t++){var a=false;if(e[t]){a=e[t]}else if(e.statuses!==undefined&&e.statuses[t]){a=e.statuses[t]}else{break}var f={user_name:a.user.name,date:s(a.created_at),tweet:a.retweeted?i("RT @"+a.user.screen_name+": "+a.retweeted_status.text):i(a.text),avatar:'<img src="'+a.user.profile_image_url+'" />',url:"https://twitter.com/"+a.user.screen_name+"/status/"+a.id_str,retweeted:a.retweeted,screen_name:i("@"+a.user.screen_name)};u.find("ul").append("<li>"+o(f)+"</li>")}if(typeof n==="function"){n()}})})}})(jQuery)
\ No newline at end of file
diff --git a/static/open-iot-challenge/stylesheet/bootstrap/bootstrap-responsive.min.css b/static/open-iot-challenge/stylesheet/bootstrap/bootstrap-responsive.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..52e6c9911040f14187b317d8640ad51ec7d8e36c
--- /dev/null
+++ b/static/open-iot-challenge/stylesheet/bootstrap/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}html{text-rendering:optimizeLegibility}body.index{background:url('../img/bg_index.png') top repeat-x #dee8ef}#catchline{font-weight:300;color:#eff4f7}#catchline h2{font-size:50px;color:#eff4f7;text-align:left}a:hover{text-decoration:none}.navbar a{border-bottom:0}h2{margin-bottom:20px;font-family:Lekton,Arial,sans-serif;font-size:38px;font-weight:normal;color:#26102b;text-shadow:0 1px 1px #8487b8;border-bottom:2px dotted #26102b}.home-box .lead{margin-top:-10px;font-size:20px;color:#8487b8}.lead li{line-height:inherit}.home-box.span4{width:350px;padding-right:10px;padding-left:10px;margin-bottom:330px;border-radius:10px}.home-box.span4 h2 a{color:#26102b}.home-box:hover{background:rgba(255,255,255,0.3)}.loaded{height:335px!important;margin-bottom:10px!important;opacity:1!important}.home-box h2{font-size:38px;text-shadow:0 1px 1px #8487b8}body.index h2{border:0}.home-box i{display:block;width:120px;height:70px;padding-top:45px;margin:auto;margin-top:20px;margin-bottom:20px;font-size:75px;color:#4b7d38;text-align:center;text-shadow:none;background:#FFF;border-radius:94px}.brand{width:100px;text-indent:-1000em;background:url('../../images/m2m_eclipse_logo.png') 0 7px no-repeat}.navbar .brand{margin-left:-40px}.row{margin-bottom:30px}.carousel-caption{background:rgba(22,23,28,0.4)}div.page-header{padding-bottom:9px;margin:0 0 30px;border-bottom:1px dashed #EEE}div.page-header h1{margin-top:0;color:#26102b}div.page-header h1 small{display:block;font-weight:300;color:#783388}.container ul li{margin-left:1em}.well{margin-bottom:50px;margin-left:-20px;background-color:white;border:1px solid #bcd1de;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.15)}@media(max-width:979px){.well{margin-left:0}}p+h2{margin-top:50px}h3{text-indent:.3em}.home-box i{display:block;width:120px;height:70px;padding-top:45px;margin-top:20px;margin-right:10px;margin-bottom:-80px;font-size:75px;color:#08c;text-align:center;text-shadow:none;background:rgba(255,255,255,0.8);border-radius:94px}.home-box .lead{width:245px;margin-top:-10px;font-size:20px;color:#8487b8}hr{margin-top:50px;margin-bottom:5px}footer ul li.pull-right{margin-top:8px}.section-title{position:relative;padding:6px 12px 8px 12px;padding-left:55px;font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:28px;font-weight:lighter;color:#fff;background:url('../../images/layout/section-heading-end.gif') #7c2c90 top right no-repeat;border-bottom:0 none}.section-title i{position:absolute;top:8px;left:16px}.section-title.grey-title{margin-bottom:0;background:url('../../images/layout/section-heading-grey-end.gif') #acb5bb top right no-repeat;border-bottom:1px solid #ccc}.grey-box{padding:20px;margin-bottom:60px;background:#ced8de}.itembox{position:relative;margin-bottom:20px;text-align:center;cursor:pointer;background:#fff}.itembox h3{color:#7c2c90}.itembox h3,.itembox p{padding:0 10px}.itembox p{font-weight:lighter}.itembox a.readmore:link,.itembox a.readmore:visited{position:absolute;bottom:0;display:block;width:100%;padding:8px 0;clear:both;color:#fff;text-align:center;background:#bd95c7}.itembox a.readmore:hover{background:#7c2c90}.itembox:hover{background:#f6f6f6}.project-list .itembox h3,.project-list .itembox p{padding:0 10px}.project-list .itembox .logo{max-width:80%;padding:15px}.project-list .itembox h3{font-size:21px}.project-list .itembox p{padding-bottom:50px;font-size:15px;color:#7c2c90}.event-list .itembox h3{padding-top:10px;margin-top:0;margin-bottom:4px;font-size:15px;line-height:16px}.event-list .itembox .location{padding-bottom:40px;margin-bottom:10px}.event-list .itembox .date,.event-list .itembox .location{font-size:13px;font-weight:normal}ul.news-list{padding:0;margin:0 0 80px 0;color:#161726;list-style:none}ul.news-list li{min-height:40px;padding:8px;margin-bottom:20px;margin-left:0!important;background:#fff;*zoom:1}ul.news-list li:before,ul.news-list li:after{display:table;line-height:0;content:""}ul.news-list li:after{clear:both}ul.news-list li span.date{position:absolute;display:block;padding-right:20px;padding-left:10px;margin-right:10px;font-size:13px;text-align:center;border-right:1px solid #ccc}ul.news-list li span.date::first-line {font-size:18px}ul.news-list li span.text{display:block;padding-left:95px}ul.news-list li:hover{cursor:pointer;background:#f6f6f6}ul.webinars-list{padding:0;margin:0;color:#161726;list-style:none}ul.webinars-list li{min-height:165px!important;padding:8px;margin-bottom:20px;background:#fff;*zoom:1}ul.webinars-list li:before,ul.webinars-list li:after{display:table;line-height:0;content:""}ul.webinars-list li:after{clear:both}@media(min-width:1200px){ul.webinars-list li{min-height:140px!important}}@media(max-width:979px) and (min-width:768px){ul.webinars-list li{min-height:240px!important}}@media(max-width:767px){ul.webinars-list li{min-height:0!important}}ul.webinars-list li span.date{position:absolute;display:block;padding-right:20px;padding-left:10px;margin-right:10px;font-size:13px;text-align:center;border-right:1px solid #ccc}ul.webinars-list li span.date::first-line {font-size:18px}ul.webinars-list li span.text{display:block;padding-left:95px}ul.webinars-list li:hover{cursor:pointer;background:#f6f6f6}.members-info .mb-logo{padding-bottom:22px}.members-info .mb-info{background:url('../../images/layout/members-info-top-left.gif') top left no-repeat}.members-info .mb-info .mb-info-container{padding:25px 22px;margin-left:25px;background:#fff}.members-info .mb-info .mb-info-container p{font-size:18px;font-weight:lighter;line-height:24px;color:#333450}.members-info .mb-info .mb-info-container h4{margin-top:0;font-size:23px;color:#7c2c90}.members-info ul.mb-links{height:38px;padding:0;margin:0;margin-left:25px;overflow:hidden}.members-info ul.mb-links a{display:block;padding:8px 0}.members-info ul.mb-links a:link,.members-info ul.mb-links a:visited{color:#fff}.members-info ul.mb-links li{display:block;float:left;width:50%;padding:0;margin:0;text-align:center;list-style-type:none;background:url('../../images/layout/members-info-link-sep-b.gif') left #12131d no-repeat}.members-info ul.mb-links li a:hover{background:-moz-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:-webkit-gradient(linear,left top,right top,color-stop(0%,rgba(125,126,125,0.01)),color-stop(100%,#7a2da3));background:-webkit-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:-o-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:-ms-linear-gradient(left,rgba(125,126,125,0.01) 0,#7a2da3 100%);background:linear-gradient(to right,rgba(125,126,125,0.01) 0,#7a2da3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#037d7e7d',endColorstr='#7a2da3',GradientType=1)}.members-info ul.mb-links li.read-more{background:url('../../images/layout/members-info-link-sep-a.gif') right #bd95c7 no-repeat}.members-info ul.mb-links li.read-more a:hover{background:-moz-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:-webkit-gradient(linear,left top,right top,color-stop(0%,#7a2da3),color-stop(100%,rgba(125,126,125,0.01)));background:-webkit-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:-o-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:-ms-linear-gradient(left,#7a2da3 0,rgba(125,126,125,0.01) 100%);background:linear-gradient(to right,#7a2da3 0,rgba(125,126,125,0.01) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7a2da3',endColorstr='#037d7e7d',GradientType=1)}@media(max-width:767px){.project-list .itembox p{font-size:13px}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:auto;margin-left:0}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade.in{top:auto}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:768px){body{padding-top:0}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:5px;padding-left:5px}.navbar .container{width:auto;padding:0;margin-right:10px;margin-left:10px}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#eff4f7;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#c4c6dd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#0d0d16}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #0d0d16;border-bottom:1px solid #0d0d16;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/static/open-iot-challenge/stylesheet/bootstrap/bootstrap.min.css b/static/open-iot-challenge/stylesheet/bootstrap/bootstrap.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..e8dafbecf27a9db4f5613fd1beee537c4d50860d
--- /dev/null
+++ b/static/open-iot-challenge/stylesheet/bootstrap/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#161726;background:#dee8ef}a{color:#4b7d38;text-decoration:none}a:hover{color:#6bb151;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{padding-top:80px;margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:24px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal dt{float:left;width:120px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea{width:210px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #bbb}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#323456}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{margin-left:-1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:160px}.form-horizontal .help-block{margin-top:10px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-right-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.info td{background-color:#d9edf7}@font-face{font-family:'FontAwesome';font-style:normal;font-weight:normal;src:url('../font/fontawesome-webfont.eot');src:url('../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),url('../font/fontawesome-webfont.woff') format('woff'),url('../font/fontawesome-webfont.ttf') format('truetype'),url('../font/fontawesome-webfont.svg#FontAwesome') format('svg')}[class^="icon-"]:before,[class*=" icon-"]:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;text-decoration:inherit}a [class^="icon-"],a [class*=" icon-"]{display:inline-block;text-decoration:inherit}.icon-large:before{font-size:1.3333333333333333em;vertical-align:middle}.btn [class^="icon-"],.nav-tabs [class^="icon-"],.btn [class*=" icon-"],.nav-tabs [class*=" icon-"]{line-height:.9em}li [class^="icon-"],li [class*=" icon-"]{display:inline-block;width:1.25em;text-align:center}li .icon-large:before,li .icon-large:before{width:1.875em}ul.icons{margin-left:2em;text-indent:-0.8em;list-style-type:none}ul.icons li [class^="icon-"],ul.icons li [class*=" icon-"]{width:.8em}ul.icons li .icon-large:before,ul.icons li .icon-large:before{vertical-align:initial}.icon-glass:before{content:"\f000"}.icon-music:before{content:"\f001"}.icon-search:before{content:"\f002"}.icon-envelope:before{content:"\f003"}.icon-heart:before{content:"\f004"}.icon-star:before{content:"\f005"}.icon-star-empty:before{content:"\f006"}.icon-user:before{content:"\f007"}.icon-film:before{content:"\f008"}.icon-th-large:before{content:"\f009"}.icon-th:before{content:"\f00a"}.icon-th-list:before{content:"\f00b"}.icon-ok:before{content:"\f00c"}.icon-remove:before{content:"\f00d"}.icon-zoom-in:before{content:"\f00e"}.icon-zoom-out:before{content:"\f010"}.icon-off:before{content:"\f011"}.icon-signal:before{content:"\f012"}.icon-cog:before{content:"\f013"}.icon-trash:before{content:"\f014"}.icon-home:before{content:"\f015"}.icon-file:before{content:"\f016"}.icon-time:before{content:"\f017"}.icon-road:before{content:"\f018"}.icon-download-alt:before{content:"\f019"}.icon-download:before{content:"\f01a"}.icon-upload:before{content:"\f01b"}.icon-inbox:before{content:"\f01c"}.icon-play-circle:before{content:"\f01d"}.icon-repeat:before{content:"\f01e"}.icon-refresh:before{content:"\f021"}.icon-list-alt:before{content:"\f022"}.icon-lock:before{content:"\f023"}.icon-flag:before{content:"\f024"}.icon-headphones:before{content:"\f025"}.icon-volume-off:before{content:"\f026"}.icon-volume-down:before{content:"\f027"}.icon-volume-up:before{content:"\f028"}.icon-qrcode:before{content:"\f029"}.icon-barcode:before{content:"\f02a"}.icon-tag:before{content:"\f02b"}.icon-tags:before{content:"\f02c"}.icon-book:before{content:"\f02d"}.icon-bookmark:before{content:"\f02e"}.icon-print:before{content:"\f02f"}.icon-camera:before{content:"\f030"}.icon-font:before{content:"\f031"}.icon-bold:before{content:"\f032"}.icon-italic:before{content:"\f033"}.icon-text-height:before{content:"\f034"}.icon-text-width:before{content:"\f035"}.icon-align-left:before{content:"\f036"}.icon-align-center:before{content:"\f037"}.icon-align-right:before{content:"\f038"}.icon-align-justify:before{content:"\f039"}.icon-list:before{content:"\f03a"}.icon-indent-left:before{content:"\f03b"}.icon-indent-right:before{content:"\f03c"}.icon-facetime-video:before{content:"\f03d"}.icon-picture:before{content:"\f03e"}.icon-pencil:before{content:"\f040"}.icon-map-marker:before{content:"\f041"}.icon-adjust:before{content:"\f042"}.icon-tint:before{content:"\f043"}.icon-edit:before{content:"\f044"}.icon-share:before{content:"\f045"}.icon-check:before{content:"\f046"}.icon-move:before{content:"\f047"}.icon-step-backward:before{content:"\f048"}.icon-fast-backward:before{content:"\f049"}.icon-backward:before{content:"\f04a"}.icon-play:before{content:"\f04b"}.icon-pause:before{content:"\f04c"}.icon-stop:before{content:"\f04d"}.icon-forward:before{content:"\f04e"}.icon-fast-forward:before{content:"\f050"}.icon-step-forward:before{content:"\f051"}.icon-eject:before{content:"\f052"}.icon-chevron-left:before{content:"\f053"}.icon-chevron-right:before{content:"\f054"}.icon-plus-sign:before{content:"\f055"}.icon-minus-sign:before{content:"\f056"}.icon-remove-sign:before{content:"\f057"}.icon-ok-sign:before{content:"\f058"}.icon-question-sign:before{content:"\f059"}.icon-info-sign:before{content:"\f05a"}.icon-screenshot:before{content:"\f05b"}.icon-remove-circle:before{content:"\f05c"}.icon-ok-circle:before{content:"\f05d"}.icon-ban-circle:before{content:"\f05e"}.icon-arrow-left:before{content:"\f060"}.icon-arrow-right:before{content:"\f061"}.icon-arrow-up:before{content:"\f062"}.icon-arrow-down:before{content:"\f063"}.icon-share-alt:before{content:"\f064"}.icon-resize-full:before{content:"\f065"}.icon-resize-small:before{content:"\f066"}.icon-plus:before{content:"\f067"}.icon-minus:before{content:"\f068"}.icon-asterisk:before{content:"\f069"}.icon-exclamation-sign:before{content:"\f06a"}.icon-gift:before{content:"\f06b"}.icon-leaf:before{content:"\f06c"}.icon-fire:before{content:"\f06d"}.icon-eye-open:before{content:"\f06e"}.icon-eye-close:before{content:"\f070"}.icon-warning-sign:before{content:"\f071"}.icon-plane:before{content:"\f072"}.icon-calendar:before{content:"\f073"}.icon-random:before{content:"\f074"}.icon-comment:before{content:"\f075"}.icon-magnet:before{content:"\f076"}.icon-chevron-up:before{content:"\f077"}.icon-chevron-down:before{content:"\f078"}.icon-retweet:before{content:"\f079"}.icon-shopping-cart:before{content:"\f07a"}.icon-folder-close:before{content:"\f07b"}.icon-folder-open:before{content:"\f07c"}.icon-resize-vertical:before{content:"\f07d"}.icon-resize-horizontal:before{content:"\f07e"}.icon-bar-chart:before{content:"\f080"}.icon-twitter-sign:before{content:"\f081"}.icon-facebook-sign:before{content:"\f082"}.icon-camera-retro:before{content:"\f083"}.icon-key:before{content:"\f084"}.icon-cogs:before{content:"\f085"}.icon-comments:before{content:"\f086"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-star-half:before{content:"\f089"}.icon-heart-empty:before{content:"\f08a"}.icon-signout:before{content:"\f08b"}.icon-linkedin-sign:before{content:"\f08c"}.icon-pushpin:before{content:"\f08d"}.icon-external-link:before{content:"\f08e"}.icon-signin:before{content:"\f090"}.icon-trophy:before{content:"\f091"}.icon-github-sign:before{content:"\f092"}.icon-upload-alt:before{content:"\f093"}.icon-lemon:before{content:"\f094"}.icon-phone:before{content:"\f095"}.icon-check-empty:before{content:"\f096"}.icon-bookmark-empty:before{content:"\f097"}.icon-phone-sign:before{content:"\f098"}.icon-twitter:before{content:"\f099"}.icon-facebook:before{content:"\f09a"}.icon-github:before{content:"\f09b"}.icon-unlock:before{content:"\f09c"}.icon-credit-card:before{content:"\f09d"}.icon-rss:before{content:"\f09e"}.icon-hdd:before{content:"\f0a0"}.icon-bullhorn:before{content:"\f0a1"}.icon-bell:before{content:"\f0a2"}.icon-certificate:before{content:"\f0a3"}.icon-hand-right:before{content:"\f0a4"}.icon-hand-left:before{content:"\f0a5"}.icon-hand-up:before{content:"\f0a6"}.icon-hand-down:before{content:"\f0a7"}.icon-circle-arrow-left:before{content:"\f0a8"}.icon-circle-arrow-right:before{content:"\f0a9"}.icon-circle-arrow-up:before{content:"\f0aa"}.icon-circle-arrow-down:before{content:"\f0ab"}.icon-globe:before{content:"\f0ac"}.icon-wrench:before{content:"\f0ad"}.icon-tasks:before{content:"\f0ae"}.icon-filter:before{content:"\f0b0"}.icon-briefcase:before{content:"\f0b1"}.icon-fullscreen:before{content:"\f0b2"}.icon-group:before{content:"\f0c0"}.icon-link:before{content:"\f0c1"}.icon-cloud:before{content:"\f0c2"}.icon-beaker:before{content:"\f0c3"}.icon-cut:before{content:"\f0c4"}.icon-copy:before{content:"\f0c5"}.icon-paper-clip:before{content:"\f0c6"}.icon-save:before{content:"\f0c7"}.icon-sign-blank:before{content:"\f0c8"}.icon-reorder:before{content:"\f0c9"}.icon-list-ul:before{content:"\f0ca"}.icon-list-ol:before{content:"\f0cb"}.icon-strikethrough:before{content:"\f0cc"}.icon-underline:before{content:"\f0cd"}.icon-table:before{content:"\f0ce"}.icon-magic:before{content:"\f0d0"}.icon-truck:before{content:"\f0d1"}.icon-pinterest:before{content:"\f0d2"}.icon-pinterest-sign:before{content:"\f0d3"}.icon-google-plus-sign:before{content:"\f0d4"}.icon-google-plus:before{content:"\f0d5"}.icon-money:before{content:"\f0d6"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-columns:before{content:"\f0db"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-envelope-alt:before{content:"\f0e0"}.icon-linkedin:before{content:"\f0e1"}.icon-undo:before{content:"\f0e2"}.icon-legal:before{content:"\f0e3"}.icon-dashboard:before{content:"\f0e4"}.icon-comment-alt:before{content:"\f0e5"}.icon-comments-alt:before{content:"\f0e6"}.icon-bolt:before{content:"\f0e7"}.icon-sitemap:before{content:"\f0e8"}.icon-umbrella:before{content:"\f0e9"}.icon-paste:before{content:"\f0ea"}.icon-user-md:before{content:"\f200"}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#4b7d38;background-color:#477635;background-image:-moz-linear-gradient(top,#4b7d38,#406c30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4b7d38),to(#406c30));background-image:-webkit-linear-gradient(top,#4b7d38,#406c30);background-image:-o-linear-gradient(top,#4b7d38,#406c30);background-image:linear-gradient(to bottom,#4b7d38,#406c30);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38',endColorstr='#ff406c30',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#4b7d38;background-color:#477635;background-image:-moz-linear-gradient(top,#4b7d38,#406c30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4b7d38),to(#406c30));background-image:-webkit-linear-gradient(top,#4b7d38,#406c30);background-image:-o-linear-gradient(top,#4b7d38,#406c30);background-image:linear-gradient(to bottom,#4b7d38,#406c30);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38',endColorstr='#ff406c30',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover .dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;overflow:visible \9;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 14px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^="icon-"]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:16px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#437d3a;*background-color:#387d3c;background-image:-moz-linear-gradient(top,#4b7d38,#387d3c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4b7d38),to(#387d3c));background-image:-webkit-linear-gradient(top,#4b7d38,#387d3c);background-image:-o-linear-gradient(top,#4b7d38,#387d3c);background-image:linear-gradient(to bottom,#4b7d38,#387d3c);background-repeat:repeat-x;border-color:#387d3c #387d3c #214823;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4b7d38',endColorstr='#ff387d3c',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#387d3c;*background-color:#306c34}.btn-primary:active,.btn-primary.active{background-color:#285a2c \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#4b7d38;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#6bb151;text-decoration:underline;background-color:transparent}.btn-group{position:relative;*margin-left:.3em;font-size:0;white-space:nowrap}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#387d3c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#4b7d38}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#4b7d38}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#4b7d38;border-bottom-color:#4b7d38}.nav .dropdown-toggle:hover .caret{border-top-color:#6bb151;border-bottom-color:#6bb151}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#eff4f7}.navbar-inner{min-height:60px;padding-right:20px;padding-left:20px;background-color:#121320;background-image:-moz-linear-gradient(top,#161726,#0d0d16);background-image:-webkit-gradient(linear,0 0,0 100%,from(#161726),to(#0d0d16));background-image:-webkit-linear-gradient(top,#161726,#0d0d16);background-image:-o-linear-gradient(top,#161726,#0d0d16);background-image:linear-gradient(to bottom,#161726,#0d0d16);background-repeat:repeat-x;border:1px solid #000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff161726',endColorstr='#ff0d0d16',GradientType=0);-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar .container{width:auto;padding-top:0}.nav-collapse.collapse{height:auto}.navbar .brand{display:block;float:left;padding:20px 20px 20px;margin-left:-20px;font-size:20px;font-weight:200;color:#c4c6dd;text-shadow:0 1px 0 #161726}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:60px}.navbar-link{color:#c4c6dd}.navbar-link:hover{color:#eff4f7}.navbar .divider-vertical{height:60px;margin:0 9px;border-right:1px solid #161726;border-left:1px solid #0d0d16}.navbar .btn,.navbar .btn-group{margin-top:16px}.navbar .btn-group .btn{margin:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:15px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:15px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner,.navbar-static-top .navbar-inner{border:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:20px 15px 20px;color:#c4c6dd;text-decoration:none;text-shadow:0 1px 0 #161726;border-top:2px #161726 solid}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#eff4f7;text-decoration:none;background-color:transparent;border-top-color:#eff4f7}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#eff4f7;text-decoration:none;background-color:#030306;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#09090f;*background-color:#030306;background-image:-moz-linear-gradient(top,#0d0d16,#030306);background-image:-webkit-gradient(linear,0 0,0 100%,from(#0d0d16),to(#030306));background-image:-webkit-linear-gradient(top,#0d0d16,#030306);background-image:-o-linear-gradient(top,#0d0d16,#030306);background-image:linear-gradient(to bottom,#0d0d16,#030306);background-repeat:repeat-x;border-color:#030306 #030306 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0d0d16',endColorstr='#ff030306',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#030306;*background-color:#000}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#000 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#eff4f7;background-color:#030306}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#c4c6dd;border-bottom-color:#c4c6dd}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#eff4f7;border-bottom-color:#eff4f7}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{height:40px;margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination li{display:inline}.pagination a,.pagination span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination a:hover,.pagination .active a,.pagination .active span{background-color:#f5f5f5}.pagination .active a,.pagination .active span{color:#999;cursor:default}.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999;cursor:default;background-color:transparent}.pagination li:first-child a,.pagination li:first-child span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination li:last-child a,.pagination li:last-child span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover{color:#999;cursor:default;background-color:#fff}.modal-open .dropdown-menu{z-index:2050}.modal-open .dropdown.open{*z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#eff4f7;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#e5edf2;border-bottom:1px solid #d4e1e9;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#4b7d38;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#161726}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit}.home-box.span4{height:0;overflow:hidden;opacity:0;-webkit-transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease;-moz-transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease;-o-transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease;transition:height .5s ease,opacity .5s ease,margin-bottom .5s ease}#home-frameworks{-webkit-transition-delay:0;-moz-transition-delay:0;-ms-transition-delay:0;-o-transition-delay:0;transition-delay:0}#home-protocols{-webkit-transition-delay:200ms;-moz-transition-delay:200ms;-ms-transition-delay:200ms;-o-transition-delay:200ms;transition-delay:200ms}#home-tools{-webkit-transition-delay:400ms;-moz-transition-delay:400ms;-ms-transition-delay:400ms;-o-transition-delay:400ms;transition-delay:400ms}#home-community{-webkit-transition-delay:600ms;-moz-transition-delay:600ms;-ms-transition-delay:600ms;-o-transition-delay:600ms;transition-delay:600ms}#home-sandbox{-webkit-transition-delay:800ms;-moz-transition-delay:800ms;-ms-transition-delay:800ms;-o-transition-delay:800ms;transition-delay:800ms}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/static/open-iot-challenge/stylesheet/font-awesome.min.css b/static/open-iot-challenge/stylesheet/font-awesome.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..ec53d4d6d5bf13db8ca757ea991a9c7839f23c89
--- /dev/null
+++ b/static/open-iot-challenge/stylesheet/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ *  Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}
\ No newline at end of file
diff --git a/static/open-iot-challenge/stylesheet/theme.css b/static/open-iot-challenge/stylesheet/theme.css
new file mode 100644
index 0000000000000000000000000000000000000000..5aabcd031e585b276017abddda21ae41b46412d9
--- /dev/null
+++ b/static/open-iot-challenge/stylesheet/theme.css
@@ -0,0 +1,317 @@
+body, p, li, h1, h2, h3, h4, h5 {
+    font-family: 'Lato', sans-serif;
+}
+body {
+    background: #fff;
+}
+a {
+    transition: color 0.3s ease;
+}
+p, li {
+    color: #747474;
+}
+.panel {
+    border: 1px solid #bfbfbf;
+    padding: 20px;
+    position: relative;
+}
+.header {
+    background-image: url(../images/header-bg.jpg);
+    background-size: cover;
+    background-position: top center;
+    text-align: center;
+    padding: 40px 0;
+}
+.header a.fa {
+    color: #fff;
+    font-size: 27px;
+}
+.header hr {
+    margin: 10px 0;
+}
+.blurb {
+    text-align: center;
+    background-color: #fff;
+    padding: 80px 0;
+}
+.blurb .container {
+    padding-top: 0;
+}
+.blurb .row {
+    margin-bottom: 0;
+}
+.blurb p {
+    font-size: 24px;
+    line-height: 1.2;
+    font-weight: 300;
+}
+.blurb p:first-child {
+    margin-bottom: 40px;
+}
+.tech {
+    background-image: url(../images/tech-bg.jpg);
+    background-position: top center;
+    background-color: #f2f2f3;
+    background-repeat: no-repeat;
+    text-align: center;
+    border-top: 1px solid #d7d7d7;
+    border-bottom: 1px solid #d7d7d7;
+}
+.tech h2 {
+    border: none;
+    padding-top: 80px;
+    font-weight: 300;
+}
+.tech .container {
+    padding-top: 0;
+}
+.tech p, .tech li {
+    font-size: 20px;
+    font-weight: 300;
+    line-height: 1.4;
+}
+.tech hr {
+    margin: 10px 0;
+    border-color: #acacac;
+}
+.tech .tech-bullets p {
+    text-align: left;
+    font-size: 16px;
+    margin-left: 10px;
+    border-left: 1px solid #494949;
+    padding-left: 10px;
+}
+.tech .tech-plus .row {
+    margin-bottom: 0;
+}
+.tech .tech-plus {
+    margin-bottom: -1px;
+}
+.tech .tech-expanded {
+    text-align: left;
+    display: block;
+}
+.tech .tech-expanded h2 {
+    padding-top: 0;
+}
+.tech .tech-expanded img {
+    margin-bottom: 40px;
+    margin-top: 40px;
+}
+.tech .tech-expanded .panel h2 {
+    background-color: #952788;
+    position: absolute;
+    padding: 50px 30px 10px;
+    top: -41px;
+    color: #fff;
+}
+.tech .tech-expanded .panel h2 span {
+    width: 0;
+    height: 0;
+    border-bottom: 30px solid #621259;
+    border-right: 15px solid transparent;
+    position: absolute;
+    top: 0;
+    right: -15px;
+    display: block;
+}
+.tech .tech-expanded .panel ul {
+    margin-top: 80px;
+}
+.tech .tech-activate {
+    cursor: pointer;
+}
+.contest {
+    background-color: #fff;
+    padding-bottom: 80px;
+}
+.contest .row {} .contest .bubbles .row {
+    margin-bottom: 0;
+}
+.contest .bubbles {
+    margin-top: 80px;
+}
+.contest h2, .contest p {
+    text-align: center;
+}
+.contest p {
+    font-size: 20px
+}
+.contest h2 {
+    border: none;
+    font-weight: 300;
+}
+.contest h2 strong {
+    color: #6eb553;
+}
+.contest hr {
+    border-color: #747474;
+    margin: 10px 0;
+}
+.contest .panel {
+    border: none;
+    background-color: #eceded;
+}
+.contest .panel p {
+    text-align: left;
+    font-size: 16px;
+    font-weight: 300;
+}
+.contest .panel p strong {
+    text-transform: uppercase;
+}
+.contest .panel span.arrow-right {
+    width: 0;
+    height: 0;
+    border-top: 10px solid transparent;
+    border-left: 10px solid #eceded;
+    border-bottom: 10px solid transparent;
+    display: block;
+    position: absolute;
+    top: 43%;
+    right: -10px;
+}
+.contest .panel span.arrow-left {
+    width: 0;
+    height: 0;
+    border-top: 10px solid transparent;
+    border-right: 10px solid #eceded;
+    border-bottom: 10px solid transparent;
+    display: block;
+    position: absolute;
+    top: 43%;
+    left: -10px;
+}
+.contest .span2 {
+    text-align: center;
+}
+.contest img {
+    text-align: center;
+}
+.sponsors {
+    background-color: #fff;
+    border-top: 1px solid #d7d7d7;
+    text-align: center;
+    padding-bottom: 80px;
+}
+.list-inline {
+    display: block;
+    position: relative;
+    left: 0;
+    float: left;
+    margin: 0 10px 0 0;
+    list-style: none;
+}
+.list-inline li {
+    float: left;
+    list-style: none;
+    margin-left: 0em!important;
+    margin-right: 1em;
+}
+button {
+    color: #ffffff;
+    background-color: #6eb553;
+    border: none;
+    padding: 10px 20px;
+    margin: 20px 0;
+    transition: background-color 0.3s ease;
+}
+button:hover {
+    background-color: #5C9704;
+}
+.footer {
+    background-color: #1d1d1d;
+    background-image: url('../images/footer-bg.jpg');
+    background-position: bottom center;
+    background-repeat: no-repeat;
+    color: #d6d6d6;
+    font-weight: 300;
+    min-height: 525px;
+}
+.footer ul {
+    list-style: none;
+    margin-bottom: 20px;
+}
+.footer ul li {
+    list-style: none;
+    text-transform: uppercase;
+    margin-bottom: 10px;
+}
+.footer ul li a {
+    color: #d6d6d6;
+}
+.footer ul li a:hover {
+    color: #838383;
+}
+.footer p {
+    font-style: italic;
+}
+.twitter-header .fa {
+    background-color: #434343;
+    padding: 12px;
+    font-size: 36px;
+    max-height: 50px;
+    margin-right: 20px;
+}
+.twitter-header h2 {
+    background-color: #6eb553;
+    padding: 10px;
+    color: #fff;
+    font-size: 24px;
+    border: none;
+    max-height: 50px;
+    margin-bottom: 0;
+}
+#twitter ul, #twitter ul li {
+    margin-left: 0!important;
+}
+#twitter ul {
+    border: 1px solid #252525;
+    padding: 20px;
+}
+#twitter ul li {
+    margin-bottom: 20px;
+}
+#twitter ul li:last-child {
+    margin-bottom: 0;
+}
+#twitter ul li > a {
+    float: left;
+    display: block;
+    margin-right: 20px;
+    width: 10%;
+}
+#twitter ul li > a img {
+    width: 35px;
+    margin-top: 5px;
+}
+#twitter ul li:before, #twitter ul li:after {
+    display: table;
+    line-height: 0;
+    content: "";
+}
+#twitter ul li:after {
+    clear: both;
+}
+#twitter ul li .tweets_txt {
+    float: left;
+    width: 75%;
+    text-transform: none;
+}
+.left {
+    float: left;
+}
+.right {
+    float: right;
+}
+.clear:before, .clear:after {
+    content: " ";
+    display: table;
+    box-sizing: border-box;
+}
+.clear:after {
+    clear: both;
+}
+.container ul li {
+    margin-left: .7em;
+}
diff --git a/static/package.json b/static/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..239f4a89fcc081754731b0e2c5801730bca069ce
--- /dev/null
+++ b/static/package.json
@@ -0,0 +1,14 @@
+{
+    "name": "version2",
+    "version": "2.0.0",
+    "devDependencies": {
+        "grunt": "~0.4.5",
+        "grunt-contrib-jshint": "~0.10.0",
+        "grunt-contrib-nodeunit": "~0.4.1",
+        "grunt-contrib-uglify": "~0.5.0",
+        "grunt-contrib-watch": "~0.5.3",
+        "grunt-sass": "~0.8.0",
+        "node-bourbon": "^1.2.3",
+        "node-sass": "^2.0.0-beta"
+    }
+}
diff --git a/static/projects.html b/static/projects.html
new file mode 100644
index 0000000000000000000000000000000000000000..9ea7020c94f063c3519b28be591b5fc962a4ac81
--- /dev/null
+++ b/static/projects.html
@@ -0,0 +1,186 @@
+<!DOCTYPE html>
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>iot.eclipse.org &mdash; Community</title>
+  <meta name="description" content="iot.eclipse.org is all about getting the IoT and M2M developers involved in what is happening in the different Eclipse projects">
+  <meta name="author" content="Eclipse.org">
+  <link rel="author" href="humans.txt" />
+
+  <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+  <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+  <!-- Le styles -->
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+</head>
+
+<body>
+
+
+  <header>
+
+    <nav class="navbar">
+      <div class="container">
+        <div class="row">
+          <div class="col-sm-2">
+            <a href="/"><img src="assets/images/iot-logo.png">
+            </a>
+          </div>
+          <div class="col-sm-10">
+            <ul class="list-inline right menu">
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+                <ul class="dropdown-menu">
+                  <li><a href="/standards">Standards</a>
+                  </li>
+                  <li><a href="/frameworks">Services &amp; Frameworks</a>
+                  </li>
+                  <li><a href="/projects">All the projects</a>
+                  </li>
+                </ul>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+              </li>
+
+              <li><a href="/ecosystem">Members</a>
+              </li>
+              <li><a href="#">Getting Started</a>
+              </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </nav>
+  </header>
+
+  <main class="main">
+
+    <div class="well">
+
+      <div class="container">
+        <h1>Projects</h1>
+
+        <p class="lead">Our open source projects provide implemt.</p>
+
+      </div>
+
+    </div>
+
+    <section style="background-image:none;" class="first project-list row-fluid" id="projects">
+      <div class="container">
+
+        <!-- <button id="btn-projects-standards" class="btn btn-info btn-projects" type="button">
+  Standards <span class="badge">5</span>
+</button>
+<button id="btn-projects-horizontals" class="btn btn-info btn-projects" type="button">
+  Horizontal frameworks <span class="badge">2</span>
+</button>
+<button id="btn-projects-industry" class="btn btn-info btn-projects" type="button">
+  Industry frameworks <span class="badge">3</span>
+</button>
+ -->
+
+        <div class="loading" id="update-project">
+          Loading projects list...
+          <!--           <div class="progress">
+            <div class="progress-bar progress-bar-info progress-bar-striped" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
+            </div>
+          </div> -->
+
+        </div>
+      </div>
+    </section>
+
+  </main>
+
+
+  <footer>
+
+    <div class="container">
+      <div class="row">
+        <div class="col-md-6">
+          <nav>
+            <ul class="list-inline menu">
+              <li><a href="#">Technology</a>
+              </li>
+              <li><a href="#">Community</a>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </nav>
+          <div class="socials">
+            <a href="#" class="social-facebook">&nbsp;</a>
+            <a href="#" class="social-twitter">&nbsp;</a>
+            <a href="#" class="social-youtube">&nbsp;</a>
+            <a href="#" class="social-share">&nbsp;</a>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+        </div>
+      </div>
+    </div>
+
+
+  </footer>
+
+
+  <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;">
+  </div>
+
+  </div>
+  <!-- /container -->
+
+
+
+  <!-- JS is at the end of the document so the pages load faster -->
+  <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
+  <!-- Include all compiled plugins (below), or include individual files as needed -->
+  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
+
+  <script src="js/shuffle.js"></script>
+  <script src="js/projects.js"></script>
+
+</body>
+
+</html>
diff --git a/static/protocols.html b/static/protocols.html
new file mode 100644
index 0000000000000000000000000000000000000000..ce181e6b530aabb31e685ad44a6f3e1be7d66378
--- /dev/null
+++ b/static/protocols.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html lang="en-US">
+
+<head>
+  <meta charset="UTF-8">
+  <meta http-equiv="refresh" content="1;url=/standards">
+  <script type="text/javascript">
+  window.location.href = "/standards"
+  </script>
+  <title>Page Redirection</title>
+</head>
+
+<body>
+  If you are not redirected automatically, follow this <a href='/standards'>this link</a>.
+</body>
+
+</html>
diff --git a/static/robots.txt b/static/robots.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a7a9803077c1ef2511594e9a27028d599d46b4ce
--- /dev/null
+++ b/static/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Sitemap: http://iot.eclipse.org/sitemap.xml
diff --git a/static/sandbox.html b/static/sandbox.html
new file mode 100644
index 0000000000000000000000000000000000000000..d5280ac312a0d29e9e59482be8c0788da69372d1
--- /dev/null
+++ b/static/sandbox.html
@@ -0,0 +1,249 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>iot.eclipse.org &mdash; Sandbox Server</title>
+    <meta name="description" content="iot.eclipse.org sandbox servers for quick testing of end-to-end M2M solutions">
+    <meta name="author" content="Eclipse.org">
+    <link rel="author" href="humans.txt" />
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+    <!-- Custom Fonts -->
+    <link href='http://fonts.googleapis.com/css?family=Lato:300,400' rel='stylesheet' type='text/css'>
+    <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+
+    <!-- Le styles -->
+    <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet">
+    <link href="css/theme.css" rel="stylesheet">
+    <link href="css/bootstrap/bootstrap-responsive.min.css" rel="stylesheet">
+
+    <script type="text/javascript">
+    var _gaq = _gaq || [];
+    _gaq.push(['_setAccount', 'UA-594061-11']);
+    _gaq.push(['_trackPageview']);
+
+    (function() {
+        var ga = document.createElement('script');
+        ga.type = 'text/javascript';
+        ga.async = true;
+        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(ga, s);
+    })();
+    </script>
+
+</head>
+
+<body>
+
+
+    <div class="navbar navbar-fixed-top">
+        <div class="navbar-inner">
+            <div class="container">
+                <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span>
+                </a> <a class="brand" href="index.html">iot.eclipse.org</a>
+
+
+                <div class="nav-collapse">
+                    <ul class="nav">
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/frameworks.html">Services &amp; Frameworks</a>
+                                </li>
+                                <li><a href="/protocols.html">Protocols</a>
+                                </li>
+                                <li><a href="/tools.html">Tools</a>
+                                </li>
+                                <li class="divider"></li>
+                                <li><a href="/java"><strong>Open IoT Stack for Java</strong></a>
+                                </li>
+                            </ul>
+                        </li>
+
+                        <li class="dropdown">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Community <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/community.html#projects">Projects</a>
+                                </li>
+                                <li><a href="/community.html#news">News</a>
+                                </li>
+                                <li class="divider"></li>
+                                <li><a href="/open-iot-challenge">Open IoT Challenge </a>
+                                </li>
+                            </ul>
+                        </li>
+
+                        <li><a href="/ecosystem.html">Ecosystem</a>
+                        </li>
+                        <li class="dropdown active">
+                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">See it live <b class="caret"></b></a>
+                            <ul class="dropdown-menu">
+                                <li><a href="/demo">Live Demo</a>
+                                </li>
+                                <li class="active"><a href="/sandbox.html">Sandbox</a>
+                                </li>
+                            </ul>
+                        </li>
+                    </ul>
+
+                    <ul class="nav pull-right">
+                        <li style="margin-left:0px;">
+                            <div style="padding-top: 20px">
+                                <div class="g-plusone" data-href="http://iot.eclipse.org/"></div>
+                            </div>
+                        </li>
+                    </ul>
+                </div>
+                <!--/.nav-collapse -->
+
+            </div>
+        </div>
+    </div>
+
+    <!-- Place this tag after the last +1 button tag. -->
+    <script type="text/javascript">
+    (function() {
+        var po = document.createElement('script');
+        po.type = 'text/javascript';
+        po.async = true;
+        po.src = 'https://apis.google.com/js/plusone.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(po, s);
+    })();
+    </script>
+
+
+    <div class="container">
+
+
+        <div class="well">
+            <div class="page-header">
+                <h1>
+	          Sandboxes <small>Build your IoT solutions using our sandbox environments</small>
+	        </h1>
+            </div>
+
+            <div>
+                <p class="lead">The IoT Working Group provides publically accesible servers for facilitating the development of IoT solutions. Refer to the details below in order to know how to connect your applications to our numerous services: MQTT, CoAP, LWM2M, &hellip;</p>
+            </div>
+        </div>
+
+
+        <!-- Example row of columns -->
+        <div class="row">
+
+            <div id="mqtt" class="span6">
+                <h2>MQTT</h2>
+                <p>You can make use of this <a href="http://mqtt.org/">MQTT</a> server with client code from the <a href="http://eclipse.org/paho/">Paho
+						project</a>, the Eclipse MQTT view from Paho, or from one of the other client APIs listed on the <a href="http://mqtt.org/downloads">MQTT.org downloads</a> page.
+                </p>
+
+                <p>
+                    Access the server using the hostname
+                    <code>iot.eclipse.org</code> and port
+                    <code>1883</code> .
+                </p>
+                <p>
+                    Some live statistics are available via <a href="https://xively.com/feeds/59871/">Xively</a> and an HTTP bridge with a list of topics is deployed at <a href="http://eclipse.mqttbridge.com">http://eclipse.mqttbridge.com</a>. This server is running the Open Source <a href="http://mosquitto.org/">Mosquitto broker</a> in its version 1.3.1.
+                </p>
+            </div>
+
+
+            <div id="coap" class="span6">
+                <h2>CoAP</h2>
+                <p>A CoAP server exposing test resources is available at: <code>coap://iot.eclipse.org:5683/</code>.</p>
+                <p>It should be used by anyone interested in testing a CoAP client implementation against another endpoint, and more generally by anyone interested in understanding the key concepts of the CoAP protocol.</p>
+                <p>
+                    This server is running <a href="https://projects.eclipse.org/projects/technology.californium">Eclipse Californium</a>.
+                </p>
+            </div>
+
+        </div>
+        <div class="row">
+
+            <div id="lwm2m" class="span6">
+                <h2>Lightweight M2M (LWM2M)</h2>
+                <p>In order to test LWM2M communication scenarios, we host a LWM2M server.</p>
+                <p>You can make use of this server with the <a href="https://projects.eclipse.org/projects/technology.wakaama">Wakaama
+						project</a>
+                </p>
+
+                <p>
+                    The LWM2M server is available at: <code>coap://leshan.eclipse.org:5683</code> (both IPv4 and IPv6 are available)
+                    <br> A web interface allows to interact with registered LWM2M clients: <a href="http://leshan.eclipse.org/"><code>http://leshan.eclipse.org</code></a>.
+                </p>
+                <p>
+                    This server is running the Open Source <a href="http:///github.com/jvermillard/leshan">Leshan server</a>.
+                </p>
+            </div>
+
+            <!-- 
+        	<div id="m3da" class="span6">
+				<h2>M3DA</h2>
+                <p>
+                There is a publically accessible <a href="http://wiki.eclipse.org/Mihini/M3DA_Specification">M3DA</a>
+					server for the Eclipse M2M projects.</p>
+				<p>You can make use of this server with the <a href="http://eclipse.org/mihini/">Mihini
+						project</a>
+				</p>
+
+				<p>
+					Access the server using the hostname
+					<code>iot.eclipse.org</code>
+					and port
+					<code>44900</code>
+					.<br>
+					REST API is available on the <code>http://iot.eclipse.org/m3da</code> endpoint.
+				</p>
+				<p>
+					This server is running the Open Source <a href="http://github.org/SierraWireless/m3da-server">M3DA server</a>.
+				</p>
+			</div>
+
+ -->
+
+        </div>
+
+
+        <hr>
+
+        <footer>
+            <ul class="nav nav-pills">
+                <li><a href="index.html">Home</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a>
+                </li>
+                <li><a href="http://www.eclipse.org/legal/" target="_blank">Legal</a>
+                </li>
+                <li><a href="contact.html" data-toggle="modal" data-target="#contact-modal">Contact Us</a>
+                </li>
+                <li class="pull-right">Copyright © 2013 The Eclipse Foundation. All Rights Reserved.</li>
+            </ul>
+        </footer>
+
+        <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;">
+        </div>
+
+    </div>
+    <!-- /container -->
+
+    <!-- JS is at the end of the document so the pages load faster -->
+    <script src="js/jquery.js"></script>
+    <script src="js/bootstrap/bootstrap.min.js"></script>
+    <script src="js/index.js"></script>
+
+
+</body>
+
+</html>
diff --git a/static/site_preview.jpg b/static/site_preview.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..c47825b69aa8ab6ba8e8015bf80d77b15415912e
Binary files /dev/null and b/static/site_preview.jpg differ
diff --git a/static/sitemap.html b/static/sitemap.html
new file mode 100644
index 0000000000000000000000000000000000000000..c4aa31a1adf94ac44103746481a3e2ccabe7dc9c
--- /dev/null
+++ b/static/sitemap.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<title>Site Map  Page 1 - Generated by www.xml-sitemaps.com</title>
+<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+<style type="text/css">
+body {
+background-color: #DDD;
+font: normal 80%  "Trebuchet MS", "Helvetica", sans-serif;
+margin:0;
+text-align:center;
+}
+#cont{
+margin:auto;
+width:800px;
+text-align:left;
+}
+a:link,a:visited {
+color: #0180AF;
+text-decoration: underline;
+}
+a:hover {
+color: #666;
+}
+h1 {
+background-color:#fff;
+padding:20px;
+color:#00AEEF;
+text-align:left;
+font-size:32px;
+margin:0px;
+}
+h3 {
+font-size:12px;
+background-color:#B8DCE9;
+margin:0px;
+padding:10px;
+}
+h3 a {
+float:right;
+font-weight:normal;
+display:block;
+}
+th {
+text-align:center;
+background-color:#00AEEF;
+color:#fff;
+padding:4px;
+font-weight:normal;
+font-size:12px;
+}
+td {
+font-size:12px;
+padding:3px;
+text-align:left;
+}
+tr {background: #fff}
+tr:nth-child(odd) {background: #f0f0f0}
+#footer {
+background-color:#B8DCE9;
+padding:10px;
+}
+.pager,.pager a {
+background-color:#00AEEF;
+color:#fff;
+padding:3px;
+}
+.lhead {
+background-color:#fff;
+padding:3px;
+font-weight:bold;
+font-size:16px;
+}
+.lpart {
+background-color:#f0f0f0;
+padding:0px;
+}
+.lpage {
+font:normal 12px verdana;
+}
+.lcount {
+background-color:#00AEEF;
+color:#fff;
+padding:2px;
+margin:2px;
+font:bold 12px verdana;
+}
+a.aemphasis {
+color:#009;
+font-weight:bold;
+}
+</style>
+
+</head>
+<body>
+<div id="cont">
+<h1>HTML Site Map</h1>
+<h3><a href="http://iot.eclipse.org">Homepage</a>
+Last updated: 2014, February 4
+</h3>
+
+
+<table cellpadding="0" cellspacing="0" border="0" width="100%">
+
+<tr valign="top">
+<td class="lpart" colspan="100"><div class="lhead">/
+<span class="lcount">8 pages</span></div>
+
+<table cellpadding="0" cellspacing="0" border="0" width="100%">
+
+<tr><td class="lpage"><a href="http://iot.eclipse.org/" title="iot.eclipse.org &amp;mdash; IoT development made simple">iot.eclipse.org &mdash; IoT development made simple</a></td></tr>
+<tr><td class="lpage"><a href="http://iot.eclipse.org/index.html" title="iot.eclipse.org &amp;mdash; IoT development made simple">iot.eclipse.org &mdash; IoT development made simple</a></td></tr>
+<tr><td class="lpage"><a href="http://iot.eclipse.org/frameworks.html" title="iot.eclipse.org &amp;mdash; Services &amp;amp; Frameworks">iot.eclipse.org &mdash; Services &amp; Frameworks</a></td></tr>
+<tr><td class="lpage"><a href="http://iot.eclipse.org/protocols.html" title="iot.eclipse.org &amp;mdash; Protocols">iot.eclipse.org &mdash; Protocols</a></td></tr>
+<tr><td class="lpage"><a href="http://iot.eclipse.org/tools.html" title="m2m.eclipse.org &amp;mdash; Tools">m2m.eclipse.org &mdash; Tools</a></td></tr>
+<tr><td class="lpage"><a href="http://iot.eclipse.org/community.html" title="iot.eclipse.org &amp;mdash; Community">iot.eclipse.org &mdash; Community</a></td></tr>
+<tr><td class="lpage"><a href="http://iot.eclipse.org/sandbox.html" title="iot.eclipse.org &amp;mdash; Sandbox Server">iot.eclipse.org &mdash; Sandbox Server</a></td></tr>
+<tr><td class="lpage"><a href="http://iot.eclipse.org/contact.html" title="http://iot.eclipse.org/contact.html">http://iot.eclipse.org/contact.html</a></td></tr>
+</table>
+</td>
+</tr>
+
+<tr valign="top">
+<td class="lbullet">&nbsp;&nbsp;&nbsp;&nbsp;</td>
+<td class="lpart" colspan="99"><div class="lhead">demo/
+<span class="lcount">2 pages</span></div>
+
+<table cellpadding="0" cellspacing="0" border="0" width="100%">
+
+<tr><td class="lpage"><a href="http://iot.eclipse.org/demo/" title="Greenhouse">Greenhouse</a></td></tr>
+<tr><td class="lpage"><a href="http://iot.eclipse.org/demo/index.html" title="Greenhouse">Greenhouse</a></td></tr>
+</table>
+</td>
+</tr>
+
+</table>
+
+
+<!--
+Please note:
+You are not allowed to remove the copyright notice below.
+Thank you!
+www.xml-sitemaps.com
+-->
+<div id="footer">
+Page generated by XML-Sitemaps.com - <a target="_blank" href="http://www.xml-sitemaps.com">Google XML sitemap and html sitemaps generator</a>
+|
+Copyright &copy; 2005-2013
+
+</div>
+</div>
+</body>
+</html>
diff --git a/sitemap.xml b/static/sitemap.xml
similarity index 100%
rename from sitemap.xml
rename to static/sitemap.xml
diff --git a/static/sitemap.xml.gz b/static/sitemap.xml.gz
new file mode 100644
index 0000000000000000000000000000000000000000..fb7f33656cc16fe09b07ec5bfffa36509e4694b0
Binary files /dev/null and b/static/sitemap.xml.gz differ
diff --git a/static/standards.html b/static/standards.html
new file mode 100644
index 0000000000000000000000000000000000000000..c9eb7a74afea8287d14b497b8a47e79b38672c11
--- /dev/null
+++ b/static/standards.html
@@ -0,0 +1,326 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>iot.eclipse.org &mdash; Standards</title>
+  <meta name="description" content="TODO">
+  <meta name="author" content="Eclipse.org">
+  <link rel="author" href="humans.txt" />
+
+  <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+  <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+  <!-- Le styles -->
+  <link href="/assets/css/bootstrap.css" rel="stylesheet">
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+
+</head>
+
+<body>
+
+  <header>
+
+    <nav class="navbar navbar-default">
+      <div class="container">
+        <!-- Brand and toggle get grouped for better mobile display -->
+        <div class="navbar-header">
+          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+            <span class="sr-only">Toggle navigation</span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <a class="navbar-brand" href="/">
+            <img alt="Brand" src="/assets/images/iot-logo.png">
+          </a>
+        </div>
+
+        <!-- Collect the nav links, forms, and other content for toggling -->
+        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+          <ul class="nav navbar-nav navbar-right">
+            <li><a href="/getting-started">Getting Started</a>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="/standards">Standards</a>
+                </li>
+                <li><a href="/frameworks">Services &amp; Frameworks</a>
+                </li>
+                <li><a href="/projects">All the projects</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+              <ul class="dropdown-menu" role="menu">
+                <li><a href="#">Resources</a>
+                </li>
+                <li><a href="#">News</a>
+                </li>
+                <li><a href="#">Events</a>
+                </li>
+              </ul>
+            </li>
+            <li><a href="/ecosystem">Working Group</a>
+            </li>
+            <li style="  padding-top: 15px; padding-left: 8px;">
+              <div class="g-plusone" data-size="medium" data-href="http://iot.eclipse.org"></div>
+            </li>
+          </ul>
+        </div>
+        <!-- /.navbar-collapse -->
+      </div>
+      <!-- /.container-fluid -->
+    </nav>
+
+
+  </header>
+
+
+  <!-- Place this tag after the last +1 button tag. -->
+  <script type="text/javascript">
+  (function() {
+    var po = document.createElement('script');
+    po.type = 'text/javascript';
+    po.async = true;
+    po.src = 'https://apis.google.com/js/plusone.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(po, s);
+  })();
+  </script>
+
+
+  <main class="main">
+
+    <div class="well">
+      <div class="container">
+        <h1>IoT Standards</h1>
+
+        <div class="lead">
+          <p>The IoT Working Group is supporting open standards for the Internet of Things.</p>
+          <p>
+            We provide open source implementations for IoT protocols such as MQTT, LwM2M, CoAP.
+          </p>
+
+        </div>
+      </div>
+    </div>
+
+    <section class="first">
+      <div class="container">
+
+        <h1 id="protocols-vision" class="purple">Vision</h1>
+
+
+        <div class="row">
+          <div class="col-md-6">
+            <p>One of the reasons why IoT development can prove to be difficult is the large number of communication protocols used in today's industries. From the industrial protocol used to collect temperature data on a sensor, to the communication protocol used to send this data to a server in the Cloud, to the device management protocol that allows remote firmware upgrade of a system, there are just too many protocols to master for building an end-to-end IoT solution.
+            </p>
+            <p>
+              We propose Open Source implementations for protocols already well-adopted in IoT fields, such as MQTT, CoAP and OMA-DM. We believe it is a way to encourage their adoption, as well as to improve the quality of these implementations.
+            </p>
+          </div>
+          <p class="col-md-6">
+            <img src="images/protocols/protocols-vision.png"></img>
+          </p>
+        </div>
+
+      </div>
+    </section>
+
+    <section class="second">
+      <div class="container">
+
+        <h1 id="mqtt" class="purple">MQTT</h1>
+
+        <p>
+          Message Queuing Telemetry Transport (MQTT) is a <a href="http://www.ibm.com/developerworks/webservices/library/ws-mqtt/index.html" target="_blank">protocol designed</a> to connect the physical world devices and networks, with applications and middleware used in IT and Web development, making it an ideal connectivity protocol for IoT and M2M.
+        </p>
+        <p>It is a lightweight publish-subscribe protocol that runs on embedded devices and mobile platforms, while connecting to highly scalable enterprise and web servers over wired and wireless networks. It is useful for connections with remote embedded systems where a small code footprint is required and/or network bandwidth is at a premium or connectivity unpredictable, and, for mobile applications that require small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers.</p>
+        <p>With loose coupling and quality-of-service, MQTT is optimized for dynamic system environments where high volumes of physical world messages and events need to be made available to Web and enterprise servers, and other consumers. MQTT has been well positioned for even the unanticipated requirements of M2M and IoT applications.</p>
+
+        <h2>
+            <i class="icon-arrow-right"></i> Getting started with MQTT
+        </h2>
+        <p>
+          The Paho project is based around MQTT client runtimes that implement the MQTT messaging protocol. The client runtimes can be configured to run against a broker running on your server, or the sandbox MQTT server described below. There are <a href="http://wiki.eclipse.org/Paho#Quick_Start_Guides" target="_blank">Quick Start Guides</a> available to get started. This article
+          <a href="http://www.infoq.com/articles/practical-mqtt-with-paho">Practical MQTT with Eclipse Paho</a> is also a good introduction to MQTT.
+        </p>
+
+
+        <div class="row-fluid">
+          <div class="span6">
+            <h2>
+                    <i class="icon-arrow-right"></i> Download MQTT runtimes
+                </h2>
+            <p>
+              Source code for our MQTT client libraries is available in multiple languages at the <a href="http://www.eclipse.org/paho/" target="_blank">Paho project</a> page.
+            </p>
+            <p>Source code for our MQTT server library is available from the <a href="http://www.eclipse.org/mosquitto">Mosquitto</a> project</p>
+          </div>
+
+          <div class="span6">
+            <h2>
+                    <i class="icon-arrow-right"></i> Sandbox MQTT Server
+                </h2>
+            <p>
+              We provide a <a href="sandbox.html#mqtt">sandbox server</a> so that you can test your MQTT-based applications against an actual MQTT broker.
+            </p>
+          </div>
+        </div>
+      </div>
+
+    </section>
+
+    <section class="third">
+      <div class="container">
+
+        <h1 id="coap" class="purple">CoAP</h1>
+
+        <p>CoAP (Constrained Application Protocol) is a protocol specialized for use with constrained nodes and networks.</p>
+
+        <p>It implements the REST architectural style, it can be transparently mapped to HTTP. However, CoAP also provides features that go beyond HTTP such as native push notifications and group communication.</p>
+
+        <div class="row-fluid">
+          <div class="span6">
+            <h2>
+                    <i class="icon-arrow-right"></i> Download CoAP runtime
+                </h2>
+
+            <p>
+              The <a href="http://www.eclipse.org/californium/" target="_blank">Californium project</a> will provide a Java implementation of the CoAP protocol, including support for the DTLS security layer. The source code of Californium should be available at Eclipse in Q2 2014.
+            </p>
+          </div>
+          <div class="span6">
+            <h2>
+                    <i class="icon-arrow-right"></i> Sandbox CoAP Server
+                </h2>
+
+            <p>
+              We provide a <a href="sandbox.html#coap">sandbox server</a> that exposes some testing resources over CoAP. You can use it to test CoAP communication scenarios.
+            </p>
+          </div>
+        </div>
+      </div>
+    </section>
+
+    <section class="second">
+      <div class="container">
+
+        <h1 id="oma-lwm2m" class="purple">OMA LightweightM2M</h1>
+
+        <p>
+          OMA LightweightM2M (LWM2M) is an industry standard for device management of M2M/IoT devices. It heavily relies on CoAP and therefore is optimized for communications over sensor or cellular networks.
+        </p>
+
+        <p>
+          OMA LWM2M provides an extensible object model that allows to enable application data exchanges in addition to the core device management features (firmware upgrade, connectivity monitoring, &hellip;)
+        </p>
+
+
+        <div class="row-fluid">
+          <div class="span6">
+            <h2>
+                    <i class="icon-arrow-right"></i> Download LWM2M runtime
+                </h2>
+
+            <p>
+              The <a href="http://www.eclipse.org/wakaama/" target="_blank">Wakaama project</a> will provide a C portable framework for building LWM2M clients and/or servers. The source code of Wakaama should be available at Eclipse in Q2 2014.
+            </p>
+          </div>
+          <div class="span6">
+            <h2>
+                    <i class="icon-arrow-right"></i> Sandbox LWM2M Server
+                </h2>
+
+            <p>
+              We provide a <a href="sandbox.html#lwm2m">sandbox LWM2M server</a> against which LWM2M clients can be registered. The sandbox server provides a Web UI and a REST API to enable interaction with the registered clients.
+            </p>
+          </div>
+        </div>
+      </div>
+
+    </section>
+
+
+
+    <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;"></div>
+
+    </div>
+  </main>
+  <!-- /container -->
+
+
+
+  <footer>
+
+    <div class="container">
+      <div class="row">
+        <div class="col-md-6">
+          <nav>
+            <ul class="list-inline menu">
+              <li><a href="#">Technology</a>
+              </li>
+              <li><a href="#">Community</a>
+              </li>
+              <li><a href="#" class="dropdown-toggle" data-toggle="dropdown">Community</a>
+                <ul class="dropdown-menu">
+                  <li><a href="#">Resources</a>
+                  </li>
+                  <li><a href="#">News</a>
+                  </li>
+                  <li><a href="#">Events</a>
+                  </li>
+                </ul>
+                <li><a href="/ecosystem">Members</a>
+                </li>
+                <li><a href="#">Getting Started</a>
+                </li>
+            </ul>
+          </nav>
+          <div class="socials">
+            <a href="#" class="social-facebook">&nbsp;</a>
+            <a href="#" class="social-twitter">&nbsp;</a>
+            <a href="#" class="social-youtube">&nbsp;</a>
+            <a href="#" class="social-share">&nbsp;</a>
+          </div>
+        </div>
+        <div class="col-md-6">
+          <p class="copyright">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</p>
+        </div>
+      </div>
+    </div>
+
+
+  </footer>
+
+
+  <!-- JS is at the end of the document so the pages load faster -->
+  <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
+  <!-- Include all compiled plugins (below), or include individual files as needed -->
+  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
+
+  <script src="js/index.js"></script>
+
+
+</body>
+
+</html>
diff --git a/static/tools.html b/static/tools.html
new file mode 100644
index 0000000000000000000000000000000000000000..8c96e4c890a3e0e2d82c4f16d8cd002d7ecae706
--- /dev/null
+++ b/static/tools.html
@@ -0,0 +1,196 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>m2m.eclipse.org &mdash; Tools</title>
+  <meta name="description" content="iot.eclipse.org helps you get started with the development tools provided in its ecosystem">
+  <meta name="author" content="Eclipse.org">
+  <link rel="author" href="humans.txt" />
+
+  <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+  <!--[if lt IE 9]>
+          <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+        <![endif]-->
+
+  <!-- Custom Fonts -->
+  <link href='http://fonts.googleapis.com/css?family=Lato:300,400' rel='stylesheet' type='text/css'>
+  <link href='http://fonts.googleapis.com/css?family=Lekton:400,700' rel='stylesheet' type='text/css'>
+
+  <!-- Le styles -->
+  <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet">
+  <link href="css/theme.css" rel="stylesheet">
+  <link href="css/bootstrap/bootstrap-responsive.min.css" rel="stylesheet">
+
+  <script type="text/javascript">
+  var _gaq = _gaq || [];
+  _gaq.push(['_setAccount', 'UA-594061-11']);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script');
+    ga.type = 'text/javascript';
+    ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(ga, s);
+  })();
+  </script>
+
+</head>
+
+<body>
+
+  <div class="navbar navbar-fixed-top">
+    <div class="navbar-inner">
+      <div class="container">
+        <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span>
+        </a> <a class="brand" href="index.html">iot.eclipse.org</a>
+
+
+        <div class="nav-collapse">
+          <ul class="nav">
+            <li class="dropdown active">
+              <a href="#" class="dropdown-toggle" data-toggle="dropdown">Technology <b class="caret"></b></a>
+              <ul class="dropdown-menu">
+                <li><a href="/frameworks.html">Services &amp; Frameworks</a>
+                </li>
+                <li><a href="/protocols.html">Protocols</a>
+                </li>
+                <li class="active"><a href="/tools.html">Tools</a>
+                </li>
+                <li class="divider"></li>
+                <li><a href="/java"><strong>Open IoT Stack for Java</strong></a>
+                </li>
+              </ul>
+            </li>
+
+            <li class="dropdown">
+              <a href="#" class="dropdown-toggle" data-toggle="dropdown">Community <b class="caret"></b></a>
+              <ul class="dropdown-menu">
+                <li><a href="/community.html#projects">Projects</a>
+                </li>
+                <li><a href="/community.html#news">News</a>
+                </li>
+                <li class="divider"></li>
+                <li><a href="/open-iot-challenge">Open IoT Challenge </a>
+                </li>
+              </ul>
+            </li>
+
+            <li><a href="/ecosystem.html">Ecosystem</a>
+            </li>
+            <li class="dropdown">
+              <a href="#" class="dropdown-toggle" data-toggle="dropdown">See it live <b class="caret"></b></a>
+              <ul class="dropdown-menu">
+                <li><a href="/demo">Live Demo</a>
+                </li>
+                <li><a href="/sandbox.html">Sandbox</a>
+                </li>
+              </ul>
+            </li>
+          </ul>
+
+          <ul class="nav pull-right">
+            <li style="margin-left:0px;">
+              <div style="padding-top: 20px">
+                <div class="g-plusone" data-href="http://iot.eclipse.org/"></div>
+              </div>
+            </li>
+          </ul>
+        </div>
+        <!--/.nav-collapse -->
+
+      </div>
+    </div>
+  </div>
+
+  <!-- Place this tag after the last +1 button tag. -->
+  <script type="text/javascript">
+  (function() {
+    var po = document.createElement('script');
+    po.type = 'text/javascript';
+    po.async = true;
+    po.src = 'https://apis.google.com/js/plusone.js';
+    var s = document.getElementsByTagName('script')[0];
+    s.parentNode.insertBefore(po, s);
+  })();
+  </script>
+
+  <div class="container">
+
+    <div class="well">
+      <div class="page-header">
+        <h1>
+                    IoT Tools <small>A one-stop shop IDE for IoT and M2M developers.</small>
+                </h1>
+      </div>
+
+      <div>
+        <p class="lead">
+          The IoT Working Group aims at providing an
+          <abbr title="Integrated Development Environment" class="initialism">IDE</abbr>
+          built on top of Eclipse that enables development of complete IoT and M2M solutions.
+        </p>
+      </div>
+    </div>
+
+    <h2 id="ide-vision">Vision</h2>
+
+
+    <div class="row">
+      <div class="span6">
+        <p>
+          We use the <a href="http://eclipse.org/eclipse/" target="_blank">Eclipse
+                        platform</a> as a base for the creation of an interoperable and extensible set of tools to simplify the development of IoT solutions.
+          <br />There are different sets of tools that we think are important to support IoT Developers:
+        </p>
+        <ul class="unstyled">
+          <li><i class="icon-ok"></i> <strong>Embedded Development</strong> &mdash; we aim at providing first-class user assistance for embedded development, especially for the Lua language.
+          </li>
+          <li><i class="icon-ok"></i> <strong>Simulation</strong> &mdash; because M2M infrastructures can be complex to setup, we want our tools to allow the simulation of M2M devices and communication scenarios between these devices and M2M servers.</li>
+          <li><i class="icon-ok"></i> <strong>Server Development</strong> &mdash; we plan on providing tools helping to discover the capabilities of an M2M server, as well as to configure it.</li>
+        </ul>
+        <!--                                <p> -->
+        <!--                                    The <a href="http://www.eclipse.org/koneki" target="_blank">Koneki -->
+        <!--                                        project</a> hosts XXX -->
+        <!--                                </p> -->
+      </div>
+      <p class="span6">
+        <img src="images/tools/tools-vision.png"></img>
+      </p>
+    </div>
+
+    <hr>
+
+    <footer>
+      <ul class="nav nav-pills">
+        <li><a href="index.html">Home</a>
+        </li>
+        <li><a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a>
+        </li>
+        <li><a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a>
+        </li>
+        <li><a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a>
+        </li>
+        <li><a href="http://www.eclipse.org/legal/" target="_blank">Legal</a>
+        </li>
+        <li><a href="contact.html" data-toggle="modal" data-target="#contact-modal">Contact Us</a>
+        </li>
+        <li class="pull-right">Copyright © 2015 The Eclipse Foundation. All Rights Reserved.</li>
+      </ul>
+    </footer>
+
+    <div id="contact-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="contact-label" aria-hidden="true" style="display: none;"></div>
+
+  </div>
+  <!-- /container -->
+
+  <!-- JS is at the end of the document so the pages load faster -->
+  <script src="js/jquery.js"></script>
+  <script src="js/bootstrap/bootstrap.min.js"></script>
+  <script src="js/index.js"></script>
+</body>
+
+</html>
diff --git a/static/urllist.txt b/static/urllist.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1640811c3e24fca3c121a08d06f62e72b5574559
--- /dev/null
+++ b/static/urllist.txt
@@ -0,0 +1,10 @@
+http://iot.eclipse.org/
+http://iot.eclipse.org/index.html
+http://iot.eclipse.org/frameworks.html
+http://iot.eclipse.org/protocols.html
+http://iot.eclipse.org/tools.html
+http://iot.eclipse.org/community.html
+http://iot.eclipse.org/demo/
+http://iot.eclipse.org/sandbox.html
+http://iot.eclipse.org/contact.html
+http://iot.eclipse.org/demo/index.html